Profile picture

[Shell Script] GPG Encrypt + Git 연동 비밀번호 관리 스크립트 작성

JaehyoJJAng2024년 05월 03일

개요

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. 필수 프로그램 설치

GPGGit이 설치되어 있어야 한다.

# 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

Loading script...