1. 소개
Jenkins 는 특히 소프트웨어 구성 관리를 위해 git 을 사용할 때 소프트웨어 빌드 및 제공을 자동화하는 훌륭한 도구입니다 . 그러나 Jenkins를 사용할 때 일반적인 문제는 암호 또는 토큰과 같은 민감한 데이터를 처리하는 방법 입니다.
이 사용방법(예제)에서는 Jenkins 파이프 라인 및 작업에 git 비밀을 안전하게 주입하는 방법을 살펴 봅니다.
2. Git 비밀
시작하려면 먼저 git 비밀 생성을 살펴 보겠습니다.
2.1. GPG 키 생성
git secrets는 GPG 키를 사용하므로 먼저 사용할 유효한 키가 있는지 확인해야합니다.
$ gpg --gen-key
그러면 전체 이름과 이메일은 물론 비밀 암호를 입력하라는 메시지가 표시됩니다. 나중에 Jenkins를 구성 할 때 필요하므로이 암호를 기억하십시오.
이렇게하면 홈 디렉토리에 공개 및 개인 키 쌍이 생성되며, 이는 비밀 생성을 시작하기에 충분합니다. 나중에 Jenkins에서 사용할 키를 내보내는 방법을 살펴 보겠습니다.
2.2. 비밀 초기화
git-secret 유틸리티는 git 저장소 내부에 민감한 데이터를 저장할 수있는 git의 추가 기능입니다 . 자격 증명을 저장하는 안전한 방법 일뿐만 아니라 git 고유의 버전 관리 및 액세스 제어의 이점도 얻을 수 있습니다.
시작하려면 먼저 git-secret 유틸리티를 설치 해야 합니다 . 이것은 대부분의 git 배포판의 일부가 아니며 별도로 설치해야합니다.
일단 설치되면 모든 git 저장소 내에서 비밀을 초기화 할 수 있습니다.
$ git secret init
이것은 git init 명령 과 유사합니다 . 저장소 내에 새로운 .gitsecret 디렉토리를 생성 합니다.
가장 좋은 방법 은 random_seed 파일을 제외하고 .gitignore 디렉토리의 모든 파일 을 소스 제어에 추가하는 것입니다 . 위의 init 명령은 .gitignore 가이를 처리 하도록 보장해야 하지만 다시 한 번 확인할 가치가 있습니다.
다음으로 git secret repo keyring에 사용자를 추가해야합니다.
$ git secret tell mike@aol.com
이제 저장소에 비밀을 저장할 준비가되었습니다.
2.3. 비밀 저장 및 검색
자식 비밀 명령은 REPO에서 특정 파일을 암호화하여 작동합니다. 파일에 .secret 확장자 가 지정 되고 원래 파일 이름이 .gitignore 에 추가되어 파일이 저장소에 커밋되지 않도록합니다.
예를 들어 dbpassword.txt 라는 파일에 데이터베이스 암호를 저장한다고 가정 해 보겠습니다 . 먼저 파일을 만듭니다.
$ echo "Password123" > dbpassword.txt
이제 파일을 암호화합니다.
$ git secret add dbpassword.txt
마지막으로 hide 명령을 사용하여 비밀을 커밋해야합니다 .
$ git secret hide
이 시점에서 파일이 저장소에 안전하게 저장되도록 변경 사항을 커밋해야합니다. 이것은 표준 git 명령을 사용하여 수행됩니다.
$ git add .
$ git commit -m "Add encrypted DB password"
$ git push
암호화되지 않은 파일은 여전히 로컬에서 사용할 수 있습니다. 그러나 git에 의해 자동으로 무시되었으므로 실수로 체크인 할 수 없습니다.
이를 확인하기 위해 저장소에서 또 다른 체크 아웃을 수행하면 다음과 같이 표시됩니다.
$ ls
dbpassword.txt.secret
.secret 파일 의 내용 은 암호화되어 읽을 수 없습니다 . 읽기 전에 파일을 해독해야합니다.
$ git secret reveal -p <PASSPHRASE>
$ git secret cat dbpassword.txt
PASSPHRASE 는 GPG 키를 생성 할 때 사용한 GPG 암호입니다.
3. Jenkins와 함께 Git 비밀 사용
이제 git secret을 사용하여 자격 증명을 저장하고 검색하는 데 필요한 단계를 살펴 보았습니다 . 다음으로 Jenkins에서 암호화 된 비밀을 사용하는 방법을 살펴 보겠습니다.
3.1. 자격 증명 만들기
시작하려면 먼저 앞서 생성 한 GPG 개인 키를 내 보내야합니다.
$ gpg -a --export-secret-keys mike@aol.com > gpg-secret.key
$ gpg --export-ownertrust > gpg-ownertrust.txt
이 개인 키를 안전하게 유지하는 것이 중요합니다 . 공유하거나 공개적으로 액세스 할 수있는 위치에 저장하지 마십시오.
다음으로이 개인 키를 Jenkins에 저장해야합니다. 방금 내 보낸 GPG 개인 키와 신뢰 저장소를 저장하기 위해 여러 Jenkins 자격 증명을 생성하여이를 수행합니다.
먼저 Credentials > System > Global Credentials로 이동하여 Add Credentials를 클릭 합니다. 다음 필드를 설정해야합니다.
- 종류 : 비밀 파일
- 파일 : 위에서 내 보낸 gpg-secret.key 업로드
- ID : gpg-secret
- 설명 : GPG 비밀 키
신임 정보를 저장하고 신뢰 저장소 파일에 대해 다른 신임을 작성하십시오.
- 종류 : 비밀 파일
- 파일 : 위에서 내 보낸 gpg-ownertrust.txt 업로드
- ID : gpg-ownertrust
- 설명 : GPG 소유자 신뢰
자격 증명을 저장하고 GPG 암호에 대한 최종 자격 증명을 만듭니다.
- 종류 : 비밀글
- 텍스트 : <GPG 키 생성에 사용되는 암호>
- ID : gpg-passphrase
- 설명 : GPG 암호
3.2. 파이프 라인에서 자격 증명 사용
이제 GPG 키를 자격 증명으로 사용할 수 있으므로 키를 사용하도록 Jenkins 파이프 라인을 생성하거나 수정할 수 있습니다. 마음에 계속 우리가 젠킨스 에이전트에 설치된 자식 비밀 도구가 있어야 이 의지 작업 전합니다.
파이프 라인 내부의 암호화 된 데이터에 액세스하려면 파이프 라인 스크립트에 몇 가지를 추가해야합니다.
먼저 환경 선언 을 추가합니다 .
environment {
gpg_secret = credentials("gpg-secret")
gpg_trust = credentials("gpg-ownertrust")
gpg_passphrase = credentials("gpg-passphrase")
}
이렇게하면 이전에 생성 한 세 가지 자격 증명을 후속 파이프 라인 단계에서 액세스 할 수 있습니다.
다음으로 GPG 키를 가져 와서 로컬 에이전트 환경으로 신뢰합니다.
steps {
sh """
gpg --batch --import $gpg_secret
gpg --import-ownertrust $gpg_trust
"""
}
마지막으로 저장소 내에서 git secret 명령을 수행 할 수 있습니다 .
steps {
sh """
cd $WORKSPACE
git secret reveal -p '$gpg_passphrase'
git secret cat dbpassword.txt
"""
}
파이프 라인을 실행하면 마지막에 데이터베이스 암호 출력이 표시됩니다.
+ git secret cat dbpassword.txt
Password123
3.3. Jenkins 채용 정보
전통적인 Jenkins 작업을 사용하여 git 비밀을 사용할 수도 있습니다.
파이프 라인과 마찬가지로 GPG 키, 신뢰 및 암호에 대해 3 개의 Jenkins 자격 증명을 구성해야합니다.
파이프 라인과의 주요 차이점은 Jenkins 환경 구성 패널을 사용하여 GPG 자격 증명을 삽입한다는 것입니다.
그런 다음 GPG import 및 git secret 명령을 쉘 명령에 추가 할 수 있습니다.
파이프 라인과 마찬가지로 작업 실행이 끝날 때 인쇄 된 데이터베이스 암호를 볼 수 있습니다.
+ git secret cat dbpassword.txt
Password123
Finished: SUCCESS
4. 결론
이 사용방법(예제)에서는 Jenkins 파이프 라인과 기존 작업 모두에서 git 비밀을 사용하는 방법을 살펴 보았습니다. 이는 CI / CD 파이프 라인에 민감한 데이터에 대한 액세스를 제공하는 쉬운 방법입니다.
그러나 Git 비밀은 키 저장을위한 하나의 옵션 이지만 Hashicorp Vault 와 같은 다른 전용 Security 솔루션 은 더 강력한 대안을 제공합니다.