Что означает ошибка Permission denied
Ошибка SSH Permission denied (доступ запрещён) появляется, когда SSH-демон (sshd) на целевом сервере отказывает в аутентификации. Сообщение может выглядеть так:
Permission denied (publickey,password).
Или, если используется конкретный метод:
Permission denied (publickey).
Ошибка возникает на этапе аутентификации, то есть соединение установлено, но сервер не пропускает пользователя. Это не сетевой сбой (в отличие от Connection refused), а проблема с учетными данными или настройками безопасности.
Причины возникновения
- Неверные учетные данные — ошибочный логин, пароль или использование не того приватного ключа.
- Неправильные права на файлы
~/.ssh— на сервере папка.sshили файлauthorized_keysдолжны иметь строгие права (700 и 600 соответственно) и принадлежать целевому пользователю. - Отключенные методы аутентификации в
sshd_config— например,PasswordAuthentication noпри попытке входа по паролю. - Пользователь заблокирован или не имеет оболочки — в
/etc/passwdу пользователя стоит/usr/sbin/nologinили/bin/false. - SELinux/AppArmor — контекст безопасности мешает доступу к
~/.ssh. - Блокировка по IP — через
fail2ban,denyhostsилиhosts.deny. - Несоответствие ключей — публичный ключ на сервере не соответствует приватному на клиенте.
- Ограничения в
sshd_config—AllowUsers,DenyUsers,AllowGroups,DenyGroupsисключают пользователя. - Проблемы с хост-ключами — хотя обычно это вызывает другое предупреждение, иногда может влиять на аутентификацию.
Способ 1: Проверка учетных данных и базовые шаги
Убедитесь, что вы пытаетесь войти с правильным именем пользователя и методом аутентификации.
- Укажите пользователя явно в команде:
ssh -l username server_ip
илиssh username@server_ip - При использовании ключа проверьте, что приватный ключ загружен в
ssh-agent:ssh-add -l
Если список пуст, добавьте ключ:ssh-add ~/.ssh/id_rsa
Или укажите ключ напрямую:ssh -i ~/.ssh/id_rsa username@server_ip - При использовании пароля убедитесь, что пароль верный и для учетной записи не установлены ограничения (например, срок действия пароля истек).
- Проверьте, доступен ли сервер (сетевой层面的):
ping server_ip nc -zv server_ip 22
💡 Совет: Если вы не уверены, какой метод аутентификации используется, попробуйте явно указать
-o PubkeyAuthentication=noдля пароля или-o PreferredAuthentications=publickeyдля ключа.
Способ 2: Исправление прав на файлы .ssh на сервере
Неправильные права — самая частая причина. Подключитесь к серверу через консоль (если есть физический доступ) или используйте альтернативный метод (например, через веб-консоль облачного провайдера).
- Войдите на сервер под учетной записью, к которой пытаетесь подключиться по SSH (или под root).
- Проверьте текущие права:
ls -la ~/.ssh
Ожидаемый вывод:drwx------ 2 user user 4096 Feb 16 12:00 . drwxr-xr-x 5 user user 4096 Feb 16 12:00 .. -rw------- 1 user user 400 Feb 16 12:00 authorized_keys - Исправьте права:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chown -R $(whoami):$(whoami) ~/.ssh - Для SELinux (если используется):
restorecon -Rv ~/.ssh - Перезапустите SSH-демон:
sudo systemctl restart sshd
Способ 3: Проверка и настройка sshd_config
Конфигурационный файл sshd_config может блокировать аутентификацию.
- Откройте файл:
sudo nano /etc/ssh/sshd_config
илиsudo vi /etc/ssh/sshd_config - Убедитесь, что строки имеют правильные значения:
PubkeyAuthentication yes PasswordAuthentication yes # если используете пароль PermitRootLogin no # или prohibit-password, но не yes для безопасности ChallengeResponseAuthentication no UsePAM yes - Проверьте директивы доступа:
- Если есть
AllowUsersилиAllowGroups, убедитесь, что ваш пользователь указан. - Если есть
DenyUsersилиDenyGroups, убедитесь, что ваш пользователь не в списке.
- Если есть
- Перезагрузите конфигурацию:
sudo systemctl restart sshd
Или проверьте синтаксис перед перезагрузкой:sudo sshd -t - Если меняли порт (через
Port), убедитесь, что подключаетесь к правильному порту:ssh -p 2222 username@server_ip
Способ 4: Анализ логов SSH
Логи содержат точную причину отказа.
- На сервере просмотрите логи в реальном времени при попытке подключения:
- Ubuntu/Debian:
sudo tail -f /var/log/auth.log - RHEL/CentOS/Fedora:
sudo tail -f /var/log/secure
- Ubuntu/Debian:
- Типичные записи:
Failed publickey for username from client_ip port ...: проблема с ключом.Failed password for username from client_ip port ...: неверный пароль или парольная аутентификация отключена.User username not allowed because not listed in AllowUsers: ограничение в конфиге.User username not allowed because shell /usr/sbin/nologin not listed in /etc/shells: оболочка запрещена.
- Используйте
grepдля фильтрации:sudo grep "sshd.*Failed" /var/log/auth.log
Способ 5: Проверка блокировок и SELinux/AppArmor
Проверка блокировок по IP
- Проверьте
fail2ban(если установлен):sudo fail2ban-client status sshd
Если ваш IP в списке, разблокируйте:sudo fail2ban-client set sshd unbanip client_ip - Проверьте
hosts.deny:cat /etc/hosts.deny
Если есть строкаsshd: ALLилиsshd: client_ip, удалите её или добавьте исключение вhosts.allow. - Проверьте
iptables/nftables:sudo iptables -L -n | grep 22 sudo nft list ruleset | grep 22
Проверка SELinux (RHEL/CentOS/Fedora)
- Проверьте статус:
sestatus
ЕслиEnabled, проверьте контекст~/.ssh:ls -laZ ~/.ssh
Должен бытьssh_home_tдля файлов иssh_home_dir_tдля папки. - Восстановите контекст:
sudo restorecon -Rv ~/.ssh - Если проблема persists, временно отключите SELinux для диагностики:
sudo setenforce 0
Но не оставляйте его отключённым! После диагностики найдите правильное решение (правильный контекст или политику).
Проверка AppArmor (Ubuntu/Debian)
- Проверьте профиль sshd:
sudo aa-status | grep sshd
Если профиль в режимеenforce, попробуйте перевести вcomplain:sudo aa-complain /etc/apparmor.d/usr.sbin.sshd
Перезапуститеsshdи проверьте подключение. - Если работает, настройте профиль правильно или оставьте в
complain, если нет угроз.
Способ 6: Проверка оболочки и состояния пользователя
- Убедитесь, что у пользователя есть оболочка:
grep ^username: /etc/passwd
Последнее поле должно быть/bin/bash,/bin/shили другой допустимой оболочкой из/etc/shells. Если/usr/sbin/nologinили/bin/false, измените:sudo chsh -s /bin/bash username - Проверьте, не заблокирован ли пользователь:
sudo passwd -S username
Если статусL(locked), разблокируйте:sudo passwd -u username - Проверьте, не истек ли пароль:
sudo chage -l username
Если пароль истек (Password expires), сбросьте:sudo passwd username
Профилактика
- Используйте SSH-ключи вместо паролей — они надежнее и удобнее.
- Регулярно обновляйте OpenSSH для получения исправлений уязвимостей:
sudo apt update && sudo apt upgrade openssh-server # Debian/Ubuntu sudo yum update openssh-server # RHEL/CentOS 7 sudo dnf update openssh-server # RHEL/CentOS 8+/Fedora - Настройте
sshd_configбезопасно: отключитеPasswordAuthentication, если используете ключи; ограничьте доступ черезAllowUsers. - Мониторьте логи (
/var/log/auth.logили/var/log/secure) на предмет подозрительных попыток. - Используйте фаервол (
ufw,firewalld,iptables) для ограничения порта 22 только доверенными IP. - Не используйте root-доступ напрямую — подключайтесь под обычным пользователем и повышайте права через
sudo. - Регулярно проверяйте права на
~/.sshиauthorized_keysпосле изменений в системе. - При использовании SELinux/AppArmor не отключайте их, а настраивайте политики корректно.
Если проблема не решена, проверьте сетевые настройки (NAT, облачные security groups) и аутентификацию через PAM (/etc/pam.d/sshd). В крайнем случае временно увеличьте уровень логирования в sshd_config (LogLevel VERBOSE) и перезапустите sshd для получения деталей.