Двухфакторная аутентификация SSH только по внешнему адресу
У меня есть сервер Ubuntu с частным, внутренним, IP и общедоступным IP. Я хочу настроить двухфакторную аутентификацию для SSH только на публичной стороне. Это возможно? Я планировал использовать Google Authenticator, но также открыт для альтернативных идей.
2 ответа
Да, вы можете сделать это с pam_access.so
, Этот рецепт был взят из вики для Google Authenticator:
Полезный рецепт PAM - пропустить двухфакторную аутентификацию, когда соединение происходит из определенных источников. Это уже поддерживается PAM. Например, модуль pam_access может использоваться для проверки источника по локальным подсетям:
# skip one-time password if logging in from the local network auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf auth required pam_google_authenticator.so
В этом случае access-local.conf выглядит так:
# only allow from local IP range + : ALL : 10.0.0.0/24 + : ALL : LOCAL - : ALL : ALL
Таким образом, попытки входа в систему с 10.0.0.0/24 не требуют двухфакторной аутентификации.
Мое требование было очень похожим, но более конкретно я хотел: 1) иметь публичный ключ И googleAuth снаружи и 2) иметь публичный ключ ИЛИ пароль изнутри (пароль на случай, если я потеряю все свои публичные ключи):
/etc/ssh/sshd_config:
AuthenticationMethods publickey,keyboard-interactive
Match address 192.168.2.0/24
PasswordAuthentication yes
AuthenticationMethods "password" "publickey"
Match all
/etc/pam.d/sshd:
# Google Authenticator
auth [success=1 default=ignore] pam_access.so accessfile=/etc/security/access-local.conf
auth sufficient pam_google_authenticator.so
# Standard Un*x authentication.
auth [success=ignore default=4] pam_access.so accessfile=/etc/security/access-local.conf
@include common-auth
/etc/security/access-local.conf
+ : ALL : 192.168.2.0/24
- : ALL : ALL
В дополнение к предыдущему ответу мне пришлось пропустить 4 правила внутри /etc/pam.d/common-auth снаружи, а также я настроил аутентификацию Google на достаточную вместо обязательной. Я сделал это в Ubuntu 20.04, но это решение должно быть довольно общим.