Выполняйте программу каждый раз, когда кто-нибудь входит через SSH в Linux

10

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

Теперь, как бы я поступил об этом?

Я бы хотел, чтобы скрипт запускался каждый раз, когда ЛЮБЫЙ пользователь входит в систему, и мне нужно иметь доступ как минимум к имени пользователя, который вошел в систему, и к IP-адресу, с которого он вошел в систему.

Я думал об использовании /etc/bash.bashrc, но это хорошее решение? Например, есть ли способ, которым пользователь может отключить его использование и, таким образом, отключить мой скрипт? Если да, каковы мои другие варианты?

Спасибо.

houbysoft
источник
Конечно, это будет работать только в том случае, если пользователь использует bash. Это не будет работать, если пользователи могут выбрать свою собственную оболочку.
Пауло Эберманн

Ответы:

12

Механизм использования зависит от ваших целей.

Если вы хотите предоставить что-то удобное или дружественное для ваших пользователей, то /etc/profileэто достаточно разумно, если все ваши пользователи используют одну и ту же оболочку. Если вы хотите, чтобы команды выполнялись только при входе через систему ssh, поместите команды в /etc/ssh/sshrc. (Если вы не возражаете, пользователи переопределяют команды своим собственным ~/.ssh/rcфайлом.)

Если вы хотите заставить пользователя выполнить одну программу и только одну программу , то ForceCommandвариант, описанный DigitalRoss, является хорошим подходом. (Лично я бы далее ограничил пользователя обязательной системой контроля доступа, такой как AppArmor , SELinux , TOMOYO или SMACK , чтобы гарантировать, что программа не может позволить пользователю сбежать. Я работал над AppArmor в течение десяти лет, так что это инструмент, который я бы выбрал первым, но остальные - прекрасные инструменты, написанные отличными программистами.)

Если вы просто хотите, чтобы одна программа выполнялась и никоим образом не беспокоила пользователя , тогда лучше всего использовать pam_exec(8)модуль, который нельзя обойти, работает независимо от оболочки и обеспечивает простую возможность запуска от имени пользователя или пользователя учетная запись программы, выполняющей авторизацию. Страница man дает следующий пример:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.

Это может быть расширено для работы на auth, account, passwordи sessionдействия; вероятно, sessionбыло бы лучше всего выполнить после входа в систему. Просто добавьте строку вроде:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

в ваш /etc/pam.d/sshdконтрольный файл.

sarnold
источник
Похоже, pam_execмодуль именно то, что я ищу. Спасибо!
Houbysoft
2
WATCH OUT, если выполняемая вами команда завершается с ненулевым кодом выхода, ваш вход не удастся, и вы можете быть заблокированы. Один из способов решить эту проблему - убедиться, что существует другой «необязательный сеанс», вызываемый с другим модулем, который всегда завершается успешно.
gflarity
4

Новые версии OpenSSH имеют серверную функцию ForceCommand, которая предоставляет управление сценарию, а не операции (scp, ssh, ...), которую предполагал пользователь. Сценарию передается исходная команда, так что вы, вероятно, можете подключиться к ней после выполнения всего, что вам нужно.

Из sshd_config (5):

ForceCommand

Принудительно выполняет команду, указанную ForceCommand, игнорируя любую команду, предоставленную клиентом, и ~ / .ssh / rc, если присутствует. Команда вызывается с использованием оболочки входа пользователя с параметром -c. Это относится к выполнению оболочки, команды или подсистемы. Это наиболее полезно внутри блока Match. Команда, изначально предоставленная клиентом, доступна в переменной среды SSH_ORIGINAL_COMMAND. Указание команды `` internal-sftp '' приведет к использованию внутрипроцессного сервера sftp, который не требует файлов поддержки при использовании с ChrootDirectory.

Я использовал это один раз, чтобы переопределить scp и обеспечить безопасную загрузку драгоценных камней, не давая каждому пользователю, уполномоченному загружать драгоценные камни, интерактивный доступ, который им не нужен или не нужен.

DigitalRoss
источник
3

Один из способов - использовать syslog-ng в качестве демона syslog и настроить его на запуск фона сценария каждый раз, когда совпадает определенная запись в журнале (например, успешный вход в систему ssh).

Янне Пиккарайнен
источник
0

Проверь это:

http://ubuntuforums.org/showthread.php?p=9383927

Я не верю, что есть способ отключить это. Кто-нибудь еще может это проверить?

стриж
источник
Это ( /etc/profileили ~/.profile) зависит от оболочки пользователя, чуть меньше, чем bashrc. Если ваши пользователи используют bash или что-то подобное, это нормально.
Пауло Эберманн