Данная статья является частью серии статей: Виртуальная машина для pet-проектов
И является продолжением статьи Создание новой ВМ. Настройка сети. Доступ по SSH
Для генерации паролей TOTP я буду использовать Kaspersky Password Manager, но вы можете использовать любые другие программы, которые поддерживают TOTP, например, Яндекс Ключ.
Помимо подключения по TOTP мы добавим:
- Ограничение на число подключений
- Ограничение на число ошибок ввода
- Ограничим время ожидания ввода пароля
- Блокировку по IP на час
Вводные данные
- На телефоне программа: Kaspersky Password Manager
- ОС: Ubuntu 22.04 в облаке Cloud.ru.
- user1: имеет права sudo
- user2: не имеет прав sudo
- Цель: user2 может подключаться по SSH по Паролю+TOTP
Установка модуля PAM для TOTP
Нужно для настройки двухфакторной аутентификации
sudo apt install libpam-google-authenticator -y
Я скачиваю программу от Google, т.к. она бесплатная и работает локально (т.е. в google не передает данные), но можно использовать другие аналоги, в т.ч. российские.
Генерация TOTP-секрета для user2
Переходим на user2
su - user2
Выполняем команду (Лучше не выполнять команду через Серийную консоль)
google-authenticator
Появится опрос.
- Генерируем токен
Do you want authentication tokens to be time-based y
Появится QR code
Снизу просят ввести код из приложения.
Сканируем QR code в приложении Kaspersky Password Manager, для этого заходим в приложение и нажимаем: плюс - Аутентификатор - Сканировать QR
В Kaspersky Password Manager появится блок с автогенерацией пароля. Сгенерированное число из 6 цифр. Надо его ввести в терминал. Надо это делать быстро, иначе придется вводить вновь сгенерированное число.
После в консоли появятся числа на случай восстановления доступа. Это резервные скретч-коды, их можно сохранить, например, в тот же Kaspersky Password Manager.
После этого опрос продолжится.
- Соглашаемся обновить файл .google_authenticator
Do you want me to update your "/home/tano/.google_authenticator" file? (y/n) y
- Запрещаем повторно использовать код
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
- Оставляем стандартные 30 сек (безопаснее)
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 authentication server and client. If you
experience problems with poor time synchronization, 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 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
Do you want to do so? (y/n) n
- Включаем лимит попыток ввода
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 3 login attempts every 30s.
Do you want to enable rate-limiting? (y/n) y
Защищаем файл с секретами
chmod 600 ~/.google_authenticator
Настраиваем PAM
Возвращаемся на пользователя с sudo
su – user1
Открываем файл /etc/pam.d/sshd
sudo vim /etc/pam.d/sshd
Сверху находим строку, переходим в режим редактирования i
@include common-auth
Ниже этой записи прописываем новую:
auth required pam_google_authenticator.so
Это настройка последовательности аутентификации, т.е. сначала будет проверка пароля, потом будет проверка TOTP
Выходим из режима редактирования ESC
Сохраняемся и выходим из файла :wq!
Настраиваем SSH подключение к ВМ через Логин+TOTP
Правим файл sudo vim /etc/ssh/sshd_config
Переходим в режим редактирования i
В прошлой статье мы уже делали настройки
#Include /etc/ssh/sshd_config.d/*.conf
PasswordAuthentication yes
PermitEmptyPasswords no
PubkeyAuthentication no
PermitRootLogin no
AllowUsers user2
Предыдущие настройки можем оставить и добавить новые:
Вводим ограничения на кол-во попыток ввода, время ожидания ввода и кол-во сессий
MaxAuthTries 3
LoginGraceTime 30
MaxSessions 3
Указываем настройки интерактивного ввода пароля.
KbdInteractiveAuthentication yes
ChallengeResponseAuthentication yes
Выходим из редактирования ESC
Сохраняемся командой :wq!
Проверяем синтаксис
sudo sshd -t
Если ошибок нет, перезапускаем SSH
sudo systemctl restart sshd
Настройка блокировки по IP
Устанавливаем fail2ban
sudo apt install fail2ban -y
Создаем конфиг для SSH
sudo vim /etc/fail2ban/jail.local
В файл прописываем строки:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
banaction = iptables-multiport
banaction_allports = iptables-allports
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 3600
Важные пояснения:
- maxretry = 3 — после 3 неудачных попыток IP блокируется.
- findtime = 600 — эти 3 попытки должны быть в течение 10 минут.
- bantime = 3600 — блокировка на 1 час.
Перезапуск службы
sudo systemctl restart fail2ban
sudo systemctl status fail2ban
На этом всё, можно пробовать зайти по ssh с телефона или иного устройства.
Теперь доступ по SSH осуществляется только для user2 и сначала запрашивается обычный пароль, а потом Verification code - это код TOTP, который генерируется в приложении Kaspersky Password Manager