Редактирование конфигов с помощью Ansible на примере sshd_config

Для изменения, добавления и удаления файлов - Ansible может использовать регулярные выражения. В этой статье напишем плейбук, который изменит конфиг-файл sshd_config, а так же удалит файлы с небезопасными алгоритмами аутентификации.


На всякий случай добавлю ссылку на мою статью добавления пользователя и publickey на удаленные сервера с помощью Ansible https://max-ko.ru/54-dobavlenie-polzovatelja-i-publickey-na-udalennye-servera-s-pomoschju-ansible.html

Перед деплоем этого плейбука сгенерируйте новую пару ключей.
ssh-keygen -t ed25519 -o -a 100 && ssh-keygen -t rsa -b 4096 -o -a 100

Либо убедитесь, что у вас сгенерированы ключи RSA 4096 bit и ED25519 256 Bit.
[lnxcfg@centos-2gb-nbg-vpn ~]$ for keyfile in ~/.ssh/id_*; do ssh-keygen -l -f "${keyfile}"; done | uniq
256 SHA256:xxY+h+Rs1eII3sTTAGRD0fY7/FCCpcFcf/epI lnxcfg@centos-2gb-nbg-vpn (ED25519)
4096 SHA256:3XjBIidRtZpKtILFAlPGcywt9To10iyY lnxcfg@centos-2gb-nbg-vpn (RSA)

Скопируйте содержимое этого плейбука и сохраните его в формате YAML. Либо можете его скачать в моём репозитории GitHub https://github.com/yatakoi/ansible

secure_ssh.yml
---
    # Поменять 'hosts: all' на нужные хосты
    # В строке '7' добавьте своего пользователя
    # В строке '60' добавьте своего пользователя
- hosts: all
  become: true
  remote_user: lnxcfg
  tasks:
    - name: Добавить обмен ключами, шифрами и MAC 
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^KexAlgorithms' line='KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256'
    
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^Ciphers' line='Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr'
        
    - name: Включить наиболее безопасные алгоритмы аутентификации сервера и 2-ю версию протокола
      lineinfile: dest=/etc/ssh/sshd_config regexp='^Protocol 2' line='Protocol 2' 
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^HostKey /etc/ssh/ssh_host_ed25519_key' line='HostKey /etc/ssh/ssh_host_ed25519_key'
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^HostKey /etc/ssh/ssh_host_rsa_key' line='HostKey /etc/ssh/ssh_host_rsa_key'   

    - name: Отключить небезопасные алгоритмы
      lineinfile: 
        dest: /etc/ssh/sshd_config 
        regexp: '^HostKey /etc/ssh/ssh_host_ecdsa_key' 
        state: absent
    - lineinfile: 
        dest: /etc/ssh/sshd_config 
        regexp: '^HostKey /etc/ssh/ssh_host_dsa_key'
        state: absent
    
    - name: И удалить файлы
      file:
        dest: /etc/ssh/ssh_host_ecdsa_key.pub
        state: absent
    - file:
        dest: /etc/ssh/ssh_host_ecdsa_key
        state: absent
    - file:
        dest: /etc/ssh/ssh_host_dsa_key.pub
        state: absent
    - file:
        dest: /etc/ssh/ssh_host_dsa_key
        state: absent
  
    - name: Отключить логин по паролю и разрешить логиниться только с помощью publickey.
      lineinfile: dest=/etc/ssh/sshd_config regexp='^#?AuthenticationMethods' line='AuthenticationMethods publickey'
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^#?PasswordAuthentication' line='PasswordAuthentication no'
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^#?ChallengeResponseAuthentication' line='ChallengeResponseAuthentication no'
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^#?PubkeyAuthentication' line='PubkeyAuthentication yes'   
      
    # Установить LogLevel на уровень VERBOSE, чтобы регистрировать отпечаток ключа пользователя при входе в систему. Нужно четко отслеживать, какой ключ использовался для входа в систему.
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^LogLevel' line='LogLevel VERBOSE'

    # Запрет root-логина. Потому что трудно отследить, какой процесс принадлежит какому пользователю root
    # В Linux пользовательские сеансы отслеживаются с использованием идентификатора сеанса на стороне ядра, однако этот идентификатор сеанса не записывается OpenSSH.
    # Кроме того, только инструменты, такие как systemd и audd записывают идентификатор сеанса процесса.
    # В других ОС идентификатор сеанса пользователя не обязательно записывается на всей стороне ядра.
    # Использование обычных пользователей в сочетании с /bin/su или /usr/bin/sudo обеспечивает четкое отслеживание аудита.
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^PermitRootLogin' line='PermitRootLogin No'
   
    # Разрешить логиниться только определенным пользователям (можно указать AllowGroups).
    - lineinfile: dest=/etc/ssh/sshd_config regexp='^AllowUsers' line='AllowUsers lnxcfg'
    
    - name: Перезапуск sshd.
      service:
        name: sshd
        state: restarted
    
    - debug:
        msg: "Готово! При необходимости сгенерируйте клиентские ключи с помощью следующей команды: ssh-keygen -t ed25519 -o -a 100 && ssh-keygen -t rsa -b 4096 -o -a 100"

ВНИМАНИЕ!

Если после деплоя плейбука вы пытаетесь подключиться к удаленному серверу и у вас появляется ошибка
[lnxcfg@centos-2gb-nbg-vpn playbooks]$ ssh centos-2gb-nbg-webserver1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:uT4UDrA6Mv4FEDSlxpjmzqCp501cbG1UpTWk.
Please contact your system administrator.
Add correct host key in /home/lnxcfg/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/lnxcfg/.ssh/known_hosts:1
ED25519 host key for centos-2gb-nbg-webserver1 has changed and you have requested strict checking.
Host key verification failed.

Удалите файл /home/user/.ssh/known_hosts или удалите старые ключи и попробуйте подключиться снова.

Добавить комментарий