개요
GPG 암호화를 사용하여 서버 비밀번호를 통합 관리하고, 이를 Git과 연동해보려고 한다.
이렇게 하면 서버 비밀번호를 안전하게 관리하면서 버전 관리 시스템을 통해 변경 이력을 추적할 수 있게 된다.
관리 방법
- GPG 암호화: 서버 비밀번호는 로컬에서 GPG로 암호화한 후 저장되며, 이 암호화된 파일을 Git에 커밋한다. (Git의 경우 사내 내부망에 Git 서버를 따로 구축)
- Git에서 암호화된 파일을 추적하여 비밀번호 변경 내역을 관리할 수 있다.
- Git 연동: 비밀번호가 변경되면 암호화된 파일을 Git에 푸시하고, 필요한 경우 복호화하여 비밀번호를 확인할 수 있다.
절차
1. GPG 키 생성 및 설정
GPG 키를 생성하고, 해당 키로 파일을 암호화/복호화 할 수 있도록 준비한다.
# GPG 키 생성
$ gpg --full-generate-key
gpg (GnuPG) 2.4.5; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)
Requested keysize is 3072 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: JaehyoJJAng
Email address: yshrim12@naver.com
Comment:
# 생성된 키 확인
$ gpg --list-secret-keys --keyid-format LONG
$ gpg --list-keys
정상적으로 생성 시 아래와 같은 출력문이 뜰 것이다.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /home/a-user/.gnupg/trustdb.gpg: trustdb created
gpg: directory '/home/a-user/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/a-user/.gnupg/openpgp-revocs.d/xxxxxxxxxxxxxxx.rev'
public and secret key created and signed.
pub rsa3072 2024-09-20 [SC]
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
uid <Your RealName> <Your Email-Address>
sub rsa3072 2024-09-20 [E]
1-1. 옵션 설명
- 각 옵션 설명
암호화 타입 선택
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(14) Existing key from card
RSA and RSA
: RSA 키 페어를 생성하며, 서명과 암호화를 모두 지원합니다. 가장 일반적인 선택이며, 대부분의 시스템에서 호환됩니다.DSA and Elgamal
: DSA는 서명을, Elgamal은 암호화를 지원하는 키 페어입니다. RSA에 비해 호환성이 다소 떨어질 수 있습니다.DSA (sign only)
: 서명만 지원하는 키를 생성합니다. 암호화가 필요할 경우 적합하지 않습니다.RSA (sign only)
: RSA로 서명만 지원하는 키를 생성합니다. 마찬가지로 암호화가 필요할 경우 적합하지 않습니다.ECC (sign and encrypt)
: ECC(Elliptic Curve Cryptography) 기반의 키를 생성하며, 서명과 암호화를 모두 지원합니다. ECC는 RSA보다 더 작은 키 크기로 동일한 수준의 보안을 제공하며, 최신 암호화 방식을 선호하는 경우 적합합니다.ECC (sign only)
: 서명만 지원하는 ECC 키를 생성합니다.Existing key from card
: 기존에 스마트카드에 저장된 키를 불러옵니다. 새로운 키를 생성하는 경우 이 옵션은 적합하지 않습니다.
키 크기 선택
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072)
Requested keysize is 3072 bits
- 기본값은 3072비트로 설정되어 있으며, 이는 강력한 보안을 제공하는 충분한 크기입니다.
- 4096비트는 더 높은 보안을 제공하지만, 암호화와 복호화 작업에 더 많은 리소스가 필요할 수 있습니다. 만약 최대 보안을 원하면 4096비트를 선택할 수 있습니다.
키 유효기간
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
- 유효 기간을 설정하는 이유는 키 관리에서 만약 키가 유출되거나 보안 위협이 있을 경우, 자동으로 만료되어 보안성을 높이기 위함입니다.
- 0 (기본값) 은 키가 만료되지 않도록 설정하며, 보통 개인적인 용도나 장기적인 프로젝트에서 키를 자주 갱신하지 않기 위해 많이 사용합니다.
- 만료 기간을 설정하려면 n (일), n w (주), n m (월), 또는 n y (년)를 입력하여 유효 기간을 지정할 수 있습니다.
- "0" 을 입력하여 만료되지 않음으로 설정하는 것이 일반적이며, 관리가 더 쉽습니다. 만약 키가 만료되면 갱신해야 하기 때문에 관리가 번거로울 수 있습니다. 하지만 보안 규칙에 따라 주기적인 키 갱신을 원할 경우 특정 기간을 설정할 수도 있습니다.
User ID 설정
GnuPG needs to construct a user ID to identify your key.
Real name: JaehyoJJAng
Email address: yshrim12@naver.com
Comment:
- Real name: 이 키와 연결할 실제 이름을 입력합니다. 이는 키를 식별하기 위한 정보로, Git 또는 다른 시스템에서 이 이름이 보여질 수 있습니다.
- Email address: GPG 키와 연결된 이메일 주소를 입력합니다. 이는 GPG 키를 사용하는 사람을 식별하는 데 중요한 요소입니다. Git 연동을 위해서는 Git에 설정된 이메일을 입력하는 것이 좋습니다.
- Comment: 선택 사항이며, 키에 대한 추가 설명이나 메모를 추가할 수 있습니다. 예를 들어 "서버 비밀번호 관리용"과 같은 설명을 덧붙일 수 있습니다.
2. 비밀번호 관리 스크립트 작성
스크립트 주소
https://github.com/JaehyoJJAng/gpg-password
3. 비밀번호 복호화
비밀번호를 복호화하려면 GPG 비밀키를 이용하여 다음 명령어로 복호화할 수 있다.
gpg --output password_store_decrypted.txt --decrypt password_store.gpg
스크립트 실행하기
- GPG 암호화 및 Git 연동을 사용한 서버 비밀번호 관리 스크립트를 실행하려면 아래 단계를 따르자.
1. 스크립트 파일 준비
작성한 스크립트 파일을 준비한다.
예를 들어 파일 이름이 manage_password.sh
라면, 이 파일이 실행 가능하도록 권한을 부여해야 한다.
chmod u+x manage_password.sh
2. 필수 프로그램 설치
GPG
와 Git
이 설치되어 있어야 한다.
# Debian
sudo apt-get install gnupg
sudo apt-get install git
# RHEL
sudo yum install gnupg
sudo yum install git
3. GPG 키 생성 및 키 ID 확인
스크립트 실행 전 GPG 키를 생성해야 한다. 이미 GPG 키가 있다면 gpg --list-keys
로 키 ID를 확인하여 스크립트의 YOUR_GPG_KEY_ID
부분을 대체한다.
키가 없다면 아래 명령어를 실행하여 새 키를 생성하자.
gpg --full-generate-key
4. 스크립트 실행
GPG 키 ID를 스크립트에 추가했다면 스크립트 파일을 터미널에서 실행할 수 있다.
bash manage_password.sh