[Github] ssh 접속 설정하기

2023. 4. 23. 15:24Github

반응형
SSH에 대한 개념과 SSH방식으로 github repository에 접근하는 방법을 설명한다.

 

Github repository를 clone 하는 방법은 HTTPS, SSH가 있다.
Public repository라면 HTTPS 방식이 설정할 필요 없이 사용하기 수월하다.
다만, Private repository라면 clone, push, pull 할 때마다 username, password를 입력해주어야 한다.
(2021년 8월 13일부로 Personal access token을 발급 받아서 사용해야한다)

매번 귀찮게 username과 password/personal access token을 입력하지 말고 SSH 방식 사용해보자.
(Github Credential이나 Mac의 KeyChain을 활용하여 매번 입력하지 않는 방식도 있으니 참고 바란다)

SSH 란?

Secure Shell의 줄임말로, 원격 호스트에 접속하기 위한 보안 프로토콜이다. 이전에는 원격 접속을 하기 위해서는
“텔넷(Telnet)” 방식을 사용했다. 하지만 해당 방식은 암호화가 되지 않아 보안이 취약하다는 단점이 있다.
이 부분을 해결한 기술이 바로 SSH다.
사용자/서버 인증부터 데이터 전송까지 전 과정이 암호화 되어 보안성이 높다.

동작방식

대칭키 암호화와 비대칭키 암호화, 해쉬를 사용한다.

  • 대칭 키
    암호화와 복호화를 같은 키로 처리하는 방식
  • 비대칭 키
    암호화와 복호화를 다른 키로 처리하는 방식으로 공개 키로 암호화, 개인 키로 복호화가 가능하다.
  • 해시
    메시지 정합성을 검증하기 위해 사용한다. 서버와 클라이언트가 메시지를 주고받을 때 메시지의 해시 값을 만들어서 함께 전송하고,
    같은 해싱룰로 메시지의 해시 값을 만들어 비교한다.

 

[서버 인증 및 세션 키 생성]

  1. 서버에 접속 요청
  2. 서버의 공개키를 클라이언트에게 전송
  3. 최초 접속일 경우, 서버의 공개키를 로컬에 저장 여부 확인
  4. 동의할 경우, 서버의 공개키가 클라이언트 측의 ~/.ssh/known_hosts 파일에 추가되며 거절 시 연결 종료
  5. 이후 요청부터는 전달받은 서버의 공개키를 ~/.ssh/known_hosts 내용과 비교하며 검증
  6. 이 과정에서 데이터 통신 시 암호화 및 복호화를 위해 사용될 세션 키생성

[클라이언트 인증]

클라이언트를 인증하는 방식은 Password 인증, SSH Key Pair 인증이 있다.
Password 인증은 사용자가 입력한 Password를 서버 인증 과정에서 생성된 세션 키로 암호화 후 서버에 보내고, 서버가 이를 검증하는 방식이다.
하지만 이 방식은 권장되지 않는다. 왜냐하면 자동화된 스크립트를 이용하여적절한 길이의 비밀번호를 알아내는 법은 비교적 쉽기 때문이다.

다음은 SSH Key Pair 인증 방식이다.

  1. 클라이언트는 서버에 접속하기 위해 Key Pair의 ID를 서버에 전송
  2. 서버는 해당 ID에 매칭되는 공개 키를 ~/.ssh/authorized_keys 파일에서 찾고, 존재할 경우 난수 값을 생성하여 클라이언트의 공개키로 암호화하여 전송
  3. 클라이언트는 전달받은 값을 개인 키로 복호화
  4. 이후 복호화된 난수값을 이용하여 해시값을 계산하고, 서버에 전송
  5. 서버도 생성했던 난수 값을 이용하여 해시값을 계산하고, 클라이언트로부터 받은 값과 같은지 검증
  6. 같다면 올바른 클라이언트임을 인증

[대칭 키 기반의 데이터 통신]

서버와 클라이언트 인증이 완료되면 서버 인증 과정에서 생성된 세션 키를 이용하여 데이터를 주고받을 수 있다.
SSH 세션이 종료되면 세션 키는 사용할 수 없게 되며, 새로운 연결 시 다시 생성하여 사용한다.

Github SSH 접속 설정하기

Github ssh 접속 설정하기 위해서는 SSH Key Pair를 만들어야 한다.
공개 키와 개인 키를 생성하고, 공개 키를 Github 계정에 설정하면 완료된다.

설정 없이 SSH로 clone 하면 아래와 같은 메시지가 표출된다.

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Key Pair 생성 여부 확인하기

cd ~/.ssh
ls -al

해당 명령어로 ssh 키의 존재여부를 확인할 수 있다.

Key Pair 생성하기

ssh-keygen -t ed25519 -C "youremail@example.com"

-t옵션은 암호화 방식을 설정 할 수 있으며,
-C 옵션으로 github 메일 계정을 설정하면 된다.

ssh-keygen -t ed25519 -C "june.programmer@gmail.com" 

--------------------------------result-----------------------------------
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/juneheein/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

key를 다른 폴더에 저장하거나 비밀번호도 지정 할 수 있지만 생성된 키중 .pub 가 붙은 파일이 공개 키이고 나머지가 개인 키 입니다.

key에 비밀번호를 지정하면 key 사용할 때마다 비밀번호를 입력해야 한다.
그런데도 비밀번호 지정을 권하는 이유는 공격자가 컴퓨터에 접근하여 해당 키를 얻으면, 해당 키를 사용하는 모든 시스템에 접근할 수 있는 위험이 발생하기 때문이다.
https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases

 

 

Github 계정에 SSH 공개 키 추가하기

로그인 후 Settings -> SSH and GPG keys 메뉴에 들어가면 New SSH key 버튼이 있고, 클릭하면 다음과 같은 화면이 나온다.

Image 1. Github 계정에 공개키 등록

Title은 구분할 수 있게 부여하자
Key는 아까 만들어놓은 공개 키를 붙여 넣은 된다.
공개 키는 .pub 이 붙은 파일이다.
서버는 ~/.ssh/authorized_keys 에 해당 공개키를 저장한 후 추후 통신 시 확인한다
개인 키값을 붙여 넣지 않게 주의가 필요하다.

Image 2. Github 계정에 공개키 등록 완료

SSH 연결 테스트

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

간혹 fingerprint 관련 메시지가 뜨는 경우에 yes를 입력 하면 된다.
(위에서 설명했던 ~/.ssh/known_hosts 파일에 추가 되는 과정이다)
성공했다면 반갑게 인사해준다.
이제 SSH로 clone 시도 시 이상 없이 진행된다.

 

마무리

Git repository를 접근하는 방법 중 하나인 SSH 인증에 대해서 알아봤다.
HTTPS 연결도 그리 허술하지 않지만 Github에서는 2021년 8월 13일부로 Personal access token을 사용하게끔 했다.
그만큼 보안에 대해서 안전하게 취급해야 한다는 의미가 아닐까?
SSH로 접근하여 혹시 모를 위험에 대비하도록 하자.

반응형

'Github' 카테고리의 다른 글

[Github] 계정별 SSH 접속 설정하기  (0) 2023.04.23