LYnLab 로고

블로그취미로그

게시물의 썸네일 이미지

Keybase와 GPG 키를 이용해 Git 커밋에 서명하기

Git은 커밋한 사람의 이메일 주소를 검증하지 않습니다. 하지만 GPG 키를 이용해 커밋에 서명을 남기면 커밋한 사람이 본인임을 증명할 수 있습니다.

2020-07-22#프로그래밍#보안#Git

💡 이 글은 작성된지 1년 이상 지났습니다. 정보글의 경우 최신 내용이 아닐 수 있음에 유의해주세요.

Git은 커밋한 사람의 이메일 주소를 검증하지 않습니다. 예를 들어 여러분이 git config에 제 이메일 주소를 등록한 후 작업을 커밋, GitHub에 푸시하면 해당 커밋은 저의 contribute 기록으로 남게됩니다.

이는 악용할 수 있는 부분이 많습니다. 마치 유명인이나 지인이 커밋을 남긴 것처럼 소셜 공격을 시도할 수도 있고, 누군가 여러분의 이메일로 악성 커밋을 남겨 마치 여러분이 공격을 시도한 것처럼 위장할 수도 있죠.

하지만 평소에 GPG 키를 이용해 커밋한 사람이 본인임을 서명하면 이러한 문제를 간단히 방어할 수 있습니다.

Keybase 설치

저는 GPG 키 관리에 Keybase를 사용합니다. 우선 다음과 같이 Keybase를 설치합니다.

# Ubuntu
curl --remote-name https://prerelease.keybase.io/keybase_amd64.deb
sudo apt install ./keybase_amd64.deb

# ArchLinux
$ yay -S keybase-bin

ArchLinux의 경우 Pacman 저장소에도 keybase 패키지가 있지만, 이는 CLI 툴만 설치되며 UI 툴은 keybase-gui 패키지를 추가로 설치해야하는 번거로움이 있습니다. 이 포스트에서는 CLI만 이용하므로 keybase 를 설치하셔도 무방하나, 추후의 사용성을 위해 keybase-bin (AUR) 설치를 추천드립니다.

설치가 완료되면 Keybase를 실행하여 로그인, 디바이스를 등록합니다.

GPG 키 들여오기

만약 Keybase에 등록된 GPG키가 존재하지 않는다면 새로운 GPG 키를 생성해야합니다.

$ keybase pgp gen --multi

키 생성이 완료되었거나, 이미 Keybase에 GPG 키가 등록되어 있었다면 아래 명령어로 시스템으로 들여옵니다.

$ keybase pgp export | gpg --import
$ keybase pgp export --secret | gpg --allow-secret-key-import --import

Git 설정

우선 방금 들여온 GPG 키의 ID를 확인합니다.

$ gpg --list-secret-keys --keyid-format LONG

...
----------------------------
sec   rsa4096/XXXXXXXXXXXXXXXX 2018-02-23 [SC] [expires: 2034-02-19]
...

위와 같이 sec 부분의 XXXXXXXXXXXXXXXX 에 해당하는 값이 Git 설정에 사용할 ID 입니다. 키 알고리즘 등에 따라 ID의 길이는 다를 수도 있습니다.

위의 ID를 Git의 GPG 서명키로 등록합니다.

$ git config --global user.signingkey XXXXXXXXXXXXXXXX
$ git config --global commit.gpgsign true

이후 커밋을 남길 때마다 GPG 키의 비밀번호를 묻는 프롬프트 창이 뜨고, 비밀번호를 입력하면 서명이 완료됩니다.

GitHub에 GPG 키 등록

GitHub에는 커밋 히스토리에 서명 여부를 표시하는 기능이 존재합니다. 서명된 커밋은 다음처럼 Verified 뱃지가 달립니다.

Verified 뱃지가 달린 커밋의 모습

GitHub의 'SSH and GPG keys' 설정(https://github.com/settings/keys)에 접속하여 GPG 키의 공개키를 등록해줍니다. 공개키는 다음과 같은 방법으로 확인할 수 있습니다.

keybase pgp export -q XXXXXXXXXXXXXXXX

GitHub 레포지토리에 커밋 서명 강제하기

마지막으로, GitHub는 서명되지 않은 커밋은 푸시 자체가 불가능하도록 막아버리는 기능을 지원합니다. 강력한 보안을 원하는 조직이라면 검토해봄직한 기능입니다.

레포지토리의 Settings > Branches 메뉴에서 아래와 같이 protection rule을 추가해줍니다.

Branch protection rule을 추가한 모습

이 설정을 적용하면 GPG 키로 서명되지 않은 커밋은 푸시가 불가능하게 됩니다.

관련된 글

Rails와 GitHub Actions에 커버리지 레포트를 달아보자

이 블로그의 CMS이기도 한 Shiori를 대폭 리팩토링하면서 테스트가 얼마나 잘 작성되어있는지 궁금해졌습니다.

Rails Global ID로 전역 객체 식별하기

Global ID는 Rails의 모든 객체를 식별할 수 있는 URI(Uniform Resource Identifier)입니다.

Ruby on WebAssembly: 살짝 맛보기

Ruby 3.2에 추가된 WebAssembly 지원을 간단하게 테스트해봅시다.

작성한 댓글은 giscus를 통해 GitHub Discussion에 저장됩니다.

크리에이티브 커먼즈 라이선스크리에이티브 커먼즈 저작자표시크리에이티브 커먼즈 동일조건변경허락

본 사이트의 저작물은 별도의 언급이 없는 한 크리에이티브 커먼즈 저작자표시-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.

LYnLab, 2011 - 2024.