Ситуация: у вас парк Linux-серверов, куда вы регулярно заходите по SSH. Двухфакторная аутентификация для SSH по какому-либо железному ключу или Google Authenticator настраивается, может быть, и просто, но далеко не всегда удобно эту настройку производить на каждом сервере, их может быть слишком много, или просто страшно перезапускать sshd :)
Выходом из этой ситуации может быть промежуточный аутентификационный сервер. Мы уже писали про выкладку нашего решения (Isolate) в опенсорс, в этой же статье — инструкция по настройке аутентификационного сервера с двухфакторной аутентификацией по одноразовым ключам через Google Authenticator.
Начнем с разворачивания Isolate, для этого понадобится CentOS 7, Ubuntu 16.04 или же Debian 8 машина:
1. Подготавливаем систему к установке Isolate:
Centos:
Ubuntu:
2. Скачиваем сам Isolate:
3. Для запуска ansible на той же машине, приводим к виду (можно запускать либо с удаленной машины, сервера или десктопного Linux/MacOS, либо же прямо на той машине, на которой разворачиваем Isolate):
4.
Ждем выполнения. В случае, если Ubuntu ругается на шаг Upgrading installed packages (APT), делаем:
5. Добавляем в конец /etc/bashrc (Centos) либо /etc/bash.bashrc (Ubuntu)
6. Перезагружаем машину. Готово!
1. Добавляем в конец /etc/pam.d/sshd (Centos) строку, либо в /etc/pam.d/common-auth (Ubuntu)
2.
3. В конец /etc/ssh/sshd_config
4.
5. Добавляем пользователя, которому включим oauth
6. Генерируем TOTP или HOTP токены:
Добавляем токен через QR-код в Google Authenticator:
7.
8. Полученную в пункте 6 строку добавляем в /etc/oath/users.oath
9. Смотрим пароль от redis
Добавляем запись в /etc/bashrc (Centos) либо /etc/bash.bashrc (Ubuntu)
Теперь, когда у нас есть готовый сервер для двухфакторной аутентификации, можно добавить свои сервера. Для этого нужно сначала добавить информацию о сервере в Isolate, затем создать пользователей и положить ключи на целевой сервер.
Добавляем сервер, на который будем ходить:
Посмотреть список серверов можно с помощью команды s:
На сервере 10.0.0.1 создаем юзера support и прописываем ему ключ из /home/auth/.ssh/id_rsa.pub с Isolate сервера:
Теперь на Isolate сервере мы можем использовать команды s для поиска нужного сервера и g для перехода на конкретный сервер:
Теперь на все добавленные сервера заходить нужно с аутентификационного: по одноразовому коду и паролю заходим на Isolate, а дальше на нужный сервер. Напрямик на сервера в этом случае ходить не стоит, так как тогда смысл двухфакторной авторизации теряется. Ну и вообще удалить ключи-юзеров и т.п. :)
Как обычно, комментарии, дополнения и, конечно, пул реквесты приветствуются! Github проекта.
Выходом из этой ситуации может быть промежуточный аутентификационный сервер. Мы уже писали про выкладку нашего решения (Isolate) в опенсорс, в этой же статье — инструкция по настройке аутентификационного сервера с двухфакторной аутентификацией по одноразовым ключам через Google Authenticator.
Начнем с разворачивания Isolate, для этого понадобится CentOS 7, Ubuntu 16.04 или же Debian 8 машина:
1. Подготавливаем систему к установке Isolate:
Centos:
yum install ansible git
Ubuntu:
apt update; apt install git python-pip
pip install ansible
2. Скачиваем сам Isolate:
git clone https://github.com/itsumma/isolate.git
3. Для запуска ansible на той же машине, приводим к виду (можно запускать либо с удаленной машины, сервера или десктопного Linux/MacOS, либо же прямо на той машине, на которой разворачиваем Isolate):
[main]
localhost ansible_connection=local
4.
ansible-playbook -i isolate/ansible/hosts.ini isolate/ansible/main.yml
Ждем выполнения. В случае, если Ubuntu ругается на шаг Upgrading installed packages (APT), делаем:
apt dist-upgrade
5. Добавляем в конец /etc/bashrc (Centos) либо /etc/bash.bashrc (Ubuntu)
if [ -f /opt/auth/shared/bash.sh ]; then
source /opt/auth/shared/bash.sh;
fi
6. Перезагружаем машину. Готово!
Приступаем к включению oauth
1. Добавляем в конец /etc/pam.d/sshd (Centos) строку, либо в /etc/pam.d/common-auth (Ubuntu)
auth required pam_oath.so usersfile=/etc/oath/users.oath window=20 digits=6
2.
sed -i -e 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
3. В конец /etc/ssh/sshd_config
Match Group auth
AuthenticationMethods keyboard-interactive
4.
systemctl restart sshd
5. Добавляем пользователя, которому включим oauth
auth-add-user имя_юзера
6. Генерируем TOTP или HOTP токены:
gen-oath-safe имя_юзера totp
gen-oath-safe имя_юзера hotp
Добавляем токен через QR-код в Google Authenticator:
7.
touch /etc/oath/users.oath
chmod 0600 /etc/oath/users.oath
8. Полученную в пункте 6 строку добавляем в /etc/oath/users.oath
9. Смотрим пароль от redis
grep requirepass /etc/redis.conf
Добавляем запись в /etc/bashrc (Centos) либо /etc/bash.bashrc (Ubuntu)
ISOLATE_BACKEND=redis
ISOLATE_REDIS_HOST="127.0.0.1";
ISOLATE_REDIS_PORT="6379";
ISOLATE_REDIS_DB=0;
ISOLATE_REDIS_PASS=redis_pass;
export ISOLATE_REDIS_HOST;
export ISOLATE_REDIS_PORT;
export ISOLATE_REDIS_PASS;
export ISOLATE_REDIS_DB;
Добавление серверов
Теперь, когда у нас есть готовый сервер для двухфакторной аутентификации, можно добавить свои сервера. Для этого нужно сначала добавить информацию о сервере в Isolate, затем создать пользователей и положить ключи на целевой сервер.
Добавляем сервер, на который будем ходить:
auth-add-host --project server-admin --server-name ubuntu --ip 10.0.0.1
Посмотреть список серверов можно с помощью команды s:
Добавление пользователя на сервер
На сервере 10.0.0.1 создаем юзера support и прописываем ему ключ из /home/auth/.ssh/id_rsa.pub с Isolate сервера:
SUPPORT_USER="support"
KEY="<YOU KEY HERE>"
useradd -m ${SUPPORT_USER}
mkdir /home/${SUPPORT_USER}/.ssh
echo ${KEY} >> /home/${SUPPORT_USER}/.ssh/authorized_keys
chmod 600 /home/${SUPPORT_USER}/.ssh/authorized_keys
chmod 700 /home/${SUPPORT_USER}/.ssh/
chown -R ${SUPPORT_USER}:${SUPPORT_USER} /home/${SUPPORT_USER}/.ssh/
echo "${SUPPORT_USER} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Теперь на Isolate сервере мы можем использовать команды s для поиска нужного сервера и g для перехода на конкретный сервер:
g ip_сервера - g 10.0.0.1
g проект имя_сервера - g server-admin ubuntu
Теперь на все добавленные сервера заходить нужно с аутентификационного: по одноразовому коду и паролю заходим на Isolate, а дальше на нужный сервер. Напрямик на сервера в этом случае ходить не стоит, так как тогда смысл двухфакторной авторизации теряется. Ну и вообще удалить ключи-юзеров и т.п. :)
Как обычно, комментарии, дополнения и, конечно, пул реквесты приветствуются! Github проекта.