HwangJerry 2023. 6. 27. 17:09

SSH

Secure Shell (Protocol)의 줄임말로, 두 컴퓨터 간 통신을 할 수 있게 해주는 하나의 프로토콜입니다.

우리들은 이미 HTTP, HTTPS 등의 프로토콜을 사용하여 다른 컴퓨터에 요청을 보내고 받는 작업을 수없이 하고 있죠.

서로 다른 컴퓨터 간 웹 페이지를 요청하고 받기 위해 브라우저를 사용하여 통신할 때 HTTP 또는 HTTPS를 사용하듯이, 데이터 전송과 원격 제어를 하기 위해 서로 다른 컴퓨터 간 shell을 통해 통신합니다.

SSH 통신의 목적

  1. 데이터 전송
  2. 원격 제어

우리가 가장 일반적으로 마주할 수 있는 SSH 통신은 GitHub 등의 원격 레포지토리에 소스코드 파일을 push와 pull할 때 일어납니다.

또한 AWS와 같은 클라우드 서비스를 이용할 때 EC2와 같은 인스턴스 서버에 접속하여 명령을 내리기 위해서도 SSH를 사용하여 접속합니다.

 

장점 : 암호화된 통신

HTTPS에서 통신 간 데이터가 암호화되어 있듯이, SSH를 사용한 통신에서도 Secure라는 말처럼 Client와 Server의 통신이 암호화되어 있습니다. 바로 이 것이 SSH를 사용하는 가장 큰 이유이자 얻고자 하는 목적입니다.

SSH는 통신을 하기 전에 안전한 환경을 구축한 뒤, 이를 통해 정보를 송수신하기 때문에 그 보안성이 매우 뛰어납니다.

 

메세지 암호화 통신

SSH가 안전한 통신을 구현하기 위해 다음의 기술을 활용합니다.

  • 대칭 암호화(Symmetric Encryption)
  • 비대칭 암호화(Asymmetric Encryption)
  • 디피-헬먼 키 교환 알고리즘(Diffie-Hellman Key Exchange Algorithm)
  • 해쉬 함수(Hashing)

 

암호화 과정

암호화 과정을 간단하게 요약하자면,

  1. 송/수신자 간 대칭 키를 생성할 때 비대칭 암호화를 사용하고,
  2. 생성된 대칭 키를 공유할 때 디피-헬먼 키 교환 알고리즘으로 안전하게 공유하여,
  3. 공유된 대칭 키를 통해 대칭 암호화 과정으로 데이터를 송수신하게 됩니다.
  4. 이 때, 전송하는 데이터의 무결성을 확인하기 위해 해싱 처리를 하여 얻은 MAC(해시값)을 비교/대조합니다.
    (해시값은 메시지의 지문과 같은 역할을 하며, 지문을 매칭하여 무결성을 입증한다고 이해하시면 됩니다.)

여기서 암호화 기술에 대한 설명은 아래 이미지로 대체합니다.

 

접속 권한 확인

서버에 접속하는 사람의 권한을 확인할 때에는 2가지 방법을 이용합니다.

  • password (username/password)
  • RSA (password 없이 identity 확인)

일반적으로 password 방식은 brute-force attack에 취약하므로 RSA를 많이 사용합니다.
(RSA는 1978년에 등장한 공개키 암호 시스템의 대표적인 알고리즘으로, 아직도 가장 대중적인 암호화 알고리즘으로 사용됩니다.)

 

Github SSH

우리는 기본적으로 깃허브에서 SSH 통신을 마주합니다. 대개의 경우 귀찮음을 이유로 https로 레포를 등록하고 사용하게 되지만, SSH를 이해해보기 위해 한번 SSH로 레포 등록을 진행해 보았습니다.

remote origin SSH 등록

SSH로 remote origin을 등록한 뒤, 자연스럽게 push를 하려고 하면 다음과 같은 에러를 볼 수 있습니다.

git@github.com: Permission denied (public key)

이는 해당 깃과 연결된 ssh key가 설정되어 있지 않기 때문입니다. 따라서 이를 생성해주어야 하며, 이는 bash에서 가능합니다.

rsa key 생성

ssh-keygen -t rsa -C "본인 깃허브 이메일"

를 git bash에서 입력하면 가장 먼저 어디에 저장할지를 물어봅니다. 이 때, 원하는 경로를 설정하여 입력하면 됩니다. 만약 그냥 엔터키를 누르면 기본 위치인 ~/.ssh/id_rsa으로 생성됩니다. 여기서 마지막은 무조건 파일 이름으로 설정해야 합니다.

만약 경로를 자기가 설정하고 싶으면, ssh config 파일에 등록되어있는 default 경로를 커스텀 세팅해줘야 합니다. 그러지 않으면 깃허브에 public key 값을 등록해도 깃허브가 인식할 수 없습니다. 이 과정이 번거로울 듯 하고, 이러한 기본값들은 오히려 유지하는게 더 일관성 있다고 판단해서 저는 그냥 .ssh에 생성하였습니다...ㅎㅎㅎ

파일 이름은 위 기본값으로 설정되면 id_rsa(private key), id_rsa.pub(public key)가 생성되며, git에는 당연히 퍼블릭 키를 알려주면 됩니다. 저는 경로의 최종 폴더 이름으로 했더니 그러지 말라고 하더라고요.

그 이후엔 패스워드(passphrase)를 지정하라는 말이 나오는데, 원하면 지정하고 아니면 그냥 엔터를 눌러도 괜찮습니다.

이렇게 생성된 키는 공개하면 내 깃허브를 남에게 전적으로 주는 것과 마찬가지니 항상 노출되지 않도록 조심합시다.

rsa key 등록

발급받은 키는 깃허브에 등록해야 합니다. vim 등으로 들어가서 복사할 필요 없이, 출력 명령어인 cat을 활용하여 키 내용을 터미널에 출력합니다. 만약 public key가 id_rsa.pub인 경우, 해당 키가 있는 경로에서 bash에 cat ~/.ssh/id_rsa.pub를 입력하면 된다. 이를 복사해서 나의 깃허브 계정에 들어가서 Settings -> SSH and GPG Keys에 등록해줍니다.

 

레포 안전하게 누리기

연결이 잘 되었는지 확인하려면 아래 명령어를 bash에 입력해주면 됩니다.

ssh -T git@github.com
// Hi HwangBaco! You've successfully authenticated, but GitHub does not provide shell access.

다음과 같은 문구가 나온다면 권한은 깃허브에 성공적으로 등록되었지만 ssh 인증이 등록되지 않은 상태입니다.

그냥 다시 remote origin 등록해주면 됩니다.

위 과정들을 정상적으로 밟으면 이후부터는 평소처럼 자유롭게 레포를 사용하면 됩니다.

만약 문제가 있다면, 이 부분에서 깃허브 공식 문서가 잘 되어 있으니 확인해보시면 됩니다.

 

SSH로 원격 접속하기

클라우드 서비스의 원격 컴퓨터 환경에 접속할 때나, 회사 서버에 원격으로 접속할 때 SSH를 활용할 수 있습니다.

윈도우 환경에서는 일반적으로 git bash환경에서 명령어를 입력하며, 기본적인 접속 명령어는 다음과 같습니다.

ssh username@server_ip

위 서버 ip는 ip가 아니라 Domain name을 적어도 DNS를 통해 ip주소로 자동 변환되어 접속됩니다.

위 접속은 ssh의 기본 포트인 22번 포트로 접속을 시도하며, 만약 포트가 다를 경우 아래 접속 플래그의 -p 플래그를 사용해야 합니다. 설명은 아래 항목을 참고하시면 됩니다.

SSH 접속 플래그

다음은 플래그에 대한 설명입니다.

-v : 디버그 모드를 활성화하여, 접속 과정의 로그를 확인할 수 있습니다.
-i : 키를 사용하여 접속할 때, 키의 위치를 지정하여 접속합니다.

-i의 경우 ec2 인스턴스 접속 시에 거의 고정적으로 활용하고 있습니다. 아무래도 .pem 키를 별도로 보관하기 때문인데요. ssh -i path/path/keyname.pem ubuntu@ec2_ip_address와 같이 접속이 가능합니다.

저는 별도 디렉토리에 .pem키를 보관하고, 아예 해당 디렉토리에서 git bash를 연 뒤에 ssh -i keyname.pem ubuntu@ec2_ip_address로 접속합니다.

-p : ssh로 접속할 때, 기본 포트는 22입니다. 하지만 서버가 다른 포트 번호를 사용하고 있는 경우, -p 플래그로 설정해줄 수 있습니다.
만약 서버가 20022 포트를 사용하고 있을 경우, ssh -p 20022 username@server_ip로 접속 가능합니다.

원격 파일 보기

다른 에디터를 이용해도 분명 지원하는 확장팩들이 있겠지만, 대중적으로 많이 쓰이고, 결정적으로 많은 기능을 무료로 제공해주는 vscode를 기준으로 ssh로 서버에 접속하여 서버 내 파일들을 보는 방법을 설명드리겠습니다.

  1. vscode의 extension 중 remote development를 설치합니다.
  2. F1키를 눌러서 검색을 통해 remote-ssh:Connect to Host...를 선택합니다.
  3. ssh 명령어를 입력하여 원격 서버에 접속합니다. 이후 config파일에 호스트 구성을 추가할 거냐고 묻는데, 알겠다고 합니다.
  4. 이후 패스워드가 있는 경우 패스워드를 입력하고 접속하면 됩니다.

파일 다운로드

SSH 통신 방식으로 파일을 다운로드 받기 위해서는 scp(secure copy)를 활용해야 합니다. 또한 -r 플래그를 사용해야 합니다.

-r : 만약 원격 서버의 파일을 로컬 환경으로 다운로드 하고싶다면 이 플래그를 사용해야 합니다.

>>> 위 이미지처럼 다운로드가 진행되는 것을 확인할 수 있습니다.

scp -r -P 20022 username@server_ip:~/dir/folder ./로 치면 로컬의 bash 창이 열려있는 경로로 파일이 복사가 됩니다. 이는 당연히 뒤의 ./경로 설정 때문이고, bash가 접속해있는 환경이 로컬일 때의 경로를 지정한 것이니, 원격 접속 상태에서 위 명령어를 입력하면 원격 서버에 파일이 복사됩니다. 또한 여기선 -P과 같이 대문자로 입력해야 먹습니다.

 

출처

medium.com (자세함)
tistory.com (간단함)
hanamon.kr(참고 안했는데 내가 볼라고 링크 남김)
git@github.com: Permission denied 참고
깃허브 ssh 인증 오류
원격 서버의 파일들 vscode로 바로 보기