К новому году я хотел запустить какой-нибудь публично доступный проект - и тогда мне пришла в голову идея написать CLI-приложение и “раздать” доступ к нему по SSH. В этой статье разберемся, как такое сделать без рисков безопасности для сервера
Будьте внимательны! Часть действий в статье может вас лишить доступа к серверу. Действия выполняются на Debian 12
¶ Как это работает?
Для реализации такого процесса, мы будем использовать директиву ForceCommand
. Она позволяет установить команду для выполнения вне зависимости от желания подключаемого пользователя. Попутно, обеспечим безопасность сервера при помощи выключения ряда функций SSH-сервера.
Реализация позволяет установить для разных пользователей и групп разные команды.
¶ Устанавливаем SSH сервер
Если у вас есть доступ к консоли сервера, то потребуется в первую очередь вообще установить SSH-сервер.
Для выполнения команды требуется sudo
или root-доступ.
apt-get update && apt-get install openssh-server -y
¶ Клонируем SSH-сервер
Наверняка, вы захотите оставить себе доступ по SSH. Поэтому, нам придется запустить два SSH-сервера, один из которых мы будем использовать под наше приложение. Найдем, где лежит файл сервиса systemd, отвечающий за SSHD.
systemctl show -P FragmentPath sshd
Скопируем этот файл чтобы создать свою копию сервера. Копию создадим в директории /etc/systemd/system/sshd-copy.service
. Используем флаг --dereference
для того, чтобы не создать символьную ссылку на файл.
Для выполнения команды требуется sudo
или root-доступ.
# одной командой
cp --dereference $(systemctl show -P FragmentPath sshd) /etc/systemd/system/sshd-copy.service
Отредактируем полученный файл, потребуется отредактировать строку ExecStart=
, где мы явно укажем конфигурационный файл, который нужно будет использовать
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS -f /etc/ssh/sshd_config_copy
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Alias=sshd-ny.service
Создадим теперь нужный нам конфигурационный файл.
Для выполнения команды требуется sudo
или root-доступ.
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_copy
Теперь нам нужно определиться на каком порту будет работать каждый из SSH серверов. Для того чтобы поменять порт оригинального сервера, через который вы будете далее подключаться к серверу откройте файл /etc/ssh/sshd_config
и отредактируйте строку Port
(возможно, потребуется раскомментировать). Откройте порты при помощи фаерволла перед этим действием!. В данной статье, я перенесу оригинальный SSH сервер на 23 порт.
Для выполнения команды требуется sudo
или root-доступ.
nano /etc/ssh/sshd_config
Конфиг будет выглядеть примерно так:
Include /etc/ssh/sshd_config.d/*.conf
Port 23
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
# < ... >
После разрешения конфликтов c портами, можем ввести в работу оба сервера:
Для выполнения команды требуется sudo
или root-доступ.
systemctl daemon-reload
systemctl restart sshd
systemctl restart sshd-copy
¶ Дополнительные настройки SSH
¶ Ограничиваем пользователей (необязательно)
В первую очередь, стоит ограничить список пользователей, которые смогут зайти. В нашем примере, создадим пользователя demo
и разрешим подключение только для него.
Для выполнения команды требуется sudo
или root-доступ.
useradd demo
Установите пароль по желанию командой passwd demo
или установите пустой командой passwd -d demo
.
Для ограничения списка пользователей допишите в /etc/ssh/sshd_config_copy
:
# через пробел можно указать неограниченное количество пользователей
AllowUsers demo
Для ограничения по принципу групп пользователей, используйте AllowGroups
.
¶ Отключаем вход для root (необязательно)
Для ограничения входа пользователя root через наш сервер найдите строку PermitRootLogin
в файле /etc/ssh/sshd_config_copy
и приведите к виду
PermitRootLogin no
¶ Отключаем форвадинг портов и X-приложений
Добавьте в /etc/ssh/sshd_config_copy
строку
AllowTcpForwarding no
и приведите строку X11Forwarding
к виду:
X11Forwarding no
¶ Отключаем передачу файлов по SFTP
Закомментируйте в /etc/ssh/sshd_config_copy
строку:
Subsystem sftp /usr/lib/openssh/sftp-server
¶ Разрешаем вход по пустому паролю
Добавьте в /etc/ssh/sshd_config_copy
строку:
PermitEmptyPasswords yes
¶ Устанавливаем запуск приложения
Не забудьте перезагрузить SSH-сервер после смены настроек командой systemctl restart sshd-copy
!
Для установки глобальной команды запуска поместите директиву ForceCommand
в корень конфигурационного файла. Например, при помощи этой команды можно каждые 5 секунд выводить дату и время
ForceCommand watch -n 5 echo 'Today is $(date)'
Если требуется для отдельного пользователя установить свою команду, то используйте ForceCommand
с конструкцией Match
# запускаем обычную консоль для админа
Match User admin
ForceCommand /bin/sh
Также есть фильтр по группе.
Match Group monitoring
ForceCommand /usr/bin/top