[Github] Password authentication was removed에 대처하기

반응형

저는 OS X, Ubuntu Linux, Windows 3가지 OS에서 Github을 이용해 소스 코드를 작성하고 푸시하는 작업을 해왔습니다. 그런데, 이를 여태까지 생각없이 편한대로 사용하여 어떤 OS에서는 SSH Key를 사용했고, 어떤 OS에서는 Password 인증을 사용하고, 어떤 OS에서는 OAuth Key를 사용했습니다.

 

그러던 오늘, 개인용 PC에 설치된 Ubuntu Linux에서 새로운 모듈을 만들고, Github에 Push를 했더니 아래와 같은 메시지를 만나게 되었습니다.

 

 

 

Password authentication is deprecated

언젠가 비슷한 메일을 Github에서 여러번 받았었는데, 조만간 안전하지 않은 보안 장치들에 대해 더 이상 지원하지 않는다는 내용이었습니다. 이제 그 날짜가 된 것 같더군요.

 

Password 방식에 대한 장점은 나의 레포지터리가 아닌 다른 레포지터리에 코드를 기여하는 등을 사용할 때 다른 Github 계정을 사용할 수 있고, 특히 개인용 PC에서 회사의 소스 코드를 수정하는 등의 작업을 통해 다른 계정으로 쉽게 로그인하고 갈아탈 수 있어 편리한 점이 있었습니다.

 

그렇다면 우리는 차기 대안으로 무엇을 선택하면 좋을까요? 우리는 여기서 두 가지 선택을 할 수 있습니다.

 

  • Personal Access Token을 발급하여 이용하는 방법
  • SSH Key를 발급하여 이용하는 방법

 

두 방법 모두 각자의 계정에 고유한 Key를 발급 받아 등록하는 방법입니다. 다만 좀 더 안전한 것은 SSH Key라고 할 수 있는데요. 왜 그러냐면, Personal Access Token은 한 번 발급한 뒤 다른 보조 기억 장치에 그 텍스트 값을 복사하여 여러 군데에 사용할 수 있기 때문에 조금 보안에 취약합니다.

 

그럼 두 가지 방법에 대해 알아보도록 하겠습니다.

 

 

 

Personal Access Token

Personal Access Token에 대한 자세한 설명은 생략하도록 하겠습니다. 이 포스트는 Github에서 Deprecated된 보안 수단을 다른 수단으로 전환하기 위함입니다.

 

먼저 자신의 Github 계정에 로그인하고, Settings에 들어갑니다.

 

Settings에서는 각자 계정에 대한 다양한 설정을 제공합니다.

 

왼쪽 사이드바 메뉴에서 Developer Settings를 클릭합니다.

 

 

역시 왼쪽 사이드바 메뉴에서 Personal access tokens를 클릭합니다. 그러면 Generate new token 버튼을 클릭하여 새로운 토큰을 발급받을 수 있습니다. (토큰 발급을 위해 패스워드를 요구할 수 있습니다.)

 

Note 란에 KEY의 이름을 입력하고 Select scopes에는 repo를 클릭합니다. 여기서 Select scopes는 해당 토큰이 가지는 권한을 이야기하며 우리는 레포지터리에서 repository를 읽고 쓰는 것이 주 역할이므로 repo에만 클릭해주면 충분합니다.

 

모든 작업이 끝났으면 Generate Token을 클릭합니다.

 

발급 받은 토큰의 키가 표시되며 해당 키를 복사합니다.

한 번 사이트를 빠져나가면 해당 키는 다시 복사할 수 없으며 외부에 노출되지 않도록 주의하세요.

 

이제 발급받은 키를 사용하여 username과 함께 password로 사용하면 됩니다. 

사용한 키는 유효기간까지 사용할 수 있습니다.

 

이렇게 발급한 키는 다시 사용하려면 재발급해야 하고, 재발급하면 기존의 발급했던 키는 유효기간이 지남에 따라 사라지거나 유효기간을 지정하지 않으면 무용한 키만 생성되므로 보안에 취약해집니다.

 

평상 이것을 다시 사용하기 위해 우리는 이 키를 안전하지 않은 일반 파일 포맷인 txt 내지에 저장하여 사용할 수 있는 방법을 떠올릴 수 있지만 이것은 절대 권장하지 않습니다. 키는 항상 정해진 키 보관소에 저장해야 합니다.

 

키 보관소는 OS별로 다르게 구성되어 있으며 아래의 지침에 따라 사용하는 OS에 맞춰 설정하시면 됩니다.

 

 

더보기

 

우분투 리눅스에서는 아래의 지침을 따릅니다.

 

Ubuntu Linux에서는 키 관리를 위해 GNOME keyring을 사용합니다. 이전에는 우분투 리눅스에 Credential Manager가 없어 pull, fetch, push 때마다 매번 ID/PW를 사용해야 했습니다. 

 

하지만 매번 ID/PW를 사용하여 Git 이벤트를 사용하는 것은 효율적이지 않습니다. GNOME keyring은 2014년에 deprecated 되었으므로 우리는 libsecret을 사용하여 키 관리를 해보도록 하겠습니다.

$ sudo apt install libsecret-1-0 libsecret-1-dev

위 명령어를 이용해 libsecret 모듈을 설치해줍니다.

 

 

Git에 libsecret을 적용하기 위해 /usr/share/doc/git/contrib/credential/libsecret 디렉터리로 이동하여 git-credential-libsecret 소스를 빌드합니다. Makefile이 이미 제공되어 있으므로 우리는 간단히 make 명령어를 이용할 수 있습니다.

$ git config --global credential.helper /usr/share/doc/git/contrib/credential/libsecret/git-credential-libsecret

빌드한 바이너리를 git의 인증 도구로 지정합니다.

 

 

이제 위에서 발급 받은 토큰으로 레포지터리를 clone 하게 되면 libsecret에 발급받은 키가 저장되어 이후 Git 이벤트에서는 더 이상 Password를 묻지 않은 것을 볼 수 있습니다.

 

GNOME의 키 관리 애플리케이션인 seahorse를 실행해보면, 방금 등록한 키가 정상적으로 올라왔음을 볼 수 있습니다.

만약, GUI를 사용할 수 없는 리눅스 환경에서 키가 등록되어 있는지를 확인하고자 한다면 lssecret 커맨드를 이용하는 것이 좋습니다. 이 커맨드는 공교롭게도 기본 리눅스에서 제공하지 않으며 APT 의존성 관리자에서도 등록되어 있지 않기 때문에 직접 소스를 받아 빌드해야 합니다.

 

https://github.com/gileshuang/lssecret

 

더보기

 

Windows에서는 아래의 지침을 따릅니다.

 

Windows 10에서는 Github의 인증 관리를 위한 Microsoft Git Credential Manager Core가 존재합니다. 이는 Windows의 제어판에서 Windows 자격 증명과 함께 확장되어 있어 여기에 Personal Access Key를 보관하여 사용할 수 있습니다.

 

한 가지 팁이 있다면 GCM Core는 Windows 뿐 아니라 Linux, Mac OS X에서도 호환되며 각자 OS에서 제공하는 키 관리 툴이 아닌 해당 코어를 이용해서 관리할 수도 있습니다.

 

먼저 제어판에서 사용자 계정을 누른 다음, 자격 증명 관리자에 Windows 자격 증명을 클릭합니다.

 

아래쪽에서 일반 자격 증명에 자격 증명 추가라는 버튼이 있습니다. 기존에 사용했던 git:https://github.com은 제거하고, 일반 자격 증명을 추가합니다.

 

Github 주소와 계정 정보를 입력한 후 확인를 클릭합니다.

 

역시 패스워드를 통한 인증은 더 이상 되지 않으며 토큰을 입력한 뒤에 Git 이벤트를 실행할 수 있음을 보실 수 있습니다.

 

더보기

 

OS X에서는 아래의 지침을 따릅니다.

 

Mac OS X에서는 키 관리를 위해 OS X Keychain을 사용합니다. 따라서 우리는 Keychain에 위에서 발급 받은 키를 등록하고, 사용할 레포지터리랑 묶어줘야 합니다.

 

Mac OS X에 있는 Keychain Access를 실행하면 github.com에서 사용한 기존의 정보가 있을 것입니다. 기존의 정보를 제거해줍니다.

 

$ security delete-internet-password -l github.com

터미널을 띄워 위의 명령어로도 제거할 수 있습니다.

 

그런 다음 발급받은 토큰을 이용해 Git 이벤트를 사용하면 됩니다.

 

그러면 기존의 정보가 토큰의 정보로 지정됨을 알 수 있습니다. 신기한 것은 Mac OS X에서는 Github에서 바로 토큰을 파기하거나 유효기간이 지나면 자동으로 Keychain Access에서도 삭제됩니다.

 

 

 

SSH Key

원격 Git 레포지터리를 Password의 대체로 이용할 수 있는 또 다른 방법에는 SSH key를 이용하는 방법이 있습니다. 이 방법은 Personal Access Token처럼 원격 벤더에서 계정에 따른 키 하나로 접근하는 방법이 아닌 원격 벤더에 공개키를 주고, 자신의 호스트에서 개인키로 통신하는 방식입니다.

 

더 자세하게 알아보고 싶다면 이고잉님의 글을 추천합니다.

 

https://opentutorials.org/module/432/3742

 

SSH Key - 비밀번호 없이 로그인 - 원격제어

SSH Key란? 서버에 접속 할 때 비밀번호 대신 key를 제출하는 방식이다.  SSH Key는 언제 사용하는가? 비밀번호 보다 높은 수준의 보안을 필요로 할 때 로그인 없이 자동으로 서버에 접속 할 때 SSH Key

opentutorials.org

 

먼저 이 방법을 이용하기 위해서는 SSH key를 발급 받아야 합니다.

$ ssh-keygen -t ed25519 -C "contact@neonkid.xyz"

ssh-keygen 명령어를 이용하여 key를 발급 받습니다. 이 때 코멘트에 여러분들이 사용할 Github의 계정 이메일 주소를 입력해줍니다.

 

여기서 사용한 ED25519는 암호화 알고리즘 종류를 이야기 합니다. Github에서 권장하는 암호화 알고리즘이지만 만약 구형 OS를 사용하고 있어 해당 알고리즘을 사용할 수 없다면 RSA 알고리즘을 사용하셔도 무방합니다.

 

기본 파일 이름은 id_{암호화_알고리즘_이름} 형식으로 지정됩니다. 우리는 ed25519 알고리즘을 사용했으므로 id_ed25519 파일 이름이 지정되며 .pub이 붙어 있는 것이 공개키, 그렇지 않은 것이 개인키입니다.

 

이번에는 아까 Settings에서 Developer Settings가 아닌 SSH and GPG Keys를 선택해줍니다. 

 

여기에서 New SSH key를 클릭하여 위에서 발급한 공개키를 등록합니다.

 

위에 PRIVATE  KEY라고 써져 있는 부분은 개인키, ssh-ed25519로 시작하는 것이 공개키이므로 우리는 밑의 내용을 복사하여 Key 부분에 넣어주고, Add SSH key를 클릭합니다.

 

그러면 맨 밑에 새로이 추가된 SSH 공개키가 나오는 것을 확인할 수 있습니다.

 

SSH key를 사용하여 Git 이벤트를 사용할 때는 https가 아닌 git@github.com을 사용하여야 합니다.

 

여기서 여러 개의 계정을 하나의 디바이스에서 사용하려면 어떻게 해야할까요? 

하나의 PC에서 여러 계정의 SSH key를 사용하려면 다음과 같이 사용할 수 있습니다.

 

~/.ssh 디렉터리에서 config 파일을 만들어줍니다.

 

# neonkid account
Host  github.com-maintainer
Hostname  github.com
User  git
IdentityFile  ~/.ssh/id_ed25519

# another account
Host  github.com-business
Hostname  github.com
User  git
IdentityFile  ~/.ssh/id_rsa

 

그런 다음 위의 내용을 입력합니다. 위의 내용에는 두 가지가 담겨져 있습니다. 한 가지는 위에서 우리가 사용한 제 계정인 neonkid의 계정이 있고, 밑의 내용은 또 다른 계정에 대한 SSH key의 정보를 저장하는 곳입니다.

 

위와 같이 저장한 후, 다른 계정에 대한 SSH key를 ssh-keygen 명령어를 이용해서 이번엔 rsa로 발급 받아줍니다. 

$ ssh-keygen -t rsa -C "webmaster@neonkid.xyz"

이렇게 명령어를 입력하면 id_rsa.pub와 id_rsa라는 두 가지 파일이 생성되며 역시 마찬가지로 id_rsa의 공개키를 Github 계정에 등록합니다.

 

이제 Git clone을 통하여 원격 레포지터리를 사용할 때는 위의 Config에서 입력한 User@Host를 입력하여 사용할 SSH key를 구분지어 사용해야 합니다. 그래야만 설정되어 있는 SSH key를 따라가게 되며 그렇지 않을 경우 403 오류가 발생합니다.

 

 

 

 

마치며...

여기까지 Git을 이용해 원격 레포지터리에 접근하기 위해 사용했던 Password를 대체할 2가지 수단에 대해 알아봤습니다. 

보안이 중요시되는 만큼 갈수록 Username/Password 기반의 단순 보안 수단이 사라지고, 더 강력한 보안을 요구하는 것이 점점 눈에 띄고 있습니다. 이에 따라 소스 코드 관리에도 이것을 신경써야 할 때가 온 것이겠지요.

 

PAT(Personal Access Token)과 SSH key의 각각 장단점을 정리하자면 아래와 같습니다.

 

 

PAT의 장점

 

  • Password 대신 유효기간이 존재하는 키를 이용하여 관리가 용이.
  • OS 혹은 Github에서 제공하는 키 관리 시스템을 이용했을 때 그 효과를 톡톡히 볼 수 있음.

 

PAT의 단점

 

  • 한 디바이스에서 다중 계정 사용을 위한 요소가 미흡
  • 키 관리 소홀로 유출되는 경우 보안에 심각한 취약점이 발생.

 

SSH Key 장점

 

  • 공개키와 개인키를 사용하므로 키의 유출로 인한 위험 부담이 다소 줄음.
  • Password, PAT와 같은 하나의 키가 아닌 정해진 키에서만 사용할 수 있으므로 지정된 디바이스 관리가 용이.

 

SSH Key 단점

 

  • PC에 직접 개인키를 저장하므로 개인 PC에 대한 관리 부담이 증가

 

어떤 보안 수단이든지 장단은 있지만 자신의 환경에 따라 알맞게 설정하는 것이 중요하다고 봅니다. 

 

2개월 만에 작성한 블로그 글이었습니다. 그 동안에는 저 자신을 수련하는데 많은 시간을 할애하고 있으며 며칠 전에도 블로그 글을 작성하려 했으나 몇 번을 철수하게 되었습니다. 작성하고자 하는 글에 대해 내가 잘 알고 쓰는 것인지 여전히 망설임이 심한 탓이라고 생각하고, 블로그의 글보다는 좀 더 자신의 역량 강화와 정리에 좀 더 충실하고자 합니다.

 

 

반응형