본문 바로가기

Security

Ssh 원리

참고

https://www.hostinger.com/tutorials/ssh-tutorial-how-does-ssh-work

http://programmingskills.net/archives/315

 

ssh란 무엇인가?

ssh는 secure shell의 약자로, 안전하지 않은 네트워크 환경에서도 안전하게 서버에 원격으로 접속할 수 있다.

ssh 접속을 위해서는 ssh client가 ssh daemon 프로세스가 실행되고 있는 서버에 접속 요청을 해야한다.

linux, osx에서는 보편적으로 터미널에서 ssh client를 사용한다.

 

왜 안전한가?

ssh는 커넥션을 맺을 때 3가지 암호화방식을 제공해서 보안성을 확보한다.

통신 암호화를 확보 후 유저 검증을 하여 제 3자가 내용을 확인할 수 없다. 

따라서 아무나 서버에 접속하지 못 한다.

유저 검증이 되면 서버에 접속하여 원격으로 서버를 제어할 수 있다.

또한 HMAC과 같은 해쉬 기법을 사용하여 전달받은 메시지가 올바른지 확인한다.

 

ssh 암호화

암호화에는 3가지 방식이 사용된다.

1. 비대칭 키 암호화

2. 대칭키 암호화

3. 해쉬

 

ssh 커넥션 생성 시, 우선 클라이언트와 서버는 tcp handshake가 이뤄진다. tcp 커넥션이 생성되면 서버는 자신의 공개키를 클라이언트에게 제공하여 서버 검증을 할 수 있도록 한다(검증되면 클라이언트의 known_hosts 목록에 서버의 공개키가 추가된다). 서버 검증 후 클라이언트와 서버는 서로가 제공하는 암호화 방식을 확인하고 공통적으로 사용할 수 있는 암호화 방식을 체택한다. (여기서 말하는 암호화 방식은 비대칭 암호화 방식을 말하는 걸까? 대칭 암호화 방식을 말하는 걸까?) 서버는 자신의 비대칭 키를 통하여 클라이언트와 키 교환 알고리즘(ex. 디피헬만)을 수행하여 대칭키를 생성한다. 즉, 비대칭 키 암호화를 통해 서버를 검증함과 동시에 대칭키를 안전하게 만들 수 있다. 이렇게 생성된 대칭키를 사용하여 서버와 클라이언트는 메시지를 암호화한다. 이는 아직까지는 완벽한 암호화 방식으로, 제 3자가 암호화된 메시지를 복호화하기란 불가능에 가깝다. 

 

비대칭 키 암호화 방식과 대칭키 방식을 섞어서 사용하는 이유는 서로의 장단점 때문이다. 비대칭 키 방식은 보안적으로는 우수하나 이를 검증하는게 어렵고 대칭키에 비해 느리다. 반면 대칭키는 암호화와 복호화가 빠르다. 하지만 보안적으로 비대칭키에 비해 허술하다. 따라서 ssh는 이 둘을 모두 사용하여 보안성을 높였다. (이는 https도 마찬가지다)

 

커넥션이 맺어지면(암호화, 유저 인증이 끝나면) 서버와 클라이언트는 메시지를 주고받을 수 있다. 이 때 보안을 좀 더 높이기 위해 해쉬를 통해 메시지 정합성을 검증한다(ex. HMAC). 클라이언트가 메시지를 만들고 전송할 때 메시지의 해쉬 값을 만들어 메시지와 함께 전송한다. 서버는 같은 해싱룰로 메시지의 해쉬 값을 만들어 클라이언트가 만든 해쉬 값과 비교한다. 만약 값이 틀리면 신뢰할 수 없는 메시지로 간주한다.

 

사용자 인증

ssh는 사용자 인증을 위해 2가지 방법을 제공한다.

1. 패스워드 인증

2. 공개키 인증

 

ssh는 특정 사용자(리눅스 유저)만 접근할  수 있도록 허용한다. 암호화를 통해 보안성이 확보되면 서버는 클라이언트를 검증한다. 클라이언트가 검증되면 비로소 커넥션 생성이 완료된다.

 

첫번째 방식은 패스워드 인증이다. 리눅스 유저는 각자 패스워드를 가질 수 있다. 패스워드 인증은 유저의 패스워드를 올바르게 입력했는지 확인하는 것이다. 유저 목록과 패스워드는 서버에 존재한다.

이 인증방식을 사용하고자 한다면 서버의 /etc/ssh/sshd_config 파일에 다음 과 같이 PasswordAuthentication을 yes로 설정해둬야한다.

설정 후 sshd 프로세스를 재시작해야한다. (필자는 systemctl 명령어로 재시작 했다.)

 

두 번째 방법은 공개키 인증이다. 비대칭 키 암호화 방식에 해당한다. 이 방식을 사용하려면 우선 서버에 클라이언트의 공개키를 넣어둬야한다. 공개키 저장 장소는 sshd_config에 설정할 수 있으며 디폴트 위치는 .ssh/authorized_keys 이다.접속하고자 하는 유저의 홈 디렉토리에서 .ssh/authorized_keys 이다.

따라서 공개키 인증으로 접속을 허용하고자 하는 유저의 홈 디렉토리에 .ssh 디렉토리를 만들고 authroized_keys 파일을 만들어야한다. ssh key는 ssh-keygen 명령어를 통해서 만들 수 있는데 자세한 사항은 참고 문서를 확인바란다. 

 

이 때 .ssh 폴더와 authorized_keys 파일의 권한을 각각 700, 600으로 설정했다. 구글링을 해보니 이 값은 os에 따라 다른건가 싶다. 정확한 문서를 확인해보지 못해서 이 점은 자세히 모른다..

 

준비가 되면 sshd_config에 아래와 같이 설정한다. 설정 후 sshd 프로세스를 재시작해야한다. (필자는 systemctl 명령어로 재시작 했다.)

 

패스워드 인증은 간단해서 좋지만 공개키 인증이 좀 더 보안적으로 우수하다. 따라서 가급적 공개키 인증 방식을 사용하길 권고한다.

 

 

 

 

'Security' 카테고리의 다른 글

Https란?  (1) 2019.01.02
비밀번호 암호화  (0) 2018.12.31