Пароль с истекшим сроком действия и логин на основе ключа SSH с UsePAM yes

12

Есть машина SLES 11. Пользователи входят в систему через SSH и pubkey (смешанные, некоторые используют пароль, некоторые используют ключ ssh)

Sshd_config имеет:

UsePAM yes
PasswordAuthentication yes
PubkeyAuthentication yes

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

Вопрос: Как мы можем настроить конфигурацию PAM или sshd, чтобы пользователи могли войти в систему, если у них есть действительный ключ SSH и срок действия пароля истек? - Не выскакивая «смени пароль».

ОБНОВЛЕНИЕ № 1: Решение не может быть: «UsePAM нет»

SERVER:~ # cat /etc/pam.d/sshd 
#%PAM-1.0
auth        requisite   pam_nologin.so
auth        include     common-auth
account     requisite   pam_nologin.so
account     include     common-account
password    include     common-password
session     required    pam_loginuid.so
session     include     common-session
SERVER:~ # 

ОБНОВЛЕНИЕ № 2: Решение не может быть: установить пароль пользователя, чтобы никогда не истек

UPDATE # 3:

SERVER:/etc/pam.d # cat common-account
#%PAM-1.0
...
account required    pam_unix2.so    
account required    pam_tally.so
SERVER:/etc/pam.d # 
thequestionthequestion
источник
Возможно, вы сможете сделать это, удалив pam_unix.soиз sessionраздела /etc/pam.d/sshd(и замените его на, pam_lastlog.soесли его там нет. Я не уверен, pam_unix.so/sessionчто тот делает это или нет, но кажется, что это правильное место.
Патрик
1
установить учетную запись пользователя, чтобы никогда не истек :)
Raza
@Raza: Спасибо :) отличная идея, но не может быть решение :(
thequestionthequestion
попробуйте ForcedPasswdChange Noэто для SSH1
Raza
1
Я понял, что ForcedPasswdChange Noне будет работать после истечения срока. Вы ищете решение, которое позволит просроченному пользователю войти в систему
Raza

Ответы:

10

Порядок операций, вызывающих запрос пароля с истекшим сроком действия, следующий:

  • SSH выполняет accountэтап PAM , который проверяет, что учетная запись существует и является действительной. На accountуведомления сценические , что срок действия пароля истек, и позволяет SSH знать.
  • SSH выполняет аутентификацию на основе ключей. Для этого ему не нужен PAM, поэтому он не работает на authсцене. Затем он устанавливает сеанс входа в систему SSH и запускает sessionэтап PAM .
  • Затем SSH запоминает, что PAM сообщил, что срок действия пароля истек, печатает предупреждающее сообщение и просит PAM попросить пользователя изменить пароль. SSH затем отключается.

Все это делает SSH, и я не вижу никаких параметров SSH для настройки этого поведения. Поэтому, если вы не хотите создать собственную версию SSH и / или PAM, я вижу только один вариант - запретить PAM сообщать SSH об истекшем пароле. Если вы сделаете это, он полностью отключит проверку пароля с истекшим сроком действия через SSH , даже если пользователь входит в систему через пароль SSH. Другие (не SSH) методы входа по-прежнему будут проверять срок действия пароля.

В вашем текущем pam.d/sshdфайле есть account include common-accountзапись. Я предполагаю, что есть common-accountфайл, который содержит ссылку на pam_unix.so. Это строка, которая проверяет истекший пароль.

Вы, вероятно, не хотите трогать сам common-accountфайл, так как он используется для других методов входа в систему. Вместо этого вы хотите удалить includeиз вашего pam.d/sshdфайла. Если common-accountпомимо этого есть другие функции pam_unix.so, вы, вероятно, захотите поместить их непосредственно в pam.d/sshd.

Наконец, помните, что это изменение безопасности вашей системы, и вы не должны слепо доверять мне, чтобы дать вам хороший совет. Узнайте, как работает PAM, если вы не знакомы с ним. Некоторые стартовые места может быть man 7 PAM, man 5 pam.confи man 8 pam_unix.

Jander
источник
Хорошее объяснение порядка операций, спасибо.
M_dk
3

В pam_unix.so была добавлена ​​опция (около февраля 2016 г.), которая называется no_pass_expiry ( здесь можно изменить исходный код или страницу руководства ). По сути, он говорит pam_unix игнорировать просроченный пароль, если для аутентификации использовалось что-то отличное от pam_unix, например, если sshd выполнил аутентификацию.

В результате, если у вас есть версия pam_unix.so, содержащая эту опцию, вы сможете настроить PAM для:

  1. Все еще предупреждаю, но не требую изменения пароля с истекшим сроком, если ключ SSH использовался для аутентификации через ssh
  2. Требовать смену пароля с истекшим сроком действия пароля, если для аутентификации через ssh использовался логин / пароль через pam_unix.so
  3. Не влияет на любую другую последовательность аутентификации (например, через сервис входа в систему).

Например, я сконфигурировал сервер RHEL 7 для выполнения вышеизложенного, просто обновив /etc/pam.d/sshd и добавив pam_unix.so no_pass_expiry как к типу учетной записи, так и к типу пароля, например

account    required    pam_nologin.so
account    sufficient  pam_unix.so no_pass_expiry
account    include     password-auth
password   sufficient  pam_unix.so no_pass_expiry
password   include     password-auth
Тодд
источник
1
Просто попробовал это, и это работает. Вы можете проверить, поддерживает ли ваша PAM эту опцию или нет, выполнив поиск "no_pass_expiry" или нет на странице man "man 8 pam_unix".
Томофуми
Изменения кода с 2016 года по-прежнему нет в Ubuntu 18.04 ... :(
ColinM
0
  • Возможно, вы не захотите менять свой PAM или sshd_config по соображениям соответствия.
  • Возможно, вы используете PasswordAuthentication no в sshd_config
  • Вы могли иметь случайные пароли.
  • Возможно, вы даже внедрили соответствие СНГ.
  • Тем не менее ваши пользователи получают подсказку

Затем root может настроить дату изменения пароля:

for user in `grep ":x:[0-9]\{4\}" /etc/passwd|cut -d: -f1`; do chage -d today $user; done
bbaassssiiee
источник