SSH
SSH
SSH란
- Secure SHell의 약자.
- 원격 호스트에 로그인하거나 명령을 실행할 수 있게 해 주는 보안 프로토콜 (및 응용 프로그램).
- 기존 프로토콜인 Telnet과 달리 암호화 기능이 추가되었으며, 안전하지 않은 네트워크에서도 통신 가능.
- 기본 포트로 22번을 사용하며, 일반적으로 CLI를 이용.
- 서버-클라이언트 구조에 기반을 둠.
사용 예시
- 깃허브에서 원격 저장소에 파일을 push하는 경우.
- AWS EC2 인스턴스에 명령을 내릴 때.
동작 과정
다음과 같은 과정을 통해 동작하게 됨.
- 서버 인증
- 사용자 인증
- 세션 키를 통해 데이터 통신
서버 인증
사용자가 올바른 서버인지 확인하는 과정. 다음과 같은 순서로 수행됨.
- 서버에 SSH 데몬이 설치되고, 처음 구동될 때 공개키와 개인키를 만듦. (이를 key pair라고 함)
- 사용자가 해당 서버에 접근을 시도하면 서버의 공개키를 받음.
- 사용자의 .ssh/known_hosts 파일에 서버의 공개키를 저장하고, 난수를 생성.
- 사용자가 서버의 공개키로 난수를 암호화해서 서버에 전송하게 됨.
- 서버는 서버의 개인키로 4번에서 받은 값을 복호화해서 사용자에게 재전송.
- 사용자는 3번에서 생성한 난수와 5번에서 받은 난수 값을 비교. 이 값이 같다면 서버가 인증됨.
사용자 인증
서버가 올바른 사용자인지 확인하는 과정. 서버 인증과 같은 방식으로 사용자와 서버의 역할만 바꾼채로 진행하게 됨.
세션 키를 통해 데이터 통신
서버와 사용자의 인증이 끝났다면 Diffie-Hellman등의 방법으로 대칭키(세션 키)를 교환하게 됨. 이 세션 키를 이용해서 데이터를 암호화 / 복호화하면서 통신.
AWS EC2에서 SSH를 이용하는 경우
- AWS에서는 key pair를 직접 다운로드 받을 수 있음.
- 이 키는 서버의 공개 키가 아니라 사용자의 개인 키를 대신 만들어서 제공하는 것.
- 다운로드 받은 키는 권한을 400으로 설정해야 함.
- 사용자의 공개 키는 서버가 본인의 .ssh/known_hosts에 자동으로 저장해 줌.
- 이후 사용자가 ssh를 사용해 EC2에 접속하게 되면 서버의 공개키를 사용자의 .ssh/known_hosts에 저장하고, 서버 인증을 진행.
- 서버에서도 사용자 인증을 진행하고, 연결하게 됨.
References
- https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-ssh%EB%9E%80/
- https://en.wikipedia.org/wiki/Secure_Shell
- https://library.gabia.com/contents/infrahosting/9002/
- https://medium.com/@labcloud/ssh-%EC%95%94%ED%98%B8%ED%99%94-%EC%9B%90%EB%A6%AC-%EB%B0%8F-aws-ssh-%EC%A0%91%EC%86%8D-%EC%8B%A4%EC%8A%B5-33a08fa76596