공개키 기반 인증의 개념
공개키 기반 인증은 SSH 프로토콜에서 가장 많이 사용되는 인증 방법 중 하나로, 클라이언트가 개인키를 사용해 서명한 메시지를 서버가 클라이언트의 공개키로 검증하는 방식으로 이루어진다. 이 방식은 비밀번호 기반 인증보다 보안성이 뛰어나며, 비밀번호를 서버에 전송하지 않기 때문에 중간자 공격에 강하다.
공개키 기반 인증을 구성하려면 클라이언트와 서버 사이에서 키 쌍을 생성하고 관리해야 한다. 이 과정에서 클라이언트는 개인키를 비밀로 유지하고, 서버에는 공개키를 등록하여 클라이언트의 인증을 수행한다.
SSH 키 생성
키 쌍을 생성하기 위해 클라이언트에서는 ssh-keygen
명령어를 사용한다. ssh-keygen
은 다양한 알고리즘(RSA, DSA, ECDSA, Ed25519)을 지원하며, 이 중 Ed25519가 최근 들어 많이 사용되고 있다.
ssh-keygen -t ed25519 -C "your_email@example.com"
위 명령어는 Ed25519 알고리즘을 사용해 키 쌍을 생성하고, 키 쌍에 이메일 주소를 주석(comment)으로 추가한다.
SSH 키 파일의 구성
ssh-keygen
을 사용해 키를 생성하면 두 개의 파일이 만들어진다.
- 개인키 (
id_ed25519
): 클라이언트가 소유하며, 비밀로 유지해야 한다. - 공개키 (
id_ed25519.pub
): 서버에 제공하여 클라이언트의 인증을 허용한다.
공개키 배포
키를 생성한 후, 클라이언트는 서버에 자신의 공개키를 배포해야 한다. 이를 위해 ssh-copy-id
명령어를 사용하여 간편하게 공개키를 서버에 추가할 수 있다.
ssh-copy-id user@hostname
이 명령어는 클라이언트의 공개키를 서버의 ~/.ssh/authorized_keys
파일에 추가한다. 공개키가 등록되면 서버는 해당 키를 통해 클라이언트를 인증할 수 있게 된다.
서버 측 설정 파일
서버에서 공개키 기반 인증을 허용하려면 sshd_config
파일에서 적절한 설정을 해야 한다. 주요 설정은 다음과 같다.
- PubkeyAuthentication: 공개키 인증을 활성화하는 옵션이다.
PubkeyAuthentication yes
- AuthorizedKeysFile: 클라이언트의 공개키가 저장된 경로를 지정한다. 기본값은
~/.ssh/authorized_keys
이다.
AuthorizedKeysFile .ssh/authorized_keys
인증 과정
공개키 인증 과정은 다음과 같이 진행된다.
- 키 쌍 생성: 클라이언트는 개인키와 공개키를 생성한다.
- 공개키 배포: 클라이언트는 서버에 공개키를 등록한다.
- 인증 요청: 클라이언트는 서버에 접속을 요청하고, 서버는 클라이언트의 공개키를 확인한다.
- 서명 요청: 서버는 클라이언트에게 메시지 서명을 요청하며, 클라이언트는 개인키를 사용해 메시지에 서명한다.
- 서명 검증: 서버는 클라이언트의 공개키로 서명을 검증하고, 검증에 성공하면 인증을 완료한다.
암호화 과정과 수학적 설명
공개키 인증은 비대칭 암호화 방식을 사용하며, 이는 클라이언트의 개인키와 서버의 공개키를 통해 보안을 유지한다. SSH에서는 클라이언트의 개인키로 메시지를 서명하고, 서버는 클라이언트의 공개키로 이 서명을 검증한다. 이 과정은 수학적으로 RSA 알고리즘과 비슷한 방식으로 설명할 수 있다. 여기서는 공개키 기반 인증에서의 기본적인 흐름을 설명하겠다.
공개키와 개인키
암호화 과정에서 다음과 같은 수학적 개념이 적용된다.
- 클라이언트의 개인키: \mathbf{k}_{\text{priv}}
- 클라이언트의 공개키: \mathbf{k}_{\text{pub}}
이 두 개의 키는 특정 수학적 관계를 통해 연관되어 있다. 예를 들어, RSA 암호화의 경우 다음과 같은 관계식을 가진다:
여기서 \mathbf{e}는 공개 지수, \mathbf{d}는 개인 지수, \mathbf{n}은 모듈러 연산에 사용되는 값이다.
서명과 검증 과정
공개키 인증에서 클라이언트가 서명하는 메시지 \mathbf{M}가 있다고 가정하자. 클라이언트는 개인키 \mathbf{k}_{\text{priv}}로 다음과 같이 메시지에 서명한다:
이 서명된 메시지 \mathbf{S}는 서버에 전송되며, 서버는 클라이언트의 공개키 \mathbf{k}_{\text{pub}}를 사용해 서명을 검증한다. 검증 과정은 다음과 같이 이루어진다:
만약 \mathbf{M}' = \mathbf{M}이라면, 서버는 서명이 유효함을 확인하고 클라이언트의 인증을 성공적으로 처리한다.
SSH 에이전트
SSH 에이전트는 클라이언트가 여러 SSH 연결을 할 때 매번 개인키를 입력할 필요 없이 개인키를 메모리에 저장하여 자동으로 인증하는 기능을 제공한다. SSH 에이전트를 시작하는 명령어는 다음과 같다:
eval "$(ssh-agent -s)"
이 명령어는 SSH 에이전트를 실행하고, 클라이언트의 개인키를 에이전트에 추가한다.
ssh-add ~/.ssh/id_ed25519
SSH 에이전트 포워딩
SSH 에이전트 포워딩은 클라이언트가 중간 서버를 경유하여 최종 서버에 접속할 때, 개인키를 중간 서버에 노출하지 않고 안전하게 인증할 수 있도록 돕는다. 이는 SSH 에이전트를 이용해 중간 서버를 통해 원격 서버로 접속하는 기능이다.
에이전트 포워딩을 사용하려면 SSH 접속 시 -A
옵션을 사용하여 포워딩을 활성화할 수 있다.
ssh -A user@intermediate_server
에이전트 포워딩을 통해 최종 서버에서도 클라이언트의 SSH 키를 사용하여 인증을 할 수 있다.