누구나 알아야하는 ssh

taypark·2020년 8월 31일
0

그 이전에 telnet이나 rsh(remote shell)같은 원격접속 기술이 있었다. 이들은 데이터를 평문으로 전송하였어서, 보안의 문제로 ssh로 대체되었다.

SSH는 Secure Shell의 줄임말이다. 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해주는 응용 프로그램 또는 그 프로토콜을 가리킨다. - 위키백과 -

AWS Lightsail 을 다룰 때(그냥 맘편히 EC2를 씁시다...), ssh를 사용하여 커넥션을 맺는 PuTTYVSCode를 사용했었다. PuTTY의 경우 .pem이 아닌 .ppk를 사용했었고, VSCode의 경우에는 내부적으로 .ssh/config 파일을 통해 ssh configuration을 한 후에 extension으로 커넥션을 맺는다.

둘의 공통점은 ssh라는 공통의 프로토콜과 key를 통해 원격 접속 커넥션을 맺는다는 것이다. 후술 할 것지만 key가 필요없이 ssh 로그인을 할 수도 있다. 그렇다면 동작 구조를 살펴보도록 하자.

ssh 동작구조

기본적으로 SSH 커넥션을 맺기 위해 2대의 컴퓨터가 필요하다.

  • 클라이언트
  • 서버

마치 HTTP프로토콜을 사용하여 서버-클라이언트간 요청-응답 구조를 가지는 것과 유사하다. 실제로 클라이언트에서 명령어를 사용하여 결과를 서버에서 클라이언트로 전달한다.

ssh를 통해 원격 컴퓨터를 제어하기 위해서는 두 가지 사항이 충족되어야한다.

  1. Client에는 SSH Client 프로그램이 설치되어 있어야한다.
  2. Server에는 SSH Server 프로그램이 설치되어 있어야한다.
  3. 각 SSH 프로그램 간 커넥션이 맺어질 수 있어야 한다.

그렇다면 다음의 동작 구조를 가지며 쉘을 통한 원격제어를 할 수 있다.

  1. SSH Client 프로그램과 SSH Server 프로그램이 커넥션을 맺는다. 단, 각각 Client와 Server에 SSH Client와 SSH Server 프로그램이 실행중이어야한다.
  2. Client가 SSH Client에게 SSH Server에서 사용할 명령어를 전달한다.
  3. 이는 암호화되어 SSH Server에게 네트워크를 통해 전달된다.
  4. SSH Server 프로그램은 이를 Server에게 전달하여 실행한다.
  5. Server는 전달받은 명령어를 실행하고 결과를 SSH Server 프로그램에게 전달한다.
  6. SSH Server 프로그램이 결과를 SSH Client 프로그램으로 전달한다.
  7. Client는 SSH Client로부터 결과를 확인한다.

사실 프로그램이 설치가 되어있으면(OpenSSH) 1. 부터 6. 까지는 프로그램이 상호 커넥션을 맺어 알아서 실행된다. 우리가 신경써야 할 부분은 0. 이다.

SSH Client와 SSH Server가 커넥션을 맺는 방법

암호학을 공부한 사람이라면 공개키 암호 알고리즘 중 RSA에 대해 알 것이다. SSH의 사용자 인증은 RSA의 개인키, 공개키를 수학적으로 비교하는 방식으로 이루어진다.

ssh key는 다른 어떤 패스워드보다 복잡하기 때문에 강력하다. 그렇기 때문에 brute-force로부터 안전하고, 간단한 키 교환으로 remote computer를 비밀번호 없이 제어할 수 있다. 물론 필요하다면 passphrase를 적용하여 키에 대한 비밀번호를 설정할 수도 있다. 그거마저 귀찮다면 컴퓨터를 사용하는 동안은 passphrase를 사용하지 않도록 agent를 설정할 수도 있다.

ssh key 만들기

ssh key를 만드는 방법은 다음과 같다.

$ ssh-keygen

그렇게되면 .ssh/ 디렉토리에 id_rsa와 id_rsa.pub 이 만들어진다. 각각 개인키, 공개키를 나타낸다.

공개키는 원격 컴퓨터에 존재하고 암호화를 위해 사용된다. 개인키는 remote 접속을 시도할 컴퓨터에 있어야하며, 복호화에 사용된다.

remote server에 key 추가하기

  1. ssh-copy-id를 사용한다.

    $ ssh-copy-id -i ~/.ssh/id_rsa.pub USERNAME@REMOTE_IP
  2. 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되기 때문이다.

  1. 공개키 자체를 복사하여 추가한다.

github의 경우에 이 방법을 사용한다.

ssh key로만 remote connect 할 수 있도록 하기

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://ko.wikipedia.org/wiki/SSH_%ED%8C%8C%EC%9D%BC_%EC%A0%84%EC%86%A1_%ED%94%84%EB%A1%9C%ED%86%A0%EC%BD%9C

https://blog.robertelder.org/what-is-ssh/

https://ko.wikipedia.org/wiki/%EC%8B%9C%ED%81%90%EC%96%B4_%EC%85%B8

profile
인생은 하드코어하게

0개의 댓글