配置 SSH 密钥与权限提升

LinuxBeginner
立即练习

介绍

受管节点的访问权限是 Ansible 自动化的基础。在实际生产环境中,Ansible 通常通过 SSH 进行连接,并使用权限提升(Privilege Escalation)来执行管理任务。

在本实验中,环境预设创建了一个名为 rhce_node 的临时受管用户。你将生成一个 SSH 密钥,为该用户进行授权,配置清单访问权限,并验证正常的 SSH 执行以及 become 权限提升功能。

创建 SSH 练习项目

在此步骤中,你将创建项目目录并设置基于 SSH 访问的 Ansible 默认配置。受管账户已经存在,但它尚未信任你的密钥。

创建并进入项目目录。

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,keys,playbooks}
cd rhce-ansible

创建 ansible.cfg 文件。

cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
interpreter_python = auto_silent
EOF

本项目在实验后续部分会使用真实的 SSH 连接到 127.0.0.1。keys 目录用于将实验密钥对与你常规的 ~/.ssh 文件隔离开来,而 host_key_checking = False 则避免了在此受控本地练习中出现交互式提示。

生成 SSH 密钥对

在此步骤中,你将创建一个 Ed25519 SSH 密钥对。私钥将保留在 keys/rhce_ed25519 中;公钥可以安全地安装到受管账户上。选项 -N '' 用于创建一个没有密码短语的密钥,以便进行实验自动化。

在执行此步骤的命令之前,请返回到 Ansible 项目目录。这样即使 LabEx 分步运行每个步骤,命令也能保持稳定。

cd /home/labex/project/rhce-ansible

生成密钥对。

ssh-keygen -t ed25519 -f keys/rhce_ed25519 -N '' -C rhce-ansible-lab

这会创建两个文件。keys/rhce_ed25519 是私钥,必须保持私密;keys/rhce_ed25519.pub 是公钥,可以安装到受管用户的账户中。

查看公钥内容。

cat keys/rhce_ed25519.pub

公钥行应以 ssh-ed25519 开头,并以注释 rhce-ansible-lab 结尾。你将把这个公钥(而不是私钥)复制到 authorized_keys 中。

为受管用户授权密钥

在此步骤中,你将为临时受管用户安装公钥。你不会更改 labex 用户的 LabEx SSH 访问权限;你只是在为本次实验准备 rhce_node 用户。

在执行此步骤的命令之前,请返回到 Ansible 项目目录。

cd /home/labex/project/rhce-ansible

创建受管用户的 .ssh 目录。

sudo mkdir -p /home/rhce_node/.ssh

SSH 会在用户的 .ssh 目录中查找受信任的公钥。这里需要使用 sudo,因为该目录位于另一个用户的主目录下。

将你的公钥安装为 authorized_keys。

sudo cp keys/rhce_ed25519.pub /home/rhce_node/.ssh/authorized_keys

修复所有权和权限。如果目录或文件的权限过于开放,SSH 会拒绝使用这些密钥。

sudo chown -R rhce_node:rhce_node /home/rhce_node/.ssh
sudo chmod 700 /home/rhce_node/.ssh
sudo chmod 600 /home/rhce_node/.ssh/authorized_keys

这些权限值是经过深思熟虑的:700 仅允许 rhce_node 访问 .ssh 目录,而 600 仅允许该用户读取或写入 authorized_keys。这些检查可以防止登录凭据被意外泄露。

配置 SSH 访问清单

在此步骤中,你将创建一个清单条目,告诉 Ansible 如何通过 SSH 在本地主机上连接到受管用户。

在执行此步骤的命令之前,请返回到 Ansible 项目目录。

cd /home/labex/project/rhce-ansible

编写清单文件。

cat > inventory/hosts <<'EOF'
[managed]
node1 ansible_host=127.0.0.1 ansible_user=rhce_node ansible_ssh_private_key_file=/home/labex/project/rhce-ansible/keys/rhce_ed25519
EOF

此清单行将 Ansible 名称与连接详细信息分离开来。node1 是清单别名,ansible_host 是要连接的地址,ansible_user 是远程账户,ansible_ssh_private_key_file 指向私钥文件。

在使用 Ansible 之前,先直接测试 SSH 连接。

ssh -i keys/rhce_ed25519 -o StrictHostKeyChecking=no rhce_node@127.0.0.1 'whoami'

该命令应输出 rhce_node。

直接测试 SSH 可以缩小问题范围。如果直接 SSH 无法登录,请在排查 Ansible 模块之前,先修复密钥、所有权、权限或清单连接值。

验证 Ansible Ping 和 Become 功能

在此步骤中,你将测试 Ansible 的连通性和权限提升功能。-b 选项代表 become,它要求 Ansible 以提升的权限运行模块。

在执行此步骤的命令之前,请返回到 Ansible 项目目录。

cd /home/labex/project/rhce-ansible

通过 SSH 运行 Ansible ping 模块。

ansible managed -m ansible.builtin.ping

这一次 ping 模块没有使用本地连接快捷方式。Ansible 应该以 rhce_node 身份连接,传输一个小模块,使用 Python 运行它,并返回 pong。

使用权限提升运行命令。当以 root 身份运行时,命令 id -u 会输出 0。

ansible managed -b -m ansible.builtin.command -a 'id -u'

-b 标志为此命令启用了 become。结果中包含 0 证明受管用户可以通过为实验创建的 sudoers 规则进行权限提升。

使用 Ansible become 编写一个 root 拥有的验证文件。

ansible managed -b -m ansible.builtin.copy -a 'content=become_ready dest=/etc/rhce-ansible-become.txt mode=0644'

在 /etc 下写入文件需要管理权限,因此这个最终命令证明的不仅仅是连通性。它确认了 Ansible 既可以通过 SSH 连接,也可以在需要时执行特权系统更改。

总结

你生成了一个 SSH 密钥对,为临时受管用户进行了授权,配置了基于 SSH 的清单访问权限,并使用 Ansible become 验证了权限提升功能。