1. Ansible 配置文件概览

1.1 ansible.cfg 文件配置

Ansible 的 ansible.cfg 文件是 Ansible 客户端的配置文件,通常位于 /etc/ansible/ 目录下。该文件控制着 Ansible 的各种默认行为,包括但不限于日志记录、主机密钥检查、默认的库存文件路径等。

  • 日志记录:可以通过配置文件设置日志级别,以便在执行任务时记录详细的信息,有助于调试和审计。
  • 主机密钥检查host_key_checking 选项控制 Ansible 是否检查目标主机的 SSH 密钥。出于安全考虑,通常建议将其设置为 False
  • 库存文件路径inventory 选项指定了 Ansible 库存文件的位置,默认为 /etc/ansible/hosts

1.2 hosts 文件配置

Ansible 的 hosts 文件是 Ansible 的库存文件,它定义了 Ansible 管理的主机列表。在该文件中,可以为每台主机或主机组指定用户名、密码、SSH 端口号等信息。

  • 主机别名:为每台主机或主机组设置别名,便于在 Playbook 中引用。
  • SSH 端口:通过 ansible_ssh_port 变量指定 SSH 连接使用的端口号。
  • 默认用户ansible_ssh_user 变量定义了连接远程主机时使用的默认用户。
  • 密码管理:虽然可以在 hosts 文件中直接使用 ansible_ssh_pass 变量设置密码,但出于安全考虑,推荐使用 SSH 密钥认证或 Ansible Vault 加密敏感信息。

hosts 文件中配置密码时,可以使用以下格式:

[webservers]
192.168.1.100 ansible_ssh_user=root ansible_ssh_pass=secret_password
192.168.1.101 ansible_ssh_user=root ansible_ssh_pass=another_secret_password

或者,对于使用 sudo 的情况:

[dbservers]
192.168.1.200 ansible_ssh_user=ubuntu ansible_ssh_pass=db_password ansible_sudo_pass=sudo_password

为了提高安全性,可以使用 Ansible Vault 对 hosts 文件进行加密:

ansible-vault encrypt /etc/ansible/hosts

在需要编辑或使用加密的 hosts 文件时,需要提供 Vault 密码:

ansible-vault edit /etc/ansible/hosts --ask-vault-pass

执行 Ansible 命令时,如果需要使用到加密的 hosts 文件,可以使用 --ask-vault-pass 选项来提示输入 Vault 密码:

ansible -i /etc/ansible/hosts all -m ping --ask-vault-pass

这种方式确保了密码等敏感信息的安全,防止在明文中暴露。

2. 配置用户名和密码

2.1 ansible_ssh_user 和 ansible_ssh_pass

在Ansible中,ansible_ssh_useransible_ssh_pass 是用于定义远程主机连接时使用的用户名和密码的变量。这些变量可以直接在inventory文件中设置,以便在执行任务时进行身份验证。

  • 默认情况下,Ansible使用root用户进行连接,但可以通过设置ansible_ssh_user来更改为其他用户。
  • 密码可以通过ansible_ssh_pass变量在inventory文件中直接设置,但这种做法存在安全风险,因为明文密码可能会被未经授权的人访问。
  • 为了提高安全性,推荐使用SSH密钥认证代替密码。但如果必须使用密码,可以通过Ansible Vault对包含密码的文件进行加密,确保敏感信息的安全。

2.2 使用 SSH 密钥代替密码

SSH密钥认证是一种更安全的远程主机访问方式,它可以避免在inventory文件中存储明文密码。

  • SSH密钥对包括一个私钥和一个公钥。私钥存储在本地,公钥存储在远程主机上。

  • 通过ssh-keygen命令生成SSH密钥对,然后使用ssh-copy-id命令将公钥复制到远程主机的~/.ssh/authorized_keys文件中,从而实现免密登录。

  • 在Ansible的inventory文件中,可以通过设置ansible_ssh_private_key_file变量来指定私钥文件的路径,从而使用SSH密钥进行认证。

  • 使用SSH密钥认证不仅可以提高安全性,还可以减少在执行任务时输入密码的麻烦,特别是在自动化任务中非常有用。

  • 此外,SSH密钥认证还可以通过Ansible的known_hosts模块进行管理,自动处理主机密钥的验证和存储。

    3. SSH 密钥管理

    3.1 生成 SSH 密钥对

    SSH 密钥对的生成是 Ansible 自动化过程中关键的一步,它允许无密码远程登录,增强了安全性并简化了管理过程。

  • 密钥对生成:使用 ssh-keygen 命令,用户可以选择生成 RSA、DSA 或 ECDSA 密钥对。通常情况下,默认的 RSA 密钥对已足够使用。

  • 密钥长度:建议至少使用 2048 位的密钥长度,以确保足够的安全性。对于更高级的安全需求,可以选择 4096 位或更长的密钥长度。

  • 密钥存储:生成的私钥(如 id_rsa)应妥善保管,不应泄露或共享。公钥(如 id_rsa.pub)则需要复制到远程主机上,以便进行认证。

3.2 复制公钥到远程主机

将公钥复制到远程主机是实现 SSH 免密登录的关键步骤,Ansible 提供了多种方式来完成这一过程。

  • 使用 ssh-copy-id 命令:这是最常用的方法,可以直接将公钥复制到远程主机的 ~/.ssh/authorized_keys 文件中。

  • 使用 Ansible 模块:Ansible 的 authorized_key 模块允许在 Playbook 中自动化这一过程,可以指定用户、公钥内容以及管理权限等。

  • 批量操作:在管理大量主机时,可以编写 Ansible Playbook 来批量复制公钥,这样可以大大减少手动操作的繁琐性。

  • 权限和安全性:确保远程主机的 ~/.ssh/ 目录和 authorized_keys 文件的权限设置正确,通常目录权限为 700,文件权限为 600,以防止未授权访问。

    4. 使用 ansible-vault 加密敏感信息

    4.1 创建和编辑加密文件

    ansible-vault 是 Ansible 提供的一个强大工具,用于加密敏感信息,如账号密码等。它使用 AES 加密算法来确保数据的安全性。

  • 创建加密文件:首先,使用 ansible-vault create 命令创建一个新的加密文件。例如,ansible-vault create secrets.yml 将会创建一个名为 secrets.yml 的加密文件,并提示用户输入一个密码,该密码将用于加密和解密文件。

  • 编辑加密文件:如果需要修改已加密的文件,可以使用 ansible-vault edit 命令。例如,ansible-vault edit secrets.yml --ask-vault-pass 将会解锁文件以供编辑,并在完成后重新加密。

  • 协同工作:在团队环境中,加密文件的密码可以通过安全的方式共享,如使用密码管理工具或通过环境变量传递,以确保团队成员可以访问和管理敏感配置。

4.2 在执行时使用加密信息

在 Ansible Playbook 或命令执行过程中,可以使用 --ask-vault-pass 选项来提示输入加密文件的密码,从而动态地加载加密的敏感信息。

  • 执行 Playbook:在运行 Playbook 时,如果涉及到加密的变量文件,可以使用 ansible-playbook site.yml --ask-vault-pass 命令来执行,系统会提示输入密码以解密所需的变量。

  • 命令行工具:在命令行工具中,也可以使用 ansible -i inventory.ini all -m ping --ask-vault-pass 来测试主机的连接性,同时使用加密的密码。

  • 集成到 CI/CD:在持续集成和持续部署的流程中,ansible-vault 可以与 Jenkins、GitLab CI 等工具集成,通过在 CI/CD 配置中设置环境变量或使用密钥管理服务来安全地使用加密信息。

  • 安全审计:使用加密的敏感信息可以提高审计的安全性,因为密码和密钥不会在日志文件或历史记录中以明文形式出现,从而降低了泄露的风险。

    5. 测试 SSH 连接

    5.1 使用 ping 模块测试

    使用 Ansible 的 ping 模块可以快速检测目标主机是否可达,这对于验证 SSH 连接是否正常工作是一个简单有效的方法。

  • 命令示例:ansible all -m ping -u username -k

  • 输出结果:如果 SSH 连接配置正确,命令执行后将显示所有目标主机的 pong 响应,表明 Ansible 成功连接到远程主机。

  • 常见问题:如果出现 FAILEDUNREACHABLE 响应,需要检查 SSH 连接配置,包括用户名、密码、密钥文件路径等是否正确。

5.2 使用 SSH 密钥测试连接

SSH 密钥测试是验证公钥是否成功部署到远程主机并能够实现免密登录的关键步骤。

  • 命令示例:ansible all -m ping -u username --private-key=/path/to/private/key

  • 输出结果:如果公钥部署正确,使用私钥进行 SSH 连接时,Ansible 能够无需密码验证直接连接到远程主机,并返回 pong 响应。

  • 常见问题:如果出现连接失败,可能是由于以下原因:

    • 私钥文件路径错误或文件权限设置不当。

    • 公钥未正确添加到远程主机的 ~/.ssh/authorized_keys 文件中。

    • 远程主机的 SSH 配置文件 /etc/ssh/sshd_config 未正确设置以允许密钥认证(PubkeyAuthentication yes)。

    • 密钥文件的权限设置不正确,通常私钥文件的权限应为 600,公钥文件的权限应为 644

      6. 配置 SSH 服务端以接受密钥认证

      6.1 设置 sshd_config 文件

      在Ansible中配置SSH服务端以接受密钥认证,首先需要编辑sshd_config文件,这是SSH服务的配置文件,通常位于/etc/ssh/sshd_config

  • PubkeyAuthentication:确保在sshd_config文件中设置PubkeyAuthentication选项为yes,这一设置允许使用公钥认证方式。

  • AuthorizedKeysFile:通常,公钥会被存储在用户的~/.ssh/authorized_keys文件中,sshd_config文件中的AuthorizedKeysFile选项应正确指向该文件。

  • StrictModes:设置StrictModesyes可以确保在~/.ssh目录和authorized_keys文件的权限设置正确,防止潜在的安全风险。

  • PasswordAuthentication:如果希望仅允许密钥认证,可以将PasswordAuthentication设置为no,这样可以禁用密码认证。

  • PermitEmptyPasswords:如果PasswordAuthentication被设置为no,同时应确保PermitEmptyPasswords也为no,以防止空密码登录。

  • UsePAM:设置UsePAMyes可以启用PAM(可插拔认证模块),这为SSH认证提供了额外的灵活性和安全性。

  • X11Forwarding:如果需要X11转发,确保X11Forwarding选项被设置为yes,这允许通过SSH会话转发X11应用程序。

6.2 重启 SSH 服务

配置完sshd_config文件后,需要重启SSH服务以使更改生效。在大多数Linux发行版中,可以使用以下命令来重启SSH服务:

   sudo systemctl restart sshd

或者在某些系统中,可能需要使用service命令:

   sudo service ssh restart

重启服务后,可以通过尝试使用SSH密钥登录来验证配置是否成功。如果遇到问题,可以检查/var/log/auth.log/var/log/secure日志文件(取决于系统)来诊断问题。

1. Ansible账号密码管理

1.1 密码管理的重要性

在Ansible中,账号密码管理是确保自动化操作安全性的关键环节。密码的不当管理可能导致安全漏洞,给系统带来风险。

1.2 密码管理的挑战

  • 多环境管理:在不同的环境(开发、测试、生产)中,Ansible需要管理不同的账号和密码,增加了管理复杂性。
  • 安全性与便捷性的平衡:在保证安全性的同时,也需要考虑到操作的便捷性,避免因为复杂的密码管理流程而影响运维效率。

2. Ansible密码管理实践

2.1 使用SSH密钥对认证

  • 密钥对生成:使用ssh-keygen命令生成SSH密钥对,提高认证的安全性。
  • 公钥分发:通过ssh-copy-id命令将公钥复制到远程主机,实现免密码登录。

2.2 使用Ansible Vault加密敏感信息

  • 加密hosts文件:使用ansible-vault encrypt命令对包含敏感信息的hosts文件进行加密。
  • 编辑加密文件:使用ansible-vault edit命令编辑加密的文件,确保在操作过程中敏感信息的安全。

2.3 密码管理的最佳实践

  • 定期更换密码:定期更换Ansible管理账号的密码,减少密码泄露的风险。
  • 使用强密码:生成复杂的密码,并使用密码管理工具来存储和管理密码。

3. Ansible密码管理工具

3.1 sshpass工具的使用

  • 非交互式密码输入:在需要时,可以使用sshpass工具来实现非交互式的密码输入,方便自动化脚本的执行。

3.2 Ansible内置模块

  • user模块:用于管理远程主机的用户账号,包括密码的设置和修改。
  • authorized_key模块:用于管理远程主机用户的SSH公钥,实现免密码登录。

4. 密码管理的安全策略

4.1 最小权限原则

  • 为Ansible管理账号分配最小必要的权限,减少安全风险。

4.2 审计和监控

  • 定期审计账号和密码的使用情况,监控异常登录行为,及时发现和响应安全事件。

5. 密码管理的未来发展

5.1 多因素认证

  • 探索在Ansible中实施多因素认证的可能性,进一步提高安全性。

5.2 密码管理服务的集成

  • 考虑将Ansible与现代密码管理服务(如HashiCorp Vault)集成,利用其强大的密码和密钥管理功能。