
Я хочу настроить sftp на своем сервере так, чтобы к нему имел доступ пользователь root.
Я изменил конфигурацию на /etc/ssh/sshd_config
:
PermitRootLogin yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords yes
ChallengeResponseAuthentication no
Compression no
ClientAliveInterval 15
ClientAliveCountMax 4
#Other options are commented
[...]
Subsystem sftp /usr/libexec/sftp-server
Match user root
ChrootDirectory /
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
Это работает, и я могу подключиться по sftp к своему серверу, но теперь я больше не могу подключиться по ssh. Я получил это сообщение:
This service allows sftp connections only.
То же самое происходит сMatch group root
Как настроить sftp так, чтобы разрешить root, но при этом оставить ssh?
Обновлять:
Комментарий ForceCommand internal-sftp option ssh по-прежнему работает, но я не могу подключиться по sftp. sshd_config:Subsystem sftp /usr/libexec/sftp-server
Match user root
ChrootDirectory /
X11Forwarding no
AllowTcpForwarding no
#ForceCommand internal-sftp
Ошибка:
user@notebook:~$ sftp root@my_device
Warning: the ECDSA host key for 'my_device' differs from the key for the IP address 'xx.xx.xx.xx'
Offending key for IP in /home/myUser/.ssh/known_hosts:78
Matching host key in /home/myUer/.ssh/known_hosts:93
Are you sure you want to continue connecting (yes/no)? yes
Connection closed.
Connection closed
На стороне сервера:
root@my_device:~# cat /var/log/auth.log | grep ssh
2024-01-17T19:25:21.659884+00:00 my_device sshd[30592]: Accepted none for root from xx.xx.xx.xx port 38024 ssh2
2024-01-17T19:25:21.881328+00:00 my_device sshd[30592]: Received disconnect from xx.xx.xx.xx port 38024:11: disconnected by user
2024-01-17T19:25:21.881997+00:00 my_device sshd[30592]: Disconnected from user root xx.xx.xx.xx port 38024
Примечание: Если я также удалю, Subsystem sftp /usr/libexec/sftp-server
то при попытке подключения по sftp возникнет другая ошибка:
subsystem request failed on channel 0
решение1
Директива ForceCommand
позволяет использовать sftp только пользователю root, попробуйте закомментировать эту строку.
решение2
Страница руководства OpenSSHsshd_config(5)описывает это:
Принудительно выполняет команду, указанную с помощью
ForceCommand
, игнорируя любую команду, предоставленную клиентом, и~/.ssh/rc
если она присутствует. Команда вызывается с помощью оболочки входа пользователя с опцией-c
. Это относится к выполнению оболочки, команды или подсистемы. Это наиболее полезно внутри блокаMatch
. Команда, изначально предоставленная клиентом, доступна вSSH_ORIGINAL_COMMAND
переменной окружения. Указание командыinternal-sftp
приведет к принудительному использованию внутрипроцессного SFTP-сервера, который не требует файлов поддержки при использовании сChrootDirectory
. Значение по умолчанию —none
.
Как здесь сказано, ForceCommand internal-sftp
разрешен только SFTP.
Более того,PermitRootLogin yes
опасен, так как включает аутентификацию по паролю для root, иChrootDirectory /
на самом деле не является ограничивающимchroot-тюрьмавообще. Рекомендуется
- использовать аутентификацию с открытым ключом или вообще
root
отключить вход в системуroot
- использовать
sudo
вместо прямогоroot
входа - использовать аутентификацию с открытым ключом для всех пользователей, имеющих
sudo
привилегии - использовать пароль для
sudo
(вместе с предыдущим это фактически является MFA для повышения привилегий).
Я постоянно напоминаю об этом, поскольку Server Fault предназначен для вопросов, связанных с бизнес-средами, а ваша текущая конфигурация не демонстрирует разумных практик в этом контексте.
решение3
Вы можете попробовать запустить этот сценарий Ansible, который проверит вашу конфигурацию SSH и создаст безопасную конфигурацию SSH. https://github.com/dev-sec/ansible-collection-hardening/tree/master/roles/ssh_hardening
После запуска вам нужно будет только разрешить rootlogin в sshd_config, после чего и ssh, и sftp должны работать.
решение4
Ну, проблема здесь была в том, что этого /usr/libexec/sftp-server
не существует на стороне сервера. Я добавил его в образ с новой сборкой Yocto, а затем смог подключиться по ssh и sftp с правами root, используя конфигурацию по умолчанию:
# override default of no subsystems
Subsystem sftp /usr/libexec/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server