如何使用Ansible正确创建Linux用户并解决SSH密钥登录异常问题
家目录权限差异原因及SSH登录失败根因
SSH服务对用户家目录、.ssh目录、authorized_keys文件的权限有严格安全校验:如果家目录开放了同组用户的写权限(也就是user1家目录的rwxrwxr-x里的第二个w),sshd会判定目录存在被其他用户篡改的风险,直接拒绝使用密钥登录,回退到密码验证逻辑,所以会出现提示输入密码的情况。
家目录权限不一致的核心原因有2个:
- 你当前使用的Ansible
user模块没有显式指定home_mode参数,创建用户时家目录的权限会继承目标主机/etc/login.defs里配置的UMASK值:如果UMASK是002,家目录权限就是775(对应user1的情况);如果UMASK是022,权限就是755(对应user2的情况);如果UMASK是077,权限就是700(对应user3的情况)。不同发行版、不同主机的UMASK配置可能存在差异,就会出现权限不一致的问题。 - 如果创建用户前,对应的
/home/[用户名]目录已经存在,user模块默认不会修改已有目录的权限,也会导致权限和预期不符。
Ansible修复方案
1. 优化现有创建用户的任务,从根源避免权限问题
在创建用户和创建.ssh目录的任务之间,新增一个设置家目录权限的任务,显式指定权限,避免受主机UMASK影响:
- name: Add user ansible.builtin.user: name: "{{ item.name }}" uid: "{{ item.uid }}" shell: /bin/bash group: "{{ item.group }}" groups: sshgroup append: yes with_items: "{{ users }}" # 新增以下任务,统一设置家目录权限为755,也可以根据安全需求调整为700 - name: Set correct home directory permission ansible.builtin.file: path: "/home/{{ item.name }}" state: directory mode: '0755' owner: "{{ item.name }}" group: "{{ item.group }}" with_items: "{{ users }}" - name: Add .ssh directory file: path: "/home/{{ item.name }}/.ssh" state: directory mode: 0700 owner: "{{ item.name }}" group: "{{ item.group }}" with_items: "{{ users }}" - name: Add key lineinfile: dest: "/home/{{ item.name }}/.ssh/authorized_keys" state: present create: yes line: "{{ item.auth_key }}" owner: "{{ item.name }}" group: "{{ item.group }}" mode: 0600 with_items: "{{ users }}"
你也可以直接在user模块里加home_mode: '0755'参数,效果和新增任务一致,不过新增任务还可以修复已经存在的家目录权限错误的问题,兼容性更好。
2. 单独修复user1的权限
如果只需要临时修复user1的登录问题,可以执行以下Ansible临时命令:ansible 目标主机组或IP -m file -a "path=/home/user1 mode=0755"
内容的提问来源于stack exchange,提问作者Miantian
相关产品推荐
相关产品推荐

