Первым делом мы выстроили систему управления SSH-ключами. Для каждого из 18 администраторов «ЛогиТранс» были сгенерированы персональные ключевые пары ED25519 — более современный и безопасный алгоритм по сравнению с RSA:
# Генерация ключа ED25519 с комментарием для идентификации
ssh-keygen -t ed25519 -C "ivanov@logitrans.ru" -f ~/.ssh/id_ed25519_logitrans
# Установка парольной фразы на существующий ключ
ssh-keygen -p -f ~/.ssh/id_ed25519_logitrans
Для массового развёртывания ключей на 200 серверов мы написали Ansible-плейбук, который выполнял три задачи: копировал публичные ключи авторизованных администраторов, устанавливал корректные права на файлы и отключал парольную аутентификацию:
# deploy_ssh_keys.yml
- hosts: all_servers
become: yes
tasks:
- name: Создаём директорию .ssh
file:
path: "/home/{{ item.user }}/.ssh"
state: directory
mode: '0700'
owner: "{{ item.user }}"
loop: "{{ ssh_users }}"
- name: Развёртываем авторизованные ключи
authorized_key:
user: "{{ item.0.user }}"
key: "{{ item.1 }}"
state: present
exclusive: yes
loop: "{{ ssh_users | subelements('keys') }}"
- name: Отключаем парольную аутентификацию
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PasswordAuthentication'
line: 'PasswordAuthentication no'
notify: restart sshd
- name: Отключаем root-логин
lineinfile:
path: /etc/ssh/sshd_config
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin no'
notify: restart sshd
Развёртывание прошло поэтапно: сначала тестовая группа из 10 серверов, затем — ежедневно по 30-40 серверов. На каждом этапе мы проверяли, что все администраторы могут подключиться по ключам, прежде чем отключать пароли.
Мы настроили SSH-агент на рабочих станциях администраторов с автоматической выгрузкой ключей через 8 часов — по окончании рабочего дня:
# Добавление ключа с таймаутом жизни 8 часов (28800 секунд)
ssh-add -t 28800 ~/.ssh/id_ed25519_logitrans
# Проверка загруженных ключей
ssh-add -l
Для каждого администратора был составлен индивидуальный SSH-конфиг, позволяющий подключаться к серверам по коротким алиасам:
# ~/.ssh/config — пример для администратора Иванова
Host *
IdentityFile ~/.ssh/id_ed25519_logitrans
ServerAliveInterval 60
ServerAliveCountMax 3
Compression yes
AddKeysToAgent yes
Host jump-msk
HostName 10.0.1.5
User ivanov
Port 2222
Host db-prod-*
User ivanov
Port 2222
ProxyJump jump-msk
Host db-prod-1
HostName 10.10.1.11
Host db-prod-2
HostName 10.10.1.12
Теперь вместо запоминания IP-адресов и паролей администратору достаточно набрать ssh db-prod-1.
Оставить комментарий