대체 GPG가 뭔가요

  • 내가 누구인지를 Signing/서명 을 통해 증명할 때

    • Git 커밋의 Verified 마크

    • 도커 설치할 때 항상 나를 귀찮게 하는 gpg/keyring/repo등도 “이 파일이 진짜 도커 엔진인지” 체크하는 과정의 일부이다

  • 파일/메시지 등의 암호화/복호화 할 때

    • 우리에게 친숙한 비대칭키 암호화다. 다만 GPG 툴을 사용해 커맨드라인으로 편하게 할 뿐이다.
  • “나는 이 사람을 신뢰하겠다”같이 어떤 사람의 public 키를 보증할 때

  • 기존 SSH키를 대체할 인증의 수단으로도 사용

    • 비교적 새로운 사용법이라 아직 많이 쓰이지는 않음

왜 이렇게 많은가: GPG, PGP, OpenPGP

PGP

  • 1991년에 나온 암호화 프로그램이다
  • Pretty Good Privacy의 약자이다
  • 특허 문제로 사람들이 편하게 못 씀

OpenPGP

  • 프로그램이 아닙니다
  • 위에서 나온 PGP 프로그램의 Open standard
  • PGP의 특허 문제를 해결하기 위해 만들어졌다

GPG, aka GnuPG

  • GNU Privacy Guard의 약자이다
  • GNU라는 집단이 OpenPGP 규약에 따라 만든 프로그램

어떻게 돌아가는가

  • 비대칭 암호화라는 마법(aka 수학)을 사용

    • 한 key를 사용해 암호화/서명, 대응되는 key를 사용해 복호화/검증
    • GPG의 모든 개념은 비대칭키를 사용해 수행된다. 그 안에서 나오는 모든 개념들은 사람의 해석일 뿐이다.

큰 그림

  • GPG키를 잃어버리거나 도둑맞는 경우, 피해는 너무도 크다

  • 그렇기 때문에, Primary keySub keys를 용도에 맞게 사용한다

  • Primary key

    • 이 키는 당신의 신분을 나타낸다
    • GnuPG를 사용할 때 자동으로 만들어진다
    • Sub key들을 만들 때, 각 sub key들을 서명하고 보증하는 용도로만 사용된다
    • Sub key들을 다 만든 후에는 어딘가에 안전하게 보관하세요
    • 길고 복잡한 암호를 설정하는 편이 좋다(보안)
  • Sub key

    • 매일매일 사용할 키이다
    • 일반적으로 불리는 GPG키는 이 Sub key 들이라고 생각하는게 편할 겁니다
    • Primary key보다 더 짧고 쉬운 비밀번호를 사용할 수 있다
    • In case of breach, you can revoke it and re-generate using primary key
    • 문제가 생긴 경우, 키를 없에서(revoke) 새로 발급할 수 있다

실제로 해봅시다

GnuPG 설치

  • MacOS: brew install gnupg
  • Ubuntu: apt-get install gnupg
  • Arch: pacman -S gnupg

설정

GPG키 생성

시연을 위해 1024 bit 키 사이즈를 사용했습니다만, 실제로 사용할 때는 현재 사용할 수 있는 가장 긴 키 사이즈를 사용하세요

$ gpg --full-gen-key
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (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) 1024
Requested keysize is 1024 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: asdf
Email address: asdf@youremail.tld
Comment:
You selected this USER-ID:
    "asdf <asdf@youremail.tld>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
  • At this point, GnuPG will ask you for a passphrase. Choose wisely
  • 이 단계에서 비밀번호를 설정 합니다. 신중하게 충분히 복잡한 비밀번호를 사용하세요.
  • 결과
...
gpg: revocation certificate stored as '/root/.gnupg/openpgp-revocs.d/268ABC813733FCB4C1A4DAB3DE6B16ACCE2B7789.rev'
public and secret key created and signed.

pub   rsa1024/DE6B16ACCE2B7789 2023-06-02 [SC]
      268ABC813733FCB4C1A4DAB3DE6B16ACCE2B7789
uid                            asdf <asdf@youremail.tld>
sub   rsa1024/145F55C942053D95 2023-06-02 [E]

Sub key들 생성

$ gpg --edit-key YOUR_NAME_OR_KEY_ID
# For example:
$ gpg --edit-key asdf
$ gpg --edit-key DE6B16ACCE2B7789
Secret key is available.

sec  rsa1024/DE6B16ACCE2B7789
     created: 2023-06-02  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa1024/145F55C942053D95
     created: 2023-06-02  expires: never       usage: E
[ultimate] (1). asdf <asdf@youremail.tld>

gpg> addkey
Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
  (14) Existing key from card
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 1024
Requested keysize is 1024 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
Really create? (y/N) y

...

sec  rsa1024/DE6B16ACCE2B7789
     created: 2023-06-02  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa1024/145F55C942053D95
     created: 2023-06-02  expires: never       usage: E
ssb  rsa1024/7DD531DF7C01216A
     created: 2023-06-02  expires: never       usage: S
[ultimate] (1). asdf <asdf@youremail.tld>

gpg> save
  • 생성된 키 리스트 확인
$ gpg --list-keys  # shortcut: -k
$ gpg --list-secret-keys  # shortcut: -K
  • Output
pub   rsa1024/61D66B8D31BD01F9 2023-06-02 [SC]
      CF78AF6A45E92DAF10479CD661D66B8D31BD01F9
uid                 [ultimate] qwerasdf <qwerasdf@yourdomain.tld>
sub   rsa1024/79C816CE3A8FF83B 2023-06-02 [E]
sub   rsa1024/23EBD2E4A68E30C1 2023-06-02 [S]
sec   rsa1024/61D66B8D31BD01F9 2023-06-02 [SC]
      CF78AF6A45E92DAF10479CD661D66B8D31BD01F9
uid                 [ultimate] qwerasdf <qwerasdf@yourdomain.tld>
ssb   rsa1024/79C816CE3A8FF83B 2023-06-02 [E]
ssb   rsa1024/23EBD2E4A68E30C1 2023-06-02 [S]

이게 무슨 뜻이죠?

  • pub: Public key
  • sub: Sub key
  • sec: Secret key
  • ssb: Secret sub key
  • 61D66B8D31BD01F9: Key ID
  • CF78AF6A45E92DAF10479CD661D66B8D31BD01F9: Fingerprint

키 백업

  • 아래 커맨드를 실행한 후 나오는 결과 파일들을 안전한 곳에 보관하세요
$ gpg -a --export > pub.asc
$ gpg -a --export-secret-keys > priv.asc
  • Sub key를 추가하거나 다른 문제가 생긴 경우, 아래처럼 복원하세요:
gpg --import myprivatekeys.asc
gpg --import mypubkeys.asc

Primary Secret Key 제거

  • 왜냐고요? 위 #Setup 섹션을 보세요
  • 주의: PRIMARY KEY ID 뒤에 느낌표를 붙이세요
$ gpg --delete-secret-key PRIMARY_KEY_ID!
# For example:
$ gpg --delete-secret-key DE6B16ACCE2B7789!

Change Passphrase

  • 왜냐고요? 위 #Setup 섹션을 보세요
$ gpg --change-passphrase YOUR_NAME
  • 제일 처음 넣은 비밀번호를 입력해 인증
  • 그 후, 사용하기 쉬운 새 비밀번호를 입력

References