사전 요구사항
- SSH 키 인증이 이미 설정되어 있을 것 (잠김 방지)
- 스마트폰에 Google Authenticator 또는 Authy 설치
- 테스트용 SSH 세션을 별도로 유지한 채 진행
1. PAM 모듈 설치
# Ubuntu / Debian
sudo apt update && sudo apt install -y libpam-google-authenticator
# CentOS / RHEL
sudo yum install -y epel-release
sudo yum install -y google-authenticator2. 사용자별 OTP 초기화
각 사용자가 직접 실행해야 합니다.
google-authenticator질문에 답합니다:
- 시간 기반 토큰? → y (TOTP 권장)
- QR 코드 스캔 → 스마트폰 앱으로 스캔
- 비상 코드 (Emergency scratch codes) → 안전한 곳에 보관
- 파일 업데이트? → y
- 여러 사용 허용 (30초 내)? → n (재사용 방지)
- 시간 오차 허용 (±1분)? → y
- Rate limiting? → y (30초에 3회 제한)
3. PAM 설정
sudo nano /etc/pam.d/sshd파일 상단에 추가:
# 2FA — OTP 필수 (키 인증 사용자도 OTP 요구)
auth required pam_google_authenticator.so
# 또는 키 인증 성공 시 OTP 생략 (선택)
# auth [success=done default=ignore] pam_google_authenticator.so nullok4. sshd_config 설정
sudo nano /etc/ssh/sshd_config# 키보드 인터랙티브 활성화
ChallengeResponseAuthentication yes
# 또는 (OpenSSH 8.7+)
KbdInteractiveAuthentication yes
# 패스워드 + OTP 조합
UsePAM yes
# 인증 방식: publickey와 keyboard-interactive 모두 요구
AuthenticationMethods publickey,keyboard-interactive
# 패스워드 + OTP만 쓰려면:
# AuthenticationMethods keyboard-interactive# 설정 검증
sudo sshd -t
# 재시작
sudo systemctl restart sshd5. 연결 테스트
현재 세션을 닫지 말고 새 터미널에서 테스트합니다.
ssh user@server
# Verification code: (앱에서 6자리 입력)비상 접속 — OTP 없이 로그인
스마트폰을 잃어버린 경우, 초기화 시 저장한 비상 코드(Scratch code)를 OTP 입력란에 입력합니다. 각 코드는 1회만 사용 가능합니다.
# ~/.google_authenticator 파일에서 비상 코드 확인 (서버 직접 접속 필요)
cat ~/.google_authenticator특정 사용자만 2FA 제외
# /etc/pam.d/sshd
auth [success=1 default=ignore] pam_succeed_if.so user in ci-runner:deploy
auth required pam_google_authenticator.so이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.