SSH 인증서: 더 나은 SSH 경험

3 hours ago 1
  • SSH 인증서는 기존 공개키 기반 SSH 인증의 번거로움을 해결하며, 클라이언트와 서버 간 자동 신뢰를 제공함
  • OpenSSH 5.4부터 지원되며, CA(인증 기관) 가 사용자와 호스트 키를 서명해 authorized_keys 수정 없이 인증 가능
  • 인증서에는 유효기간, 허용 사용자(principal), 접근 IP, 강제 명령(force-command) 등을 포함해 세밀한 접근 제어 지원
  • TOFU(Trust on First Use) 절차가 제거되고, 호스트 키 변경 시 경고 없이 안전하게 접속 가능
  • 자동 서명 서버나 도구를 활용하면 대규모 서버 환경의 SSH 관리 자동화와 보안성 향상이 가능함

SSH 인증서 개요와 기존 SSH 키 기반 인증의 한계

  • SSH 연결 시 처음 접속하는 서버의 호스트 키 지문(fingerprint) 을 확인해야 하며, 대부분 사용자는 이를 검증하지 않고 ‘yes’를 입력하는 TOFU(Trust on First Use) 방식 사용
    • 관리자는 서버의 지문을 직접 확인하거나 ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key 명령으로 검증 가능
  • 공개키 기반 인증은 비밀번호 없이 접속할 수 있지만, 각 서버의 authorized_keys 파일에 공개키를 배포해야 함
  • SSH 에이전트(ssh-agent)를 이용하면 개인키를 메모리에 저장해 반복 입력 없이 인증 가능
  • 기존 방식의 한계
    • 사용자별로 서버에 공개키 복사 필요
    • 호스트 키 변경 시 클라이언트에서 경고 메시지 발생
    • TOFU로 인한 신뢰 관리의 불편함

SSH 인증서와 인증 기관(CA)

  • SSH 인증서(Certificate) 는 OpenSSH 5.4(2010년 3월)부터 지원되며, 기존 SSH 키 포맷을 확장한 구조
  • SSH CA는 SSH 키 쌍으로 구성되며, 공개키가 신뢰 루트 역할 수행
  • 주요 장점
    • 서버의 authorized_keys 파일 수정 불필요
    • 호스트 키 교체 시 경고 없음
    • TOFU 절차 제거로 자동 신뢰 구현
    • 인증서에 허용 사용자(principal), 허용 IP, 유효기간, 강제 명령(force-command) 등을 포함 가능
    • 인증서 만료 시 자동 접근 차단

SSH CA 구축 및 서명 절차

  • CA 시스템에서 ECDSA 알고리듬으로 CA 키 쌍 생성
    • ssh-keygen -t ecdsa -C "SSH CA" -f CA/ssh-ca
  • 사용자는 자신의 공개키(*.pub)를 CA에 전달하고, CA는 이를 서명(sign) 하여 인증서(*-cert.pub) 발급
    • 예: ssh-keygen -s CA/ssh-ca -I "Jane Jolie" -n jane -z 001 -V +1w jane.pub
  • 서버 구성
    • CA 공개키를 /etc/ssh/ssh-ca.pub에 저장하고 TrustedUserCAKeys 설정 추가
    • 서버 호스트 키를 CA로 서명 (ssh-keygen -h -s CA/ssh-ca ...) 후 HostCertificate 항목에 등록
  • 클라이언트 구성
    • known_hosts 파일에 @cert-authority 한 줄 추가
    • 예: @cert-authority *.example.com $(cat CA/ssh-ca.pub)

SSH 인증서 기반 접속 및 검증

  • 사용자는 서명된 인증서와 개인키를 함께 사용해 접속 (ssh -i jane -l jane alice.example.com)
  • 서버 로그에는 인증서의 ID, 일련번호(serial), CA 지문 이 기록됨
  • 여러 호스트명 또는 IP를 인증서의 principal 로 추가 가능
  • 인증서에 지정된 principal 외 사용자로 로그인 시도 시 “Certificate invalid: name is not a listed principal” 오류 발생
  • 인증서에 강제 명령(force-command) 또는 허용 IP(source-address) 설정으로 세밀한 접근 제어 가능

점검 및 문제 해결 체크리스트

  • 서버 측 확인 항목

    • TrustedUserCAKeys 설정 및 CA 공개키 존재
    • 호스트 키 서명 및 HostCertificate 지정
    • sshd 재시작 필요
  • 클라이언트 측 확인 항목

    • 사용자 키가 CA로 서명되어 있어야 함
    • known_hosts의 @cert-authority 항목과 principal 일치 필요
    • 인증서 만료 시 “Certificate invalid: expired” 메시지 표시
    • 인증서 제약 조건 불일치 시 비밀번호 요청 발생
    • SSH 에이전트에 인증서 추가 시 키와 인증서가 모두 등록됨 (ssh-add jane)
    • 서명 시 옵션(-O)으로 기능 제어 가능
    • 예: -O clear로 모든 권한 제거 후 permit-agent-forwarding, permit-port-forwarding만 허용

호스트 키 인증서 자동화

  • Python 모듈 sshkey-tools 와 BottlePy를 이용해 자동 서명 서버(hkbot) 구현
    • CA 서버에서 hkbot.py 실행 후 HTTP 요청으로 호스트 공개키 업로드 시 자동 서명
    • 클라이언트에서 curl -F hostkey=@/etc/ssh/ssh_host_ed25519_key.pub http://CA:8870 | sh 명령으로 자동 설치
    • /etc/ssh/sshd_config 수정 및 검증 후 systemctl restart sshd 로 적용
  • 이후 SSH 접속 시 인증서 기반으로 자동 신뢰 및 로그인 가능

SSH 인증서의 장점 요약

  • TOFU 불필요, 클라이언트와 서버 간 자동 신뢰
  • 단기 유효 인증서 발급으로 일시적 접근 제어 가능
  • 인증서 만료 시 자동 접근 차단, authorized_keys 정리 불필요
  • 강제 명령, PTY 제한, 접근 IP 제어 등 세밀한 정책 설정 가능
  • 자동화 도구로 대규모 서버 환경 관리 간소화 가능
  • 관련 프로젝트로 Smallstep SSH 소개

추가 참고 자료

업데이트

  • SSH CA는 자체 서버를 보유하고 루트 권한이 있는 환경에서 특히 유용
  • 다중 사용자 시스템에서는 기존 known_hosts 및 authorized_keys 방식이 여전히 필요
  • SSH 인증서 포맷 표준화 초안: draft-miller-ssh-cert-06
Read Entire Article