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

32

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

Я пробовал:

# passwd -u username
passwd: unlocking the password would result in a passwordless account.
You should set a password with usermod -p to unlock the password of this account.

Записи журнала авторизации:

Mar 28 00:00:00 vm11111 sshd[11111]: User username not allowed because account is locked
Mar 28 00:00:00 vm11111 sshd[11111]: input_userauth_request: invalid user username [preauth]
kravemir
источник
Вы должны (IMHO) сделать это для всех пользователей ... простая конфигурация, когда вы делаете это для всего sshd
Skaperen
passwd -uплохая идея Смотрите ответ Джайлза ниже.
Питер Дженкинс

Ответы:

15

Разблокируйте учетную запись и дайте пользователю сложный пароль, как подсказывает @Skaperen.

Отредактируйте /etc/ssh/sshd_configи убедитесь, что у вас есть:

PasswordAuthentication no

Убедитесь, что строка не закомментирована ( #в начале) и сохраните файл. Наконец, перезапустите sshdсервис.

Прежде чем сделать это, убедитесь, что ваша аутентификация с открытым ключом работает в первую очередь.

Если вам нужно сделать это только для одного (или небольшого числа) пользователей, оставьте PasswordAuthenticationвключенным и вместо этого используйте Match User:

Match User miro, alice, bob
    PasswordAuthentication no

Поместите в конец файла, как он действителен до следующей Matchкоманды или EOF.

Вы также можете использовать Match Group <group name>или отрицаниеMatch User !bloggs

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

PasswordAuthentication no
.
.
.
Match <lame user>
    PasswordAuthentication yes
garethTheRed
источник
У меня сложилось впечатление, что Миро хотел отключить пароль только для одного использования. но смотри мой предыдущий комментарий
Skaperen
@Skaperen - вы могли бы быть правы. Я немного изменил свой ответ.
garethTheRed
Этот Matchсинтаксис выглядит хорошо, но я собираюсь попробовать его в обратном порядке. Включить логин с паролем для (несколько хромых) пользователей.
Кравемир
@Miro - Это хорошая идея, я добавил ее в свой ответ для дальнейшего использования.
garethTheRed
37

Что бы вы ни делали, не оставляйте учетную запись в оставленном состоянии passwd -uс пустым полем пароля: это позволяет входить в систему без ввода пароля (кроме как через SSH, потому что SSH отказывается от этого).

Измените учетную запись, чтобы не иметь пароля, но быть разблокированным. У учетной записи нет пароля, если хэш пароля в базе данных паролей не является хешем какой-либо строки. Традиционно для этого используется односимвольная строка, такая как *или !.

Заблокированные учетные записи также используют специальный маркер в поле пароля, чтобы строка не была хешем какой-либо строки. Маркер зависит от системы. В Linux passwdкоманда помечает заблокированные пароли, ставя !в начале, а OpenSSH рассматривает учетную запись как заблокированную, если поле начинается с !. Другие варианты Unix, как правило, используют похожие, но не идентичные механизмы, поэтому позаботьтесь о том, чтобы ваша база паролей использовалась в гетерогенной сети.

В Linux вы можете отключить основанный на пароле доступ к учетной записи, одновременно разрешая доступ SSH (с помощью другого метода аутентификации, обычно пары ключей) с

usermod -p '*' username

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

Если вы хотите, вы можете вместо этого настроить SSH на отказ от аутентификации по паролю, независимо от того, есть ли у учетной записи пароль. Вам все равно нужно будет принять меры к тому, чтобы SSH не считал учетную запись заблокированной, поэтому, например, в Linux вам нужно будет удалить поле !из пароля (но не делайте это поле пустым - установите его так, *как описано выше). ). Чтобы отключить аутентификацию по паролю для SSH, добавьте PasswordAuthenticationдирективу /etc/sshd_configили /etc/ssh/sshd_config(в зависимости от того, какая она есть в вашей системе). Используйте Matchблок, чтобы эта директива применялась только к конкретному пользователю; Matchблоки должны появиться

…
Match User username
    PasswordAuthentication no
Жиль "ТАК - прекрати быть злым"
источник
6
Спасибо - usermod -p '*' usernameсработал брелок!
Homme Zwaagstra
1
OpenSSHd позволяет заблокированным пользователям (то есть хэшу пароля с !префиксом) войти в систему с помощью другого метода аутентификации, если UsePAM yesон установлен в sshd_config. Это, вероятно, значение по умолчанию для большинства дистрибутивов (например, для Fedora).
maxschlepzig
1
У меня есть встроенная система без PAM, поэтому различие между « '*'против» '!'очень полезно.
jpkotta
8

Вам не нужно включать или устанавливать пароли, и вы действительно не должны, если вы уже используете сильные клавиши. Просто заблокируйте свою учетную запись (sudo passwd -l username) из существующего сеанса и исправьте конфигурацию SSH.

Причина этого, вероятно, заключается в том, что вы отредактировали один из параметров демона SSH по умолчанию (в / etc / ssh / sshd_config).

Измените это в / etc / ssh / sshd_config и перезапустите SSH:

UsePAM yes

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

Подсказка при работе с SSH: оставляйте открытым другой сеанс (в другом окне) всякий раз, когда вносите изменения в конфигурацию SSH, а затем проверяйте, можете ли вы по-прежнему входить в систему; если вы случайно заблокировали свой доступ, используйте текущий сеанс, чтобы исправить это.

(Отказ от ответственности: я работаю в Userify, которая предоставляет программное обеспечение для управления ключами SSH.)

Джеймисон Беккер
источник
0

У меня была эта проблема в CentOS 7. Я обычный пользователь Linux на основе Debian, поэтому я был рыбой из воды. Я заметил, что на некоторых серверах это работало, а на одном - нет. Audit.log не сказал ничего полезного, и secure.log тоже ничего не дал. Я обнаружил, что единственное реальное различие заключается в некоторых различиях контекста безопасности в файлах и каталогах между теми, которые работали, и теми, которые не работали. Получить безопасность с

sudo ls -laZ <user-home>/.ssh

каталога (я предполагаю, что по умолчанию в sshd_config много настроек).

Вы должны увидеть некоторые ssh_home_tи user_home_tатрибуты. Если вы этого не сделаете, используйте chconкоманду, чтобы добавить недостающие атрибуты.

Например

home="$(getent passwd <user> | cut -d: -f6)"
sudo chcon -R unconfined_u:object_r:ssh_home_t:s0 "$home".ssh
sudo chcon unconfined_u:object_r:user_home_t:s0 "$home"

В моем случае я подозреваю, что пользователь был создан нестандартным способом. Его дом был каталогом /var/lib.

Больше информации в: https://www.linuxquestions.org/questions/linux-security-4/selinux-preventing-ssh-login-with-~-ssh-authorized_keys-4175469538/

hanzo2001
источник
-2

разблокировать аккаунт и изменить пароль на случайную строку

Skaperen
источник