# 기타 인증 방법 (GSSAPI, Kerberos, 인증서 기반)

#### 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"
   ```
2. **클라이언트 인증서 생성**: 클라이언트의 공개 키를 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`는 인증서의 유효 기간을 나타낸다.
3. **서버에서 CA 공개 키 등록**: 서버에서 클라이언트의 인증서를 검증하기 위해 CA의 공개 키를 서버에 등록한다. 서버의 `sshd_config` 파일에 다음과 같이 CA 키를 등록한다:

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

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

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