SSH Login Email Alerts in Linux Server
SSH 로그인 한 경우 shell script 따위를 실행하도록 하는 방법은 다음과 같다.
- pam_exec.so
- .profile 을 이용하는 방법
다음과 같은 명령어로 이메일을 보낼 수 있다.
- curl : 최신 버전에서만 지원한다.
- sendmail, exim 같은 MTA 나 mailx 유틸리티
이메일 보내는 방법에 대해서는 필자가 작성한 다른 글을 참조한다.
1. pam_exec.so 를 이용하는 방법
1.1. pam_exec.so 사용법
/etc/pam.d/sshd 에 다음을 추가하면, 로그인 혹은 로그아웃 할 때, /usr/local/bin/pam_exec_email.sh 파일이 실행된다.
session optional pam_exec.so seteuid debug log=/var/log/pam_exec_email.log /usr/local/bin/pam_exec_email.sh
/var/log/pam_exec_email.log 파일에는 /usr/local/bin/pam_exec_email.sh 에서 echo 로 남긴 것들이 쌓인다.
log 를 남기지 않고, 다음과 같이 간단하게 할 수도 있다.
session optional pam_exec.so /usr/local/bin/pam_exec_email.sh
1.2. pam_exec.so 가 내보내는 환경변수
/etc/pam.d/sshd 에 추가한 경우 다음과 같은 환경변수를 내보낸다.
- PAM_RHOST : 로그인한 IP
- PAM_USER : 로그인한 사용자 ID
- PAM_RUSER : sshd 에서 이 값은 없다.
- PAM_SERVICE : sshd
- PAM_TTY : ssh
- PAM_TYPE : open_session 혹은 close_session
1.3. /usr/local/bin/pam_exec_email.sh
/usr/local/bin/pam_exec_email.sh 파일을 만든다.
1.3.1. sendmail 혹은 exim 이용
소스코드는 GitHub 의 email_alerts_with_sendmail_using_pam.sh 에서 다운로드 받을 수 있다.
예제는 sendmail 을 기준으로 작성되었다. exim 의 경우 sendmail 만 exim으로 변경하면 된다.
로그인 / 로그아웃 한 경우 이메일을 보낸다.
로그인 한 경우에만 이메일을 보내고 싶다면, 다음과 같은 구문으로 전체를 감싸면 된다.
if [ ${PAM_TYPE} = "open_session" ]; then fi
1.3.2. curl 이용
소스코드는 GitHub 의 email_alerts_with_curl_using_pam.sh 에서 다운로드 받을 수 있다.
로그인 한 경우에만 이메일을 보내고 싶다면, 위의 sendmail 혹은 exim 이용 편을 참조한다.
1.4. 문제해결
로그는 /var/log/secure 혹은 /var/log/auth.log 에서 확인할 수 있다.
1.4.1. /usr/local/bin/pam_exec_email.sh failed: exit code 2
상세 로그는 다음과 같다.
pam_exec(sshd:session): Calling /usr/local/bin/pam_exec_email.sh ... pam_exec(sshd:session): execve(/usr/local/bin/pam_exec_email.sh,...) failed: No such file or directory pam_exec(sshd:session): /usr/local/bin/pam_exec_email.sh failed: exit code 2
pam_exec_email.sh 파일의 줄바꿈 문자가 DOS/Windows (\r\n) 이다.
Unix (\n) 으로 변경한다.
1.4.2. /usr/local/bin/pam_exec_email.sh failed: exit code 8
pam_exec(sshd:session): Calling /usr/local/bin/pam_exec_email.sh ... pam_exec(sshd:session): execve(/usr/local/bin/pam_exec_email.sh,...) failed: Exec format error pam_exec(sshd:session): /usr/local/bin/pam_exec_email.sh failed: exit code 8
pam_exec_email.sh 에서 #!/bin/bash
이 생략되었다.
#!/bin/bash
를 추가한다.
1.4.3. /etc/pam.scripts/pam_exec_email.sh failed: exit code 13
pam_exec(sshd:session): Calling /etc/pam.scripts/pam_exec_email.sh ... pam_exec(sshd:session): execve(/etc/pam.scripts/pam_exec_email.sh,...) failed: Permission denied pam_exec(sshd:session): /etc/pam.scripts/pam_exec_email.sh failed: exit code 13
/etc/pam.scripts/pam_exec_email.sh 파일을 실행할 수 없다. selinux 에서만 발생한다.
파일의 위치를 /usr/local/bin/ 같은 곳으로 변경한다.
1.4.4. CentOS 5.x 에서 버그
CentOS 5.x 에서는 PAM_TYPE 따위의 환경변수를 내보내지 않는 버그가 있다.
CentOS 5.11 updates 에서 다운로드 받은 pam 을 설치한다.
2. .profile 을 이용하는 방법
.bash_login
을 만들고 나서,
.bash_profile
혹은 .profile
파일의 끝에 다음의 내용을 추가한다.
if [ -f ~/.bash_login ]; then . ~/.bash_login fi
2.1. .bash_login
2.1.1. sendmail 혹은 exim 이용
소스코드는 GitHub 의 email_alerts_with_sendmail_using_profile.sh 에서 다운로드 받을 수 있다.
2.1.2. curl 이용
소스코드는 GitHub 의 email_alerts_with_curl_using_profile.sh 에서 다운로드 받을 수 있다.
3. 잡담
.profile 을 이용하는 방법은 .profile 을 실행하지 않는 연결, 예를 들어 sftp 나 Apache Ant 의 scp 태스크나 curl 과 같은 프로그램적인 연결에 대한 알림을 발송하지 않는다.
pam_exec.so 를 이용하는 방법은 모든 연결에 대해 알림을 발송하지만, 너무 많은 알림이 발송될 가능성도 있다.