我是 Ansible 的新手。到目前为止,我见过的大多数 VPS 配置指南都这样做:
- 禁止 root 登录
ssh
创建一个只能使用(而非密码)登录的新用户- 将新用户添加到
wheel
组中,使用无密码 sudo允许
我理解(1)和(2),但不理解(3)。
无密码sudo
登录肯定和 一样root
?我理解这样做的好处(方便),但这不是非常不安全吗?
我知道管理员以各种方式运行他们的网络,因此这可以说是“主观的”,但这是非常常见的做法,甚至在各种官方 ansible 文档以及托管公司发布的指南中都有显示。这违背了常识。这背后的逻辑是什么?
答案1
如果服务帐户可以执行无密码 sudo,那么您必须保护对该帐户的访问。
拥有账户不是有一个密码,并且只使用 ssh 密钥登录,就可以实现这一点,前提是您也可以保证 ssh 私钥的安全。
答案2
在 (2) 中创建的新用户只能使用 SSH 密钥登录,无需密码。SSH 密钥提供间接 root 访问权限。因此,这相当于仅允许使用密钥进行 root 登录。
由于帐户没有密码,因此不可能要求sudo
输入密码。此外,Ansible 需要能够执行命令。在与密钥相同的位置提供额外的密码不会增加安全性。
答案3
问题是 ansible 是为管理员和自动化设计的,所以如果你需要输入密码来运行脚本,那并不是最好的方法。另外,将 sudo 的密码存储在文件或数据库中并不安全,ansible 每次运行 playbook 时都会获取该密码。因此,无密码 sudo 和使用 ssh Keys 进行身份验证的组合是确保安全性和运行 playbook 时不会出现任何问题的最佳方法。此外,您是管理员,并且知道您在 playbook 中编写了什么程序。因此 playbook 不会破坏您的服务器。
答案4
简而言之,是的。它并不像它应该的那样安全。如果一个坏人获得了你某台服务器的访问权限,并且可以在不使用密码的情况下使用 sudo,那么他们也可以sudo su
成为 root 用户。
始终拥有运行升级权限所需的用户密码
您可能会认为这会使自动化变得困难,每次都必须输入密码,但这正是ansible_become_pass
主机变量有用的地方。
在某处创建一个 yaml 文件并创建一个主机到 sudo 密码的字典:
sudo_passwords:
host1.wherever.net: superSeCRETpa$$word
host2.wherever.net: SUPerDuperSecretpa$$word
您可以选择保留此文件,但这是我的策略。我将原始机密文件作为纯文本文件保存在加密卷中,然后将符号链接添加到 ansible 项目根目录中的文件。您也可以将此文件保存在 ansible 项目本身的根目录中,并使用 ansible-vault 进行加密/解密。
# Decrypt when you're using it
ansible-vault decrypt sudo_passwords.yaml
# Encrypt when you're done
ansible-vault encrypt sudo_passwords.yaml
对于这一部分,您将需要加密密码。将其视为主密码。但是,我只是符号链接,因为我的加密卷仅在我需要工作时才打开。
~/my-ansible-project $ ln -s /path/to/vault/sudo_passwords.yaml
确保此文件不受版本控制
然后创建一个部分任务,将 sudo 密码作为事实导入ansible_become_pass
。保存到与任何剧本不同的文件中,因为这可以导入到所有剧本中。
---
- name: Import Sudo Password as Fact
ansible.builtin.set_fact:
ansible_become_pass: "{{ sudo_passwords[inventory_hostname] }}"
...
然后将此任务导入到任何需要提升权限的剧本中:
- name: Playbook Name
hosts: all
gather_facts: true
vars_files:
# Point to the passwords file relative to where the playbook file resides
# In this case, it's the same directory
- sudo_passwords.yaml
tasks:
- name: Set sudo password
import_tasks: set-sudo.tasks.yaml
# Add a directory inside the root user's home for proof of concept
- name: Create secrets directory
become: true
ansible.builtin.file:
path: /root/.secrets
state: directory
mode: 0700
owner: root
请注意,为了简单起见,剧本、导入的任务和密码文件都位于同一目录中。
我相信,这是自动化程度和安全性之间的良好平衡。