마스토돈 서버 목록에 등록을 하려면 권장사항을 따라야 합니다. 오늘은 그 중에서도 “3. At least one other person with emergency access to the server infrastructure” “긴급상황시 서버 인프라에 접근 가능한 한 명 이상의 다른 인원이 있어야 한다” 항목을 더 안전하게 설정하는 방법에 대해 알아봅시다.

우선 긴급상황시 서버 인프라에 접근 가능한 관리자를 백업 관리자라 합시다. 서버의 백업을 관리하는 게 아닌, 백업의 의미 그대로 관리자가 상황이 안 좋을 때 보조로 대신 나서는 관리자입니다. 이 백업 관리자가 하는 일은 원래의 관리자가 죽거나 그와 비슷한 상황이 왔을 때 서버를 물려 받아 운영을 지속하거나 서버 종료 절차를 대신 수행해 주는 사람입니다. 원칙적으로는 평상시에는 서버에 접근 권한이 없어야 합니다만, 관리자들이 모두 연락두절이 된 상황을 감지하고 권한을 넘겨주는 시스템이 있다면 얼마나 좋을까요. 있긴 있습니다만 제대로 작동하지 않으면? 무용지물입니다. 그래서 평상시에도 권한 자체는 주되, 사용하지 않도록 하게 됩니다.

하지만 가장 흔한 보안취약점은 사람에게서 나온다고 했습니다. 백업관리자는 평상시에 권한을 사용하지 않아야 하는데 이를 어떻게 제한할까요? 큐돈은 백업 관리자가 로그인을 할 때마다 관리자의 이메일로 알림이 오게 해 두고 왜 로그인을 했는지 보고를 해야 합니다. 이러면 악의를 가졌거나 계정이 탈취 당했을 때 관리자가 바로 알 수 있습니다. 평상시라면 백업 관리자는 시스템에 로그인 자체를 할 일이 없기 때문이죠.

설정 방법

그럼 방법에 대해 알아보겠습니다. 리눅스 시스템은 PAM이라는 모듈을 사용해 로그인을 하게 됩니다. 패스워드가 없어도 키를 이용해 로그인을 하거나 심지어는 다른 프로그램이 특정 조건에 따라 로그인을 허용해 줄 수 있습니다. 여기에는 로그인에 훅을 걸어 특정 행동을 하게 할 수도 있는데 이를 이용하는 것입니다.

먼저, /etc/pam.d/sshd 파일을 수정합니다. 가장 끝에 다음 줄을 추가합니다.

#Send email on login
session optional pam_exec.so seteuid /usr/local/bin/send-email-on-ssh-login.sh

이 설정은 SSHD를 통해 로그인을 할 때마다 해당 스크립트를 실행하도록 합니다. 알림 스크립트가 실패해도 일단 로그인이 되는 게 더 중요하기 때문에 optional 설정으로 넣었습니다.

그럼 이제 /usr/local/bin/send-email-on-ssh-login.sh 파일을 만들어 봅시다.

#!/bin/bash

if [ "$PAM_TYPE" != "open_session" ]; then
    exit 0
fi

ignored_users=('dokku' 'admin')

for user in ${ignored_users[@]}; do
    if [ "$PAM_USER" = "$user" ]; then
        exit 0
    fi
done

{
    echo "User: $PAM_USER"
    echo "Remote Host: $PAM_RHOST"
    echo "Service: $PAM_SERVICE"
    echo "TTY: $PAM_TTY"
    echo "Date: $(date)"
    echo "Server: $(hostname)"
} | mail -s "$PAM_SERVICE login on $(hostname -s) for account $PAM_USER" ADMIN_EMAIL@EMAIL.COM

일단 open_session이 실제로 세션이 열리는 경우이니, 아닌 경우엔 빨리 리턴을 해버리고 종료합니다. 내부에서 사용하는 유저와 관리자 계정은 메일이 매번 오면 귀찮으니 ignored_users 항목으로 분리시켜 제외하도록 하였습니다. 이후 상황은 제외되지 않은 유저가 로그인 한 상황 뿐입니다. mail 유틸을 사용하여 어디서 어떻게 접속을 했는 지 관리자의 이메일로 보내버리면 백업 관리자가 로그인을 할 때마다 이메일로 알림이 오게 됩니다.

주의사항

1. 모든 프로그램은 완벽하지 않습니다. 설정도 마찬가지입니다.

모든 설정과 프로그램은 완벽하지 않으므로 정기적으로 백업관리자가 제대로 로그인 권한을 가지고 있는 지 확인하는 점검기간을 가집시다. 제대로 로그인이 되는지, 관리자는 제대로 로그인 알림이 오는 지를 체크합니다.

2. 백업 관리자도 관리자입니다.

특수한 경우를 제외하고 백업 관리자에게도 root 권한을 사용할 수 있는 sudo 명령을 사용할 수 있게 둡니다. 이는 이 설정을 지워버릴 수도 있다는 것을 의미합니다. 하지만 이 설정을 지우기 위해서는 한 번 이상 로그인을 해야 하므로 알림이 오게 됩니다. 알림을 받은 후에는 로그인을 한 경위를 보고 받도록 하고 스크립트가 정상적으로 살아 있는 지 점검을 해야 합니다.