- hosts: all become: yes vars: # Задайте пути к ключам на вашей локальной машине (где запускается Ansible), # предварительно скачав их с сервера step-ca local_ssh_user_ca_pub_path: "~/.step/secrets/ssh_user_ca_key.pub" local_ssh_host_ca_key_path: "~/.step/secrets/ssh_host_ca_key" tasks: # --- ЭТАП 1: УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ И КАТАЛОГАМИ --- - name: Создание системной директории для принципалов file: path: /etc/ssh/auth_principals state: directory owner: root group: root mode: '0755' - name: Создание локальных пользователей из списка проекта user: name: "{{ item.name }}" shell: /bin/bash create_home: yes state: present loop: "{{ project_users }}" - name: Генерация файлов auth_principals для каждого пользователя copy: dest: "/etc/ssh/auth_principals/{{ item.name }}" content: "{{ allowed_projects | join('\n') }}\n" owner: root group: root mode: '0644' loop: "{{ project_users }}" - name: Настройка беспарольного sudo для администраторов проекта copy: dest: "/etc/sudoers.d/project-ssh-{{ item.name }}" content: "{{ item.name }} ALL=(ALL) NOPASSWD:ALL" validate: /usr/sbin/visudo -cf %s mode: '0440' loop: "{{ project_users }}" when: item.sudo | bool # --- ЭТАП 2: РАСКАТКА ДОВЕРИЯ К USER CA --- - name: Копирование публичного ключа User CA на хост copy: src: "{{ local_ssh_user_ca_pub_path }}" dest: /etc/ssh/ca.pub owner: root group: root mode: '0644' # --- ЭТАП 3: ХОСТОВЫЕ СЕРТИФИКАТЫ (Опционально, локальный выпуск) --- # Мы генерируем сертификат прямо на машине администратора с помощью локального step-cli # и копируем готовый сертификат на целевой сервер. - name: Локальная генерация Host-сертификата для целевой ноды delegate_to: localhost become: no shell: > step ssh certificate {{ inventory_hostname }} /tmp/{{ inventory_hostname }}_host.pub --host --sign --ca-key {{ local_ssh_host_ca_key_path }} --no-password --insecure --principal {{ inventory_hostname }} --principal {{ ansible_host }} args: creates: "/tmp/{{ inventory_hostname }}-cert.pub" # Примечание: Для работы этой задачи на вашем ПК должен быть настроен step-cli контекст. # Если это сложно автоматизировать, этот блок можно пока пропустить. # --- ЭТАП 4: НАСТРОЙКА SSHD_CONFIG --- - name: Сбор имен всех разрешенных пользователей для AllowUsers set_fact: allow_users_list: "{{ project_users | map(attribute='name') | join(' ') }}" - name: Конфигурация OpenSSH Daemon blockinfile: path: /etc/ssh/sshd_config block: | TrustedUserCAKeys /etc/ssh/ca.pub AuthorizedPrincipalsFile /etc/ssh/auth_principals/%u AllowUsers {{ allow_users_list }} hogweed1 PasswordAuthentication no PubkeyAuthentication yes marker: "# {mark} ANSIBLE MANAGED ZERO TRUST BLOCK #" notify: Restart SSH handlers: - name: Restart SSH service: name: sshd state: restarted