最稳妥的做法是通过普通用户 SSH 登录,然后在 Ansible 任务中利用 become 机制提权,而不是直接用 root 账号远程连接。
先说结论:生产环境应禁止 root 直接 SSH,改用普通用户配合 sudo 提权
- 适合:需要审计权限操作且禁止 root 远程登录的场景
- 先准备:目标主机创建普通用户并配置 sudoers 免密或密码
- 验收:执行 whoami 命令确认提权后身份为 root
命令速用版
ansible all -m command -a "whoami" `--become` `--ask-become-pass`这条命令会让 Ansible 使用当前 SSH 用户连接,执行时询问提权密码,并以 root 身份运行 whoami。如果返回 root 则配置生效。
为什么会这样
直接使用 root 账户进行 SSH 远程登录存在较高安全风险,一旦密钥或密码泄露,攻击者将获得完全控制权。通过普通用户登录并结合 sudo 提权,可以实现权限分离和操作审计。Ansible 的 become 机制正是为此设计,它允许你在连接时使用普通用户,而在执行特定任务时临时切换到 root 或其他指定用户。
遵循最小权限原则是安全最佳实践,默认不使用 root 登录可有效降低密钥泄露后的爆炸半径。
分步处理
1. 在目标主机创建普通用户并设置密码
注意:不同 Linux 发行版设置密码命令不同,请根据系统选择。
# RHEL/CentOS 系列
useradd -m -s /bin/bash ansible_user
echo "your_password" | passwd `--stdin` ansible_user# Ubuntu/Debian 系列
useradd -m -s /bin/bash ansible_user
echo "ansible_user:your_password" | chpasswd2. 配置 sudo 权限
编辑/etc/sudoers 文件必须使用 visudo 命令,以防语法错误导致无法使用 sudo:
visudo添加以下内容允许该用户免密提权:
ansible_user ALL=(ALL) NOPASSWD: ALL如果出于安全考虑需要密码,则保留密码验证,并在 Ansible 配置中通过 `--ask-become-pass` 或 vault 提供密码。
3. 修改 Ansible 配置文件或清单
安全建议:不要在 inventory 文件中明文存储密码。
方式一:命令行交互式输入密码(适合临时任务)
ansible all -m ping `--become` `--ask-become-pass`方式二:使用 ansible-vault 加密变量(适合自动化流水线)
# 创建加密变量文件
ansible-vault create vault_vars.yml
# 内容示例:
# ansible_become_pass: your_sudo_password# 执行时加载 vault 文件
ansible-playbook site.yml `--vault-password-file`=vault_pass.txt若需在 inventory 中指定用户,仅配置用户名,不配置密码:
[servers]
192.168.1.10 ansible_user=ansible_user怎么验证是否生效
执行以下命令检查当前执行用户身份:
ansible all -m command -a "whoami" `--become`如果输出结果为 root,说明提权成功。同时可以检查目标主机的/var/log/secure 或/var/log/auth.log 日志,确认 sudo 操作记录是否正常生成。
常见坑
1. requiretty 限制:部分系统默认配置要求 sudo 必须在 tty 环境下运行,会导致 Ansible 报错。需在 sudoers 中禁用 requiretty 或添加 Defaults:ansible_user !requiretty。
2. 家目录权限:普通用户必须存在家目录且有写权限,否则某些模块可能因无法创建临时文件而失败。
3. Handlers 继承问题:在 Playbook 中,handlers 默认不继承 play 层级的 become 设置,需要在 handler 任务中单独声明 become: true。
4. 密码变量优先级:Ansible 2.5 版本后 ansible_become_pass 替换了旧的 ansible_sudo_pass,混用可能导致密码传递失败。
参考来源
- Ansible Official Documentation: Privilege Escalation
- Ansible Official Documentation: ansible-vault
原文链接:https://www.zjcp.cc/ask/11107.html
