Как разрешить вход по паролю в SSH: Ubuntu и Debian

Три команды на сервере:

echo 'PasswordAuthentication yes' | sudo tee /etc/ssh/sshd_config.d/00-password.conf
sudo sshd -T | grep -i passwordauthentication
sudo systemctl restart ssh

Вторая должна вывести passwordauthentication yes. В Ubuntu 24.04 вместо этого может появиться Missing privilege separation directory: /run/sshd: выполните sudo systemctl start ssh и повторите проверку. В Fedora, RHEL и AlmaLinux служба называется sshd: sudo systemctl restart sshd. Теперь подключитесь со своего компьютера:

ssh alice@server

Не закрывайте текущую сессию, пока вход по паролю не заработает. Если новый конфиг сломан, через эту сессию вы его почините.

Я проверил всё на Ubuntu 24.04 и 26.04, Debian 12 и 13: входил по паролю с другого хоста.

Почему PasswordAuthentication yes в sshd_config не работает

В 2017 году я советовал здесь поправить /etc/ssh/sshd_config. На облачном сервере это часто ничего не меняет. В начале этого файла в Ubuntu, Debian, Fedora и RHEL 9+ стоит строка:

Include /etc/ssh/sshd_config.d/*.conf

В RHEL 8 и CentOS 7 нет ни этой строки, ни каталога sshd_config.d: первая команда из начала статьи выдаст No such file or directory. Пропишите PasswordAuthentication yes прямо в /etc/ssh/sshd_config.

Для каждой опции sshd берёт первое найденное значение (sshd_config(5)). Файлы из sshd_config.d он читает раньше основного, по алфавиту. Если в одном из них написано no, правка в sshd_config не сработает. В облачных образах это обычно 50-cloud-init.conf: его пишет cloud-init по настройке ssh_pwauth. Мой файл называется 00-password.conf, чтобы оказаться в списке первым.

Кто задаёт опцию, покажет команда:

sudo sh -c 'grep -i passwordauthentication /etc/ssh/sshd_config.d/*.conf /etc/ssh/sshd_config'

Действует первая строка без #, и no можно заменить на yes в ней же. sshd читает только файлы с расширением .conf: файл 00-password он пропустит.

Без sh -c шаблон *.conf раскрывает ваша оболочка, ещё до sudo. В Fedora и RHEL 9+ содержимое sshd_config.d видит только root, поэтому grep выдаст No such file or directory и покажет один основной файл.

sshd -T показывает новое значение ещё до перезапуска. Запущенный sshd работает со старым, пока его не перезапустят.

Как подключиться по SSH с паролем

На своём компьютере:

ssh alice@server

Вместо alice подставьте своего пользователя на сервере, вместо server — IP-адрес или домен сервера. При первом подключении ssh покажет отпечаток ключа сервера: ответьте yes. Потом он спросит пароль. Символы при вводе не отображаются.

Если на компьютере есть SSH-ключи, ssh сначала пробует их. Чтобы сразу перейти к паролю:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no alice@server

Перезапуск SSH в Ubuntu 24.04: ssh, а не sshd

С версии 22.10 Ubuntu запускает sshd через сокет: порт 22 слушает systemd (ssh.socket), а ssh.service стартует при первом подключении. В 24.04 из-за этого:

  • sudo systemctl restart sshd падает с ошибкой Unit sshd.service not found. В Ubuntu 26.04 и Debian работают оба имени.
  • sudo systemctl reload ssh отвечает ssh.service is not active, cannot reload, если после загрузки ещё никто не подключался. restart работает в обоих случаях.
  • sudo sshd -t и sudo sshd -T по той же причине пишут Missing privilege separation directory: /run/sshd: systemd создаёт этот каталог, когда запускает ssh.service, и удаляет, когда служба останавливается. Выполните sudo systemctl start ssh и повторите.

Если меняете Port или ListenAddress, нужны ещё sudo systemctl daemon-reload и sudo systemctl restart ssh.socket. Так написано в README.Debian пакета.

Перед перезапуском запускайте sudo sshd -t. Если конфиг в порядке, команда ничего не выводит, иначе называет файл и строку с ошибкой. С опечаткой перезапуск не пройдёт и сервер перестанет принимать новые подключения, но открытые сессии останутся.

Как разрешить вход под root по паролю

Для root одного PasswordAuthentication yes мало. По умолчанию стоит PermitRootLogin prohibit-password: root входит только по ключу, а на верный пароль сервер отвечает Permission denied, please try again. В выводе sshd -T это значение может называться по-старому, without-password. Разрешаем вход:

echo 'PasswordAuthentication yes' | sudo tee /etc/ssh/sshd_config.d/00-password.conf
echo 'PermitRootLogin yes' | sudo tee /etc/ssh/sshd_config.d/00-root.conf
sudo passwd root
sudo systemctl restart ssh

Первая команда та же, что в начале статьи. Без неё сработает no из 50-cloud-init.conf, и root получит Permission denied (publickey).

В Ubuntu у root нет рабочего пароля сразу после установки, поэтому passwd обязателен. Безопаснее завести обычного пользователя с sudo: как создать администратора.

Пароль только для одного пользователя или сети

Чтобы пускать по паролю только одного пользователя или только из домашней сети, добавьте в конец /etc/ssh/sshd_config:

Match User alice
    PasswordAuthentication yes

Match Address 192.168.1.0/24
    PasswordAuthentication yes

Блок Match действует до следующего Match или до конца файла. Его значения перебивают глобальные, в том числе no из 50-cloud-init.conf. Что получит конкретное подключение, покажет команда:

sudo sshd -T -C user=alice,host=laptop,addr=203.0.113.5 | grep -i passwordauthentication

Пароль верный, а войти не получается

  • У пользователя нет пароля. Пользователя по умолчанию, например ubuntu, cloud-init создаёт с заблокированным входом по паролю. Задайте пароль: sudo passwd ubuntu.
  • Too many authentication failures. ssh-agent сначала предлагает серверу все ключи, и после шести неудач сервер рвёт соединение. Отключите ключи опцией -o PubkeyAuthentication=no, как в разделе «Как подключиться по SSH с паролем» выше.
  • Permission denied (publickey) без запроса пароля. Сервер не принимает пароли, проверьте sshd -T. Какие способы входа он предлагает, покажет ssh -o BatchMode=yes alice@server: если в скобках есть password, пароли включены.

Нужен ли KbdInteractiveAuthentication

Для входа по паролю не нужен: хватит PasswordAuthentication yes, а в Ubuntu и Debian по умолчанию стоит KbdInteractiveAuthentication no. Эта опция важна, когда пароли выключаете. При UsePAM yes (так в конфиге Ubuntu и Debian) KbdInteractiveAuthentication yes всё равно спросит пароль через PAM, поэтому выключайте обе. В старых конфигах, например в 50-redhat.conf на AlmaLinux, у неё прежнее имя: ChallengeResponseAuthentication.

Можно ли записать пароль в ~/.ssh/config

Нет, такой опции у клиента нет: на Password ssh ответит Bad configuration option: password. Пока вход по паролю открыт, скопируйте на сервер ключ:

ssh-copy-id alice@server

Если ключа ещё нет, создайте его командой ssh-keygen -t ed25519 (подробнее про SSH-ключи на Mac). Если скрипт не может войти по ключу, sshpass -e возьмёт пароль из переменной SSHPASS:

SSHPASS="$SERVER_PASSWORD" sshpass -e ssh -o StrictHostKeyChecking=accept-new alice@server

accept-new сохраняет ключ сервера, к которому ssh ещё не подключался. Без этой опции первое подключение остановится на вопросе о ключе хоста, и sshpass молча завершится с кодом 6.

Защита от перебора: fail2ban

Пароль можно подобрать. Ставьте длинный и включите fail2ban:

sudo apt install fail2ban
sudo fail2ban-client status sshd

В Ubuntu 24.04, 26.04 и Debian 13 jail sshd работает сразу после установки: после пяти неудачных попыток за 10 минут IP блокируется на 10 минут. В Debian 12 fail2ban не запускается: Have not found any log file for sshd jail. Debian 12 не ставит rsyslog, и файла /var/log/auth.log нет. Переключите fail2ban на журнал systemd и nftables, как в Debian 13:

printf '[DEFAULT]\nbanaction = nftables\nbanaction_allports = nftables[type=allports]\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.local
sudo systemctl restart fail2ban

Когда ключ уже на сервере, выключите пароли: впишите PasswordAuthentication no и KbdInteractiveAuthentication no в 00-password.conf и перезапустите ssh.

Консультирую по продукту, собираю MVP и учу делать продукты самостоятельно. Поработать со мной →