Linux. Настройка двухэтапной аутентификации для пользователя root

Сегодня я расскажу как настроить двухэтапную аутентификацию для пользователя root на вашем сервере по временному одноразовому паролю, что будет генерировать приложение на телефоне или же простая консоль. Смысл в том, что при переходе в суперпользователя на вашем сервере вначале будет запрошен временный (одноразовый) пароль и только затем — пароль рута. Это поможет вам более качественно защитить ваш сервер от несанкционированного доступа.

Начнём с установки OATH Toolkit что уже есть в репозитории Debian.

apt-get install oathtool libpam-oath

Далее нам потребуется сгенерировать случайную строку (секретную фразу) на основе которой и будут генерироваться случайные временные одноразовые ключи. Поэтому стоит держать эту строку в секрете.

head -c 4096 /dev/urandom | md5sum | awk '{print $1}'
6819c89679c56508fec770362e312c4e

В данном примере секретная фраза это 6819c89679c56508fec770362e312c4e.

Теперь нам необходимо создать файл (/etc/users.oath) с описанием алгоритмов работы, пользователя и его секретной фразы.

echo "HOTP/T30 root - 6819c89679c56508fec770362e312c4e" > /etc/users.oath
chown root:root /etc/users.oath
chmod 600 /etc/users.oath

Далее — редактирование файла /etc/pam.d/su.
Вам необходимо дописать после

auth       sufficient pam_rootok.so

строку

auth requisite  pam_oath.so usersfile=/etc/users.oath window=10 digits=6

Где
usersfile — путь к файлу с описанием пользователей и их секретных фраз,
window — размер «окна». Поскольку временный одноразовый ключ создаётся относительно времени, то окно — это расхождение серверного времени от времени клиента/приложения. Одно «окно» — 30 секунд. Т.е. мы задали максимальное расхождение ключей в 5 минут.
digits — необходимое количество цифр во временном одноразовом ключе.

Теперь пробуем получить одноразовый временный пароль с нашей секретной фразой:

oathtool --verbose --totp 6819c89679c56508fec770362e312c4e

На что получим что-то следующее:

Hex secret: 6819c89679c56508fec770362e312c4e
Base32 secret: NAM4RFTZYVSQR7WHOA3C4MJMJY======
Digits: 6
Window size: 0
Step size (seconds): 30
Start time: 1970-01-01 00:00:00 UTC (0)
Current time: 2014-04-15 05:36:28 UTC (1397540188)
Counter: 0x2C6D360 (46584672)
385762

385762 — это и есть наш одноразовый временный пароль, а вот строку Base32 secret мы будем использовать когда будем настраивать приложение для телефона (только вводить мы будем этот код без знаков «=», т.е. как NAM4RFTZYVSQR7WHOA3C4MJMJY).

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

И наконец тестируем!

Подключаемся к серверу другим соединением (на всякий случай не закрывайте сессию root!) и пробуем сделать su
Система должна нас вначале спросить одноразовый временный пароль.

$ su
One-time password (OATH) for `root':

Генерируем одноразовый временный пароль либо через консоль с помощью команды oathtool, либо через приложение на вашем телефоне и вводим его.
Если вы всё сделали правильно, то после ввода временного пароля система вам предложит ввести пароль рута.