我想要一个只能通过 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。如果您需要传递变量,我建议使用可执行此操作的包装器脚本。