Есть ли способ запустить привилегированную команду после успешного входа в SSH (не обязательно с оболочкой или PTY)?

Я бы хотел запустить привилегированную команду после успешных логинов SSH на сервере. Однако это должно быть в конфигурации сервера ( sshd_config или что-либо еще, что пользователь не может манипулировать или обходить пользователя), поскольку мне нужно, чтобы это было обязательным. То есть, однако, ограниченная системная учетная запись используется, она должна иметь возможность манипулировать частью данных, которая требует привилегий суперпользователя (а именно, использовать ipset add условно – что я могу ipset add ). О, и я хотел бы иметь доступ к содержимому SSH_CLIENT , пожалуйста – несмотря на привилегированное исполнение. ChrootDirectory также не должен изменять ChrootDirectory .

Я знаю /etc/ssh/sshrc , но это похоже на «клиентскую сторону», то есть он запускается пользователем, который входит в систему.

Существует ли такое средство в OpenSSH? Я использую версию 6.6.


Кроме того, man-страница ( ssh(1) ) не слишком понятна для sshrc :

/etc/ssh/sshrc Команды в этом файле выполняются ssh когда пользователь входит в систему, непосредственно перед /etc/ssh/sshrc оболочки (или команды) пользователя. Дополнительную информацию см. На странице руководства sshd(8) .

Значит ли это, что он также работает, когда внешние команды (через ForceCommand ) или подсистемы, такие как internal-sftp вызываются, несмотря на ограничение настроек, таких как выделение PTY или принуждение chroot ? Если это так, я могу прибегнуть к ограничительной записи /etc/sudoers если нет другого способа вообще.

NB: Я не использую inetd по очевидным причинам (см. sshd(8) ), как описано здесь .

Вы можете сделать это с помощью PAM и модуля pam_exec.so .

Вы просто добавляете строку в /etc/pam.d/sshd в раздел «сеанс», например:

 session optional pam_exec.so /usr/local/bin/ipset-ssh 

Где ipset-ssh – это какой-то скрипт, который вы создаете.

Скрипт будет запущен как root. Вы можете получить IP-адрес клиента с переменной PAM_RHOST . Вы также захотите проверить переменную PAM_TYPE поскольку ваш скрипт будет выполнен как при входе в систему, так и при выходе из системы. При входе в систему PAM_TYPE будет установлено значение open_session . При выходе из системы установлено значение close_session .

Вот полный список переменных, которые я получаю от простого теста (я поместил env > /tmp/pamenv в скрипт):

 PAM_SERVICE=sshd PAM_RHOST=127.0.0.1 GNOME_KEYRING_CONTROL=/home/phemmer/.cache/keyring-vJUUda PAM_USER=phemmer PWD=/ GNOME_KEYRING_PID=19742 SHLVL=1 PAM_TYPE=open_session PAM_TTY=ssh _=/usr/bin/env 

Ваш скрипт может быть таким же простым, как:

 #!/bin/bash [[ "$PAM_TYPE" == "open_session" ]] && ipset add whitelist $PAM_RHOST