평소에는 크게 신경 쓰지 않고 사용해오던 GitLab Personal Access Token(PAT)이었는데, 이번에 Dockerfile을 사용한 자동화 작업을 하면서 단순한 문제가 아니라는 것을 새삼 느꼈습니다.

처음에는 흔히들 하듯이 아래처럼 토큰을 URL에 직접 포함시켜서 사용했습니다.

1
https://oauth2:<token>@gitlab.com/username/project.git

이 방식은 편리하지만, 보안적으로는 매우 위험하다는 것을 알게 되었습니다. 토큰이 Dockerfile에 포함되면, 이 파일이 실수로라도 커밋되거나 공유되었을 경우, 누구나 해당 토큰으로 GitLab에 접근할 수 있게 됩니다. 그리고 토큰이 만료되거나 갱신되었을 때 매번 관련 스크립트나 설정 파일을 수정해야 하는 번거로움도 있습니다.

보다 안전하게 PAT를 관리할 수 있는 방법이 없을까 고민하다가, pass라는 도구를 알게 되었고, 이를 통해 매우 간단하면서도 강력하게 토큰을 관리할 수 있었습니다.

pass란 무엇인가요?

pass는 GPG(GNU Privacy Guard)를 기반으로 하는 간단한 비밀번호 관리자입니다. 각 비밀번호는 GPG로 암호화되어 파일로 저장되며, GPG 개인 키를 가진 사용자만 복호화할 수 있습니다. 파일 자체는 로컬에 저장되지만, GPG 키 없이는 내용을 확인할 수 없기 때문에 보안상 매우 안전합니다.

설치와 초기 설정

우선 필요한 패키지를 설치합니다.

1
sudo apt install pass gnupg

GPG 키가 아직 없다면 아래 명령으로 새로 생성할 수 있습니다.

1
gpg --full-generate-key

이름, 이메일, 암호 등을 입력하고 나면 키가 생성되며, 아래 명령으로 키 목록을 확인할 수 있습니다.

1
gpg --list-keys

이제 pass를 GPG 키로 초기화합니다. GPG 키 ID는 이름이나 이메일 주소 대신 fingerprint 전체를 사용하는 것이 가장 안전합니다.

1
pass init 121C19C25E08DB40298DC736283B3D49ACE4E74A

비밀번호(PAT) 저장과 조회

PAT를 저장하려면 다음 명령을 입력합니다.

1
pass insert gitlab/pat

프롬프트가 나타나면 비밀번호(PAT)를 입력하고 Enter, 다시 한 번 확인 입력을 하면 저장됩니다. 입력한 내용은 화면에 표시되지 않지만 정상적으로 입력되고 있으니 걱정하지 않으셔도 됩니다.

조회할 때는 아래 명령을 사용합니다.

1
pass gitlab/pat

Docker 빌드 시에도 환경 변수로 불러와 사용할 수 있습니다.

1
2
export GITLAB_PAT=$(pass gitlab/pat)
docker build --build-arg GIT_TOKEN=$GITLAB_PAT .

이 방식은 Dockerfile 안에 토큰이 직접 노출되지 않기 때문에 보안상 매우 안전합니다.

마무리

처음엔 그냥 환경 변수나 .env 파일로 관리하면 되지 않을까 생각했지만, 보안성과 관리 편의성을 함께 고려했을 때 pass는 매우 훌륭한 대안이었습니다. 특히 pass는 GPG 기반이기 때문에 복잡한 외부 솔루션 없이도 충분히 강력한 보안 수준을 확보할 수 있습니다.

GitLab PAT뿐만 아니라, 다른 서비스의 API 키나 비밀번호도 이 방식으로 안전하게 관리할 수 있다는 점도 큰 장점입니다. 자동화 환경에서 민감 정보를 다루는 경우, 꼭 한 번 pass를 도입해보시기를 권해드립니다.