SSH 로 GitHub 연결

SSH 비대칭 키 페어에 대해서 알아보고, GitHub에 연결하는 방법

written by tiaz0128

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

SSH(Secure Shell)


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

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

비대칭키


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

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

어떤 키를 어떻게 쓰나?


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

https://github.com/tiaz0128.keys

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

private 저장소로 생각 해보기


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

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

분실술

> 누가 진짜인지 알 수 없다

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

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에 연결을 시도하고, 연결이 성공적이면 아래와 같은 메시지를 출력합니다.

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 폴더 내에 작성하면 됩니다.

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

다음은 github.com의 config 파일의 예입니다.

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

이 설정은 “github.com”이라는 별명을 사용하여 github.comgit 사용자로 로그인하고, ~/.ssh/github 키 파일을 사용하여 인증하는 연결을 설정합니다.

아래와 같이 별명 github.alias를 이용하여 저장소를 clone 할때 SSH를 이용 할 수 있다. Host 옵션을 사용하지 않는 경우는 HostName을 그대로 이용한다.

# HostName이 있는 경우, HostName으로 참조
$ git clone git@github.alias:tiaz0128/tiaz0128.github.io.git

# HostName을 작성하지 않는 경우, Host로 참조
$ git clone git@github.alias:tiaz0128/tiaz0128.github.io.git

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


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

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

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

  1. GitHub를 사용하기 위한, 이미 정해져 있는 HostName = github.com & User = git 작성
  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


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

Remote - SSH

🔗 Remote - SSH

SSH 정리


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

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

GitHub SSH

tiaz0128

Eat Sleep Coding.

Never Never Giveup.

💫 Python  |  BackEnd  |  Cloud Architect  |  DevOps