我想使用 Ansible 在树莓派或 Oracle 云上自动执行一些配置。
这些是任务序列:
- 使用当前/默认/不安全用户“ubuntu”运行脚本
ansible-playbook security.yml -u ubuntu
- 剧本将创建新用户
- name: create a new safe user
user:
name: "{{ safe_user }}"
state: present
groups: "sudo"
password: "{{ password }}"
comment: "Safe user"
shell: /bin/bash
update_password: on_create
playbook 将确保第二步中创建的安全用户存在authorized_keys 文件
playbook 将删除不安全用户“ubuntu”
playbook 将继续设置fail2ban、ufw、更改 ssh 端口...但现在使用“safe_user”
它在步骤 4-5 中失败,因为它尝试使用 Ubuntu 用户继续所有后续任务,而 Ubuntu 用户已从系统中擦除。
是否可以在第 5 步指定使用 <safe_user> 重新连接?
目前,我将所有任务分成两个文件,但我只想只有一个。
$ ansible-playbook security-1.yml -u ubuntu # will create safe_user
$ ansible-playbook security-2.yml -u safe_user # will delete ubuntu user
你可能会问为什么我要删除用户 ubuntu ?
- 这是因为当坏人无法选择使用 ubuntu 或 pi 用户登录时,我感觉更安全。
- 我想更深入地了解 ansible 的限制。
答案1
我认为这根本不可能(不仅在ansible中,而且基本上),只是因为没有机制可以否认或重新拥有正在运行的进程或以其他方式模拟它。
如果您可以在前者中重命名第二个用户,为什么您需要创建一个新用户并删除另一个用户?我不知道在 ansible 中会怎样,但 shell 命令会是这样的:
usermod -l safe_user ubuntu
如果您仍想删除该用户,可以将此操作移至最后一步,这样删除后就不会再有任何任务。或者在额外的脚本(剧本)下执行剩余的任务su -c '...' safe_user
(不知道ansible是否支持这种“嵌套”)。
另一种变体是禁用或锁定用户 ( usermod -L ubuntu
) 或其登录名 ( usermod ubuntu -s /sbin/nologin
),而不是完全删除。
答案2
以您的安全用户身份运行该游戏。
- 一定要设置好
gather_facts: no
,不然到这一步播放会失败并host unreachable
报错。
- 一定要设置好
在第一个任务中,为了检查用户是否已存在,您 ping 服务器并忽略主机无法访问错误:
- name: Check if safe user exists ansible.builtin.ping: register: result ignore_unreachable: true
如果 ping 失败,请使用您创建的安全用户的默认用户,为其授予 sudo 权限并添加 SSH 密钥:
- name: Handle the error (missing user) when: result.failed == true vars: ansible_ssh_user: "{{ default_user }}" block: - ansible.builtin.meta: clear_host_errors - name: Create safe user ansible.builtin.user: name: "{{ safe_user }}" password: "{{ password | password_hash('sha512') }}" groups: - sudo - users append: true shell: "{{ shell }}" - name: Add Authorized key ansible.posix.authorized_key: user: "{{ safe_user }}" key: "{{ ssh_pub_key }}" exclusive: true
现在,安全用户应该具有 SSH 访问权限并且可以删除默认用户。
- name: Remove default user ansible.builtin.user: name: "{{ default_user }}" state: absent
剧本的其余部分可以作为安全用户运行。该剧本也可以稍后重新运行。 ping 将成功并且将跳过用户创建。