대상 OS: Rocky Linux 9
서버 침해사고에서 가장 흔한 ‘가속 페달’은 SSH로 root가 직접 들어올 수 있는 구성입니다.
root 로그인이 가능하면, 계정 하나만 뚫려도 곧바로 시스템 전체가 장악되고, 감사(누가 무엇을 했는지)도 흐려집니다.
반대로 root SSH를 완전히 차단하고, 개인 계정으로 접속한 뒤 sudo로만 승격시키면, 침해 난이도가 올라가고 추적 가능성이 크게 좋아집니다.
오늘은 Rocky Linux 9에서 root SSH 로그인을 확실하게 막고, 그룹 기반으로 SSH 접속/승격을 통제하며, breakglass(긴급) 경로와 롤백 절차까지 포함한 ‘운영형’ 구성을 정리합니다.
원격 서버에서 적용하다 잠기는 사고가 가장 위험하니, 테스트 포트/세션 유지 같은 안전장치도 같이 넣습니다.
---
# 1) 적용 전 안전 수칙: “잠기지 않는” 절차부터
1) SSH 세션을 2개 유지
- 하나는 작업용
- 하나는 비상용(끊기면 즉시 감지)
2) 가능하면 콘솔 접근 확보
- 클라우드 콘솔/시리얼/iDRAC/iLO가 있으면 롤백이 쉬워집니다.
3) sshd 설정 백업
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F_%H%M%S)
---
# 2) 현재 상태 점검: root 로그인/인증 방식 확인
1) sshd 실제 설정 확인
sudo sshd -T | egrep -i '^(permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|permitemptypasswords|allowusers|allowgroups)'
2) root 계정 상태 확인
sudo passwd -S root || true
sudo awk -F: '$1=="root"{print $1,$2,$3,$4,$5,$6,$7}' /etc/shadow 2>/dev/null || true
- root 패스워드가 잠겨있더라도, PermitRootLogin이 열려 있으면 키 인증 등으로 root 접속이 될 수 있습니다.
---
# 3) 목표 상태 설계: “root는 SSH로 못 들어온다” + “관리 그룹만 SSH 허용”
1) 권장 목표
- `PermitRootLogin no`
- `PasswordAuthentication no` (가능하면)
- 관리망/관리 그룹만 SSH 허용(AllowGroups)
- sudo 권한은 wheel 등 최소 그룹으로
2) 그룹 정의
- `ssh-admin`: SSH 접속을 허용할 관리자 그룹
- `wheel`: sudo 승격을 허용할 최소 그룹(기존 관행)
---
# 4) 관리자 그룹 생성 및 사용자 배치
1) 그룹 생성
sudo groupadd -f ssh-admin
2) 사용자 추가
sudo usermod -aG ssh-admin <관리자계정>
sudo usermod -aG wheel <관리자계정>
3) 반영 확인
id <관리자계정>
getent group ssh-admin
getent group wheel
---
# 5) sshd_config 하드닝: PermitRootLogin + AllowGroups
1) 설정 추가(파일 하단에 블록으로 명시)
sudo bash -lc 'cat >>/etc/ssh/sshd_config <<"EOF"
# --- SSH hardening: disable root login & restrict groups ---
PermitRootLogin no
# 가능한 경우 비밀번호 인증 차단(키 인증 전제)
PasswordAuthentication no
PermitEmptyPasswords no
# 관리자 그룹만 SSH 로그인 허용
AllowGroups ssh-admin
EOF'
'
2) 설정 문법 체크
sudo sshd -t
---
# 6) 안전한 적용: 테스트 포트로 먼저 검증(강력 추천)
1) 임시 sshd를 2222 포트로 띄우기
sudo /usr/sbin/sshd -D -p 2222 -o PidFile=/run/sshd_hardening_test.pid &
ss -lntp | grep ':2222' || true
2) 클라이언트에서 테스트해야 할 것
- `ssh-admin` 그룹에 속한 계정은 2222로 접속 성공
- 그룹 밖 계정은 접속 거부
- root로는 접속 거부
3) 테스트 sshd 종료
sudo kill "$(cat /run/sshd_hardening_test.pid 2>/dev/null)" 2>/dev/null || true
sudo rm -f /run/sshd_hardening_test.pid
4) 본 sshd 재시작
sudo systemctl restart sshd
sudo systemctl --no-pager -l status sshd | sed -n '1,60p'
---
# 7) sudo 정책 점검: wheel 최소화 + 명령 로그(선택)
1) wheel에 불필요 인원이 없는지 확인
getent group wheel
2) sudoers 문법 검증
sudo visudo -c
3) sudo에서 감사 로그 강화(원하면)
- 이전 글에서 다룬 것처럼 `use_pty`, `log_output` 등을 붙일 수 있습니다.
- 여기서는 최소 예시만 제시합니다.
sudo bash -lc 'cat >/etc/sudoers.d/05-audit-basic <<"EOF"
Defaults use_pty
Defaults logfile="/var/log/sudo/sudo.log"
EOF'
chmod 0440 /etc/sudoers.d/05-audit-basic
'
sudo visudo -cf /etc/sudoers.d/05-audit-basic
---
# 8) breakglass(긴급) 설계: “정상 운영과 분리된” 복구 계정
1) 원칙
- 평소에는 사용하지 않고, 필요할 때만 제한적으로 사용
- 접근 IP 제한/키 보관/사용 알림이 필수
2) 예시: breakglass 그룹/계정
sudo groupadd -f breakglass
sudo useradd -m -s /bin/bash breakglass-admin 2>/dev/null || true
sudo usermod -aG breakglass,wheel breakglass-admin
3) sshd에서 breakglass만 별도 허용하고 싶다면
- AllowGroups에 breakglass를 추가하고, 키는 오프라인 보관 등으로 강하게 운영하세요.
sudo sed -i 's/^AllowGroups.*/AllowGroups ssh-admin breakglass/' /etc/ssh/sshd_config
sudo sshd -t
sudo systemctl restart sshd
---
# 9) 점검: 적용 후 반드시 확인할 것
1) root 접속이 막혔는지 확인(서버에서 설정 값 확인)
sudo sshd -T | egrep -i '^(permitrootlogin|allowgroups|passwordauthentication)'
2) sshd 인증 실패 로그 확인
sudo journalctl -u sshd -S -2h --no-pager | tail -n 200
3) sudo 로그 파일 생성 여부
sudo tail -n 50 /var/log/sudo/sudo.log 2>/dev/null || true
---
# 10) 롤백: 잠겼을 때 가장 빠른 복구
1) 콘솔에서 sshd_config 되돌리기
sudo ls -1 /etc/ssh/sshd_config.bak.* | tail -n 3
sudo cp -a /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config 2>/dev/null || true
sudo sshd -t
sudo systemctl restart sshd
2) AllowGroups만 임시로 완화
sudo sed -i 's/^AllowGroups.*/# AllowGroups temporarily disabled/' /etc/ssh/sshd_config
sudo sshd -t
sudo systemctl restart sshd
---
# 11) 결론: root SSH 차단은 ‘가장 값싼’ 보안 강화
1) root로 직접 들어오는 길을 끊으면, 침해 난이도와 감사 품질이 동시에 올라간다
2) AllowGroups로 SSH 자체를 최소 집합으로 줄이면, 공격면이 확 줄어든다
3) breakglass와 롤백 절차가 있어야 “운영이 가능한” 보안이 된다