プレーンテキストデータの危険性
インターネット経由で機密データを送信することは、はがきを郵送するようなものです。ISPからパブリックWi-Fiを傍受しているハッカーまで、そのカードを扱う人なら誰でもメッセージを読むことができます。StripeのAPIキーが含まれたデータベースのバックアップや.envファイルが、プレーンテキストでウェブ上を移動しているところを想像してみてください。悪意のある攻撃者がそのトラフィックを傍受すれば、インフラ全体が丸見えになってしまいます。
ある夜、ロシアの単一IPから数千回ものSSHブルートフォース攻撃がサーバーログに記録されているのを見て、私はトランスポート層のセキュリティを当たり前のものと考えるのをやめました。境界防御だけでは不十分なことが多いのです。トランスポート層は常に侵害されている可能性があると想定しなければなりません。GnuPG(GPG)は、データ自体を保護することでこの問題を解決します。たとえファイルが悪意のある者の手に渡ったとしても、特定の鍵がなければ、それはただの無意味な暗号化されたビットの塊に過ぎません。
コアコンセプト:GPGの仕組み
GnuPGはOpenPGP標準に準拠しており、非対称暗号(公開鍵暗号)を利用しています。このシステムは、数学的にリンクされた一対の鍵、つまり「公開鍵」と「秘密鍵」を使用します。
- 公開鍵: これは開いた南京錠のようなものだと考えてください。誰にでも渡すことができます。同僚があなたに安全なファイルを送りたい場合、この「錠」を使ってデータを保護します。
- 秘密鍵: これはあなたの物理的な鍵です。秘密にしてください。公開鍵でロックされたデータを開くことができるのは、この鍵だけです。
GPGは電子署名も扱います。これは内容を隠すものではありませんが、ファイルが改ざんされていないことを証明します。封筒の封蝋(シーリングワックス)のようなもので、送信者の身元を保証します。
GPG環境のセットアップ
ほとんどのLinuxディストリビューションでは、GPGがすぐに使えるようになっています。バージョンを確認することで、準備ができているか確認できます:
gpg --version
システムが「command not found」エラーを返した場合は、パッケージマネージャー経由でインストールしてください。Ubuntu、Debian、またはPop!_OSの場合は、以下を実行します:
sudo apt update && sudo apt install gnupg -y
鍵ペアの生成
--full-generate-keyフラグを使用することをお勧めします。デフォルトの生成ツールの方が高速ですが、「フル」バージョンではアルゴリズムや鍵の強度を細かく制御できます。
gpg --full-generate-key
プロンプトが表示されたら、次の手順に従います:
- アルゴリズム:
(1) RSA and RSA (default)を選択します。よりモダンで短く、パフォーマンスに優れた鍵を好む場合は、(9) ECCが優れた代替案となります。 - 鍵のサイズ:
4096ビットを選択します。2048ビットの鍵もまだ一般的ですが、4096ビットのRSAは、ブルートフォース攻撃の進化に対してかなり大きな安全マージンを提供します。 - 有効期限:
2y(2年)のように有効期限を設定します。本番用の鍵では「無期限」オプションは避けてください。無期限の鍵へのアクセス権を失うと、その鍵は「ゴーストアイデンティティ」として鍵サーバーに永遠に残ってしまいます。 - ユーザー情報: 本名と仕事用のメールアドレスを使用してください。これにより、同僚が正しい鍵を見つけやすくなります。
- パスフレーズ: これは最後の防衛線です。単純なパスワードではなく、20文字以上の長いパスフレーズを使用してください。
鍵の管理
生成プロセスが完了したら、簡単なコマンドで新しいアイデンティティを確認できます:
gpg --list-keys
公開鍵のエクスポート
暗号化されたファイルを受け取るには、公開鍵を共有する必要があります。メールに貼り付けたりサーバーにアップロードしたりしやすいように、テキストファイル(ASCII-armored形式)としてエクスポートします:
gpg --armor --export "自分の名前" > mypublickey.asc
同僚の鍵のインポート
チームメイトから鍵が送られてきたら、安全に何かを送信する前に、その鍵をローカルのキーリングに追加する必要があります:
gpg --import colleague_public_key.asc
インポート後は必ずフィンガープリントを確認してください。同僚に電話するか、Signalのような安全なチャネルでメッセージを送り、文字列が一致することを確認します。これにより、中間者攻撃を防ぐことができます。
gpg --fingerprint "同僚の名前"
実践:暗号化と復号
confidential_report.pdfという名前のファイルがあるとします。これを、他の誰にも内容を見られずに、アリスという名前のチームメイトに届ける必要があります。
ファイルの暗号化
--encryptフラグを使用し、受信者を指定します。GPGはキーリングからアリスの公開鍵を探します。
gpg --encrypt --recipient "Alice" confidential_report.pdf
これにより confidential_report.pdf.gpg が生成されます。これで、盗み見を心配することなく、SlackやGoogleドライブ、メールにアップロードできます。
ファイルの復号
アリスがファイルを受け取ったら、簡単な復号コマンドを実行します。GPGはどの秘密鍵が必要かを自動的に判別します:
gpg --decrypt confidential_report.pdf.gpg > confidential_report.pdf
ファイルがロック解除される前に、彼女のパスフレーズの入力が求められます。
共通鍵暗号(手軽な方法)
自分用にローカルバックアップをパスワード保護したいだけなら、公開鍵/秘密鍵のペアは必要ありません。代わりに共通鍵暗号を使用します:
gpg --symmetric backup.tar.gz
これはデフォルトでAES256アルゴリズムを使用します。プロンプトで入力したパスワードだけが、生成された .gpg ファイルを解除できます。
電子署名による整合性の確保
暗号化はデータを隠しますが、署名はデータが改ざんされていないことを証明します。私はチームに配布する前に、必ずBashスクリプトに署名します。これにより、転送中にスクリプトに悪意のあるコードが注入されていないことを保証できます。
分離署名の作成
分離署名は、元のファイルとは別に小さな .sig ファイルを作成します。この方法では、ソースファイル自体を変更する必要はありません。
gpg --detach-sign script.sh
署名の検証
script.sh が本物かどうかを確認するには、以下を実行します:
gpg --verify script.sh.sig script.sh
出力に「Good signature」と表示されれば、ファイルはあなたが作成した通りの状態です。
経験から学んだベストプラクティス
たった一つのファイルを紛失したために、何年分ものデータを失ったユーザーを見てきました。そうならないために、データの安全性とアクセス性を保つための3つのルールに従ってください。
1. 今すぐ失効証明書を作成する
もしノートパソコンが盗まれたら、自分の鍵が侵害されたことを世界に知らせる必要があります。失効証明書がなければ、それは不可能です。鍵ペアを作成した直後に生成してください。
gpg --output revoke.asc --gen-revoke "自分の名前"
このファイルを印刷するか、物理的な金庫に保管されている専用の暗号化済みUSBドライブに保存してください。
2. 秘密鍵をバックアップする
GPGには「パスワードを忘れた場合」のリンクはありません。SSDが故障し、秘密鍵のバックアップがない場合、暗号化されたデータは永遠に失われます。安全にエクスポートしておきましょう:
gpg --armor --export-secret-keys "自分の名前" > private_key_backup.asc
3. 日常業務にはサブキーを使用する
上級ユーザーは、マスターキーをオフラインで保管すべきです。日常の署名や暗号化には「サブキー」を作成して使用します。ノートパソコンが盗まれた場合、サブキーだけを失効させれば、メインのアイデンティティは維持できます。設定には少し手間がかかりますが、セキュリティ侵害時の数時間の頭痛の種を減らすことができます。
日々のワークフローのセキュリティ強化
GPGをルーチンに組み込むのは最初は面倒に感じるかもしれませんが、すぐに慣れます。サーバーバックアップの固定でも、Gitコミットへの署名でも、GPGはパスワードだけでは太刀打ちできないレベルの確実性を提供します。今日、鍵ペアを生成し、いくつかのテストファイルを暗号化することから始めてみてください。絶え間ないデータ漏洩の時代において、プライベートなデータをプライベートに保つための最も効果的な方法です。
