Git Secret : 파일 암호화

sangyeon217·2022년 2월 8일
0

Git

목록 보기
7/7
post-thumbnail

비밀번호와 같이 개인정보가 포함된 파일을 GitHub에 올려야할 때, 개인정보가 유출되지 않도록 암호화 하기 위해 git secret을 사용합니다.

로컬에서 password.txt라는 개인정보가 담긴 파일을 암호화하여 git에 올리고, CI 서버(Jenkins)에서 해당 파일을 복호화하는 과정을 다룹니다.

GPG 설치

git secret은 GPG(GNU Privacy Guard)를 기반으로 암호화하여 저장하기 때문에 GPG가 암호화/복호화할 OS에 설치되어 있어야 합니다.

사용자 환경에 따라 brew 또는 yum 또는 apt 명령어로 설치합니다.

$ yum install gpg

여기서 주의해야할 부분이 있는데, 암호화를 진행하는 OS와 복호화를 진행하는 OS에 설치된 gpg 버전이 같아야합니다. 참고 링크 (제가 암호화를 진행하는 MacOS에서는 gpg 버전 2.3.4(stable버전)를 설치하고, 복호화를 진행하는 CI서버(CentOS 7)에 gpg 버전 2.0.22(최신버전)을 설치하였었더니 CI 서버에서 복호화가 제대로 진행되지 않아 고생했었네요.)

GPG key 생성

$ gpg --gen-key

위 명령어 실행하면, 사용할 암호화 알고리즘을 선택하라고 합니다. (저는 기본값인 RSA를 선택하였습니다.) 암호화 알고리즘 선택 이후 Real Name, Email, Password를 입력하여 gpg key를 생성합니다. 여기서 설정한 Password 는 나중에 암호화된 파일을 복호화 할 시 입력해야하는 비밀번호 입니다.

git secret은 생성한 GPG key를 바탕으로 암호화할 대상 파일을 공개키로 암호화하고, 개인키로 복호화하여 파일을 볼 수 있게 됩니다.

git-secret 설치

gpg 설치할 때와 동일하게 사용자 환경에 따라 brew 또는 yum 또는 apt 명령어로 암호화/복호화할 OS에 git-secret을 설치합니다.

$ yum install git-secret

암호화

git secret 관련 명령어는 git의 기본 명령어와 굉장히 유사합니다.

초기화

$ git secret init

위 명령어를 실행하면, 프로젝트 내부에 .gitsecret 디렉터리를 생성되고, .gitignore 파일에 GitHub에 업로드되면 안되는 .gitsecret/keys/random_seed 파일이 추가됩니다.

사용자 추가

$ git secret tell <이메일주소>
$ git secret tell sangyeon217@gmail.com

GPG key 생성 시 설정한 Email을 입력하여 암호화된 파일을 볼 수 있는 사용자를 추가합니다.

암호화하여 저장할 파일 추가

$ git secret add <파일명>
$ git secret add password.txt

위 명령어를 실행하면, .gitignore 파일에 GitHub에 업로드되면 안되는 원본 파일(예시에서는 password.txt)이 추가됩니다.

암호화 진행

$ git secret hide

<파일명>.secret 파일(예시에서는 password.txt.secret)이 생성됩니다.

이후에는 표준 git 명령어를 수행하여 GitHub에 파일을 업로드합니다.

$ git add .
$ git commit -m "암호화된 파일 추가"
$ git push origin master

복호화

GPG key 내보내기

GPG key를 생성한 OS에서 CI 서버로 개인키를 전달하기 위해 export를 진행합니다.
$keyid$ gpg --list-secret-keys 명령어를 통해 확인할 수 있습니다.

$ gpg -a --export-secret-keys $keyid > gpg-secret.key
$ gpg --export-ownertrust > gpg-ownertrust.txt

위 명령어를 실행하면, git-secret.key 파일과 gpg-ownertrust.txt 파일이 생성됩니다.

Jenkins 설정

자격 증명 생성

Jenkins > Dashboard > Credentials > System > Global credentials > Add Credentials 에서 아래 2가지 Credential을 생성합니다.

  • SSH Username with private key
    • gpg-secret >> 개인키(git-secret.key) 입력
    • gpg-passphrase >> GPG key 생성 할 때 설정한 비밀번호 입력
  • Secret file
    • gpg-trust >> 파일(gpg-ownertrust.txt) 업로드

복호화 진행

  • Jenkins > 프로젝트명 > 빌드 환경 > Use secret text(s) or file(s) 에 체크 합니다.
  • Bindings 에서 위에서 생성한 자격 증명과 변수를 맵핑합니다.
    • SSH User Private Key
      • Key File Variable : gpg_secret
      • Passphrase Variable : gpg_passphrase
      • Credentials
        • 위에서 생성한 자격 증명 gpg-secret 맵핑
    • Secret file
      • Variable : gpg_trust
      • Credentials
        • 위에서 생성한 자격 증명 gpg-trust 맵핑

쉘 스크립트에서 개인키와 trustdb를 import합니다.

$ gpg --batch --import $gpg_secret
$ gpg --import-ownertrust $gpg_trust

이후, 아래 명령어를 실행하여 복호화를 진행합니다.

$ git secret reveal -p '$gpg_passphrase

이제 CI 서버에서 복호화된 파일을 이용할 수 있습니다.

Reference

profile
I'm a constant learner. "Long Learn for Long Run!"

0개의 댓글