대상 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와 롤백 절차가 있어야 “운영이 가능한” 보안이 된다