Как разрешить вход по паролю в 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.