Редактирование конфигов с помощью Ansible на примере sshd_config
Для изменения, добавления и удаления файлов - Ansible может использовать регулярные выражения. В этой статье напишем плейбук, который изменит конфиг-файл sshd_config, а так же удалит файлы с небезопасными алгоритмами аутентификации.
На всякий случай добавлю ссылку на мою статью добавления пользователя и publickey на удаленные сервера с помощью Ansible https://max-ko.ru/54-dobavlenie-polzovatelja-i-publickey-na-udalennye-servera-s-pomoschju-ansible.html
Перед деплоем этого плейбука сгенерируйте новую пару ключей.
Либо убедитесь, что у вас сгенерированы ключи RSA 4096 bit и ED25519 256 Bit.
Скопируйте содержимое этого плейбука и сохраните его в формате YAML. Либо можете его скачать в моём репозитории GitHub https://github.com/yatakoi/ansible
secure_ssh.yml
Удалите файл /home/user/.ssh/known_hosts или удалите старые ключи и попробуйте подключиться снова.
На всякий случай добавлю ссылку на мою статью добавления пользователя и 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 или удалите старые ключи и попробуйте подключиться снова.