대상 OS: Rocky Linux 9
운영에서 제일 무서운 계정은 ‘root’라기보다 ‘sudo 가능한 일반 계정’입니다.
SSH 키가 유출되거나 세션이 탈취되면, 공격자는 마지막 한 걸음만 남겨두고 있습니다: sudo.
그래서 sudo를 보호하는 건 사실상 “리눅스 운영 권한 전체를 보호”하는 것과 같습니다.
Rocky Linux 9에서는 PAM을 이용해 sudo 실행 시 MFA(OTP)를 요구하도록 만들 수 있고, 이는 최소한의 비용으로 권한 탈취 리스크를 크게 줄여줍니다.
이 글은 Rocky Linux 9에서 Google Authenticator 호환 PAM 모듈을 사용해 sudo에 MFA를 붙이는 방법을 단계별로 정리합니다.
또한, 잘못 설정하면 본인도 sudo를 못 쓰게 되는 위험이 있으므로, 안전한 롤아웃/복구 경로까지 함께 설명합니다.
---
1) 먼저 알아야 할 것: sudo MFA의 장단점
1) 장점: SSH 세션/키가 털려도 sudo 단계에서 한 번 더 막을 수 있다
2) 장점: “권한 상승” 이벤트를 사람-기기 단위로 더 강하게 통제할 수 있다
3) 단점: 자동화(Ansible, 배치)와 충돌할 수 있다
4) 단점: PAM 설정 실수 시 운영자가 스스로 잠길 수 있다
따라서 sudo MFA는 “사람이 직접 sudo를 쓰는 서버(운영 접속)”에 특히 적합합니다.
배포/자동화 서버는 예외 설계가 필요합니다(뒤에서 다룹니다).
---
2) 적용 전 안전장치: 콘솔/비상 접근 경로 준비
이 작업은 원격에서 하면 위험합니다. 반드시 아래를 먼저 준비하세요.
1) 클라우드/가상화 콘솔(iDRAC/iLO/시리얼 콘솔 등) 접근 가능 여부 확인
2) 기존 SSH 세션을 끊지 말고 유지(tmux 권장)
command -v tmux || sudo dnf -y install tmux
3) 비상용 root 비밀번호/키 또는 break-glass 계정 준비(조직 정책에 따라)
MFA 설정이 꼬이면 “콘솔에서 PAM 파일을 되돌리는 것”이 최후의 생명줄입니다.
---
3) PAM OTP 모듈 설치
Rocky Linux 9에서 Google Authenticator 호환 PAM 모듈은 패키지로 제공됩니다.
1) 설치
sudo dnf -y install google-authenticator
2) PAM 모듈 파일 존재 확인
rpm -ql google-authenticator | grep -E 'pam_google_authenticator\.so$' || true
ls -la /lib64/security/pam_google_authenticator.so 2>/dev/null || true
---
4) 사용자별 OTP 시크릿 생성(운영자 계정에서)
OTP는 사용자 홈 디렉터리에 시크릿을 저장합니다.
운영자 계정(예: ops)으로 로그인한 뒤, 그 계정에서 설정을 만듭니다.
1) OTP 설정 실행(대화형)
google-authenticator
권장 선택(운영 일반)
- time-based tokens 사용
- rate limiting 사용
- emergency scratch codes 저장
2) 생성된 파일 확인
ls -la ~/.google_authenticator
chmod 0600 ~/.google_authenticator
3) 복구 코드(스크래치 코드)는 안전한 곳에 보관
- 이 코드는 MFA 장치 분실 시 복구 수단이므로, 운영 문서/시크릿 관리 체계에 포함시키세요.
---
5) sudo에 MFA 붙이기: /etc/pam.d/sudo 수정
여기서부터가 핵심입니다.
PAM은 매우 민감하므로, 먼저 백업하고 단계적으로 적용하세요.
1) 백업
sudo cp -a /etc/pam.d/sudo /etc/pam.d/sudo.bak.$(date +%F_%H%M%S)
2) PAM에 OTP 모듈 추가(예시)
아래 예시는 “sudo 시 OTP를 요구”하는 가장 단순한 형태입니다.
sudo tee /etc/pam.d/sudo >/dev/null