그 이전에 telnet이나 rsh(remote shell)같은 원격접속 기술이 있었다. 이들은 데이터를 평문으로 전송하였어서, 보안의 문제로 ssh로 대체되었다.
SSH는 Secure Shell의 줄임말이다. 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다. - 위키백과 -
AWS Lightsail 을 다룰 때(그냥 맘편히 EC2를 씁시다...), ssh를 사용하여 커넥션을 맺는 PuTTY와 VSCode를 사용했었다. PuTTY의 경우 .pem이 아닌 .ppk를 사용했었고, VSCode의 경우에는 내부적으로 .ssh/config 파일을 통해 ssh configuration을 한 후에 extension으로 커넥션을 맺는다.
둘의 공통점은 ssh라는 공통의 프로토콜과 key를 통해 원격 접속 커넥션을 맺는다는 것이다. 후술 할 것지만 key가 필요없이 ssh 로그인을 할 수도 있다. 그렇다면 동작 구조를 살펴보도록 하자.
기본적으로 SSH 커넥션을 맺기 위해 2대의 컴퓨터가 필요하다.
마치 HTTP프로토콜을 사용하여 서버-클라이언트간 요청-응답 구조를 가지는 것과 유사하다. 실제로 클라이언트에서 명령어를 사용하여 결과를 서버에서 클라이언트로 전달한다.
ssh를 통해 원격 컴퓨터를 제어하기 위해서는 두 가지 사항이 충족되어야한다.
그렇다면 다음의 동작 구조를 가지며 쉘을 통한 원격제어를 할 수 있다.
사실 프로그램이 설치가 되어있으면(OpenSSH) 1. 부터 6. 까지는 프로그램이 상호 커넥션을 맺어 알아서 실행된다. 우리가 신경써야 할 부분은 0. 이다.
암호학을 공부한 사람이라면 공개키 암호 알고리즘 중 RSA에 대해 알 것이다. SSH의 사용자 인증은 RSA의 개인키, 공개키를 수학적으로 비교하는 방식으로 이루어진다.
ssh key는 다른 어떤 패스워드보다 복잡하기 때문에 강력하다. 그렇기 때문에 brute-force로부터 안전하고, 간단한 키 교환으로 remote computer를 비밀번호 없이 제어할 수 있다. 물론 필요하다면 passphrase를 적용하여 키에 대한 비밀번호를 설정할 수도 있다. 그거마저 귀찮다면 컴퓨터를 사용하는 동안은 passphrase를 사용하지 않도록 agent를 설정할 수도 있다.
ssh key를 만드는 방법은 다음과 같다.
$ ssh-keygen
그렇게되면 .ssh/ 디렉토리에 id_rsa와 id_rsa.pub 이 만들어진다. 각각 개인키, 공개키를 나타낸다.
공개키는 원격 컴퓨터에 존재하고 암호화를 위해 사용된다. 개인키는 remote 접속을 시도할 컴퓨터에 있어야하며, 복호화에 사용된다.
ssh-copy-id를 사용한다.
$ ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@REMOTE_IP
scp를 사용한다.
$ scp ~/.ssh/id_rsa.pub USERNAME@REMOTE_IP:/home/USERNAME/.ssh/authorized_keys
$ USERNAME@REMOTE_IP`s password:
단, 이 경우에 remote 컴퓨터의 ssh key가 존재할 경우, scp로 key를 넣는 방법은 사용하지 말아야한다. 현재 추가하려는 키가 overwrite되기 때문이다.
github의 경우에 이 방법을 사용한다.
ssh key가 아닌 password authentication을 허용한다면 ssh는 사실상 사용하지 않아도 된다. 그렇기에 외부에서 brute-force 공격을 막고 ssh key를 가진 사람만이 remote control 하게 하려면 password authentication을 막아야한다.
$ vi /etc/ssh/sshd_config
# PasswordAuthentication no 로 설정
# ubuntu의 경우
$ sudo service ssh restart
# centos의 경우
$ sudo systemctl restart ssh
https://tools.ietf.org/html/rfc4254
https://www.youtube.com/watch?v=zlv9dI-9g1U
https://www.youtube.com/watch?v=mF6J-VQHPxA
https://blog.robertelder.org/what-is-ssh/
https://ko.wikipedia.org/wiki/%EC%8B%9C%ED%81%90%EC%96%B4_%EC%85%B8