SSH란?
Secure Shell Protocol의 약자로 네트워크 프로토콜중 하나로, 네트워크 상의 다른 컴퓨터로 접속할때(또는 통신할때) 안전하게 통신을 할수 있는 기능을 제공한다.
사용 이유
이와 비슷한 프로토콜로 FTP(파일 전송 프로토콜),telnet등이 있는데 왜 ssh를 사용할까?
답은 보안때문이다.
telnet,FTP같은 프로토콜들의 문제점은 데이터를 암호화 하지 않고 평문상대로 보내기 때문에 중간에 데이터를 갈취하게 된다면 그대로 사용할수 있게 되기 떄문에 거의 사용하지 않는다.
이러한 이유로 윈도우에서는 아에 telnet기능 자체를 기본적으로 꺼둔다.
아래의 이미지를 보면 윈도우에서는 기본적으로 텔넷기능이 꺼져있는것을 볼수 있다.
사용 예
데이터 전송
⇒ github에 소스 코드를 push하는 경우를 생각할 수 있다. ssh를 이용해서 파일을 전송한다.
원격제어
⇒ 아래와 같이 명령어를 사용해서 원격으로 접속할 수 있다.
ssh <접속할 서버의 계정>@<서버의 ip주소>
⇒ 원격제어의 예로는 AWS의 EC2에 접속하는 것을 예로 들수 있다.
ssh lsh9672@192.168.0.16
SSH 동작과정
ssh는 기본적으로 다른 컴퓨터와 접속을 할때 일반적으로 사용하는 비밀번호 입력을 하지 않는다.(물론 서버에서 config파일에 가서 패스워드기능을 켤수 있다.)
ssh는 대칭키방식과 비대칭키 방식을 모두 사용해서 인증과 암호화를 한다.
따라서 ssh를 이용하기 위해서는 키를 교환해야 한다.
키를 교환하는 인증과정은 아래와 같다.
서버 인증
⇒ 클라이언트는 그다음으로 난수값을 발생시키고 난수값에 대한 해시값을 생성해서 저장하게 된다. 그리고 난수값을 서버로부터 받은 공개키로 암호화하여 서버에 전송하게 된다.
⇒ 클라이언트는 저장하고 있는 해시값과 서버로부터 받은 해시값을 비교해서 서버가 정상적인 서버인지 확인한다.
⇒ 서버에서는 아까 건네준 자신의 공개키로 암호화된 암호문을 비밀키를 이용해서 복호화 하고 복호화된 난수값을 통해 해시값을 다시 만든후에 클라이언트에게 전달한다.
⇒ ssh를 처음 구동하면 내부적으로 비대칭키가 생성된다. 클라이언트가 처음으로 서버에 접속을 시도하면 공개키를 받을지 묻는 메시지가 나오고 사용자가 yes를 선택하면 공개키를 받아서 클라이언트에 있는 .ssh/known_hosts파일에 저장한다.
사용자 인증
⇒ 서버와 원리는 같으며 단지 서버에서 사용자로 역할만 바뀌게 된다.
⇒ 사용자 인증은 클라이언트 측에서 ssh를 설치하고 구동하면 비대칭키를 생성하게 된다.
⇒ 생성된 공개키는 서버로 보내고 서버는 .ssh/authorized_keys 파일에 사전에 복사를 해둔다.
⇒이과정을 통해서 서버는 클라이언트의 공개키를 클라이언트는 서버의 공개키를 가지고 있게 된다.
⇒ 서버인증과 동일하게 서버에서 난수값을 생성하고 이를 통해서 해쉬값을 만들어 저장한다. 이 값은 클라이언트의 공개키로 암호화 되어 클라이언트로 전송하게 되고, 클라이언트에서는 암호화된 난수값을 본인의 비밀키로 복호화 하게 된다.
⇒ 복호화된 데이터로 해시값을 생성해 다시 서버로 보내면 서버측에서는 저장하고 있는 해시값과 받은 해시값을 비교해서 정상적인 사용자인지를 확인하게 된다.
데이터 암호화
⇒ 서버인증, 클라이언트 인증이 끝나면 비대칭키를 이용해서 서로 대칭키(세션키라고 부름)을 교환하게 된다.
⇒ 이 후 통신하는 모든 데이터는 세션키를 이용해서 암호화가 이루어지게 된다.
'인프라 > 리눅스' 카테고리의 다른 글
[Linux] Cockpit (0) | 2021.11.08 |
---|