GSSAPI (Generic Security Services Application Programming Interface)

GSSAPI는 응용 프로그램과 보안 서비스 사이의 인터페이스로, SSH에서는 Kerberos 인증 프로토콜을 지원하는 방식으로 많이 사용된다. 이 방법을 통해 서버와 클라이언트 간의 인증이 이루어질 수 있다. GSSAPI를 이용하면 SSH 클라이언트가 서버로부터 인증을 받을 때, 별도의 패스워드 입력 없이도 인증이 가능하다.

GSSAPI의 동작 방식

  1. 서비스 티켓 획득: 클라이언트는 인증 서버(Kerberos KDC)로부터 서비스 티켓을 획득한다.
  2. 티켓 전송: 클라이언트는 SSH 서버에 접속할 때, 이 티켓을 사용하여 자신의 신원을 증명한다.
  3. 서버 인증: 서버는 클라이언트로부터 받은 티켓을 검증하여 클라이언트를 인증한다.

GSSAPI는 특히 엔터프라이즈 환경에서 유용하며, 중앙집중식 인증 시스템을 통해 사용자를 관리할 수 있는 이점이 있다. Kerberos와 같은 시스템은 대규모 네트워크 환경에서 인증을 안전하고 효율적으로 처리할 수 있게 한다.

Kerberos 기반 인증

Kerberos는 네트워크 상에서 클라이언트와 서버 간의 인증을 안전하게 수행하기 위한 프로토콜이다. 공개키 암호화를 사용하지 않고 대칭키 암호화를 기반으로 동작하며, 티켓을 사용하여 보안 세션을 설정한다.

Kerberos의 동작 구조

Kerberos 인증 프로토콜은 크게 다음과 같은 단계로 이루어진다:

  1. TGT (Ticket Granting Ticket) 요청: 클라이언트는 인증 서버(KDC, Key Distribution Center)에 접속하여 TGT를 요청한다. 이 과정에서 클라이언트는 자신의 인증 정보를 제출한다.
  2. TGT 수신: KDC는 클라이언트의 인증 정보를 확인한 후, 클라이언트에게 TGT를 발급한다. 이 티켓은 이후 서비스 티켓을 요청할 때 사용된다.
  3. 서비스 티켓 요청: 클라이언트는 TGT를 사용하여 특정 서비스 (예: SSH 서버)에 접속하기 위한 서비스 티켓을 KDC로부터 요청한다.
  4. 서비스 티켓 전송: 클라이언트는 서비스 티켓을 서버로 전송하고, 서버는 이 티켓을 통해 클라이언트를 인증한다.

Kerberos의 장점은 중앙에서 모든 인증 정보를 관리할 수 있어, 다중 시스템 간의 통합 인증을 가능하게 한다는 점이다. SSH에서 Kerberos 인증을 사용할 때는 GSSAPI를 통해 연동하는 경우가 많으며, 추가적으로 GSSAPIAuthentication yes와 같은 설정을 sshd_config 파일에서 활성화해야 한다.

인증서 기반 인증

SSH에서 인증서 기반 인증은 전통적인 공개키 인증 방식보다 더 복잡하지만, 더 높은 수준의 보안을 제공한다. 여기서 말하는 인증서는 단순히 SSH 키 쌍이 아니라, PKI(Public Key Infrastructure)를 사용하여 서명된 인증서다.

인증서 기반 인증의 동작 방식

  1. 인증서 생성: 인증서 기반 SSH 인증에서는 개인 키와 공개 키가 필요하다. 이 때, 공개 키는 CA(Certificate Authority, 인증 기관)에 의해 서명된다. 서명된 공개 키가 바로 인증서이다.
  2. 인증서 전송: 클라이언트는 인증서 기반 SSH 접속 시, CA로부터 서명된 공개 키(인증서)를 서버로 전송한다.
  3. 서버에서 인증서 검증: 서버는 클라이언트로부터 받은 인증서를 검증하기 위해 CA의 공개 키를 사용한다. 인증서가 유효한 경우, 서버는 클라이언트의 인증을 승인한다.

이 방식은 기존의 SSH 공개키 인증과 유사하지만, 인증서를 사용함으로써 중앙집중식 관리와 더 강력한 보안 정책을 적용할 수 있다. 특히, CA를 통해 발급된 인증서는 만료 기한을 지정하거나, 특정 사용자와 시스템에만 제한적으로 사용될 수 있도록 설정할 수 있다.

인증서 기반 인증의 구성 요소

  1. 인증 기관(CA): CA는 인증서를 발급하고 서명하는 주체이다. CA는 클라이언트의 공개 키를 서명함으로써 해당 키가 신뢰할 수 있음을 보증한다. 또한, 서버는 클라이언트가 제출한 인증서를 검증할 때 CA의 서명 정보를 사용한다.

  2. 클라이언트 인증서: 클라이언트는 자신이 사용하는 개인 키에 해당하는 공개 키를 CA에 제출하여 인증서를 발급받는다. 이 인증서는 SSH 접속 시 서버에 제출되며, 서버는 해당 인증서를 기반으로 클라이언트의 신원을 확인한다.

  3. 서버 인증서: 클라이언트가 SSH 서버에 접속할 때, 서버 역시 CA로부터 서명된 인증서를 클라이언트에게 제공할 수 있다. 클라이언트는 서버의 인증서를 검증하여 해당 서버가 신뢰할 수 있는 서버임을 확인한다.

  4. 인증서 만료 및 갱신: 모든 인증서는 만료 기한이 설정되어 있으며, 만료된 인증서는 더 이상 유효하지 않다. 따라서 인증서 기반 SSH 시스템을 사용하려면 주기적으로 인증서를 갱신하거나 새로 발급받아야 한다. 이를 통해 인증 체계의 유효성과 보안성을 유지할 수 있다.

인증서 기반 SSH 설정

서버와 클라이언트 모두에서 인증서 기반 인증을 설정하려면 다음과 같은 절차를 따른다:

  1. CA 생성: 먼저 CA를 설정하고, 해당 CA를 사용하여 클라이언트와 서버의 공개 키에 서명할 수 있도록 한다. 이를 위해 ssh-keygen 명령어를 사용하여 CA 키를 생성할 수 있다.

ssh-keygen -f /etc/ssh/ssh_ca -C "My CA"

  1. 클라이언트 인증서 생성: 클라이언트의 공개 키를 CA로 서명하여 인증서를 생성한다. 클라이언트의 공개 키에 서명하는 명령은 다음과 같다:

ssh-keygen -s /etc/ssh/ssh_ca -I user_cert -n username -V +52w /home/user/.ssh/id_rsa.pub

여기서 -I는 인증서의 ID를 지정하며, -n은 인증서가 유효한 사용자 이름을 의미한다. -V는 인증서의 유효 기간을 나타낸다.

  1. 서버에서 CA 공개 키 등록: 서버에서 클라이언트의 인증서를 검증하기 위해 CA의 공개 키를 서버에 등록한다. 서버의 sshd_config 파일에 다음과 같이 CA 키를 등록한다:

TrustedUserCAKeys /etc/ssh/ssh_ca.pub

  1. 클라이언트 인증서 사용: 클라이언트는 자신이 발급받은 인증서를 사용하여 서버에 접속할 수 있다. 클라이언트의 ~/.ssh/config 파일에 다음과 같이 설정할 수 있다:

Host myserver CertificateFile ~/.ssh/id_rsa-cert.pub IdentityFile ~/.ssh/id_rsa

이와 같이 인증서 기반 SSH 인증은 중앙집중식 관리가 가능하며, 특히 많은 서버와 사용자를 관리하는 환경에서 유용하다. 또한, 인증서의 유효 기간과 사용 범위를 제한할 수 있어 보안성을 강화할 수 있다.