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

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

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

  1. пользователь определил разумную оболочку,
  2. что целевой скрипт является исполняемым, и
  3. что в вашем сценарии есть подходящая строка Шебанга

тогда в вашем глобальном файле 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)

Применение

  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"

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

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