SSH 로 GitHub 연결
SSH 키를 사용하면 GitHub에 안전하게 연결할 수 있습니다. 여기서는 SSH 키를 사용하여 GitHub에 연결하는 방법과 과정 중에 발생 할 수 있는 문제를 해결하는 방법에 대해 설명합니다.
SSH(Secure Shell)
SSH(Secure Shell)는 네트워크 프로토콜 중 하나로, 컴퓨터와 컴퓨터가 인터넷과 같은 네트워크를 통해 안전하게 통신할 수 있게 해줍니다.
SSH의 핵심 기능 중 하나는 “암호화”입니다. SSH는 모든 통신 내용을 암호화하여 네트워크를 통해 전송되는 데이터가 타인에게 노출되는 것을 방지합니다. 이는 중요한 정보를 안전하게 보호하며, 해커의 공격으로부터 보호할 수 있습니다.
SSH는 비대칭키 암호화 방식을 사용합니다.
비대칭키
GitHub에 SSH 를 연결하고 사용하기 위해서는 비대칭키 라는 것을 이해하면 좋습니다. 비대칭키의 큰 개념은 아래와 같습니다.
- 데이터를 암호화 & 복호화 하는 두 개의 키 = 키 페어가 있다.
- 비밀키(identification) 와 공개키(Public Key)
- 비밀키 : 공유해서는 안돼는 키
- 공개키 : 누구나 가질 수 있으며 사용 할 수 있는 키
- 각 키는 암호화 복호화에 사용된다. 한 키로 암호화한 내용은 다른 키로만 복호화 가능
- 비밀키로 암호화한 내용은 오직 공개키로만 복호화 가능하다.
- 공개키로 암호화한 내용은 오직 비밀키로만 복호화 가능하다.
어떤 키를 어떻게 쓰나?
Github 에 등록되는 키는 누구나 볼 수 있습니다. URL 에 user_id.keys
를 입력하면 사용자가 등록한 키를 누구나 볼 수 있습니다. 누구나 볼 수 있는 키 = 즉 Github 는 공개키를 가지고 있다는 뜻이겠죠? 반대로 우리가 가지고 있어야 하는 키는 나머지 비밀키가 됩니다.
https://github.com/tiaz0128.keys
> 얄팍한 코딩사전 : HTTPS가 뭐고 왜 쓰나요? (Feat. 대칭키 vs. 비대칭키)
private 저장소로 생각 해보기
public 저장소는 누구나 소스코드를 보고 내려 받을 수 있으니 제외하고 여기서는 나만 소스코드를 올리고 받을 수 있는 private 저장소를 예를 들어 보겠습니다.
만약에 Github 에 비밀키를 등록해 있다면 어떨까요? 비밀키로 암호화 한다면 누구나 가질 수 있는 공개키로 복호화 가능하니 내가 나인것을 증명 할 수 없게 됩니다. 즉 사용자를 인증 할 수 없게 됩니다.
> 누가 진짜인지 알 수 없다
따라서 Github 는 공개키를 사용하며 사용자의 비밀키로 인증을 확인하고, 데이터의 안전한 전송을 보장합니다.
- Github 가 가지고 있는 공개키를 이용해 소스코드를 암호화
- 나만 가지고 있는 비밀키로 복호화
SSH 키 생성 및 등록
1. 로컬 시스템에 SSH 키가 있는지 확인
우선은 linux
베이스 환경인 경우는 사용자의 .ssh
폴더를 확인 합니다. 아래의 명령어로 비대칭 키 페어 파일들을 찾아 봅니다.
$ ls -la ~/.ssh
windows 의 경우는 Users 폴더에 사용자 이름의 폴더 안에 .ssh
폴더를 확인합니다.
> ls C:\Users\{user_id}\.ssh
> ls C:\Users\tiaz\.ssh
2. 공개 키가 없다면, 새로운 SSH 키를 생성
가지고 있는 키 페어가 없다면, 다음 명령을 사용하여 SSH 키를 생성할 수 있습니다. 이 명령은 새로운 SSH 키 페어를 생성하고, 이메일 주소를 키에 연결합니다.
$ 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
> 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
-t rsa
: 생성할 키의 유형을 지정-b 4096
: 키의 길이를 비트로 지정-C "{email}"
: 선택적인 값. 키에 첨부할 주석을 지정, 키가 어떤 서비스에 사용되는지 쉽게 식별하기 위한 입력값- -
f {file_path}
: 생성할 키의 경로와 파일명을 지정
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 인증 에이전트를 시작해야 합니다. 운영체제 별로 표시되는 에러 메세지와 이를 해결하는 명령어가 조금씩 다릅니다.
Could not open a connection to your authentication agent
$ eval "$(ssh-agent -s)"
windows 의 경우는 관리자 권한으로 아래의 명령어를 입력해 봅니다. 동작하지 않는 경우는 직접 서비스 시스템에 들어가서 OpenSSH Authentication Agent
서비스를 활성화 시켜줍니다.
Error connecting to agent: No such file or directory
> Start-Service ssh-agent
> windows 서비스 - OpenSSH Authentication Agent
> SSH 를 활성화 해준다.
그런 다음, ssh-add
명령을 다시 실행하여 SSH 키를 인증 에이전트에 추가합니다.
$ ssh-add ~/.ssh/{private_key}
$ ssh-add ~/.ssh/github
> ssh-add c:\Users\{user}\.ssh\{private_key}
> ssh-add c:\Users\tiaz\.ssh\github
WARNING: UNPROTECTED PRIVATE KEY FILE!
이 오류는 비밀키 파일의 권한이 너무 과도하게 설정된 경우 SSH에 의해 무시되었음을 나타냅니다. 이 문제를 해결하려면, 비밀키 파일의 권한을 변경해주면 됩니다. 다음 명령을 사용하여 파일 권한을 변경합니다.
$ chmod 600 ~/.ssh/{private_key}
$ chmod 600 ~/.ssh/github
SSH config 파일 작성
SSH config 파일은 SSH 연결 설정을 저장하는데 사용됩니다. 이 파일을 사용하면, 다양한 서버에 대한 SSH 연결 설정을 쉽게 관리할 수 있습니다. 파일은 config
라는 이름으로 .ssh 폴더 내에 작성하면 됩니다.
SSH config 파일에는 다음과 같은 설정을 포함할 수 있습니다.
Host
: 호스트 별명. 이 별명을 사용하여ssh
명령에서 연결 설정을 참조HostName
: 실제 호스트 이름 또는 IP 주소User
: 해당 호스트에 로그인할 때 사용할 사용자 이름IdentityFile
: 해당 호스트에 연결할 때 사용할 비밀키 파일의 경로Port
: 해당 호스트에 연결할 때 사용할 포트 번호
예를 들어, 다음은 SSH config 파일의 예입니다.
Host github
HostName github.com
User git
IdentityFile ~/.ssh/github
이 설정은 “github”이라는 별명을 사용하여 github.com
에 git
사용자로 로그인하고, ~/.ssh/github
키 파일을 사용하여 인증하는 연결을 설정합니다. 이 설정이 있으면, ssh github
명령을 사용하여 이 연결을 쉽게 시작할 수 있습니다.
개인 계정도 쓰고 회사 계정도 쓰고싶어!
이런 경우가 있습니다. 점심시간에 짬내서 회사 컴퓨터에서도 개인 저장소에도 push 를 하고 싶을 때가 있습니다. 매번 로그인을 했다가 풀었다가, 자격증명을 삭제했다가 다시 등록하고… 너무 번거롭고 귀찮을 때가 많습니다.
위의 내용까지 잘 이해했다면 이런 상황에서 SSH 를 유용하게 사용 가능합니다. 서로 다른 계정을 여러개 등록하고 손쉽게 사용 할 수 있습니다. 상황을 가정해보겠습니다.
- 하나의 컴퓨터에 여러개의 GitHub 계정을 쓰고 싶다.
- 개인계정 : tiaz0128
- 회사계정 : dev0128
- 각각의 GitHub 계정에는 서로 다른 공개키가 등록되어 있다.
- 각 공개키의 페어인 비밀키를 컴퓨터에 저장하고 있다.
config 파일에서 Host
값을 잘 사용하면 간단하게 해결 됩니다.
- GitHub 를 사용하기 위한, 이미 정해져 있는
HostName
과User
를 동일하게 작성 IdentityFile
는 각각의 계정의 공개키의 페어인 비밀키를 지정Host
는 사용할 키를 구분할 수 있게 작성
# 개인 키
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 까지 설치가 가능하게 만들어주기 때문에 클라우드를 이용 할때, 서버 접속 등을 용이하게 해줍니다.
SSH 정리
SSH 는 비대칭키인 한 쌍의 비밀키와 공개키를 사용하여 암호화, 복호화 방법입니다. 키 페어에서 암호화에 사용된 키를 나머지 하나의 키로 복호화가 가능합니다. 이를 통해서 사용자 인증에 이용 할 수 있습니다.
config 파일에 설정을 저장하고 Host
값으로 하나의 서비스를 여러 계정으로 통신이 가능한 것을 알아봤습니다. 여기서는 GitHub 로 예시를 들었지만, 다른 서비스도 SSH 를 통한 통신을 할떄 기본 개념은 동일합니다. 😊