Post

ssh로 git clone 하기

SSH

SSH 란 Secure Shell 의 줄임말로, 두 컴퓨터 간 통신을 할 수 있게 해주는 하나의 protocol

Protocol 이란, 서로 다른 통신 장비 간 주고 받는 데이터의 양식과 규칙입니다.

인터넷 연결만 되어있어도 내 컴퓨터의 terminal 을 통해 다른 지역에 있는 컴퓨터 혹은 서버를 관리할 수 있게 해주고, 파일도 공유 가능

ex) HTTP, HTTPS, FTP 등

브라우저가 웹페이지를 보여주기 위해 서버와 통신할 때 HTTPS protocol을 사용하는 것과 같이, 서로 다른 컴퓨터들이 shell 을 통해 통신하기 위한 protocol 이 필요했고, 지금 가장 많이 사용되는 것이 SSH

SSH 의 장점: 암호화된 통신

HTTPS 에서 통신 간 데이터가 암호화 되어 있는 것과 같이, SSH 를 이용한 통신에서는 Client 와 Host 의 통신이 암호화 되어 있다.

Client: Host 에 접속하려고 하는 컴퓨터

Host: 접속 대상 (ex. remote 서버)

모든 데이터가 암호화 되어 전송 ⇒ 굉장히 안전

SSH 의 Encryption/Decryption 과정

SSH 통신에서 데이터가 암호화되는 과정: 3 steps

  • 대칭 암호화 (Symmetric Encryption)
  • 비대칭 암호화 (Asymmetric Encryption)
  • 해쉬함수 (Hashing)

대칭 암호화 (Symmetric Encryption)

대칭 암호화란 1개의 공통된 Secret Key 를 가지고 양쪽에서 데이터를 암호화 및 복호화 할 수 있게 하는 방법

  • 서로 같은 Secret Key 만 있으면 데이터를 암호화/복호화 가능
  • Secret Key 가 유출 되었을 경우 암호화된 모든 통신이 노출된다는 치명적인 단점이 존재

⇒ 안전하게 Key 를 exchange 하는 방법으로 비대칭 암호화 (Asymmetric Encryption) 알고리즘이 존재

비대칭 암호화 (Asymmetric Encryption)

  • 송신자, 수신자 각각 Public Key 와 Private Key 를 가짐.
  • 송신자의 Public Key 로 암호화 된 데이터는 송신자의 Private Key 를 사용해야만 복호화가 가능 ⇒ 서로의 Public Key 를 교환하여 암호화하는데 사용
  1. 나는 상대방에서 나의 Public Key 를 보내주고, 나는 상대방의 Public Key 를 받는다.
  2. 내가 보내고 싶은 데이터를 내가 가진 상대방의 Public Key 로 암호화 한 뒤 전송
  3. 상대방이 내가 전송한 암호화된 데이터를 받아 본인의 Private Key 로 복호화

  • 비대칭 암호화는 송/수신자 간 대칭 암호화에서 필요했던 공통의 Secret Key 를 생성하는 과정에서 사용
  • 서로가 서로의 Public Key 를 공유할 때는 해커가 해당 데이터를 가로챌 위험성

⇒ 알고리즘이 디피-헬먼 키 교환 알고리즘 (Diffie-Hellman Key Exchange Algorithm) ** 암호화 알고리즘이 아니며, 서로 간 안전하게 키를 공유할 수 있게 해주는 알고리즘

해쉬 함수 (Hashing)

  • 대칭 암호화, 비대칭 암호화, 디피-헬먼 키 교환 알고리즘 ⇒ SSH 에서 송/수신자 간 안전하게 암호화 된 데이터를 주고 받음.
  • 하지만, SSH 커넥션이 성공적으로 생기기 전 이미 누군가 (해커) 송/수신자 (Client 혹은 Host) 를 위장하여 잠입해, 모든 정보를 조작할 가능성. ⇒ 이런 경우 송/수신자는 아무것도 모른채 악의적으로 변화된 데이터를 지속적으로 받아보게 될 수도 있음.

⇒ 이를 방지하기 위해 SSH 에서는  MAC (Message Authentication Code)을 통한 데이터 무결성을 (송신자가 보낸 메세지가 변조되지 않았는지) 확인하는 절차가 존재

  • Hash 함수가
    • 전송되는 메세지
    • 송/수신자가 공유하는 Secret Key
    • Packet Sequence Number 위 정보를 가지고 MAC 값을 출력 → 수신자 (Host) 에게 보냄.
  • 수신자도 같은 정보를 가지고 있기때문에, 같은 정보를 가지고 똑같은 Hash 함수를 돌려 나온 MAC 값이 일치하는지 확인
  • 해시 함수는 항상 일정한 크기의 출력을 생성 ⇒ 입력의 길이가 어떻든지 상관없이 항상 일정한 크기의 해시값을 생성한다는 것을 의미

Hashing 은 기본적으로 단방향으로 이루어집니다. 단방향으로 이루어지는 이유? 복호화를 염두해두고 사용하는 암호화 과정이 아니기 때문 ( 입력으로부터 해시값을 계산할 수 있지만, 해시값으로부터 입력을 복구할 수는 없다. 이는 해시 함수가 데이터의 보안을 강화하는 데 도움)

Authentication

이렇게 해서 송/수신자 간 안전한 connection 이 열리게 되면, 이제 접속을 시도하는 user 가 접속 권한이 있는 사람인지 확인하는 절차가 필요

만약 이런 절차가 없다면 누구나 언제든 서버에 접속할 수 있기 때문

SSH 에서 User 를 인증하는 방법

  • Password (username/password — username 은 보통 root)
  • RSA (password 없이 identity 확인)

Password

  • 비밀번호를 입력하는 방법
  • 이미 여러가지 절차를 통해 secure connection 이 열린 상태이기 때문에 password 를 입력해도 크게 문제 될 건 없겠지만 권장되는 방법은 아님. 왜냐하면 이 방법은 Brute-force 공격에 취약하다는 단점

Brute-force Attack: 키 전수조사 또는 무차별 대입 공격을 통해 조합 가능한 모든 문자열을 하나씩 대입해 보는 방식으로 암호를 해독하는 방법

⇒ 비밀번호 입력없이 나의 identity 가 확인되는 방법 필요.

RSA

  • 내 컴퓨터에 SSH 키를 생성 → 나의 Public Key 를 host 의 인가 목록에 추가 → 자동으로 나를 인증하는 방법
  • 해당 Public Key 와 매칭되는 Private Key 가 존재하는 나의 컴퓨터를 사용하는 한 비밀번호 없이 인증이 가능
1
RSA 알고리즘은 소인수분해 문제가 어렵다는 사실에 기반한 알고리즘

SSH Key 생성 방법 (깃헙 계정 연동 목적)

Step 1: SSH Key 존재유무 확인

1
2
3
4
ls -al ~/.ssh

// id_rsa.pub 이라는 파일이 존재하면 SSH Key 가 이미 있다는 뜻
// 추가로 생성할 필요가 없음

Step 2: SSH Key 생성

1
ssh-keygen -t rsa -b 4096 -C "GitHub이메일주소"
1
2
3
4
5
6
7
> Generating public/private rsa key pair.

> Enter a file in which to save the key (/Users/*you*/.ssh/id_rsa):

> Enter passphrase (empty for no passphrase):

> Enter same passphrase again:

passphrase?

RSA 방식의 단점인 누군가 악의적으로 내 컴퓨터를 컨트롤 할 수 있게 된다면, 내 컴퓨터에 있는 SSH Key 를 가진 모든 시스템에 접근 권한이 생기기 때문에 SSH Key 에 추가적으로 비밀번호를 추가하는 보안 레이어

Step 3: GitHub 계정에 SSH Key 추가

SSH Key 복사 (id_rsa.pub 파일 내용 복사 — Public Key)

1
pbcopy < ~/.ssh/id_rsa.pub

우측 상단 프로필 사진 버튼 > Settings

Step 4: 제대로 연결이 되었는지 확인

아래 커맨드를 통해 새로 추가한 SSH 커넥션이 제대로 연결되었는지 확인

1
ssh -T git@github.com

이제 GitHub 에서 repository 를 clone 받거나, 다른 액션을 수행할 때 HTTPS 가 아닌 SSH 방식으로 clone 이 가능!

This post is licensed under CC BY 4.0 by the author.