토이프로젝트: env 파일 숨기기

coolchaem·2022년 6월 30일
1

toyproject

목록 보기
20/21

로그인 기능 구현하면서 토큰 요청에 필요한 client secret key가 env 파일에 기록하였는데 private key는 절대 노출되면 안 된다.
그래서 숨겨야하는데 env 파일을 안 올리면 다른 개발자들은 매번 환경 변수를 수동으로 추가하거나 파일을 디스크에 저장하고 배포해야 할 것이다.
이런 과정을 없애기 위해 env 파일을 암호화하여 올리고 복호화 권한만 있다면 env를 자동으로 적용하고 배포에서까지 노출하지 않고 자동으로 할 수 있는 방법을 찾아보았다.

git-secret

git repo에 private data를 올릴 때 사용하는 bash tool 이라고 한다. gpg(GNU Privacy Guard)를 사용해 암호화를 한다고 한다!

installation

Mac OS 기준으로 설치하였다.

  1. homebrew & git-secret 설치

https://git-secret.io/ 에서 installation을 참고하였다. npm 패키지로 따로 있는 것이 아니라 mac에서 오픈 소스 설치 관리 패키지인 homebrew를 이용해 설치하여야 한다고 설명이 있었다.

  1. 설치 확인

설치 확인의 쉬운건 패키지 이름 그대로 쳐보는 것이다. 그럼 사용할 수 있는 커맨드 리스트를 대부분 보여준다.

env 파일 숨기기

숨길 대상 파일은 아래처럼 민감한 정보로 구성되어 있을 것이다. 반드시 env 파일이 아니어도 된다.

user@devicename blog_server % cat .env 
KAKAO_CLIENT_ID="/* secret */"
KAKAO_CLIENT_SECRET="/* secret */"
KAKAO_AUTH_URL="/* secret */"
KAKAO_AUTH_TOKEN_URL="/* secret */"
KAKAO_REDIRECT_URL="/* secret */"

gpg key 생성

  1. 먼저 git-secret이 사용할 public-private key pair를 생성한다. 공식 문서에 따라 gpg로 생성한다.
blog_server % gpg --gen-key
gpg (GnuPG) 2.3.6; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name: coolchaem
Email address: /*개인메일*/@gmail.com
You selected this USER-ID:
    "coolchaem </*개인메일*/@gmail.com>"

Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
/* passphrase 작성하라는 창이 생기는데 비밀번호를 생성해주면 됩니다 */
  1. key 생성 확인

설치가 잘 되었는지 생성이 잘 되었는지 확인하는 습관이 있어야 터미널 작업엔 편하다.

blog_server % gpg --list-secret-keys
  1. public key도 생성
blog_server % gpg --armor --export your.email@address.com > public-key.gpg
blog_server % gpg --import public-key.gpg
blog_server % cat public-key.gpg

git-secret 설정
1. 기존 git 처럼 init을 해준다. 그러고나면 .gitsecret 폴더가 생기고 내부에 keys, paths 폴더가 생기는 것을 볼 수 있다. 아직 내용을 추가하진 않아서 폴더, 파일의 내용은 비어있다.

user@devicename blog_server % git secret init
git-secret: init created: '/Users/seongchaemin/Workspace/blog_server/.gitsecret/'
user@devicename blog_server % ls .gitsecret/
keys	paths
user@devicename blog_server % ls .gitsecret/paths 
mapping.cfg
user@devicename blog_server % ls .gitsecret/keys 
  1. 계정에 대한 key 추가
user@devicename blog_server % git secret tell -m
gpg: keybox 'blog_server/.gitsecret/keys/pubring.kbx' created
gpg: blog_server/.gitsecret/keys/trustdb.gpg: trustdb created
git-secret: done. /*계정*/@gmail.com added as user(s) who know the secret.

// .gitignore에 대상이 되는 파일도 추가
user@devicename blog_server % vi .gitignore  
user@devicename blog_server % cat .gitignore
# node modules
node_modules/

# test coverage
src/coverage/

.gitsecret/keys/random_seed
!*.secret
.env
  1. .env 파일 암호화 추가

이 작업을 거치면 .secret 확장자가 붙은 새로운 파일이 생성된다. 내용물은 암호화가 되어 원본 텍스트를 확인할 수 없는 상태를 확인할 수 있다.

user@devicename blog_server % git secret add .env
user@devicename blog_server % git secret hide 
git-secret: done. 1 of 1 files are hidden.

user@devicename blog_server % git status 
On branch f/oAuthLogin/chaemin_seong
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   .gitignore
	modified:   src/router/loginApi.ts

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.env.secret
	.gitsecret/
  1. secret 파일 복호화 테스트

reveal을 이용하면 복호화가 풀린다. 다른 컴퓨터에 private key를 전달하는건 아무래도 임의로 추가해야할 거 같은데 되는지 테스트 해봐야한다.

user@devicename blog_server % mv .env .env.backup
// ls -a 로 .env 없는걸 확인 가능
user@devicename blog_server % git secret reveal
git-secret: done. 1 of 1 files are revealed.
profile
Front-end developer

0개의 댓글