성공적인 SSH 로그인 후 권한 있는 명령을 실행하는 방법이 있습니까(반드시 셸이나 PTY를 사용할 필요는 없음)?

성공적인 SSH 로그인 후 권한 있는 명령을 실행하는 방법이 있습니까(반드시 셸이나 PTY를 사용할 필요는 없음)?

서버 측에서 SSH 로그인이 성공한 후 권한 있는 명령을 실행하고 싶습니다. 그러나 sshd_config이를 적용해야 하므로 이는 서버 구성(또는 사용자가 조작하거나 우회할 수 없는 다른 항목) 에 있어야 합니다 . 즉, 사용되는 시스템 계정이 아무리 제한되어 있더라도 슈퍼유저 권한이 필요한 데이터를 조작할 수 있어야 합니다(예: ipset add조건부 사용 - 스크립트 작성 가능). 아, 콘텐츠에 액세스하고 싶습니다 SSH_CLIENT. 권한 있는 실행이기는 하지만요. 또한 순서는 의 영향을 받지 않아야 합니다 ChrootDirectory.

알아요 /etc/ssh/sshrc. 하지만 이것은 "클라이언트 측"인 것 같습니다. 즉, 컴퓨터에 로그인한 사용자가 실행하는 것입니다.

OpenSSH에 그러한 도구가 있습니까? 버전 6.6을 사용하고 있습니다.


또한 매뉴얼 페이지( ssh(1))도 명확하지 않습니다 sshrc.

/etc/ssh/sshrcssh이 파일의 명령은 사용자가 로그인할 때 실행되지만 사용자의 셸(또는 명령)이 시작되기 전에 실행됩니다. sshd(8)자세한 내용은 매뉴얼 페이지를 참조하십시오 .

그렇다면 이는 PTY 할당 또는 강제 적용과 같은 설정에 대한 제한에도 불구하고 외부 명령( 을 통해 ForceCommand) 또는 하위 시스템이 호출될 때도 실행된다는 의미입니까 ? 그렇다면 다른 방법이 없다면 출입을 제한할 수도 있겠네요.internal-sftpchroot/etc/sudoers

알아채다:그래요아니요inetd명백한 이유로 sshd(8)위에서 언급한 대로 (참조)를 사용하십시오.여기.

답변1

PAM을 사용할 수 있으며pam_exec.so기준 치수.

"세션" 섹션에 /etc/pam.d/sshd다음과 같은 줄을 추가하기만 하면 됩니다.

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

ipset-ssh작성한 스크립트는 어디에 있습니까?

이 스크립트는 루트로 실행됩니다. 이 변수를 사용하여 클라이언트의 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

관련 정보