대상 OS: Ubuntu Server 24.04 LTS

운영 서버가 늘어날수록 SSH 키 관리는 ‘사람 수 × 서버 수’만큼 복잡해집니다.
키를 회수해야 할 때(퇴사/권한 변경)도 서버마다 authorized_keys를 뒤져야 하죠.
OpenSSH 인증서(SSH CA)는 이 문제를 “CA가 서명한 키만 허용”으로 바꿔줍니다.
즉, 서버는 더 이상 사용자 개별 공개키를 기억하지 않고, CA 공개키 1개만 신뢰합니다.

이 글은 Ubuntu 24.04에서 OpenSSH 인증서 기반 로그인(사용자 인증서 + 호스트 인증서)을 구성하고, 권한 범위 제한과 폐기(KRL)까지 실제 운영 관점에서 정리합니다.

---

1) 인증서 기반 SSH가 해결하는 것

1) 서버별 authorized_keys 관리 부담 감소

2) 권한 회수(폐기) 속도 개선

3) 접근 통제의 ‘정책화’(principal/유효기간/강제 옵션)

4) 호스트 키 스푸핑 위험 완화(호스트 인증서 + @cert-authority)

기본 아이디어는 단순합니다.
- 사용자 공개키에 CA가 서명 → “사용자 인증서(user cert)”
- 서버 호스트키에 CA가 서명 → “호스트 인증서(host cert)”
- 서버는 “사용자 CA 공개키”를 신뢰
- 클라이언트는 “호스트 CA 공개키”를 신뢰

---

2) 구성 설계(권장)

- CA는 가능한 한 ‘오프라인’(접근 제한된 관리용 머신/보안 스토리지)에 둡니다.
- CA 개인키는 서버에 절대 복사하지 않습니다.
- 인증서 유효기간은 짧게(예: 30일) → 자동 갱신 루틴 권장.
- principal(로그인 가능한 사용자/역할)을 명시하고, 필요 시 소속 그룹/계정 정책과 결합합니다.

이 글의 예시
- 사용자 인증서 principal: `ops`, `deploy`
- 호스트 인증서 principal: `host1.example.com`, `10.0.0.10`

---

3) 사전 준비: OpenSSH 버전과 파일 경로 확인

1) OpenSSH 버전 확인

ssh -V
sshd -T | head -n 20

2) Ubuntu 24.04의 sshd 설정 디렉터리 확인

ls -la /etc/ssh/sshd_config.d || true

Ubuntu 계열은 `/etc/ssh/sshd_config`에서 `Include /etc/ssh/sshd_config.d/*.conf`를 쓰는 경우가 많으니, 인증서 관련 설정은 별도 파일로 분리하는 편이 안전합니다.

---

4) CA 키 생성(오프라인 권장)

1) 사용자 인증서용 CA 키 생성

ssh-keygen -t ed25519 -f ./user_ca -C "user-ca"

2) 호스트 인증서용 CA 키 생성

ssh-keygen -t ed25519 -f ./host_ca -C "host-ca"

산출물
- `user_ca` (개인키) / `user_ca.pub` (공개키)
- `host_ca` (개인키) / `host_ca.pub` (공개키)

서버에는 **CA 공개키만** 배포합니다.

---

5) 서버 측: 사용자 CA 공개키 신뢰 설정

아래는 ‘서버(로그인 대상 Ubuntu 24.04)’에서 수행합니다.

1) 사용자 CA 공개키 배포 및 권한 설정

sudo install -d -m 0755 /etc/ssh/ca
sudo install -m 0644 ./user_ca.pub /etc/ssh/ca/user_ca.pub
sudo chown -R root:root /etc/ssh/ca

2) sshd 설정 파일 추가

sudo tee /etc/ssh/sshd_config.d/20-ssh-ca.conf >/dev/null /dev/null  ~/.ssh/known_hosts

이제 `*.example.com` 도메인의 서버들은 “호스트 CA가 서명한 호스트 인증서”를 제시해야 정상으로 인식됩니다.

---

8) 권한 범위 좁히기: principal, 강제 옵션, 만료 전략

인증서의 장점은 ‘키’가 아니라 ‘정책’입니다.

1) principal을 역할 기반으로 설계하기

- `ops` : 운영 접근
- `deploy` : 배포 전용 접근
- `breakglass` : 비상 접근(짧은 만료)

2) 인증서 만료를 짧게 잡기

ssh-keygen -s ./user_ca -I "deploy-2026-02" -n "deploy" -V "+7d" ./deploy_key.pub

3) 서버에서 principal별로 로컬 계정/권한 분리

- `ubuntu` 계정은 `ops`만
- `deployer` 계정은 `deploy`만
- sudo 권한은 필요한 계정에만

(중요) 인증서가 있어도, 로컬 계정 권한이 과하면 그대로 위험합니다.

---

9) 폐기(Revocation): KRL로 ‘즉시 차단’하기

유효기간을 짧게 잡아도, 즉시 차단이 필요한 상황은 생깁니다.
OpenSSH는 KRL(Key Revocation List)을 지원합니다.

# 9-1) 폐기 대상 전략

- 특정 사용자 키(공개키) 폐기
- 특정 인증서 시리얼(serial) 폐기
- 특정 CA로 발급된 범위 폐기(운영상 주의)

# 9-2) KRL 생성(예시)

1) KRL 파일 생성(초기)

ssh-keygen -k -f ./revoked.krl

2) 특정 사용자 공개키 폐기

ssh-keygen -k -f ./revoked.krl -u ./id_ed25519.pub

3) 서버에 KRL 배포 및 sshd 설정

sudo install -d -m 0755 /etc/ssh/revocation
sudo install -m 0644 ./revoked.krl /etc/ssh/revocation/revoked.krl
sudo chown -R root:root /etc/ssh/revocation
sudo tee /etc/ssh/sshd_config.d/22-ssh-krl.conf >/dev/null