SSH에 대해 알아보자!
해당 포스트는 macOS 환경에서의 ssh를 다룬다. 일반적인 서버는 리눅스 환경이기 때문에 좀 더 많은 설여(open-ssh 설치 등)이 필요할 수 있다. 그러나 크게 다르지 않다.
SSH(Secure Shell)은 원격지 호스트 컴퓨터에 접속하기 위해 사용되는 인터넷 프로토콜이다.
기존의 유닉스(unix) 시스템 쉘에 원격 접속하기 위해 사용되던 텔넷(telnet)은 암호화가 이루어지지 않아 계정 정보가 탈취 위험이 높았기 때문에 여기에 암호화 기능을 추가하여 1995년에 나온 보안 프로토콜이다.
쉘로 원격 접속하기 때문에 기본적으로 CLI(Command-Line Interface)상에서 실행한다. 기본 포트는 22번이다.
SSH를 구성하는 가장 핵심적인 키워드는 ‘KEY(키, 열쇠)’다.'
사용자(클라이언트)와 서버(호스트)는 각각의 키를 보유하고 있으며, 이 키를 이용해 연결 상대를 인증하고 안전하게 데이터를 주고 받는다.
키를 생성하는 방식이 두 가지가 있는데, ‘대칭키’와 ‘비대칭키(또는 공개 키)’ 방식이다.
SSH 접속시 가장 먼저 사용자와 서버가 서로의 정체를 증명해야 한다. 이 시점에서 사용되는 것이 비대칭키 방식이다.
비대칭키 방식에서는 서버 또는 사용자가 Key Pair(키 페어, 키 쌍)를 생성하며, 키 페어는 공개 키(public key)와 개인 키(private key)로 이루어진 한 쌍을 뜻한다.
예를 들어 사용자가 키 페어를 생성했을 경우, 공개 키를 서버에 전송한다. 공개 키는 말 그대로 ‘공개’된 키이기 때문에 누구나 가질 수 있어 전송과정에서 유출되어도 크게 문제가 되지 않는다.
서버는 공개 키를 받아서, 이 공개 키로 만들어진 랜덤한 값을 생성한다. 이 값은 사용자가 올바른 키 페어를 가지고 있는지 시험하는 일종의 시험지다.
시험지를 받은 사용자는 가지고 있는 개인 키를 이용해 이 시험지를 푼다. 공개 키와 개인 키는 쌍으로 이루어져있기 때문에, 다른 공개 키나 개인 키를 이용해서 풀어낼 수 없다.
즉, 키 페어 생성 시 함께 생성된 개인 키와 공개 키만 서로 해석이 가능하다. 다시 말해 개인 키를 제외한 그 어떤 방법으로도 이 시험지를 풀어낼 수 없다.
또한 개인 키는 공개 키와 달리 다른 곳에 보여주지 않다.(그래야 한다.)
그래서 결과적으로 개인 키가 서버와 사용자 간의 사이를 증명하는 수단이 되는 것이다.
이렇게 시험지를 풀어서 나온 값을 사용자는 다시 서버에 전송한다.
서버는 사용자로부터 전송받은 값을 자신이 처음에 낸 값과 비교하여 두 값이 같게 되면 서버는 접속을 허용해준다.
이런 방식으로 사용자와 서버 간의 인증 절차가 비대칭키 방식을 통해 인증된다.
이제 정보를 주고받을 차례이다.
주고받는 과정에서 정보가 새어나가지 않기 위해 정보를 암호화해서 주고받는데, 여기서 사용되는 과정이 대칭키 방식이다. 대칭키 방식에서는 비대칭키 방식과 달리 한 개의 키만을 사용하는데, 해당하는 키를 대칭 키라고 한다.
위의 예에서 사용자 또는 서버는 하나의 대칭 키를 만들어 서로 공유한다. 공유된 대칭 키를 이용해 정보를 암호화하면, 받은 쪽에서 동일한 대칭 키로 암호를 풀어 정보를 얻는다.
정보 교환이 완료되면 교환 당시 썼던 대칭 키는 폐기되고, 나중에 다시 접속할 때마다 새로운 대칭 키를 생성하여 사용한다.
이렇게 하여 일련의 원격 접속 과정이 SSH를 통해 안전하게 이루어진다.
먼저 SSH를 사용하기 위해 OpenSSH를 설치한다.
$ sudo apt-get install openssh-server
설치 후 ssh-keygen을 사용해 key를 생성할 수 있다.
$ ssh-keygen -t rsa
# -t 옵션으로 어떤 타입의 암호화 방식을 사용할 것인지 지정할 수 있다. (default: rsa)
key를 생성하면 어디에 저장할지 묻는다. 엔터(Enter)를 누르면 기본 경로에 저장된다. 다른 경로를 원하면 해당 경로를 입력하ㅐ주면 된다.
Generating public/private rsa key pair.
Enter file in which to save the key (기본경로):
다음으로 ssh 사용 시 비밀번호를 사용할 지 묻는다.
Created directory (경로)
Enter passphrase (empty for no passphrase):
key를 확안하고 싶다면 저장한 경로로 이동하변 된다.
$ ls -al /경로/
total 16
drwx------ 4 user staff 128 6 7 15:07 .
drwxr-xr-x+ 31 user staff 992 6 7 15:05 ..
-rw------- 1 user staff 1876 6 7 15:07 id_rsa
-rw-r--r-- 1 user staff 403 6 7 15:07 id_rsa.pub
id_rsa
가 개인 키 id_rsa.pub
가 공개키이다.
개인 키는 사용자만이 읽고 쓸수 있고(600), 공개 키는 다른 사용자도 읽을 수 있는 권한(644)을 가지고 있는 것을 확인할 수 있다.
접속하고자하는 컴퓨터에 공개 키를 등록해 놓으면, 이후 ssh로 접근할 때 개인키와 비교하여 인증한다.
# scp를 통해 원격 컴퓨터에 공개키 전송 (다른 방법도 가능)
$ scp [경로]/id_rsa.pub user@server_ip:id_rsa.pub
masOS의 경우 기본적으로 SSH Server가 설치되어 있다.
macOS를 서버로 사용하고 싶다면 시스템 환경 > 공유에서 원격 로그인을 체크하면 외부에서 SSH를 통해 접근 가능하다.
이제 원격 컴퓨터에는 전달받은 id_rsa.pub
를 authorized_keys
파일에 등록한다.
만약 .ssh
폴더가 없다면 새로 만들고 chmod 700
으로 설정해준다.
(중요 정보가 저장되어 있기 때문에 소유자 외 접근이 불가능하게)
# 원격 컴퓨터에 authorized_keys에 리다이렉션(추가) 해준다.
$ cat $HOME/id_rsa.pub >> $HOME/.ssh/authorized_keys
이제 ssh를 통해 접속이 가능하다.
$ ssh user@server_ip
# -v 옵션을 사용하면 디버그 모드로 접속과정의 로그를 확인할 수 있다.
-p
옵션을 사용하면 포트 번호를 지정할 수 있다.
$ ssh -p [포트 번호] user@server_ip
만약 개인 키(id_rsa
)의 위치를 변경했다면 -i
옵션으로 접속하면 된다.
$ ssh -i [변경된 경로] user@server_ip
마지막으로 접속 종료는 exit
을 입력하면 된다.
참고
https://www.ssh.com/academy/ssh/command
https://library.gabia.com/contents/infrahosting/9002/