Ситуация: у вас парк Linux-серверов, куда вы регулярно заходите по SSH. Двухфакторная аутентификация для SSH по какому-либо железному ключу или Google Authenticator настраивается, может быть, и просто, но далеко не всегда удобно эту настройку производить на каждом сервере, их может быть слишком много, или просто страшно перезапускать sshd :)

Выходом из этой ситуации может быть промежуточный аутентификационный сервер. Мы уже писали про выкладку нашего решения (Isolate) в опенсорс, в этой же статье — инструкция по настройке аутентификационного сервера с двухфакторной аутентификацией по одноразовым ключам через Google Authenticator.

image

Начнем с разворачивания 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

image

Добавляем токен через QR-код в Google Authenticator:

image

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:

image

Добавление пользователя на сервер


На сервере 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 проекта.

Комментарии (15)