ssh-certs hosts.
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 0s
All checks were successful
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 0s
This commit is contained in:
59
playbooks/ssh-certs/deploy-host-certs.yml
Normal file
59
playbooks/ssh-certs/deploy-host-certs.yml
Normal file
@@ -0,0 +1,59 @@
|
||||
- hosts: all
|
||||
become: yes
|
||||
vars:
|
||||
# Имя провижнера на сервере step-ca, который имеет право подписывать хосты
|
||||
step_host_provisioner: "ssh-host-provisioner"
|
||||
# Путь к файлу с паролем от этого провижнера на вашей Ansible-машине
|
||||
step_provisioner_password_file: "/etc/step-ca/host_provisioner_password.txt"
|
||||
|
||||
tasks:
|
||||
- name: Создание временной папки на Ansible-машине для генерации ключей хоста
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
file:
|
||||
path: "/tmp/ssh_host_certs/{{ inventory_hostname }}"
|
||||
state: directory
|
||||
mode: '0700'
|
||||
|
||||
- name: Удаленный выпуск Хост-сертификата силами step-ca
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
shell: >
|
||||
step ssh certificate {{ inventory_hostname }} /tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key.pub
|
||||
--host --sign --provisioner "{{ step_host_provisioner }}"
|
||||
--password-file "{{ step_provisioner_password_file }}"
|
||||
--principal "{{ inventory_hostname }}" --principal "{{ ansible_host }}"
|
||||
--force
|
||||
|
||||
# step создаст два файла: сам публичный ключ и файл сертификата с суффиксом -cert.pub
|
||||
# Нам нужно забрать получившийся сертификат и положить его на целевую ноду
|
||||
|
||||
- name: Копирование сгенерированного Хост-сертификата на целевую виртуалку
|
||||
copy:
|
||||
src: "/tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key-cert.pub"
|
||||
dest: /etc/ssh/ssh_host_ed25519_key-cert.pub
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0600'
|
||||
|
||||
- name: Настройка sshd_config для отдачи Хост-сертификата клиентам
|
||||
blockinfile:
|
||||
path: /etc/ssh/sshd_config
|
||||
block: |
|
||||
HostKey /etc/ssh/ssh_host_ed25519_key
|
||||
HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub
|
||||
marker: "# {mark} ANSIBLE MANAGED HOST CERTIFICATE BLOCK #"
|
||||
notify: Restart SSH
|
||||
|
||||
- name: Очистка временных файлов на Ansible-машине
|
||||
delegate_to: localhost
|
||||
become: no
|
||||
file:
|
||||
path: "/tmp/ssh_host_certs/{{ inventory_hostname }}"
|
||||
state: absent
|
||||
|
||||
handlers:
|
||||
- name: Restart SSH
|
||||
service:
|
||||
name: sshd
|
||||
state: restarted
|
||||
70
playbooks/ssh-certs/deploy-user-certs.yml
Normal file
70
playbooks/ssh-certs/deploy-user-certs.yml
Normal file
@@ -0,0 +1,70 @@
|
||||
- hosts: all
|
||||
become: yes
|
||||
vars:
|
||||
# Путь к ПУБЛИЧНОМУ ключу User CA на вашей Ansible-машине
|
||||
local_ssh_user_ca_pub_path: "/etc/step-ca/ssh_user_ca_key.pub"
|
||||
|
||||
tasks:
|
||||
- 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
|
||||
|
||||
- name: Копирование публичного ключа User CA на хост
|
||||
copy:
|
||||
src: "{{ local_ssh_user_ca_pub_path }}"
|
||||
dest: /etc/ssh/ca.pub
|
||||
owner: root
|
||||
group: root
|
||||
mode: '0644'
|
||||
|
||||
- name: Сбор имен всех разрешенных пользователей для AllowUsers
|
||||
set_fact:
|
||||
allow_users_list: "{{ project_users | map(attribute='name') | join(' ') }}"
|
||||
|
||||
- name: Настройка sshd_config для авторизации пользователей по сертификатам
|
||||
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 USER CERTIFICATE BLOCK #"
|
||||
notify: Restart SSH
|
||||
|
||||
handlers:
|
||||
- name: Restart SSH
|
||||
service:
|
||||
name: sshd
|
||||
state: restarted
|
||||
Reference in New Issue
Block a user