그 이전에 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