SSH 로 GitHub 연결

SSH 키를 사용하면 GitHub에 안전하게 연결할 수 있습니다. 여기서는 SSH 키를 사용하여 GitHub에 연결하는 방법과 과정 중에 발생 할 수 있는 문제를 해결하는 방법에 대해 설명합니다.

SSH(Secure Shell)


SSH(Secure Shell)는 네트워크 프로토콜 중 하나로, 컴퓨터와 컴퓨터가 인터넷과 같은 네트워크를 통해 안전하게 통신할 수 있게 해줍니다.

SSH의 핵심 기능 중 하나는 “암호화”입니다. SSH는 모든 통신 내용을 암호화하여 네트워크를 통해 전송되는 데이터가 타인에게 노출되는 것을 방지합니다. 이는 중요한 정보를 안전하게 보호하며, 해커의 공격으로부터 보호할 수 있습니다.

SSH는 비대칭키 암호화 방식을 사용합니다.

비대칭키


GitHub에 SSH 를 연결하고 사용하기 위해서는 비대칭키 라는 것을 이해하면 좋습니다. 비대칭키의 큰 개념은 아래와 같습니다.

  1. 데이터를 암호화 & 복호화 하는 두 개의 키 = 키 페어가 있다.
  2. 비밀키(identification) 와 공개키(Public Key)
    • 비밀키 : 공유해서는 안돼는 키
    • 공개키 : 누구나 가질 수 있으며 사용 할 수 있는 키
  3. 각 키는 암호화 복호화에 사용된다. 한 키로 암호화한 내용은 다른 키로만 복호화 가능
    • 비밀키로 암호화한 내용은 오직 공개키로만 복호화 가능하다.
    • 공개키로 암호화한 내용은 오직 비밀키로만 복호화 가능하다.

어떤 키를 어떻게 쓰나?


Github 에 등록되는 키는 누구나 볼 수 있습니다. URL 에 user_id.keys 를 입력하면 사용자가 등록한 키를 누구나 볼 수 있습니다. 누구나 볼 수 있는 키 = 즉 Github 는 공개키를 가지고 있다는 뜻이겠죠? 반대로 우리가 가지고 있어야 하는 키는 나머지 비밀키가 됩니다.

https://github.com/tiaz0128.keys

> 얄팍한 코딩사전 : HTTPS가 뭐고 왜 쓰나요? (Feat. 대칭키 vs. 비대칭키)

private 저장소로 생각 해보기


public 저장소는 누구나 소스코드를 보고 내려 받을 수 있으니 제외하고 여기서는 나만 소스코드를 올리고 받을 수 있는 private 저장소를 예를 들어 보겠습니다.

만약에 Github 에 비밀키를 등록해 있다면 어떨까요? 비밀키로 암호화 한다면 누구나 가질 수 있는 공개키로 복호화 가능하니 내가 나인것을 증명 할 수 없게 됩니다. 즉 사용자를 인증 할 수 없게 됩니다.

분실술

> 누가 진짜인지 알 수 없다

따라서 Github 는 공개키를 사용하며 사용자의 비밀키로 인증을 확인하고, 데이터의 안전한 전송을 보장합니다.

  1. Github 가 가지고 있는 공개키를 이용해 소스코드를 암호화
  2. 나만 가지고 있는 비밀키로 복호화

SSH 키 생성 및 등록


1. 로컬 시스템에 SSH 키가 있는지 확인

우선은 linux 베이스 환경인 경우는 사용자의 .ssh 폴더를 확인 합니다. 아래의 명령어로 비대칭 키 페어 파일들을 찾아 봅니다.

linux
$ ls -la ~/.ssh

windows 의 경우는 Users 폴더에 사용자 이름의 폴더 안에 .ssh 폴더를 확인합니다.

windows
> ls C:\Users\{user_id}\.ssh

> ls C:\Users\tiaz\.ssh

2. 공개 키가 없다면, 새로운 SSH 키를 생성

가지고 있는 키 페어가 없다면, 다음 명령을 사용하여 SSH 키를 생성할 수 있습니다. 이 명령은 새로운 SSH 키 페어를 생성하고, 이메일 주소를 키에 연결합니다.

linux
$ ssh-keygen -t rsa -b 4096 -C "{email}" -f {file_path}

$ ssh-keygen -t rsa -b 4096 -C "tiaz0128.dev@gmail.com" -f ~/.ssh/github
windows
> ssh-keygen -t rsa -b 4096 -C "{email}" -f {file_path}

> ssh-keygen -t rsa -b 4096 -C "tiaz0128.dev@gmail.com" -f c:\Users\tiaz\.ssh\github

ssh-keygen 명령어를 입력하면 패스프레이즈(passphrase) 입력을 받습니다. 패스프레이즈를 설정하면 비밀키를 사용하기 전에 패스프레이즈를 입력해야 합니다. 설정하지 않으면, 비밀키를 사용할 때 입력 하지 않아도 됩니다. 따라서, 패스프레이즈 설정 여부는 편의성과 보안 사이의 균형을 고려하여 결정해야 합니다. 여기서는 그냥 빈 엔터값을 입력하겠습니다.

Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): ↵
Enter same passphrase again: ↵

생성된 파일을 확인해보면 두개의 파일, 키 페어가 생성됩니다. 이중에서 .pub 확장자가 붙어있는 키가 공개키(public key)이며 나머지 하나가 비밀키(identification) 입니다.

키 페어의 지문(fingerprint)는 키의 고유한 해시 값으로, 키를 식별하는 데 사용됩니다. 랜덤아트(randomart image)는 키의 지문을 시각적으로 표현한 것으로, 키가 변경되었는지 빠르게 확인하는 데 도움이 됩니다.

Your identification has been saved in c:\Users\tiaz0\.ssh\github
Your public key has been saved in c:\Users\tiaz0\.ssh\github.pub
The key fingerprint is:
SHA256:cyboaD4Jn1nZXehR0WXLBQ+DR529JprwL5kfsAxZP0M tiaz0128.dev@gmail.com
The key's randomart image is:
+---[RSA 4096]----+
|            .==+*|
|            o +*=|
|           + E oo|
|       . .= +. o |
|      .oS==+o+o  |
|  .  oo .==+o o  |
|   oo=.    o+.   |
|   o*      + ..  |
|    ..      o.   |
+----[SHA256]-----+

3. 공개키를 GitHub 계정에 추가

공개키의 내용을 복사합니다. 그런 다음 GitHub 계정 설정의 SSH 키 섹션에 이 키를 붙여넣습니다. Github 에 로그인하여 우측 상단에 자신의 프로필을 클릭하여 setting - SSH 에서 공개키를 등록 가능합니다.

> Github - setting 에서 SSH 공개키를 저장한다.

4. SSH를 통해 GitHub에 연결할 수 있는지 확인

제대로 공개키가 등록되었는지 확인해봅시다. 아래의 명령어는 GitHub에 연결을 시도하고, 연결이 성공적이면 “Hi {username}! You’ve successfully authenticated…” 메시지를 출력합니다.

$ ssh -T git@GitHub.com
Hi tiaz0128! You've successfully authenticated, but GitHub does not provide ...

등록한 키 정보를 삭제 할때는 -d 옵션을 이용하여 키를 지정하여 삭제합니다.

$ ssh-add -d ./github

에러 해결


Could not open a connection to your authentication agent

이 오류는 SSH 인증 에이전트가 실행 중이지 않거나 연결할 수 없음을 나타냅니다. 이 문제를 해결하려면, 먼저 SSH 인증 에이전트를 시작해야 합니다. 운영체제 별로 표시되는 에러 메세지와 이를 해결하는 명령어가 조금씩 다릅니다.

linux
Could not open a connection to your authentication agent

$ eval "$(ssh-agent -s)"

windows 의 경우는 관리자 권한으로 아래의 명령어를 입력해 봅니다. 동작하지 않는 경우는 직접 서비스 시스템에 들어가서 OpenSSH Authentication Agent 서비스를 활성화 시켜줍니다.

windows
Error connecting to agent: No such file or directory

> Start-Service ssh-agent

OpenSSH Authentication Agent

> windows 서비스 - OpenSSH Authentication Agent

SSH

> SSH 를 활성화 해준다.

그런 다음, ssh-add 명령을 다시 실행하여 SSH 키를 인증 에이전트에 추가합니다.

linux
$ ssh-add ~/.ssh/{private_key}

$ ssh-add ~/.ssh/github
windows
> ssh-add  c:\Users\{user}\.ssh\{private_key}

> ssh-add  c:\Users\tiaz\.ssh\github

WARNING: UNPROTECTED PRIVATE KEY FILE!

이 오류는 비밀키 파일의 권한이 너무 과도하게 설정된 경우 SSH에 의해 무시되었음을 나타냅니다. 이 문제를 해결하려면, 비밀키 파일의 권한을 변경해주면 됩니다. 다음 명령을 사용하여 파일 권한을 변경합니다.

linux
$ chmod 600 ~/.ssh/{private_key}

$ chmod 600 ~/.ssh/github

SSH config 파일 작성


SSH config 파일은 SSH 연결 설정을 저장하는데 사용됩니다. 이 파일을 사용하면, 다양한 서버에 대한 SSH 연결 설정을 쉽게 관리할 수 있습니다. 파일은 config 라는 이름으로 .ssh 폴더 내에 작성하면 됩니다.

SSH config 파일에는 다음과 같은 설정을 포함할 수 있습니다.

예를 들어, 다음은 SSH config 파일의 예입니다.

config
Host github
  HostName github.com
  User git
  IdentityFile ~/.ssh/github

이 설정은 “github”이라는 별명을 사용하여 github.comgit 사용자로 로그인하고, ~/.ssh/github 키 파일을 사용하여 인증하는 연결을 설정합니다. 이 설정이 있으면, ssh github 명령을 사용하여 이 연결을 쉽게 시작할 수 있습니다.

개인 계정도 쓰고 회사 계정도 쓰고싶어!


이런 경우가 있습니다. 점심시간에 짬내서 회사 컴퓨터에서도 개인 저장소에도 push 를 하고 싶을 때가 있습니다. 매번 로그인을 했다가 풀었다가, 자격증명을 삭제했다가 다시 등록하고… 너무 번거롭고 귀찮을 때가 많습니다.

위의 내용까지 잘 이해했다면 이런 상황에서 SSH 를 유용하게 사용 가능합니다. 서로 다른 계정을 여러개 등록하고 손쉽게 사용 할 수 있습니다. 상황을 가정해보겠습니다.

config 파일에서 Host 값을 잘 사용하면 간단하게 해결 됩니다.

  1. GitHub 를 사용하기 위한, 이미 정해져 있는 HostNameUser 를 동일하게 작성
  2. IdentityFile 는 각각의 계정의 공개키의 페어인 비밀키를 지정
  3. Host 는 사용할 키를 구분할 수 있게 작성
config
# 개인 키
Host github.private
  HostName github.com
  User git
  IdentityFile C:\Users\tiaz\.ssh\private

# 회사 키
Host github.company
  HostName github.com
  User git
  IdentityFile C:\Users\tiaz\.ssh\company

등록한 Host 를 이용해 각 계정의 비밀키로 저장소를 clone 할 수 있습니다. clone 하면서 연결된 계정으로 push 가 가능해집니다.

> git clone git@github.private:tiaz0128/private-project.git

> git clone git@github.company:dev0128/company-project.git

vscode extension : Remote - SSH


SSH 를 vscode 에서 손쉽게 연결할 수 있게 도와주는 extension 입니다. 원격 대상에 vscode 의 다른 extension 까지 설치가 가능하게 만들어주기 때문에 클라우드를 이용 할때, 서버 접속 등을 용이하게 해줍니다.

Remote - SSH

🔗 Remote - SSH

SSH 정리


SSH 는 비대칭키인 한 쌍의 비밀키와 공개키를 사용하여 암호화, 복호화 방법입니다. 키 페어에서 암호화에 사용된 키를 나머지 하나의 키로 복호화가 가능합니다. 이를 통해서 사용자 인증에 이용 할 수 있습니다.

config 파일에 설정을 저장하고 Host 값으로 하나의 서비스를 여러 계정으로 통신이 가능한 것을 알아봤습니다. 여기서는 GitHub 로 예시를 들었지만, 다른 서비스도 SSH 를 통한 통신을 할떄 기본 개념은 동일합니다. 😊

GitHub SSH