배경
최근 개발팀에서 여러 서버를 효율적으로 관리하기 위한 툴로 Termius를 도입했다. Termius 계정 하나로 담당하는 모든 서버에 손쉽게 접근할 수 있어 개발 및 운영의 편의성이 향상되었다.
다만 Termius 계정을 탈취했을 때, 공격자가 방화벽에 등록된 IP를 사용한다면 그 계정에 연결된 모든 서버에 대한 접근 권한을 얻게 되는 불안요소가 발생했다.
따라서 각 서버에 SSH 접속이 발생할 때마다 실시간으로 알림을 받아, 현재의 접속이 정당한 사용자(개발팀)에 의한 것인지 확인할 수 있어야 한다고 생각했다.
목표
정당하지 않은 사용자에 의한 서버 접근을 즉각적으로 인지하고 피해를 최소화하는 것.
적용 개념
리눅스의 PAM을 이용한다.
PAM은 SSH 접속 요청에 대해 인증을 진행하는 내장 모듈이다. PAM이 요청에 대한 인증 절차를 완료했을 때, 알림 스크립트를 실행시키도록 설정한다.
활용
- 알림 스크립트 생성
sudo vi /usr/local/bin/ssh-alert.sh
#!/bin/bash # 인스턴스 명칭 INSTANCE_NAME="" # 회사 IP EXCLUDE_IP="1.235.143.84" # 디스코드 웹훅 url DISCORD_WEBHOOK_URL="https://discord.com/api/webhooks/1395331655144837150/YlHkxDKTZZODPkjyCA5bXphayFtJ3uJ_7RtlgOypuZHyyW4wrJXqqmdgjMxJCBE3pXFz" # PAM 환경변수 확인 if [ "$PAM_TYPE" != "open_session" ] || [ -z "$PAM_USER" ] || [ -z "$PAM_RHOST" ]; then exit 0 fi # 변수에 유저와 IP 할당 USER_NAME=$PAM_USER REMOTE_IP=$PAM_RHOST # 회사 IP면 스크립트 종료 if [ "$REMOTE_IP" = "$EXCLUDE_IP" ]; then exit 0 fi # 알림 메세지 생성 JSON_PAYLOAD="{\"username\":\"SSH 접속 알리미\",\"embeds\":[{\"title\":\"🚨 SSH 접속 이벤트\",\"color\":15158332,\"fields\":[{\"name\":\"🪐 인스턴스\",\"value\":\"\`$INSTANCE_NAME\`\",\"inline\":true},{\"name\":\"👤 접속 계정\",\"value\":\"\`$USER_NAME\`\",\"inline\":true},{\"name\":\"🌐 접속 IP\",\"value\":\"\`$REMOTE_IP\`\",\"inline\":true}]}]}" # 웹훅 요청 /usr/bin/curl -X POST -H "Content-Type: application/json" -d "$JSON_PAYLOAD" --connect-timeout 3 -o /dev/null -s "$DISCORD_WEBHOOK_URL" exit 0
- PAM에 적용
# 실행 가능하도록 모드 추가 sudo chmod +x /usr/local/bin/ssh-alert.sh
# PAM 설정 파일 편집하기 sudo vi /etc/pam.d/sshd
# 파일 하단에 입력! # SSH 세션 접속 성공 시 알림 스크립트 실행 session optional pam_exec.so /usr/local/bin/ssh-alert.sh
짜잔

