sshd: отказ аутентификации из-за прав на файлы
sshd отклоняет ключи, если домашний каталог или файл с ключами доступны для записи группе или остальным. Служба при этом работает: проблема не в запуске, а в проверке прав при входе.
Что это значит
Проверка строгая нарочно: доступный для записи чужим файл с ключами означает, что вход может получить кто угодно. Сообщение об этом sshd пишет в журнал с пометкой «bad ownership or modes».
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Слишком широкие права на домашний каталог
Права 0775 или 0777 на домашнем каталоге делают ключи ненадёжными, и sshd их игнорирует.
-
Файл ключей принадлежит не тому пользователю
После копирования под root владельцем становится root, и sshd отказывается доверять файлу.
-
Домашний каталог недоступен из-за SELinux
На системах с SELinux файлу ключей нужна правильная метка. Права при этом верные, и причина не видна.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
sshd прямо пишет, какой файл его не устроил.
sudo journalctl -u ssh -n 40 --no-pager | grep -iE "bad ownership|authentication|publickey"Права и владельцы всей цепочки.
ls -ld ~ ~/.ssh ~/.ssh/authorized_keysПодробный вывод со стороны клиента: видно, какие способы входа предлагались.
ssh -vvv user@host 2>&1 | tail -25Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Права 0775 или 0777 на домашнем каталоге делают ключи ненадёжными, и sshd их игнорирует.
- Как проверить
-
Посмотрите права на каталог и файл ключей.
ls -ld /home/user /home/user/.ssh /home/user/.ssh/authorized_keys
- Как исправить
-
Приведите права к обычным: каталог 0700, файл ключей 0600.
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && chmod 750 ~
- Почему происходит
- После копирования под root владельцем становится root, и sshd отказывается доверять файлу.
- Как проверить
-
Посмотрите владельца.
ls -l /home/user/.ssh/authorized_keys
- Как исправить
-
Смените владельца на пользователя, который входит.
sudo chown -R user:user /home/user/.ssh
- Почему происходит
- На системах с SELinux файлу ключей нужна правильная метка. Права при этом верные, и причина не видна.
- Как проверить
-
Посмотрите метки и отказы.
ls -Z /home/user/.ssh/authorized_keys 2>/dev/null sudo ausearch -m avc -ts recent 2>/dev/null | tail -5
- Как исправить
-
Восстановите контексты в домашнем каталоге.
sudo restorecon -R -v /home/user/.ssh
Пример вывода
Права на домашний каталог слишком широкие. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
sshd[5100]: Authentication refused: bad ownership or modes for directory /home/user
sshd[5100]: Connection closed by authenticating user user <адрес> port N [preauth]
Связанные ошибки
- Permission denied в журнале службы Отказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
- status=224/PAM в systemd Код 224/PAM: не удалось открыть сеанс PAM для службы. Обычно нет нужного файла настроек в /etc/pam.d.
- MySQL: Can't open the mysql.plugin table и повреждение системных таблиц MySQL не запускается: недоступны или повреждены системные таблицы. Права на каталог данных, версия схемы, восстановление.
- PostgreSQL: data directory has invalid permissions Кластер PostgreSQL не запускается из-за прав на каталог данных. Требование 0700 или 0750 и как вернуть владельца.
- nginx 403 Forbidden и Permission denied на файлы сайта nginx отдаёт 403: нет прав на файлы сайта, закрыт каталог по пути, мешает SELinux или AppArmor, нет индексного файла.
- sshd: Bad configuration option и отказ запуска sshd не запускается из-за ошибки в sshd_config: неизвестный параметр, устаревшая настройка, ошибка в include.
- sshd: смена порта не действует из-за ssh.socket Порт в sshd_config игнорируется, потому что адрес слушает systemd через сокет-активацию. Где менять порт.
- status=200/CHDIR в systemd Код 200/CHDIR означает, что systemd не смог перейти в каталог из WorkingDirectory= до запуска программы. Причины и решение.
Где встречается чаще всего
Источники
- Документация OpenSSH: StrictModes
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено правами 0777 на домашнем каталоге.