Section 1. SSH 서버
1.1 SSH란?
SSH(Secure SHell)란 통신 경로를 암호화하는 SSH 프로토콜을 사용하여 안전한 원격 셸을 제공하는 서비스이다.
사용자 인증에는 비밀번호뿐만 아니라 공개키를 이용한 공개키 인증이나 원 타임 비밀번호를 이용할 수 있다. 공개키 인증은 사용자가 생성한 공개키와 비밀키 쌍을 서버에 등록해두고 사용자가 비밀키를 사용해 해당 페어를 증명함으로써 인증을 받는 방식이다. 또한 원 타임 비밀번호는 한 번만 사용하는 비밀번호로 인증하는 방식이다.
SSH 프로토콜은 원격 셸이나 파일 전송뿐만 아니라 해당 세션에 다른 애플리케이션의 통신을 캡슐화할 수 있다. 이렇게 하면 평문(plain text)으로 통신하는 애플리케이션도 암호화 통신이 가능해지는데, 이것을 SSH 포트 포워드라고 하며 이를 통해 간이 VPN을 구축할 수도 있다. SSH는 서비스를 제공하는 SSH 서버와 SSH 서버에 로그인하는 SSH 클라이언트로 구성된다.
1.2 SSH 데몬
SSH 서버를 구동하려면 sshd라는 데몬 프로세스를 실행한다.
sshd을 구동했을 때 기본적으로 포트번호가 22/TCP로 SSH 클라이언트의 접속을 기다리게 된다. 클라이언트에게 접속이 오면 이용하는 SSH 프로토콜 버전 교환을 시작으로 통신을 개시한다.
SSH 데몬 동작은 다음과 같다.
- SSH 클라이언트의 접속 요구
- SSH 프로토콜 버전 교환
- DH 키 교환을 거쳐 세션 키를 취득
- 호스트 키/사용자 키 교환
- 인증
- 세션 개시
- 셸 커맨드 실행
- 세션 종료
SSH 프로토콜 통신을 체결하면 Diffie-Hellman 키 교환을 통해 세션 키를 취득한다. 그리고 서버의 호스트 키와 클라이언트의 사용자 키를 서로 교환한다. 이때 다음 동작이 들어간다.
- 클라이언트에 SSH 서버의 호스트 키가 등록된 경우 -> 문제 없음
- 클라이언트에 SSH 서버의 호스트 키가 등록되어 있지 않은 경우 -> SSH 서버 호스트 키의 fingerprint를 표시하여 등록 확인을 표시함
- 클라이언트에 등록된 SSH 서버의 호스트 키와 다른 경우 -> Man-in-the-middle 공격의 가능성이 있다는 경고를 표시함
세션 키를 얻어 암호화 통신을 개시한 후에는 서버와 클라이언트의 인증에 들어간다. 여기서 비밀번호 인증/공개키 인증을 이용하여 계정을 사용할지 판단한다. 인증을 통과하면 셸 구동, 커맨드 실행, X 클라이언트 전송 등을 실행하여 세션을 개시한다.
세션이 실행되면 SSH 클라이언트와 셸 등과의 통신으로 넘어간다. 통신이 끝나면 서버는 세션 종료를 클라이언트 측에 통보하고 접속을 종료한다.
1.3 SSH 데몬 설정 파일
sshd가 이용하는 파일은 /etc/ssh 아래에 정리되어 있다.
moduli
는 DH 키 교환에 사용하는 데이터이다.
SSH 데몬이 참조하는 것은 sshd_config
이다.
ssh host * key{,.pub}
은 SSH 서버에서 가지는 SSH 호스트 키이다.
ssh_config
는 SSH 클라이언트가 참조하는 기본 설정 파일이다.
sshd_config의 내용은 책 참고하기. 포트번호, 대기하는 IP주소, 이용할 SSH 프로토콜 버전, SSH 호스트 비밀키, 여러 권한들에 대해 yes인지 no인지 등을 확인할 수 있다. 해당 내용에서 참고로 알아둘만한 용어는 다음과 같다.
- Kerberos의 KDC (Key Distribution Center)
- GSSAPI (Generic Security Service Application Programming Interface) Authentication(인증)
- AllowTcpForwarding : 'SSH 포트 포워드'라고도 불리는 TCP 전송의 허가 여부를 지정한다. SSH의 TCP 전송은 안전하지 않은 TCP/IP 프로토콜을 캡슐화함으로써 암호화된 TCP/IP 프로토콜로 안전하게 경로를 이용할 수 있게 해준다. 안전하지 않은 TCP/IP 프로토콜을 SSH로 암호화해서 이용하려면 프로그램이 암호화에 사용할 주소와 포트가 필요하다. 그 포트를 통해 SSH 서버의 22/TCP에 접속하여 수신할 수 있다.
1.4 SSH 클라이언트 설정
SSH 클라이언트는 관리자뿐만 아니라 개발자도 개발 서버나 설치 서버 로그인 등에 많이 사용하는 도구 중 하나이다. SSH를 사용할 때 긴 커맨드나 호스트 이름을 입력하거나 SSH 공개키 인증 패스 문구를 입력하는 일은 꽤 번거로운 일이기도 하다. 여기에서는 OpenSSH의 클라이언트를 조금이라도 편리하게 쓸 수 있는 설정 파일을 만들 수 있다.
SSH 클라이언트의 옵션은 다음 순서로 읽어들인다.
- ssh 커맨드 라인 옵션
- 사용자별 옵션(~/.ssh/config)
- 시스템 옵션(/etc/ssh/ssh_config)
- ssh 커맨드 기본 파라미터
커맨드 라인 옵션에 입력하는 호스트 이름이나 사용자명, SSH 비밀키 PATH, 포트 번호 등 자주 쓰는 로그인일수록 매번 입력하기 귀찮기 마련이다. 이것을 사용자용 파일 ~/.ssh/config에 정리해두면 좀 더 편리하게 로그인할 수 있다. 다음은 ~/.ssh/config의 예시이다.
Host example
User manager #사용자명
Hostname www.example.com #호스트 이름
AddressFaimily inet6 #IPv6로 접속
Port 2222 #포트번호
IdentityFile ~/.ssh/id_rsa-example #SSH 비밀키
SSH 커맨드를 실행하는 예이다.
$ ssh -l manager www.example.com -6 -p 2222 -i ~/.ssh/id_rsa-example
이로써 ssh example
이라고 입력하기만 하면 위의 커맨드 실행처럼 실행되어 타깃 호스트에 SSH로 로그인할 수 있게 된다.
위의 파일 예시를 Host *(와일드카드)로 바꾸면 기본 값으로 사용할 수 있다.
또한 SSH 공개키로 패스 문구를 설정해 두면 로그인할 때마다 패스 문구를 입력해야 하지만, ssh-agent
를 이용해서 맨 처음 한 번만 입력해 두면 그 이후에는 입력을 생략할 수 있다. SSH 공개키 인증 패스 문구를 등록하려면 ssh-add
로 키를 캐시하면 된다. 등록 후에는 그 다음부터 패스 문구 입력을 요구하지 않는다.