Предоставляем доступ к приложению по SSH

22.02.2025

Илья Замарацких

Содержание

К новому году я хотел запустить какой-нибудь публично доступный проект - и тогда мне пришла в голову идея написать CLI-приложение и “раздать” доступ к нему по SSH. В этой статье разберемся, как такое сделать без рисков безопасности для сервера

Будьте внимательны! Часть действий в статье может вас лишить доступа к серверу. Действия выполняются на Debian 12

demo

Как это работает?

Для реализации такого процесса, мы будем использовать директиву 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