개발을 할 때 꽤나 자주 SSH라는 것을 마주치게 됩니다. 오늘은 SSH의 구체적인 원리부터 사용 방법까지 알아보겠습니다.
우리의 컴퓨터가 아닌 다른 어딘가에 있는 컴퓨터의 파일을 보거나, 조작하거나, 가져오거나, 명령을 실행하는 등의 작업을 하기 위해선 그 컴퓨터에 접속해야만 합니다. 이전에는 이러한 원격 접속을 하기 위해서 Telnet, RSH, Rlogin 과 같은 프로토콜을 사용했습니다.
하지만 Telnet과 같은 프로토콜의 경우 데이터가 평문으로 전송되었고, 네트워크 스니핑을 통해 간단하게 전송되는 데이터를 탈취할 수 있었기 때문에 보안상 매우 취약했습니다.
이를 보완하기 위해 등장한 것이 바로 SSH 입니다.
SSH는 Secure Shell의 줄임말로, 단어의 뜻 그대로 보안 쉘을 의미합니다.
Shell
명령어와 프로그램을 사용할 때 쓰는 인터페이스를 말합니다. 좀 더 자세하게 표현하자면 커널과 사용자 간의 다리 역할을 하는 것으로, 사용자로부터 명령을 받아 그것을 해석하고 실행하는 역할을 합니다. 흔히 검은 바탕에 흰 글자가 나오는 명령어 입력 환경을 떠올리시면 됩니다
SSH를 이용한 통신은 데이터가 암호화되어 전송되기 때문에, 데이터가 중간에 탈취되어도 그 내용을 알 수 없어서 보안이 보장됩니다. 이런 이유로 현재에는 원격 접속 보안을 위한 필수적인 요소가 되었습니다.
SSH는 원격의 다른 컴퓨터에 접속하는 보안 프로토콜이라고 했습니다. 내 컴퓨터에 누군가 접속하려고 할 때, 아무나 들어올 수 있게 된다면 좋지 못한 결과가 생길 것이 분명합니다. 따라서, 우리는 내 컴퓨터에 접속하는 누군가가 인증된 사용자인지 검증하는 과정이 필요합니다.
이런 검증 과정은 KEY를 통해 이루어집니다. 사용자(클라이언트)와 서버(호스트)는 각각의 키를 보유하고 있으며, 이 키를 이용해 상대방이 인증된 사용자인지 확인하고 안전하게 암호화된 데이터를 주고받을 수 있습니다.
여기서 키를 생성하는 방식에는 두 가지가 있습니다. 바로 대칭키와 비대칭키 방식입니다. (두 가지 모두 사용합니다)
먼저 사용자와 서버가 서로가 인증된 사용자인지 검증하는 과정이 필요합니다. 여기서 사용되는 것이 바로 비대칭키 방식입니다. 인증 과정을 순서대로 알아보겠습니다.
Key Pair(키 쌍, 공개키와 개인키로 이루어짐) 를 생성합니다.보통 공개키는
.pub, 비밀키는.pem형식을 가집니다
공개 키는 말 그대로 공개 키이기 때문에 노출되어도 상관없는 키입니다
비대칭키 방식에서는 공개 키로 암호화한 값을 개인 키로만 복호화할 수 있습니다.
서버 관점에서는 클라이언트의 공개 키가 자신의~/.ssh/authorized_keys에 저장되어있는지 확인하고, 있다면 위의 3~8번 과정을 통해 사용자를 인증합니다.
클라이언트 관점에서는 접속하려는 서버의 공개 키가 자신의~/.ssh/known_hosts에 등록된 공개 키와 동일한 지 확인하여 정상적인 서버인지 확인힙니다.known_hosts에 저장되는 값은 최초에 서버로 접속했을 때 등록되는 서버의 공개 키(fingerprint) 입니다.
연결이 완료되었으니 이제 정보를 주고받을 수 있습니다. 위에서 말한대로 SSH를 통해 전송되는 데이터는 암호화되어 전송되는데, 이 때 암호화/복호화를 하는 방식이 바로 대칭키 방식입니다.
SSH에서 사용하는 대칭키 교환 알고리즘으로는 대표적으로 디피-헬만 알고리즘 이 있습니다.
서버와 사용자는 서로 약속된 대칭키 를 사용하여 통신 시 데이터를 암호화 / 복호화합니다. 정보 교환이 완료되면 교환 당시 썼던 대칭 키는 폐기되고, 나중에 다시 접속할 때마다 새로운 대칭 키를 생성하여 사용합니다.
가장 먼저, 원격 접속하고자 하는 컴퓨터에 SSH 서버가 설치되어 있어야하고, SSH 연결을 위한 키 페어를 생성해야합니다. 요즘은 대부분 SSH를 위한 프로그램이 설치되어 있지만 설치되어 않은 경우도 종종 있기 때문에 만약 설치되어 있지 않은 경우 다음 명령어를 통해 설치합니다.
# 우분투 기준
$ sudo apt -y openssh-server # install openssh-server
$ sudo systemctl start sshd # ssh server daemon start
MacOS는 기본적으로 OpenSSH 서버가 설치되어 있지만, 원격에서 나의 로컬로 접속을 허용하기 위해선 다음과 같이 설정해야 합니다.
1.시스템 환경설정(System Preferences)에 들어갑니다.
2.공유(Sharing) 패널을 클릭합니다.
3.원격 로그인(Remote Login) 서비스 체크박스에 체크하고, 모든 사용자(All users)에 대해 접근을 허용합니다.
키 페어는 ssh-keygen 명령어를 사용하여 생성합니다.
$ ssh-keygen -t rsa -b 4096 -f mykey
-t옵션 : 키 알고리즘을 선택할 수 있습니다.(rsa, dsa, ecdsa..)
-b옵션 : 키의 비트 수를 결정합니다. 키 알고리즘 타입마다 권장되는 비트 수가 다릅니다.
-f옵션 : 키 페어 파일의 이름(경로)을 결정합니다. 적지 않으면 일반적으로~/{user}/.ssh/에id_rsa라는 이름의 파일로 생성됩니다.
더 자세한 옵션은 OpenSSH 페이지를 참고하세요
키 페어를 만들었다면, 인증 절차를 위해 서버에 공개 키를 복사해야 합니다. ssh-copy-id 명령어를 사용하여 간단하게 공개 키를 복사할 수 있습니다.
$ ssh-copy-id -i ~/.ssh/mykey.pub -p 22 {user_name}@{host}
위의 명령을 실행하면, 나의 공개키가 서버에 등록됩니다.
~/.ssh에는known_hosts와authorized_keys라는 파일이 있습니다.
known_hosts에는내가 다른 서버에 접속할 때, 그 서버의 공개 키가 등록되고(fingerprint),
authorized_keys에는 `다른 컴퓨터가 내 컴퓨터에 접속하기 위해' 등록한 상대방의 공개 키가 저장됩니다.
이제 SSH Client를 이용하여 원격 호스트에 접속해봅니다.
$ ssh {user}@{host}
$ ssh realsy@localhost
SSH-Key로 서버 접속하기
SSH 명칭부터 접속까지 한 번에 이해하기
[서버보안] SSH #1 - SSH 원리