使用 sudo 进行限制

使用 sudo 进行限制

我想要一个只能通过 Ansible 剧本启动/停止/重新启动/状态服务的用户。

剧本如下:

host: my-server
remote_user: my-user
tasks:
  - name: "Start my-service"
    service:
      name: my-service
      state: started
      daemon_reload: yes
    become: true

我尝试使用 sudoers 文件来限制权限,my-admin但这不起作用,因为 Ansible 正在运行的命令是(简化):

sudo /bin/sh -c "python /tmp/ansible-xxxxxx.py"

显然,我不能允许以 rootmy-admin身份运行,/bin/sh因为这将允许所有内容以 root 身份运行。我应该进行什么配置?我应该更改什么?

答案1

一般来说:

你不能。Ansible 权限提升要么全有,要么全无。请参阅:https://docs.ansible.com/ansible/latest/user_guide/become.html#privilege-escalation-must-be-general

使用 sudo 进行限制

经典方法:允许您的用户访问该系统,然后您创建一个sudo策略,严格限制和限制用户可以运行哪些命令(以及使用哪些参数)sudo。这是可能的,非常容易维护,但带有 sudo 限制,即这些命令需要按照策略的精确语法使用。
这或多或少禁止使用本机 Ansible 模块和特权升级方法来执行任务。

您仍然可以使用剧本,但是您会得到一些丑陋的东西,例如:

tasks:
  - name: "Start my-service with sudo"
    ansible.builtin.command: /usr/bin/sudo /usr/bin/systemctl start my-service.service

当你的 sudo 策略仍然需要密码时,情况会变得更加糟糕。

使用 Ansible 塔:

为了避免让您的用户同时访问该系统并设置受限的 sudo 策略:

  • 您为 Ansible 剧本设置了一个具有所需的无限权限升级的服务帐户。
  • 您将 Ansible Tower 设置为唯一具有使用 Ansible 服务帐户登录凭据的系统。
  • 您可以使用 Ansible Tower 中的用户管理和 ACL 来指定您的用户可以针对哪些主机运行哪些游戏。您的用户游戏将使用 Ansible 服务帐户执行,但您无需将这些游戏交给您的用户。

https://docs.ansible.com/ansible-tower/latest/html/userguide/security.html

答案2

您可以尝试这样的事情:

添加一个名为 youruser 的文件/etc/sudoers.d/你的用户内容如下:

youruser   ALL=(ALL)       NOPASSWD: /usr/bin/python /tmp/ansible-xxxxxx.py

您的用户可以对 /tmp/ansible-xxxxxx.py 文件执行 python 命令,并具有 sudo 权限

当然,用户基本上可以运行任何Python具有 sudo 权限的命令。

据我所知,如果参数发生变化,则无法将非命令参数传递给 sudo。如果您需要传递变量,我建议使用可执行此操作的包装器脚本。

相关内容