---
# System prepended metadata

title: Практическая работа № 3 (“Многофакторная аутентификация для SSH в Linux”.)

---

# Практическая работа № 3 (“Многофакторная аутентификация для SSH в Linux”.)

## Цель работы:

1) Научиться настраивать многофакторную аутентификацию для SSH;
2) После настройки проверить подключение.

## Основные понятия: 

1) ***Многофакторная аутентификация*** - использует несколько технологий для аутентификации личности пользователя. С MFA пользователи должны комбинировать технологии проверки как минимум из двух разных групп или факторов аутентификации. Эти факторы делятся на три категории: **то, что вы знаете** (обычно это пароль, PIN-код или кодовая фраза, или набор секретных вопросов и соответствующие ответы на них, известные только человеку), **что у вас есть** (токены или смарт-карты, которые генерировали одноразовый пароль или код доступа (OTP), приложение-аутентификатор для генерации ключей безопасности OTP), **и то, чем вы являетесь** (биометрические данные о человеке варьируются от отпечатков пальцев, сканирования сетчатки глаза). 

2) ***SSH*** - это Secure Shell (безопасная оболочка), специальный протокол для передачи данных в безопасном режиме. Он очень часто применяется для удаленного управления компьютерами и устройствами по сети.

![](https://i.imgur.com/nx2ezOo.png)


## Начало работы:

### 1) Необходимо установить на свой смартфон приложение-аутентификатор для генерации ключей безопасности (OTP). Такими приложениями могут быть: Google Authenticator, FreeOTP или же Microsoft Authenticator.

> Я буду использовать Google Authenticator

### 2) После установки приложения на смартфон, нужно установить Google Authenticator и на свою машинку:

> sudo apt install libpam-google-authenticator

### 3) Сгнерирую начальный токен для пользователя:

> $ google-authenticator

Будет выведен qr-код, который необходимо отсканировать приложением-аутентификатором:

![](https://i.imgur.com/tSqCL2j.png)

После сканирования qr-кода во второй строке будет нужно ввести код, который появится в приложении-аутентификаторе:

![](https://i.imgur.com/yglwR3b.png)

Далее произойдет стандартная настройка: 

1) Do you want me to update your "~/.google_authenticator" file (y/n) y

> Если вы выберете у, ключи и параметры в файле .google_authenticator будут обновлены. А при ответе no программа завершит работу и ничего не запишет в файл, в результате чего аутентификация не будет работать.

2) Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y

> Этот параметр позволяет предотвратить навязывание пакетов, потому что каждый код станет недействителен после использования, и злоумышленник не сможет ввести уже использованный код (если даже ему удастся его перехватить).

3) By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between the authentication server and client. Suppose you experience problems with poor time synchronization. In that case, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the eight previous codes, the current code, and the eight next codes). This will permit a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) y

> При ответе yes эта опция будет создавать до 17 валидных кодов в скользящем окне в течение 4 минут. Если вы ответите no, их количество будет ограничено до 3 валидных кодов в полторы минуты – это более безопасный выбор. Позже вы сможете изменить эту настройку в файле .google_authenticator, который хранится в корне вашего домашнего каталога.

4) If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than three login attempts every 30s. Do you want to enable rate-limiting (y/n) y

> Этот параметр ограничит количество попыток угадать код: удаленному злоумышленнику дается всего несколько попыток ввести правильное значение, после чего ввод блокируется на некоторое время. Если ранее вы не настраивали ограничение скорости ввода непосредственно в SSH, сделайте это сейчас – это отличный способ укрепить защиту системы.

### 4)  Настройка SSH:

> Важное замечание: выполнять настройку не от root!

1) Итак, создайте резервную копию конфигурационного файла sshd:

> sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak

2) Откройте его в текстовом редакторе:

> sudo nano /etc/pam.d/sshd

3) В конец файла вставьте:

> auth required pam_google_authenticator.so nullok
> auth required pam_permit.so

Параметр nullok в конце предпоследней строки включает поддержку разных методов аутентификации. Это значит, что пользователи, у которых нет TOTP-ключа, смогут использовать SSH-ключи для входа. Если TOTP-ключи есть у всех ваших пользователей, nullok можно удалить, чтобы сделать MFA обязательной для всех.

Вторая строка, pam_permit.so, разрешит аутентификацию, если пользователь не применяет токен MFA для входа в систему. Любой метод входа требует ответ SUCCESS, чтобы разрешить аутентификацию. Если пользователь не поддерживает инструмента многофакторной аутентификации, опция nullok возвращает IGNORE для аутентификации по интерактивной клавиатуре. Затем pam_permit.so возвращает SUCCESS, что позволяет продолжить аутентификацию.

4) Сохраните и закройте файл комбинацией клавиш (Ctrl+O --> Enter --> Ctrl+X)
5) Затем нам нужно настроить SSH для поддержки этого типа аутентификации.
6) Откройте конфигурацию SSH:

> sudo nano /etc/ssh/sshd_config

7) Найдите здесь строку "Change to yes to enable challenge-response passwords (beware issues with some PAM modules and threads) и установите значение yes:

> ChallengeResponseAuthentication yes

8)  Сохраните и закройте файл комбинацией клавиш (Ctrl+O --> Enter --> Ctrl+X)
9) Перезапустите SSH, чтобы обновить настройки:

> sudo systemctl restart sshd.service

### 5)  Проверка работоспособности:

Чтобы убедиться, что все работает правильно, откройте новый терминал и попробуйте создать SSH-подключение.

1) Введите пароль пользователя;
2) Зайдите в приложение-аутентификатор и введите полученный из него код.

![](https://i.imgur.com/5nUoipY.png)

### 6)  Если что-то идёт не так:

Иногда возникает ситуация, когда вы теряете или меняете свое мобильное устройство. В этом случае вам придется переустановить приложение google-authenticator и зарегистрировать секретный ключ, чтобы начать генерировать токены.

Если вы заблокированы в системе, то вам придется войти непосредственно на сервер, чтобы создать новые секретные ключи для регистрации и использования. Но есть и альтернативный подход, когда вы можете войти в систему по ssh и сгенерировать ключи вновь.

Помните коды, которые генерируются на начальном этапе? Вы можете использовать аварийный скретч-код в качестве маркера для входа в систему. Каждый скретч-код можно использовать только один раз. Сохраните его в надежном месте, чтобы он мог быть использован в нужный момент.

Коды сохраняются в файле ~/.google_authenticator.

> $ cat ~/.google_authenticator

## Вывод о проделанной работе:

Только что вы настроили двухфакторную аутентификацию (SSH-ключ + токен), которая обрабатывается по двум разным каналам (компьютер + телефон). Подобная настройка почти полностью исключает возможность взлома и brute force атак, а также существенно увеличивает защиту машины от злоумышленников.

Запомните: повышая уровень безопасности системы, вы отвечаете за ее управление. Будьте очень внимательны. Следите за сохранностью ключей SSH и секретных ключей TOTP.