44bits / feedback

5 stars 0 forks source link

GPG(GNU PG)를 이용해 git 커밋에 서명하는 방법 #62

Open utterances-bot opened 3 years ago

utterances-bot commented 3 years ago

GPG(GNU PG)를 이용해 git 커밋에 서명하는 방법 | 44BITS

깃허브(GitHub)에서 커밋을 읽다보면 Verified 된 커밋을 발견하곤 합니다. Verified된 커밋을 만들려면 GPG 키로 커밋에 서명을 해야합니다. 이 글에서는 gpg를 사용해 GPG 키를 생성하고 깃 커밋에 서명하는 방법을 소개합니다.

https://www.44bits.io/ko/post/add-signing-key-to-git-commit-by-gpg

CreatiCoding commented 3 years ago

혹시 커밋 서명이 왜 필요한지 알 수 있을까요? 어떤 보안 이슈를 막을 수 있는건가요?

jeyraof commented 3 years ago

@CreatiCoding 안녕하세요. 이재영입니다. 먼저 글에 관심 가져주셔서 대단히 감사합니다.

먼저 제가 알고 있는 지식이 불완전해 온전히 필요성을 대변할 수 있지 못할 수 있다고 생각해서 조심스러운 마음으로 조금만 적어 보겠습니다.

먼저 서명의 대상은 커밋 뿐만 아니라 태그도 포함이 됩니다. 해당 커밋 내지는 태그에 (이하 커밋) 개인키로 서명을 하게 되면, 해당 개인키의 페어가 되는 공개키를 가진 주체가 해당 커밋의 주체를 명확하게 특정할 수 있게 됩니다. 다시 말해 해당 커밋의 주체가 제가 보관중인 공개키의 상응하는 개인키의 보유자라는것을 확인할 수 있게 됩니다.

이로 인해 얻을 수 있는 메리트는 크다면 크고, 적다면 적겠지만 두가지만 크게 적어 본다면,

  1. 특정 브랜치에 내가 신뢰하는 사람들의 커밋만 포함을 하고 싶을때 merge 커맨드의 --verify-signatures 옵션을 통해 해당 동작을 수행할 수 있습니다.

  2. 요즘에는 코드를 Github 과 같은 VCS 저장소에 올려두고 형상관리를 하시는 경우가 많은데요, 제가 커밋을 할 때 @CreatiCoding 님의 사용자 정보를 이용해서 커밋을 하게 된다면 @CreatiCoding 님께서는 아무런 행동도 하지 않았지만 저장소에는 @CreatiCoding 님이 작업을 하신 것 처럼 보일 수 도 있습니다.

2번에 대한 예를 들어보자면,, 제가 한 행위는 아주 단순합니다. .gitconfig 파일의 내용을 다음과 같이 바꾸고, 커밋을 한 후 저장소로 올렸습니다.

[user]
    name = "CRECO"
    email = "creatixxxxx@gmail.com" # 이메일이 노출 되시는걸 꺼려하실 수 도 있을 것 같아 조금 변조했습니다.. 😅

이후 저장소의 커밋 내역을 보면, 마치 @CreatiCoding 님께서 활동을 하신것과 같이 보여집니다. 만약 제가 늘상 개인키를 이용해서 나의 모든 커밋에 서명을 하며 활동을 한다면, Verified 가 없는 이 커밋은 나의 활동이 아니다는것을 주장할 수 있을지 모르겠습니다.

image

저도 이번에 지인에게 전달하기 위해 작성하면서 많이 배우고 있는 상황이라, 부족함이 있을 수 있는데 더 중요한 필요성을 알고 계시는 분께서 댓글로 내용을 덧붙여 주신다면 굉장히 풍부한 컨텐츠가 되지 싶습니다..!

다시한번 감사합니다.

CreatiCoding commented 3 years ago

그렇군요! 필요성을 확실히 알 것 같습니다! 친절한 답변 정말 감사합니다 😄ㅎㅎ

imbrok commented 3 years ago

좋은 글 감사합니다 @jeyraof 그리고 다른 분들에게 도움이 될까 싶어 Mac OS에서 제가 경험한 에러상황에 대한 대처방법을 남깁니다.

error: gpg failed to sign the data
fatal: failed to write commit object

혹시나 위와 같은 에러가 발생한다면 jeyraof님이 글에서 언급해주신 것 처럼 사용중인 쉘 환경설정에 export GPG_TTY=$(tty) 명령어를 설정해 주는 방법으로 문제를 해결할 수 있지만, VSCode의 SOURCE CONTROL 탭과 같은 GUI 환경에서는 계속해서 같은 에러가 발생할 것입니다.(VSCode의 WSL 환경에서도 마찬가지라고 합니다.)

아마도 원인은 커밋 시 비밀번호를 입력하는 창이 없기 때문일 것입니다.

이 경우, 매 번 새로운 세션에서 커밋 시 터미널에 다음과 같은 명령어를 통해 비밀번호를 입력 해줘야만 이후에 에러 메시지 없이 서명된 커밋이 가능했습니다.

$ echo "test" | gpg --clearsign

하지만 매 번 이렇게 입력하는 것이 번거로워서 검색해보니 Mac OS환경에서는 다음과 같은 편법(stackoverflow link)으로 해결이 가능했습니다.

$ brew install pinentry-mac $ echo "pinentry-program /usr/local/bin/pinentry-mac" >> ~/.gnupg/gpg-agent.conf $ killall gpg-agent

위와 같이 pinentry-mac을 brew를 통해 설치 후, gpg-agent설정파일에 명령어를 추가(생성)한 뒤, gpg-agent를 종료해 줍니다.

이 후, gpg를 이용하여 commit을 작성하면 비밀번호를 입력해주는 창이 뜨고, 이 때 비밀번호를 입력해주면 이후로는 mac에서 같은 키를 이용하는 모든 환경에서 더 이상 비밀번호를 입력해줄 필요가 없게 됩니다.(보안상 이 부분은 호불호가 갈릴 수 있겠네요.)

부수적으로, 이렇게 하면 더 이상 쉘 환경에 export GPG_TTY=$(tty) 명령어를 설정해줄 필요도 없어집니다.

혹시나 저처럼 이 부분으로 문제를 겪으시는 분들께 도움이 되면 좋겠네요.

jeyraof commented 3 years ago

와 저도 몰랐던 해결 방법입니다. 좋은 정보 너무 감사합니다 @imbrok 님!

15kubernetes commented 1 year ago

아주 잘 설명된 포스팅이었습니다. 많은 도움 얻고 갑니다.

uthline commented 1 year ago

와우~ 감사합니다. 시간 벌었네요.