2018年8月23日木曜日

GPG Key を使ってみる

概要

GPG (GNU Privacy Guard) は暗号化のソフトウェアです
データを渡す際にセキュリティを高めるためにあらかじめ GPG で暗号化してから渡したりします
今回は使い方を紹介します

環境

  • Ubuntu 16.04 (A, B)
  • gpg 1.4.20

キーの作成 (A)

  • gpg --gen-key

いろいろ聞かれます
ユーザ名やメールアドレスを入力する必要もあります
以下のような感じで作成しました

  • gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/0CEAD198 2018-08-21
uid                  hawksnowlog (admin) <hawksnowlog@gmail.com>
sub   2048R/B62F9EC7 2018-08-21
  • gpg --list-secret-keys
/root/.gnupg/secring.gpg
------------------------
sec   2048R/0CEAD198 2018-08-21
uid                  hawksnowlog (admin) <hawksnowlog@gmail.com>
ssb   2048R/B62F9EC7 2018-08-21

鍵を公開する (A)

  • gpg --send-keys 0CEAD198
gpg: sending key 0CEAD198 to hkp server keys.gnupg.net

公開された鍵を取得する (B)

別のサーバで行います

  • gpg --search-keys "hawksnowlog"
gpg: searching for "hawksnowlog" from hkp server keys.gnupg.net
(1)     hawksnowlog (admin) <hawksnowlog@gmail.com>
          2048 bit RSA key 0CEAD198, created: 2018-08-21
Keys 1-1 of 1 for "hawksnowlog".  Enter number(s), N)ext, or Q)uit > 1
gpg: requesting key 0CEAD198 from hkp server keys.gnupg.net
gpg: key 0CEAD198: public key "hawksnowlog (admin) <hawksnowlog@gmail.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

検索できると思うので「1」を入力して取得します
(なぜかよくわからないのですがたまに検索できないときがあります、もしかするとサーバ間で鍵データを同期しているため同期が完了してないサーバに問い合わせているからかもしれません)

gpg --list-keys で鍵が登録されているのが確認できると思います

暗号化する (B)

--search-keys で鍵を登録したマシンで行います
暗号化は公開鍵で行い復号化は秘密鍵で行うためです

  • date > hoge.txt
  • gpg -e -r hawksnowlog hoge.txt
gpg: B62F9EC7: There is no assurance this key belongs to the named user

pub  2048R/B62F9EC7 2018-08-21 hawksnowlog (admin) <hawksnowlog@gmail.com>
 Primary key fingerprint: D45E E561 7186 0F93 2D25  0830 76F0 0D80 0CEA D198
      Subkey fingerprint: E67C 4DEA 45E3 19CB 8CC3  DE37 990C 2242 B62F 9EC7

It is NOT certain that the key belongs to the person named
in the user ID.  If you *really* know what you are doing,
you may answer the next question with yes.

Use this key anyway? (y/N) y

hoge.txt.gpg が完成しています

  • file hoge.txt.gpg
hoge.txt.gpg: PGP RSA encrypted session key - keyid: 42220C99 C79E2FB6 RSA (Encrypt or Sign) 2048b .

復号化してみる (A)

秘密鍵があるマシンで行います
先程の hoge.txt.gpg を scp なりメールなりクラウドストレージなりで秘密鍵のあるマシンに移動します
復号化します

  • gpg hoge.txt.gpg
You need a passphrase to unlock the secret key for
user: "hawksnowlog (admin) <hawksnowlog@gmail.com>"
2048-bit RSA key, ID B62F9EC7, created 2018-08-21 (main key ID 0CEAD198)

gpg: gpg-agent is not available in this session
gpg: encrypted with 2048-bit RSA key, ID B62F9EC7, created 2018-08-21
      "hawksnowlog (admin) <hawksnowlog@gmail.com>"

gpg --gen-keys した際にパスレーズを設定している場合は複合する場合に必要になります

これで hoge.txt が復元できました

  • cat hoge.txt
Tue Aug 21 16:30:50 JST 2018

最後に

GPG Key を使ってデータの暗号化と復号化を試してみました
用途としてはデータをリモートの誰かに渡す場合に通信経路が暗号化などされていない場合にファイル自体を暗号化してセキュリティを強化する感じかなと思います

IT リテラルを試すのに「GPG を xxx という名前で公開しているので暗号化してメールで送ってください」ってのも良いかもしれません

一番身近なところだと apt や yum のパッケージを暗号化して配布する場合でしょうか
データの受け渡しなどは最近はクラウドストレージがあるのでわざわざ GPG する必要もないかなと思っています

Tips

keys.gnupg.net に公開した鍵を削除する方法
厳密には失効 (revoke) させるだけ

  • gpg --output revoke.asc --gen-revoke 0CEAD198
  • gpg --import revoke.asc
  • gpg --keyserver keys.gnupg.net --send-keys 0CEAD198

で確認すると revoke 状態になっているはずです

  • gpg --search-keys hawksnowlog
gpg: searching for "hawksnowlog" from hkp server keys.gnupg.net
(1)     hawksnowlog (admin) <hawksnowlog@gmail.com>
          2048 bit RSA key 0CEAD198, created: 2018-08-21 (revoked)

トラブルシューティング

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 294 more bytes)

が出る場合は以下を実行してください

  • apt -y install rng-tools
  • rngd -r /dev/urandom

参考サイト

0 件のコメント:

コメントを投稿