現在位置: ホーム / みらくるブログ / Linux OS のセキュリティ-3

Linux OS のセキュリティ-3

通信経路が暗号化されていない場合に、GnuPG を活用することによりファイルを暗号化して、安全にデータを送受信します。

セキュリティの話題のコーナーですね。おひさしぶりです。ニックネーム たいちょう です。

netcat というファイルの送受信もできる便利なコマンドがあるのですが、最近使ってみました。

ファイルを受信する側で、ファイルにリダイレクトさせるように待ち受けておきます。

$ nc -l [ポート番号] > [受信ファイル]

送信するマシンで、以下のように実行するとファイルが送受信できます。

$ nc [相手ホスト] [ポート番号] < [送信ファイル]

経路は暗号化されませんが、閉じたネットワークでは面倒な認証も必要ないので便利です。

では、これをインターネット上で使うことはできないでしょうか。

問題は、通信経路が暗号化されないことです。ファイル自体を暗号化して、netcat  を送受信プログラムとする方法はあるのではないでしょうか。

そこで、第1日目にやってみた GnuPGを活用します。

相手の公開鍵でファイルを暗号化します。そうすると、これを復号化できるのは、相手だけになるというわけです。

以下が必要となるものです。

- 送信側
自分の秘密鍵-公開鍵のペア
相手の公開鍵

- 受信側

自分の秘密鍵-公開鍵のペア

相手の公開鍵を、取得します。
ここでは、ファイルとして受け取ったとして、そのファイル名は、sombody.key (名前は任意です) だとします。
この相手の公開鍵を、以下のコマンドでインポートします。

$ gpg --import somebody.key

自分の鍵のリストをを以下のコマンドで表示します。

$ gpg --list-keys
pub   4096R/08B824E0 2016-02-28
uid                  Taichou Miracle <taichou.miracle@xxx>
sub   4096R/517BCA22 2016-02-28

pub   4096R/F4A80EB5 2014-06-23
uid                  CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>

pub   2048R/436438A0 2016-06-18
uid                  Sombody <somebody@yyy>
sub   2048R/68050FE6 2016-06-18

一番上が、前回作成した自分の公開鍵、次が前回取得したCentOS-7 の公開鍵です。
一番下の鍵が、今回の相手の公開鍵ですね。

ここで、68050FE6 という数字に注目します。
では、この相手の公開鍵を、自分の秘密鍵でサインします。

$ gpg --sign-key 68850FE6

これで準備は整いました。
では、あるファイルを相手の公開カギで暗号化します。
これを復号化できるのは、その秘密鍵をもっている相手のみのはずです(秘密鍵が漏れていなければ)。
以下のコマンドを実行して、暗号化ファイルを作成します。
ファイルは、以下の内容、以下のファイル名にします。

$ vim secret.txt
This is a secret.

では、この、secret.txt を相手の公開鍵で暗号化します。

$ gpg --output secret.gpg --encrypt --recipient somebody@yyy secret.txt

ここでできたのが、secret.txt を暗号化したファイル、secret.gpg になります。
ファイル名や拡張子は任意です。

試しに、cat してみます。

$ cat secret.gpg

ぐちゃぐちゃな文字になってました。

では、このファイルを相手に送信します。

ファイル送信----->相手がファイル受領

ファイルを受信する相手側で、ファイルにリダイレクトさせるように待ち受けておきます。
受信が完了すると、リターンします。ポート番号は、普段使わない番号を /etc/services で確認してから使いました。

$ nc -l 13580 > secret.gpg

送信するマシンで、以下のようにを実行します。

$ nc [相手の IPアドレス] 13580 < secret.gpg

拒否されてしまいました。

どうやら送受信に失敗したようです。
受信側のファイアウォールの設定でしょうか。
受信側の端末で、firewalld のコマンドを投入します。以下は一例です。

# firewall-cmd --get-default-zone
public
# firewall-cmd --zone=public --add-port=13580/tcp
success
# firewall-cmd --zone=public --list-port
13580/tcp

上記設定は、再起動後に消えます。残す場合は、--permanent を追加します。

もう一度送受信してみます。
今度は送受信に成功しました。

さて、受け取った相手は、このsecret.gpg を、復号化して、もとのファイルの内容を見たいです。
相手は、以下のコマンドを実行します。ファイル名は任意の名前にできます。

$ gpg --output doc.txt --decrypt secret.gpg
$ ls doc.txt

確かに、doc.txt が生成されていますが、中身はどうでしょうか。

$ cat doc.txt
This is a secret.

おお、ちゃんと復号化されてます。

この方式で、面倒なのは、公開鍵をいつ送信しておくかです。
このような課題を解決するために、公開鍵サーバが存在しています。代表的なサーバを紹介します。

https://pgp.mit.edu/

そこに登録しておくことで、だれでも公開鍵を入手できるので便利です。
たいちょう もこのサーバに公開鍵を登録しています。

全世界に公開鍵を文字どおり公開しているわけです。

暗号化する時は、その相手の公開鍵を自分のマシンにインポートして署名しておけば、
すぐに暗号化できます。あとは、今回のように netcat プログラムを使ったり、メールの添付ファイルなどにして送受信することで安全を確保できます。

(参考)
http://nc110.sourceforge.net/
https://www.gnupg.org/gph/en/manual/x110.html

Linux で色々実験したりするのは楽しいですね。
今回はこの辺で。ニックネーム たいちょうでした。次回をお楽しみに。

 

松江ラボ エンジニア募集中

詳細へ暮らしやすさ日本一の水の都、そしてオープンソースの都、
松江で一緒に働くエンジニアを募集しています。
タグ: