JooTC
github-white-logo-700

[Git] SSH 키 생성 및 GitHub 저장소에 SSH로 접속하기

GitHub를 사용할 때 내 저장소에 파일을 업로드 해야하는 경우가 많습니다. 이 때 git push 명령을 사용하여 소스코드 & 파일을 업로드할 수 있지만, 이 과정에서 해당 저장소를 수정할 수 있는 권한을 가진 사용자 인증 과정이 필요합니다.

그러나 지속적으로 사용자 계정 정보를 입력하지 않고 싶거나, GitHub 계정이 2FA(Two-Factor Authentication)에 의해 이중 인증이 필요한 상황이 생길 때가 있습니다. (물론 이는 토큰 생성으로 해결할 수 있습니다. 여기를 클릭하여 참고해보세요.) 이럴 때는 HTTPS가 아닌 SSH를 사용하여 접속/업로드할 수 있습니다.

참고 : GitHub에서는 SSH 보다는 HTTPS 프로토콜을 사용하는 것을 권장하고 있습니다. 단, 보안상의 문제와는 관련이 없습니다.

여기서는 GitHub & Linux를 기준으로 설명드리겠습니다. (GitLab 등의 대부분의 버전 관리 툴이 아래 방법과 비슷할 것입니다.)

 

 

Git SSH 키 생성 및 GitHub 사용자 인증하기

GitHub에 접속하기 위한 SSH 인증은 기존의 리눅스 서버에 접속하기 위해 사용하는 공개 키 인증(Public Key Authentication)과 유사합니다.

SSH 인증을 위해서는 서버 내에서 사용자 키의 역할을 하는 공개 키(Public Key)개인 키(Private Key)생성해야 합니다.

이미 자신의 서버에 SSH 키를 가지고 있는 경우 이 과정을 건너뛰어도 됩니다. 일반적으로 사용자 키 파일은 ~/.ssh 경로에 존재합니다.

 

사용자 키를 새롭게 생성하기 위해 서버에 SSH로 접속하여 터미널을 열어줍니다. 사용자 키는 현재 로그인한 사용자가 직접 해야하므로 가능한 root 권한으로 진행하지 않도록 합니다.

현재 사용자의 홈 디렉토리로 이동해줍니다.

$ cd ~

이제 .ssh 디렉토리로 이동합니다. 없다면 다음과 같이 생성 후 (생성 시 권한은 rwx------) 이동합니다.

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ cd .ssh

이후 다음과 같이 사용자 키 생성 명령어를 입력해줍니다. (my-email@example.com 대신 자신의 이메일 주소를 입력합니다.)

$ ssh-keygen -t rsa -b 4096 -C "my-email@example.com"

다음과 같이 나타나면 엔터를 눌러줍니다. (경로를 다른 위치로 특별히 지정해야 하는 경우에만 절대 경로를 입력해줍니다.)

Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):

이제 이 사용자 키의 암호(Passphrase)를 입력해줍니다. 동일 암호를 두 번 입력하여 확인 과정을 마칩니다.

Enter passphrase (empty for no passphrase): 
Enter same passphrase again:

다음과 같이 나타나면 키 생성이 완료 된 것입니다.

Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:qYWyFlIUh/DxwRyzRj961ymIFyhgKchwpAyl0YJcIIm my-email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| Eo+X+.          |
|+O.B.O           |
|+.  @ =          |
|o. B *   o .     |
|. . B = S o      |
|   . = + .       |
|    o =          |
|   .         =   |
|                 |
+----[SHA256]-----+

 

ls -l 명령어를 사용하여 키 파일이 생성되었는지 확인해보겠습니다.

$ ls -l
total 12
-rw-------. 1 user user  393 Apr  6 22:27 authorized_keys
-rw-------. 1 user user 3326 May 12 18:01 id_rsa
-rw-r--r--. 1 user user  746 May 12 18:01 id_rsa.pub

 

생성 된 파일 중 id_rsa개인 키, id_rsa.pub공개 키입니다. 개인 키는 절대로 외부 서버나 위치 사용자에 알려주어서는 안되므로 보안에 유의하여 보관해주셔야 합니다. 우리가 GitHub에서 이 사용자 키를 사용하여 사용자 인증을 하기 위해서는 ‘공개 키’ 파일에 있는 정보GitHub에 알려주어야 합니다.

 

 

생성한 공개 키 등록 & 복사

공개 키 내용을 복사하기 위해 cat 명령어를 사용하여 파일을 출력해보겠습니다. 아래와 같이 공개 키 파일의 내용이 보여질 것입니다.

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDHWj+cNJF9qA3GnyxWyFqKXF+YRdIkoDBhQuGN6j3IZaJNtntIbZp4v8l2tPGeYbY+vyaCZHU2qZ62Zs4S/ov+4C7LONvINBF8BUCpveOsdMgfbMT3EnfZHsGUFh3iaRcHNwN/ZcdAasSnj1LFJ2wkOqUWgVGWwZL1uvr23IyTQrZwv7ShYyp4XgYbvILSWsID2E8WvckcnxYC936iTYkugFHlJQXybeTxKcccMprwWc/WtIwYWDTzZM4DQdShcm5/dTnHDkQwh27ziCkXMnaow9WfYxw+pyJ/BmFQVT0VxTIxkwJ6285QBGsgSqK+NRcYUVX/ubVk6gsAddPOg5E94kg+6bjs9xyuNTCrAyC9eipeyrSkbB85uLsBaZckkVdebllHMUKCBiCjLL61Lv8WS1PbOFouXzKE23HMf57XXXNtDzHkqyeP035M04Q5BTk7Rr18OgMkzOWsHVM5c5ai4MjaXuEHE0cCsrrDCxYCnzbU39aJgUFekQG3CGCv97bGjT3WN5qD9pUaXhrCTgIjYQtbWKeRfyI0+oxsMZiEEuOmCNuv89/6Dkz2v52bCQOW0k6oIiiQIqehyVObfk7Rffq+uwfowBZco9kxFWEaKKzddQy0STcjmuA7g3UjjZNUV+yA+CepVEwFF3MLNtD1GQhmhgQPiHQwWkEzCHhafLw== my-email@example.com

ssh-rsa부터 Comment 부분(my-email@example.com)까지 모두 복사해둡니다.

 

다음으로 SSH-Agent에 생성한 사용자 키 중 개인 키 파일을 등록해주어야 합니다.

먼저 eval $(ssh-agent -s) 명령어를 사용하여 확인해봅니다. (pid 번호는 아래와 다를 수 있습니다.)

$ eval $(ssh-agent -s)
agent pid 22654

이제 ssh-add 명령어를 사용하여 개인 키 파일을 사용하여 ssh-agent에 등록합니다. (등록 과정 중 사용자 키 암호를 입력해야 합니다.)

$ ssh-add ~/.ssh/id_rsa

 

 

GitHub에 공개 키 등록하기

이제 GitHub 홈페이지로 이동해보겠습니다. 아래 URL에서 로그인을 진행합니다.

https://github.com/login

 

로그인이 완료되었다면 우측 상단 메뉴의 자신의 프로필을 클릭한 후 ‘Settings’ 메뉴를 클릭합니다.

github-create-access-token-1

 

이어서 좌측 메뉴에서 ‘SSH and GPG keys’ 메뉴를 클릭합니다.

github-add-ssh-credentials-1

 

다음으로 우측 상단(SSH Keys 항목)의 ‘New SSH Key’ 버튼을 클릭하여 새로운 SSH 키를 등록합니다.

github-add-ssh-credentials-2

 

아래와 같이 각 입력란에 키 정보를 입력합니다.

  • Title : 키 이름
  • Key : 상단에서 복사한 공개 키 내용

입력이 완료되면 ‘Add SSH Key’ 버튼을 클릭하여 등록을 완료합니다.

github-add-ssh-credentials-3

 

SSH 키가 문제 없이 등록된 것을 확인합니다.

github-add-ssh-credentials-4

 

 

Git 설정 변경하기

GitHub에서 SSH를 사용하려면 먼저 사용을 원하는 저장소에 방문하여 다음과 같이 SSH 경로를 복사해야 합니다.

‘Clone or download’ – ‘Use SSH’ 를 클릭하여 git@github.com:[계정명]/[저장소명].git 을 복사합니다.

github-add-ssh-credentials-5

이제 HTTPS 접근 방식이 아닌 SSH 접속 방법을 사용하여 GitHub 저장소에 접근할 수 있도록 Git 설정을 변경해주어야 합니다.

리눅스 서버 내에 git 저장소가 초기화 된 경로가 /home/www/html이라고 가정해보겠습니다. 만약 아직 git 저장소 초기화가 안되었다면 원하는 경로에서 git init 명령어를 사용하면 됩니다. 다음 명령어를 입력하여 해당 경로로 이동합니다.

$ cd /home/www/html

 

다음 명령어를 사용하여 remote 정보를 갱신합니다. 여기에 사용되는 git 주소는 방금 전에 복사했던 SSH 경로를 붙여넣습니다.

$ git remote add origin git@github.com:user/repository.git

git remote show 명령어로 추가한 연결된 저장소를 확인할 수 있습니다.

$ git remote show
origin

 

임의의 파일을 commit하기 위해 test.txt 파일을 변동사항에 추가한 후, master 브랜치로 push하여 서버에 업로드해보겠습니다.

$ git add test.txt
$ git commit -m "test"
$ git push origin master

다음과 같이 호스트 키 저장 여부를 묻는다면 yes를 입력합니다.

The authenticity of host 'github.com (192.###.###.###)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXU##################################.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:##:##:##:##:##:##:##:##.
Are you sure you want to continue connecting (yes/no)?

 

파일이 문제 없이 업로드되는 것을 확인할 수 있습니다.

Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 258 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To git@github.com:user/repository.git
   481cdf6..e04da7d  master -> master

이제 별도의 사용자 이름과 암호를 묻지 않고 저장소에 파일을 업로드할 수 있습니다.

 

 

참고자료


이 글에 대해 어떻게 생각하시나요?

여러분의 의견을 댓글로 남겨주세요.

avatar
error: Y