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 не может работать. Предполагая, что:

  1. пользователь имеет разумную оболочку, определенную,
  2. что ваш целевой скрипт является исполняемым и
  3. что ваш скрипт имеет соответствующую строку 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

затем, после того, как он настроен, на сервере:

  1. редактировать /etc/default/fwknop-server
  2. изменить строку START_DAEMON="no" в START_DAEMON="yes"
  3. запустите:

    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)

использование

  1. сделайте приведенный выше скрипт исполняемым:

chmod +x logwatcher.python3

  1. добавить cronjob, чтобы запустить его после перезагрузки

crontab -e

тогда напишите эту строку там и сохраните его после этого:

@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"

на первым аргументом этого скрипта является файл журнала для просмотра и второй аргумент-строка, для которой нужно искать в нем. The третий аргумент-скрипта когда строка встречается в файле.

лучше всего, если вы используете что-то более надежное для запуска/перезапуска скрипта в случае его сбоя.