SSH-принудительное выполнение команды при входе в систему даже без оболочки
Я создаю ограниченного пользователя без оболочки только для переадресации портов, и мне нужно выполнить скрипт при входе в систему через pubkey, даже если пользователь подключен через ssh -N user@host
который не запрашивает SSH-сервер для оболочки.
скрипт должен предупреждать администратора о соединениях, аутентифицированных с помощью pubkey, поэтому пользователь, подключающийся, не должен пропускать выполнение скрипта (например, при подключении с ssh -N
).
Я старался не avail:
- установка команды в
/etc/ssh/sshrc
. - использование command= "COMMAND" в
.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
) это не сработает.
3 ответов
параметр ForceCommand работает без PTY, если клиент не запросит его. В результате у вас фактически нет оболочки для выполнения сценариев так, как вы могли бы ожидать. Кроме того, на man-странице OpenSSH SSHD_CONFIG(5) четко написано:
команда вызывается с помощью оболочки входа пользователя с параметром-c.
это означает, что если вы отключили оболочку входа пользователя или установили ее на что-то вроде /bin/false
, тогда ForceCommand не может работать. Предполагая, что:
- пользователь имеет разумную оболочку, определенную,
- что ваш целевой скрипт является исполняемым и
- что ваш скрипт имеет соответствующую строку shebang
тогда в вашем глобальные sshd_config файл после надлежащего изменения с правильным именем пользователя и полным именем пути к пользовательскому скрипту:
Match User foo
ForceCommand /path/to/script.sh
Я автор ОП; я пришел к выводу, что то, что мне нужно достичь, невозможно с помощью SSH только до даты (OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015
), но я нашел отличную часть программного обеспечения, которая использует зашифрованную SPAuthentication для открытия порта SSH, и это новая версия (на дату этого сообщения, это GitHub master branch) имеет функцию для выполнения команды всегда, что пользователь авторизует успешно.
Fwknop - зашифрованная авторизация одного пакета
FWKNOP набор в iptables правила, которые разрешают доступ к данным портам на одном зашифрованном пакете, который отправляется через UDP. Затем после авторизации он разрешает доступ авторизованному пользователю в течение определенного времени, например 30 секунд, закрывая порт после этого, оставляя соединение открытым.
1. Чтобы установить на Ubuntu linux:
текущая версия (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 (email, pushover script и т. д.)
Итак, как указано выше, текущая версия присутствует в репозиториях Ubuntu (2.6.0-2.1build1) не удается выполнить команду на успешном SPA. Если вам нужна эта функция по состоянию на OP, но она будет выпущена в версии fwknop (2.6.8), как указано здесь:
https://github.com/mrash/fwknop/issues/172
поэтому, если вам нужно использовать его прямо сейчас, вы можете построить из GitHub branch master, у которого есть .
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)
Я автор ОП. Кроме того, вы можете реализовать простой 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"
на первым аргументом этого скрипта является файл журнала для просмотра и второй аргумент-строка, для которой нужно искать в нем. The третий аргумент-скрипта когда строка встречается в файле.
лучше всего, если вы используете что-то более надежное для запуска/перезапуска скрипта в случае его сбоя.