SSH - принудительное выполнение команды при входе даже без Shell
Я создаю ограниченного пользователя без оболочки только для пересылки портов, и мне нужно выполнить скрипт при входе через pubkey, даже если пользователь подключен через ssh -N [email protected]
который не запрашивает SSH-сервер для оболочки.
Сценарий должен предупреждать администратора о соединениях, прошедших проверку подлинности с помощью pubkey, поэтому подключение пользователя не должно пропускать выполнение скрипта (например, путем соединения с ssh -N
).
Я пробовал безрезультатно:
- Установка команды в
/etc/ssh/sshrc
. - Использование команды = "КОМАНДА" в
.ssh/authorized_keys
(man authorized_keys) - Настройка скрипта с помощью команды в качестве оболочки пользователя. (
chsh -s/sbin/myscript.sh USERNAME
) - Соответствующий пользователь в
/etc/ssh/sshd_config
: Match User MYUSERNAME ForceCommand "/sbin/myscript.sh"
Все работает, когда пользователь запрашивает оболочку, но если она зарегистрирована только для переадресации портов и без оболочки (ssh -N
), она не работает.
Ответы
Ответ 1
Я являюсь автором ОП; Я пришел к выводу, что то, что мне нужно достичь, невозможно использовать SSH только до даты (OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015
), но я нашел большое программное обеспечение, которое использует зашифрованную SPAuthentication для открыть SSH-порт, а новая версия (до даты этого сообщения, это главная ветка GitHub) имеет функцию, чтобы всегда выполнять команду, которую пользователь авторизует успешно.
FWKNOP - Зашифрованная авторизация с одним пакетом
FWKNOP устанавливает правила iptables, которые разрешают доступ к данным портам за один зашифрованный пакет, который отправляется через UDP. Затем после авторизации он разрешает доступ для авторизованного пользователя в течение определенного времени, например 30 секунд, после этого закрывает порт, оставляя соединение открытым.
1. Для установки на Linux-сервере Ubuntu:
Текущая версия (2.6.0-2.1build1) в репозиториях Ubuntu до даты все еще не позволяет выполнить команду в успешном SPA; (вместо этого используйте 2.6.8 от GitHub)
На клиентской машине:
sudo apt-get install fwknop-client
На стороне сервера:
sudo apt-get install fwknop-server
Вот учебник по настройке клиентских и серверных машин https://help.ubuntu.com/community/SinglePacketAuthorization
Затем, после того, как он настроен, на стороне сервера:
- Изменить
/etc/default/fwknop-server
- Измените строку
START_DAEMON="no"
на START_DAEMON="yes"
-
Затем выполните:
sudo service fwknop-server stop
sudo service fwknop-server start
2. Предупреждение администратора об успешном SPA (электронная почта, сценарий pushover и т.д.)
Таким образом, как указано выше, текущая версия, содержащаяся в репозиториях Ubuntu (2.6.0-2.1build1), не может выполнить команду для успешного SPA. Если вам нужна эта функция с OP, но она будет выпущена в версии fwknop (2.6.8), как это указано здесь:
https://github.com/mrash/fwknop/issues/172
Поэтому, если вам нужно использовать его прямо сейчас, вы можете построить из мастера ветки github, у которого есть опция CMD_CYCLE_OPEN
.
3. Дополнительные ресурсы на fwknop
https://help.ubuntu.com/community/SinglePacketAuthorization
https://github.com/mrash/fwknop/ (проект на GitHub)
http://www.cipherdyne.org/fwknop/ (сайт проекта)
https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (учебник по сообществу DO)
Ответ 2
Параметр ForceCommand работает без PTY, если клиент не запрашивает его. В результате у вас фактически нет оболочки для выполнения сценариев так, как вы могли бы ожидать. Кроме того, на странице руководства OpenSSH SSHD_CONFIG (5) четко сказано:
Команда вызывается с использованием оболочки входа пользователя с параметром -c.
Это означает, что если вы отключили пользовательскую оболочку входа в систему или установили что-то вроде /bin/false
, то ForceCommand не может работать. Предполагая, что:
- пользователь определил разумную оболочку,
- что целевой скрипт является исполняемым, и
- что в вашем сценарии есть подходящая строка Шебанга
тогда в вашем глобальном файле sshd_config должно работать следующее, правильно измененное с правильным именем пользователя и полным путем к вашему пользовательскому сценарию:
Match User foo
ForceCommand /path/to/script.sh
Ответ 3
Я являюсь автором ОП. Кроме того, вы можете реализовать простой logwatcher как следующий, написанный на python3, который продолжает чтение для файла и выполняет команду, когда строка содержит шаблон.
logwatcher.python3
#!/usr/bin/env python3
# follow.py
#
# Follow a file like tail -f.
import sys
import os
import time
def follow(thefile):
thefile.seek(0,2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.5)
continue
yield line
if __name__ == '__main__':
logfilename = sys.argv[1]
pattern_string = sys.argv[2]
command_to_execute = sys.argv[3]
print("Log filename is: {}".format(logfilename))
logfile = open(logfilename, "r")
loglines = follow(logfile)
for line in loglines:
if pattern_string in line:
os.system(command_to_execute)
Применение
- Сделайте исполняемый скрипт:
chmod +x logwatcher.python3
- Добавьте cronjob, чтобы запустить его после перезагрузки
crontab -e
Затем напишите эту строку и сохраните ее после этого:
@reboot/home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"
Первым аргументом этого скрипта является файл журнала для просмотра, а второй аргумент - строка, для которой он должен выглядеть. Третий аргумент - это сценарий для выполнения, когда строка найдена в файле.
Лучше всего использовать что-то более надежное для запуска/перезапуска скрипта в случае его сбоя.