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

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