SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【LPIC102】GnuPGによる暗号化 LPICで学ぶLinux18


長らく続いたLPICレベル1もついに最終記事です。
今回はLPICのセキュリティの要素の一つである「GnuPG」を扱います。

GnuPG


ウィキペディアでは以下のように説明されています。

GNU Privacy Guard (GnuPG, GPG) とは、Pretty Good Privacy (PGP) の別実装として、GPL に基づいた暗号化ソフトである。 OpenPGP 規格 (RFC 4880) に完全準拠しているが、古い PGP との互換性は完全ではない。

引用元:GNU Privacy Guard - Wikipedia

上記の説明ではGnuPGの他にPGPなんかも突然でてきますが、もう少し知るには以下とかも参考になります。
PGP、OpenPGP、GnuPG 暗号化の違い

LPICの範囲では、Linux上でのファイルの暗号化に用いる仕組みと認識しておけば、大きな間違いはないと思います。
よくも悪くもLPICレベル1の範囲では本質的な部分の重要度は下がりコマンドなどを把握してれば大丈夫そうです。
いずれにしても、SSHとの明確な役割の違いを抑えつつ比較する形で把握していくとよいかと思います。

gpgコマンド

gpgコマンドは、GnuPGというアルゴリズムでファイルの暗号化、複合化を行うコマンドです。
実際に実行すると表示が長くなりそうなので、先にオプションを抑えておきます。

■主要オプション一覧

オプション 内容
--gen-key 公開鍵方式の鍵ペアを生成
--export 公開鍵のエクスポート
--import 公開鍵のインポート
--list-keys 公開鍵一覧を表示
--sign ファイルに署名
--verify ファイルの署名を検証
-e ファイルの暗号化
-o 出力ファイルの指定
-r 公開鍵の所有者のメールアドレスを指定
鍵ペアの生成

gpgコマンドにおいて、鍵ペアを生成するには「--gen-key」オプションを指定します。

※試験的な注意点ですが、SSHで鍵を生成する場合にはssh-keygenコマンドです。

実行すると以下の表示がなされ入力を行っていきます。
以下では基本的にデフォルト設定を行っていますが、見栄え上あえて入力を行っています。

[wantan@server1 ~]$ gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

ご希望の鍵の種類を選択してください:
   (1) RSA と RSA (デフォルト)
   (2) DSA と Elgamal
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
あなたの選択は? 1
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048) 2048
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)0
(null)は無期限です
これで正しいですか? (y/N) y

GnuPGはあなたの鍵を識別するためにユーザIDを構成する必要があります。

本名: test
名前は5文字以上でなければなりません
本名: testuser
電子メール・アドレス: test@test.com
コメント: Test.
次のユーザIDを選択しました:
    "testuser (Test.) <test@test.com>"

名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? o

oを入力した後、以下のようなパスフーズの入力を求める画面に切り替わりパスフレーズを二回入力します。

f:id:wantanBlog:20210202000007p:plain

パスフレーズの入力後、鍵の生成が行われます。
以下、少し注意があります。

実行環境のスペックや条件によるものかもしれませんが、生成にかなり時間がかかりました
途中から時間を気にしなくなってしまいましたが1時間ぐらい経過してたかもしれません。

また、以下の文章は実際の表示がスペースやタブ(?)、改行でかなり乱れていたので、表示されたものをそのまま貼り付けた後、整形を行いました。

秘密鍵を保護するためにパスフレーズがいります。

たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動かす、ディスクにアクセスするなどの他の操作を素数生成の間に行 うことで、乱数生成器に十分なエントロピーを供給する機会を与えることができます。
たくさんのランダム・バイトの生成が必要です。キーボード を打つ、マウスを動かす、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生成器に十分なエントロピーを供給する機会 を与えることができます。

gpg: /home/wantan/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵B1DDBB87を絶対的に信用するよう記録しました
公開鍵と秘密鍵を作成し、署名しました。
gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg:  深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/B1DDBB87 2021-02-02
フィンガー・プリント = 40F3 CDAE 6C23 671F 99E4  5A9F AAC5 B8C0 B1DD BB87
uid                  testuser <test@test.com>
sub   2048R/FE12BD78 2021-02-02
[wantan@server1 ~]$ 
共通鍵による暗号化

公開鍵暗号方式だけかと思ったら、共通鍵もあるんですねって言う話。
問題集とか見てる感じだと、共通鍵よりも公開鍵の方が試験的な重要度は高そうです。

・共通鍵による暗号化

共通鍵による暗号化は「-c」オプションをつけ対象のファイルを指定することで実行されます。

[wantan@server1 ~]$ gpg -c test.txt

実行時に2回パスフレーズが求められ、暗号化済みファイルが生成されます。
元ファイルも残るようです。

[wantan@server1 ~]$ ll test.txt*
-rw-r--r--. 1 wantan group1 11981  22 22:56 test.txt
-rw-r--r--. 1 wantan group1  2547  22 23:01 test.txt.gpg

・共通鍵による復号化

復号化はオプションなしでファイルのみを指定することで実行できます。
復号化の場合にも、復号前(暗号化済み)ファイルは残るようです。

[wantan@server1 tttdir]$ gpg test.txt.gpg
gpg: CAST5暗号化済みデータ
gpg: 1 個のパスフレーズで暗号化
gpg: *警告*: メッセージの完全性は保護されていません
[wantan@server1 tttdir]$ ll
合計 16
-rw-r--r--. 1 wantan group1 11981  22 23:17 test.txt
-rw-r--r--. 1 wantan group1  2547  22 23:16 test.txt.gpg
[wantan@server1 tttdir]$
公開鍵暗号方式での暗号化

gpgコマンドでは当然ながら公開鍵暗号方式も扱うことできます。
今回は簡易的に実施するために同一サーバ内の異なるユーザで公開鍵方式によるファイルのやり取りを行ってみます。

以下のようなイメージで進めていきます。
①生成側で鍵ペアを生成し、受取側に公開鍵を配布する。
②受取側で生成した秘密鍵で、配布された公開鍵に署名する。
③署名済みの公開鍵で、ファイルを暗号化し、生成側にファイルを送付する。
④暗号化ファイルを、生成側の秘密鍵で復号化する。

f:id:wantanBlog:20210204004921p:plain

f:id:wantanBlog:20210204004935p:plain

公開鍵暗号方式の場合、公開鍵を相手に配布することになりますが、鍵の生成により作成された~/.gnupgディレクトリには、それらしいファイルが見当たりません。
なので、配布する公開鍵をエクスポートする必要があります。

・公開鍵のエクスポート

出力先のファイルを指定し、「--export」オプションでエクスポートを行います。

[wantan@server1 .gnupg]$ gpg -o testkey.pub --export

カレントディレクトリに生成されたことを確認します。

[wantan@server1 .gnupg]$ ll testkey.pub
-rw-r--r--. 1 wantan group1 1176  22 23:40 testkey.pub

方法は問わないので、公開鍵を通信先の相手のところに配布します。

・公開鍵のインポート
公開鍵を暗号化に使用するために通信先のユーザでgpgコマンドを使用して公開鍵のインポートを行います。

インポートは「--import」オプションを付与し、対象の公開鍵を指定することで実行します。

[receiveuser@server1 ~]$ gpg --import testkey.pub
gpg: ディレクトリ「/home/receiveuser/.gnupg」が作成されました
gpg: 新しいコンフィグレーション・ファイル「/home/receiveuser/.gnupg/gpg.conf」ができました
gpg: *警告*: 「/home/receiveuser/.gnupg/gpg.conf」のオプションはこの実行では、まだ有効になりません
gpg: 鍵リング「/home/receiveuser/.gnupg/secring.gpg」ができました
gpg: 鍵リング「/home/receiveuser/.gnupg/pubring.gpg」ができました
gpg: /home/receiveuser/.gnupg/trustdb.gpg: 信用データベースができました
gpg: 鍵B1DDBB87: 公開鍵"testuser <test@test.com>"をインポートしました
gpg:         処理数の合計: 1
gpg:           インポート: 1  (RSA: 1)
[receiveuser@server1 ~]$

・インポートした公開鍵一覧を表示する

公開鍵は複数インポートすることも考えられるので、公開鍵の一覧を表示することができます。

[receiveuser@server1 ~]$ gpg --list-key
/home/receiveuser/.gnupg/pubring.gpg
------------------------------------
pub   2048R/B1DDBB87 2021-02-02
uid                  testuser <test@test.com>
sub   2048R/FE12BD78 2021-02-02

[receiveuser@server1 ~]$

・公開鍵への署名
公開鍵の信頼性が判断できたら、公開鍵に署名を行います。
署名を行うことで公開鍵は次回以降、確認を行うことなく暗号化に使用することができます。

コマンドの注意点としては公開鍵の所有者側のユーザ名(鍵の生成者名)を入力すること。
ちなみに署名には、秘密鍵を使用するので、公開鍵の受け取り側のユーザ(ここで言うreceiveuser)でもgpgによる鍵の生成を行っておく必要があります。

[receiveuser@server1 ~]$ gpg --sign-key testuser

pub  2048R/B1DDBB87  作成: 2021-02-02  有効期限: 無期限      利用法: SC
                     信用: 不明の     有効性: 不明の
sub  2048R/FE12BD78  作成: 2021-02-02  有効期限: 無期限      利用法: E
[  不明  ] (1). testuser <test@test.com>


pub  2048R/B1DDBB87  作成: 2021-02-02  有効期限: 無期限      利用法: SC
                     信用: 不明の     有効性: 不明の
主鍵フィンガー・プリント: 40F3 CDAE 6C23 671F 99E4  5A9F AAC5 B8C0 B1DD BB87

     testuser <test@test.com>

本当にこの鍵にあなたの鍵"receiveuser <receiveuser@test.com>"で署名してよいですか
(FC961EEC)

本当に署名しますか? (y/N) y

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"receiveuser <receiveuser@test.com>"
2048ビットRSA鍵, ID FC961EEC作成日付は2021-02-02


[receiveuser@server1 ~]$

・公開鍵による暗号化
「-e」オプションで暗号化を行います。その際に鍵の生成元ユーザ(鍵生成の際に入力したユーザ名)を入力する必要があります。
「-r」オプションで指定するユーザ名は暗号に使用する公開鍵の生成者です。

[receiveuser@server1 ~]$ gpg -e -r testuser testfile.txt
gpg: 信用データベースの検査
gpg: 「ギリギリの信用」3、「全面的信用」1、PGP信用モデル
gpg: 深さ: 0  有効性:   1  署名:   1  信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 深さ: 1  有効性:   1  署名:   0  信用: 1-, 0q, 0n, 0m, 0f, 0u

ここでもやはり、暗号化済みと暗号化前のファイルもそのまま残ることになります。

[receiveuser@server1 ~]$ ll testfile.txt*
-rw-rw-r--. 1 receiveuser receiveuser 11998  23 23:59 testfile.txt
-rw-rw-r--. 1 receiveuser receiveuser  2865  24 00:00 testfile.txt.gpg

・秘密鍵による復号化

暗号化したファイルを公開鍵の生成元ユーザに渡して、復号化を行ってみます。
復号化を行う際には、オプションなしで暗号化されたファイル名のみを指定します。

この際に秘密鍵のパスフーズ入力が求められるので、入力を行います。

[wantan@server1 ~]$ gpg testfile.txt.gpg

次のユーザの秘密鍵のロックを解除するには
パスフレーズがいります:"testuser <test@test.com>"
2048ビットRSA鍵, ID FE12BD78作成日付は2021-02-02 (主鍵ID B1DDBB87)

gpg: 2048-ビットRSA鍵, ID FE12BD78, 日付2021-02-02に暗号化されました
      "testuser <test@test.com>"
[wantan@server1 ~]$

ここでもやはり、暗号化済みと復号化後の2種のファイルが存在するので、復号したファイルの中身を確認できたらOKです。
これでgpgコマンドを使用したファイルの暗号化通信が実現できました。


これにてLPICレベル1の範囲は終了しました。
一部記事化していない分野もありますが、まぁ今更やるほどでもないかな。

受験日程はもう決まっているので、この記事を上げる頃には受験が終わり合格していることでしょう。
では、最後まで気を抜かずにいきます。

・前回(第十七回)
www.wantanblog.com