本記事には広告(アフィリエイトリンク)が含まれます。

SSH鍵 GnuPG OpenSSL LinuC102 第10回

広告

LinuC レベル1 102試験対策シリーズの第10回です。前回はファイアウォールと SELinux で「アクセスを制限する」層を学びました。今回は 「データそのものを守る」 層 ── 暗号化です。共通鍵暗号と公開鍵暗号の違いから始め、SSH 鍵認証ssh-keygen)、GnuPGgpg)でのファイル暗号化・署名、OpenSSLopenssl)でのハッシュ・証明書操作を実機で読み解きます。盗聴・改ざん・なりすましからデータを守る、現場必須の技術です。

環境前提

  • ディストロ:AlmaLinux 9.6(Minimal Install)
  • ユーザー:developer(sudo NOPASSWD)
  • 検証環境:Hyper-V on Windows 11
  • 関連VM:linuc-alma(10.0.10.132、操作元)、linuc-ubuntu(10.0.10.133、SSH 接続先)
  • 導入済み:OpenSSH(既定)、gnupg2(gpg 2.3.3)、openssl(3.5.1)。追加 dnf 不要
  • 演習で作る鍵・証明書は専用ファイル名(linuc_test_*/tmp 配下)にし、既存の developer の SSH 鍵には触れない。演習末でクリーンアップする
広告

今ここマップ

LinuC 102 試験対策シリーズ(全12回)

  第1回 シェル環境のカスタマイズ
  第2回 Bashスクリプト入門
  第3回 ネットワーク基礎
  第4回 ネットワークトラブルシューティングとDNS
  第5回 ユーザ・グループ管理と sudo 設定
  第6回 ジョブスケジューリングと時刻管理
  第7回 ログ管理実践
  第8回 メール配送エージェント(MTA)の基本
  第9回 ファイアウォールと SELinux 入門
▶ 第10回 暗号化によるデータ保護    ← いまここ
  第11回 クラウドセキュリティの基礎
  第12回 オープンソースの文化

この記事で身につくこと

  1. 共通鍵暗号と公開鍵暗号の違いを説明できる
  2. ssh-keygen で鍵ペアを生成し、ssh-copy-id で公開鍵を配布できる
  3. ~/.ssh/ のパーミッション要件を理解している
  4. gpg でファイルの暗号化・復号ができる
  5. openssl でハッシュ計算・自己署名証明書の作成・証明書表示ができる

第1章:なぜ暗号化が必要なのか

1.1 平文通信の危険

かつてサーバへのリモートログインには telnet、ファイル転送には ftp が使われていました。今これらがほぼ使われないのは、通信内容が平文(暗号化されていない)だからです。経路の途中でパケットを覗かれれば、パスワードもファイル内容もそのまま読まれてしまいます。

暗号技術は、次の3つを守るために使われます。

  • 機密性:盗聴されても内容が読めない(暗号化)
  • 完全性:改ざんされたら気づける(ハッシュ・署名)
  • 認証:通信相手が本物だと確認できる(署名・証明書)

誰のためかというと ── 開発者のため(コードや認証情報を守る)、運用者のため(サーバ間通信を安全にする)、そして利用者のため(個人情報の漏洩を防ぐ)。暗号化は「特別なことをするとき」ではなく、通信とデータ保管の標準装備です。

第2章:共通鍵暗号と公開鍵暗号

2.1 共通鍵暗号 ── 同じ鍵で暗号化・復号

共通鍵暗号(対称鍵暗号)は、暗号化と復号に 同じ鍵を使います。代表は AES。処理が高速で、大量のデータの暗号化に向きます。

弱点は 鍵配送問題です。暗号文を送る相手に「鍵」を渡さなければ復号できませんが、その鍵を安全に渡す手段がそもそも問題になります。鍵を平文で送れば、盗聴者にも鍵が渡ってしまいます。

2.2 公開鍵暗号 ── 2つで1組の鍵

公開鍵暗号(非対称鍵暗号)は、公開鍵秘密鍵のペアを使います。代表は RSA、楕円曲線暗号(ECC)。

  • 公開鍵で暗号化したものは、対応する秘密鍵でしか復号できない
  • 公開鍵は名前のとおり 誰に渡してもよい。秘密鍵だけ厳重に守る

これで鍵配送問題が解決します。受信者が公開鍵をばらまき、送信者はその公開鍵で暗号化する。復号できるのは秘密鍵を持つ受信者だけ。弱点は 処理が遅いことです。

2.3 ハイブリッド方式 ── 両者のいいとこ取り

実際の SSH / TLS(HTTPS)/ GPG は、両方を組み合わせた ハイブリッド方式です。

  • 実データは 共通鍵暗号で暗号化(速い)
  • その共通鍵(セッション鍵)を 公開鍵暗号で相手に渡す(安全)

「速さ」と「安全な鍵配送」を両立する、よくできた仕組みです。

共通鍵暗号と公開鍵暗号を比較し、両者を組み合わせたハイブリッド方式を示した図。上段左は共通鍵暗号で、暗号化と復号に同じ鍵1本を使い速いが鍵配送問題がある。上段右は公開鍵暗号で、公開鍵で暗号化し秘密鍵で復号する2本ペアの方式で、遅いが鍵配送問題を解決する。下段はハイブリッド方式で、実データを共通鍵で暗号化し、その共通鍵を公開鍵で安全に相手へ渡す。SSH / TLS / GPG はすべてこの方式を採る。
図 10-01. 共通鍵暗号と公開鍵暗号、そしてハイブリッド方式

2.4 デジタル署名 ── 鍵の使い方を逆にする

公開鍵暗号は、鍵の使い方を逆にすると デジタル署名になります。

  • 暗号化:公開鍵で暗号化 → 秘密鍵で復号(機密性)
  • 署名秘密鍵で署名公開鍵で検証(完全性+認証)

「秘密鍵を持つ本人にしか作れない署名」を、誰でも公開鍵で検証できる。これで「本物が作った」「改ざんされていない」が確認できます。

公開鍵暗号の2つの使い方を上下で対比した図。上段は暗号化で、平文データを公開鍵で暗号化し、暗号文を秘密鍵で復号して機密性を守る。下段はデジタル署名で、データを秘密鍵で署名し、公開鍵で検証することで本物であることと改ざんがないことを証明する。暗号化は公開鍵から秘密鍵の順、署名は秘密鍵から公開鍵の順で、使う鍵の向きがちょうど逆になる。署名は秘密鍵を持つ本人にしか作れない。
図 10-02. 暗号化と署名 ── 鍵の使い方は逆向き

📖 試験Tipsボックス1:共通鍵と公開鍵

主題:1.10.3(重要度:高)
出題パターン:「共通鍵暗号と公開鍵暗号の違いは?」「鍵配送問題とは?」「デジタル署名はどちらの鍵で行う?」

暗記ポイント

  • 共通鍵暗号=暗号化と復号に同じ鍵、速い、鍵配送問題あり(AES 等)
  • 公開鍵暗号=公開鍵で暗号化・秘密鍵で復号、遅い、鍵配送問題を解決(RSA / ECC 等)
  • 実用はハイブリッド(データは共通鍵、その鍵を公開鍵で配送)── SSH / TLS / GPG すべてこれ
  • デジタル署名は 秘密鍵で署名・公開鍵で検証(暗号化と逆向き)

第3章:SSH 鍵認証

3.1 パスワード認証より鍵認証

SSH には2つの認証方式があります。

  • パスワード認証:パスワードを入力。総当たり攻撃(ブルートフォース)に弱い。第7回で見た /var/log/secure の「Failed password」は、この攻撃の記録
  • 公開鍵認証:秘密鍵を持っていることで認証。秘密鍵はネットワークを流れないため、盗聴・総当たりに強い

本番サーバでは 鍵認証だけを許可し、パスワード認証を無効化sshd_configPasswordAuthentication no)するのが標準です。

3.2 ssh-keygen で鍵ペアを生成する

鍵ペアの生成は ssh-keygen です。鍵の種別は、現在は ed25519(楕円曲線、短くて安全で高速)が推奨です。RSA を使う場合は 4096bit 以上にします。

実行コマンド(linuc-alma、検証用に専用ファイル名で生成):

$ ssh-keygen -t ed25519 -C "linuc-test" -f ~/.ssh/linuc_test_ed25519 -N ""

実行結果:

Generating public/private ed25519 key pair.
Your identification has been saved in /home/developer/.ssh/linuc_test_ed25519
Your public key has been saved in /home/developer/.ssh/linuc_test_ed25519.pub
The key fingerprint is:
SHA256:qB4AP2dUQCEuP6l5/6X5jQ3fnpDOK7dpZI19eVgWUIg linuc-test
The key's randomart image is:
+--[ED25519 256]--+
(randomart の図は省略)
+----[SHA256]-----+
オプション意味
-t ed25519鍵種別(ed25519 / rsa / ecdsa)
-C "コメント"コメント(どの鍵か識別しやすくする)
-f パス出力ファイル名(既定は ~/.ssh/id_ed25519
-N "パスフレーズ"秘密鍵のパスフレーズ("" で無し。本番では設定推奨)
-b ビット数鍵長(RSA で 4096 等)

3.3 生成物 ── 秘密鍵と公開鍵

実行コマンド(linuc-alma):

$ ls -la ~/.ssh/linuc_test_ed25519 ~/.ssh/linuc_test_ed25519.pub
$ cat ~/.ssh/linuc_test_ed25519.pub

実行結果:

-rw-------. 1 developer developer 399  5月 16 17:37 /home/developer/.ssh/linuc_test_ed25519
-rw-r--r--. 1 developer developer  92  5月 16 17:37 /home/developer/.ssh/linuc_test_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHbRtTX2FEcZ4t1Rqq9W6XaCWWiJhfM9eWSa4O35XxT8 linuc-test
  • 秘密鍵linuc_test_ed25519、拡張子なし):パーミッション 0600絶対に外部に出さない
  • 公開鍵linuc_test_ed25519.pub.pub 付き):パーミッション 0644。配ってよい。中身は 鍵種別 base64鍵 コメント の1行

3.4 ssh-copy-id で公開鍵を配る

鍵認証でログインするには、接続先サーバの ~/.ssh/authorized_keys に自分の公開鍵を登録します。これを自動でやるのが ssh-copy-id です。

$ ssh-copy-id -i ~/.ssh/linuc_test_ed25519.pub developer@10.0.10.133

ssh-copy-id は、初回はパスワード認証で接続し、指定した公開鍵を接続先の authorized_keys に追記します。以降はその鍵で鍵認証ログインができます。手動でやるなら「公開鍵の1行を接続先の ~/.ssh/authorized_keys に追記する」のと同じです。

3.5 パーミッション要件 ── 緩いと認証されない

SSH 鍵認証は パーミッションに厳格です。緩すぎると sshd が「安全でない」と判断し、鍵認証を拒否します。

対象必要なパーミッション
~/.ssh ディレクトリ700(本人のみ)
秘密鍵(id_ed25519 等)600(本人のみ読み書き)
~/.ssh/authorized_keys600
公開鍵(*.pub644(配ってよい)

実行コマンド(linuc-alma):

$ ls -ld ~/.ssh
$ ls -la ~/.ssh/authorized_keys

実行結果:

drwx------. 2 developer developer 104  5月 16 17:37 /home/developer/.ssh
-rw-------. 1 developer developer 100  5月  9 19:16 /home/developer/.ssh/authorized_keys

ssh-keygenssh-copy-id は最初から正しいパーミッションで作ります。「鍵認証が効かない」トラブルの定番が、手作業でファイルをコピーしたときの パーミッションの緩みです。

📖 試験Tipsボックス2:ssh-keygen と鍵認証

主題:1.10.3(重要度:高)
出題パターン:「鍵を生成するコマンドは?」「推奨される鍵種別は?」「公開鍵を配布するコマンドは?」「~/.ssh のパーミッションは?」

暗記ポイント

  • 鍵生成 ssh-keygen -t ed25519(ed25519 推奨、RSA なら 4096bit)
  • 生成物は秘密鍵(拡張子なし)と公開鍵(.pub
  • 配布は ssh-copy-id user@host(接続先の ~/.ssh/authorized_keys に追記)
  • パーミッション:~/.ssh=700、秘密鍵=600、authorized_keys=600、公開鍵=644
  • 緩いと sshd が鍵認証を拒否
  • 秘密鍵はネットワークを流れない=盗聴に強い

第4章:ssh-agent でパスフレーズを管理する

秘密鍵には パスフレーズを設定すべきです。万一秘密鍵ファイルが盗まれても、パスフレーズが分からなければ即座には悪用されません(二要素的な守り)。

ただし、SSH 接続のたびにパスフレーズを打つのは手間です。そこで ssh-agent が、一度入力したパスフレーズ(実際には復号した鍵)をメモリに保持し、以降の接続で自動的に使えるようにします。

$ eval $(ssh-agent)          # エージェントを起動
$ ssh-add ~/.ssh/id_ed25519  # 鍵を登録(パスフレーズはここで1回だけ入力)
$ ssh-add -l                 # 登録済みの鍵を一覧

多くのデスクトップ環境では、ログイン時に ssh-agent が自動起動します。ssh-add -A 相当の エージェント転送ssh -A)を使うと、踏み台サーバ経由で奥のサーバへ接続するときも手元の鍵を使えますが、踏み台が信頼できない場合はリスクになるため、必要なときだけ使います(踏み台構成は次回第11回で詳しく扱います)。

第5章:GnuPG(gpg)

5.1 GnuPG とは

GnuPG(GNU Privacy Guard、コマンドは gpg)は、OpenPGP 標準の実装です。ファイルの暗号化・復号・署名・検証に使います。SSH が「通信」を守るのに対し、gpg は主に「ファイル・データ」を守ります。

実行コマンド(linuc-alma):

$ gpg --version | head -2

実行結果:

gpg (GnuPG) 2.3.3
libgcrypt 1.10.0-unknown

5.2 対称暗号 ── パスフレーズだけで暗号化

もっとも手軽なのが -c--symmetric)の 対称暗号です。鍵ペアを作らず、パスフレーズだけでファイルを暗号化できます。「このファイルを自分用に暗号化して保管したい」「パスワードを知っている相手に渡したい」という用途に向きます。

実行コマンド(linuc-alma):

$ echo "secret data for LinuC" > /tmp/secret.txt
$ gpg -c --batch --passphrase "testpass" /tmp/secret.txt
$ ls /tmp/secret.txt.gpg

実行結果:

/tmp/secret.txt.gpg

暗号化された secret.txt.gpg が作られます(元の secret.txt は残ります)。なお、gpg を初めて使うときは ~/.gnupg ディレクトリが自動作成される旨のメッセージが出ます。--batch --passphrase は対話プロンプトを省く指定で、本来は対話的にパスフレーズを入力します。

復号は -d--decrypt)です。

実行コマンド(linuc-alma):

$ gpg -d --batch --passphrase "testpass" /tmp/secret.txt.gpg

実行結果(標準出力に復号内容、標準エラーに暗号方式の情報):

secret data for LinuC
gpg: AES256.CFB暗号化済みデータ
gpg: 1 個のパスフレーズで暗号化

暗号アルゴリズムは AES256 が使われています。

5.3 公開鍵暗号と署名

gpg の本領は公開鍵暗号です。鍵ペアを作り、相手の公開鍵で暗号化したり、自分の秘密鍵で署名したりします。主な操作をまとめます。

用途コマンド
鍵ペア生成gpg --full-generate-key
公開鍵の一覧gpg --list-keys
秘密鍵の一覧gpg --list-secret-keys
公開鍵で暗号化gpg -e -r 受信者 file
復号gpg -d file.gpg
署名(文書に埋め込み)gpg --sign file
分離署名(別ファイル)gpg --detach-sign file
署名の検証gpg --verify file.sig file
対称暗号gpg -c file

OSS の配布ファイルに付いている .sig.asc ファイルは gpg の署名で、gpg --verify で「配布元が本物か」「ダウンロード中に改ざんされていないか」を検証できます。

📖 試験Tipsボックス3:gpg の主要操作

主題:1.10.3(重要度:高)
出題パターン:「ファイルを暗号化するには?」「復号は?」「対称暗号のオプションは?」「署名の検証は?」

暗記ポイント

  • GnuPG は OpenPGP 実装(コマンドは gpg
  • 鍵生成 gpg --full-generate-key
  • 一覧 --list-keys / --list-secret-keys
  • 公開鍵暗号化 gpg -e -r 受信者 file、復号 gpg -d
  • 署名 --sign、分離署名 --detach-sign、検証 --verify
  • 対称(パスフレーズ)暗号は gpg -c
  • 設定は ~/.gnupg

第6章:OpenSSL

6.1 openssl は暗号ツールキット

OpenSSL は、ハッシュ計算・共通鍵暗号・公開鍵・証明書操作までを1つでこなす暗号ツールキットです。HTTPS(TLS)のライブラリとしても広く使われています。

実行コマンド(linuc-alma):

$ openssl version

実行結果:

OpenSSL 3.5.1 1 Jul 2025 (Library: OpenSSL 3.5.1 1 Jul 2025)

6.2 ハッシュ計算

ハッシュは「データから固定長の要約値を作る一方向の計算」です。同じ入力からは必ず同じハッシュが出るため、ファイルが改ざんされていないかの確認に使います。

実行コマンド(linuc-alma):

$ echo "linuc" > /tmp/h.txt
$ openssl dgst -sha256 /tmp/h.txt
$ sha256sum /tmp/h.txt

実行結果:

SHA2-256(/tmp/h.txt)= 864794e06b6beb7f21f34fcc7f2a5a5ae013bab0fd1fee1299c5262daaf7f89c
864794e06b6beb7f21f34fcc7f2a5a5ae013bab0fd1fee1299c5262daaf7f89c  /tmp/h.txt

openssl dgst -sha256sha256sum同じ SHA-256 アルゴリズムなので、ハッシュ値は完全に一致します(表示形式だけ違う)。ダウンロードしたファイルのハッシュを配布元の値と照合すれば、改ざんを検出できます。

6.3 乱数生成

パスワードやトークンの生成に使える乱数も openssl で作れます。

実行コマンド(linuc-alma):

$ openssl rand -base64 32

実行結果(例、毎回変わる):

z0nFFr224bWHA7RjWZyOoNKv8KyJuENbFX0/GdnpldY=

6.4 自己署名証明書を作る

HTTPS で使う証明書も openssl で作れます。検証環境や社内向けには 自己署名証明書(自分で自分を証明する証明書)を使うことがあります。

実行コマンド(linuc-alma):

$ openssl req -x509 -newkey rsa:2048 -keyout /tmp/key.pem -out /tmp/cert.pem -days 365 -nodes -subj "/CN=linuc-test"
$ ls /tmp/key.pem /tmp/cert.pem

実行結果(鍵生成中は進捗ドットが表示される):

/tmp/cert.pem
/tmp/key.pem
オプション意味
req -x509証明書署名要求ではなく、自己署名証明書を直接生成
-newkey rsa:2048新しい RSA 2048bit 鍵を同時に生成
-keyout / -out秘密鍵 / 証明書の出力先
-days 365有効期限(日数)
-nodes秘密鍵にパスフレーズを付けない
-subj "/CN=..."対話入力を省略し主体名を指定

6.5 証明書の中身を読む

実行コマンド(linuc-alma):

$ openssl x509 -text -noout -in /tmp/cert.pem | head -13

実行結果(抜粋):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            49:dd:5f:55:10:4f:7a:62:5f:90:ac:00:7e:31:0c:7b:29:8c:bd:6f
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN=linuc-test
        Validity
            Not Before: May 16 08:37:34 2026 GMT
            Not After : May 16 08:37:34 2027 GMT
        Subject: CN=linuc-test
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption

x509 -text -noout で証明書を人間可読で表示します。Issuer(発行者)と Subject(対象)が同じ=自分で自分を証明している=自己署名証明書、と読み取れます。CA が発行した証明書なら Issuer は CA の名前になります。接続先サーバの証明書を確認するなら openssl s_client -connect ホスト:443 も使えます。

📖 試験Tipsボックス4:openssl の主要操作

主題:1.10.3(重要度:高)
出題パターン:「SHA-256 ハッシュを計算するには?」「自己署名証明書の作成は?」「証明書の内容を表示するには?」

暗記ポイント

  • ハッシュ openssl dgst -sha256 file
  • 乱数 openssl rand -base64 N
  • 共通鍵暗号 openssl enc -aes-256-cbc
  • 自己署名証明書 openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days N -nodes
  • 証明書表示 openssl x509 -text -noout -in cert.pem
  • 接続先証明書確認 openssl s_client -connect host:443
  • Issuer=Subject なら自己署名

第7章:公開鍵基盤(PKI)と証明書の信頼

7.1 「この公開鍵は本物か」問題

公開鍵暗号には、もう1つ課題があります。「受け取った公開鍵が、本当に意図した相手のものか」を、どう保証するのか。攻撃者が偽の公開鍵をすり替えれば、なりすましが成立してしまいます。

これを解決するのが PKI(公開鍵基盤)証明書です。証明書は「この公開鍵は、確かにこのドメイン/組織のものだ」と、信頼できる第三者が保証した文書です。

7.2 認証局(CA)と信頼の連鎖

その「信頼できる第三者」が 認証局(CA:Certificate Authority)です。

  • ルート CA:信頼の頂点。OS やブラウザに「信頼するルート証明書」として最初から組み込まれている
  • 中間 CA:ルート CA に署名された CA。実際のサーバ証明書はここが発行することが多い
  • サーバ証明書:中間 CA に署名された、各サイトの証明書

「ルート CA → 中間 CA → サーバ証明書」と署名がつながっていることを 信頼の連鎖(チェーン)と呼びます。ブラウザは、この連鎖を辿って最後にルート CA に行き着けば「信頼できる」と判断します。HTTPS サイトで鍵マークが出るのはこの検証が通った印です。

PKI(公開鍵基盤)の信頼の連鎖を3段の縦の階層で示した図。最上段はルートCA証明書で信頼の頂点であり、OS やブラウザに最初から組み込まれている。中段は中間CA証明書で、ルートCAに署名されている。最下段はサーバ証明書で、中間CAに署名された各サイトの証明書である。上の段が下の段に署名する関係を下向きの実線矢印で、ブラウザが下から上へ連鎖を辿って検証する関係を上向きの破線矢印で示す。ルートCAまで辿り着けばブラウザは信頼できると判断する。
図 10-03. PKI 信頼の連鎖 ── ルートCAから連なる証明書

7.3 自己署名証明書との違い

第6章で作った自己署名証明書は、この連鎖がありません(自分で自分を保証しているだけ)。だからブラウザは「信頼できない」と警告を出します。検証環境や社内限定なら自己署名でも実用になりますが、一般公開するサイトは CA 署名の証明書が必要です。無料で CA 署名証明書を発行する Let’s Encrypt が広く使われており、第8回で触れた certbot.timer がその自動更新を担っています。

第8章:現場での使いどころ

現場での使いどころ

  • サーバ間 SSH の鍵運用:本番サーバはパスワード認証を無効化(PasswordAuthentication no)し、鍵認証のみにする。総当たり攻撃の入口を塞ぐ
  • CI/CD のデプロイ鍵:GitHub の Deploy Key、デプロイ用サービスアカウントの鍵。読み取り専用・1リポジトリ限定など、権限を絞った鍵を使う
  • 設定ファイル・バックアップの暗号化:認証情報を含むバックアップを gpg で暗号化してから外部ストレージに置く
  • 配布物の検証:OSS やパッケージをダウンロードしたら、sha256sum でハッシュを照合し、gpg --verify で署名を検証してから使う
  • HTTPS 証明書の管理openssl x509 -textopenssl s_client で有効期限・発行者を確認。期限切れはサービス停止に直結するため監視対象にする
  • 鍵ローテーション:鍵は永久ではない。定期的に、また担当者の異動・退職時に、鍵を作り直して古い鍵を authorized_keys から削除する

第9章:ヒヤリハット

現場ヒヤリハット:秘密鍵を GitHub に公開してしまった

新人エンジニアが、自分の作業用スクリプト一式を GitHub のリポジトリにアップロードした。便利になったと喜んでいたが、数時間後にセキュリティ担当から連絡が来た。「リポジトリに id_ed25519(拡張子なしの秘密鍵)がコミットされている」

原因は、作業ディレクトリごと git add . でコミットしたこと。~/.ssh/ をコピーして作業フォルダに置いていたため、秘密鍵まで巻き込まれた。GitHub の公開リポジトリは、世界中の自動スキャナが常時クロールしており、公開された鍵・トークンは数分で収集される

対応

  • その秘密鍵は即座に「漏洩した」とみなす。コミットを消しても、Git の履歴やスキャナのキャッシュには残るため、ファイルを消すだけでは不十分
  • 漏洩した鍵に対応する公開鍵を、全サーバの ~/.ssh/authorized_keys から削除(失効)する
  • 新しい鍵ペアを生成してローテーション。新しい公開鍵を各サーバに配布し直す
  • その鍵でアクセスできた範囲に不正アクセスの痕跡がないか/var/log/securejournalctl -u sshd を調査する

教訓と予防

  • 秘密鍵・パスワード・API トークンは絶対にリポジトリに入れない.gitignoreid_**.pem.env 等を必ず登録する
  • git add . の前に git status何がコミットされるか確認する習慣をつける
  • 秘密鍵にパスフレーズを付けておけば、漏洩しても即座の悪用は防げる(時間が稼げる)。ただしパスフレーズ付きでも漏洩は漏洩 ── 必ずローテーションする
  • 「鍵が漏れたら、その鍵はもう使わない」が鉄則。もったいないと思って使い続けない

秘密鍵は「鍵」そのもの。家の鍵を落としたら鍵穴ごと交換するのと同じで、漏れた鍵は失効+ローテーションが唯一の正しい対応。

第10章:やってみよう

linuc-alma にログインして次の4つの演習を実行してください。所要時間は25〜35分です。生成する鍵・証明書はすべて専用ファイル名で、演習末にクリーンアップします。既存の ~/.ssh/id_* には触れないこと。

演習1:SSH 鍵ペアを作る

実行コマンド(linuc-alma):

$ ssh-keygen -t ed25519 -C "linuc-test" -f ~/.ssh/linuc_test_ed25519 -N ""
$ ls -la ~/.ssh/linuc_test_ed25519*
$ cat ~/.ssh/linuc_test_ed25519.pub
$ ssh-keygen -lf ~/.ssh/linuc_test_ed25519.pub
$ rm ~/.ssh/linuc_test_ed25519 ~/.ssh/linuc_test_ed25519.pub

確認ポイント:秘密鍵が 0600、公開鍵が 0644。公開鍵は1行。-lf でフィンガープリント(256bit、ED25519)が出る。最後の rm でクリーンアップ。

演習2:gpg で対称暗号

実行コマンド(linuc-alma):

$ echo "secret data" > /tmp/secret.txt
$ gpg -c --batch --passphrase "testpass" /tmp/secret.txt
$ ls /tmp/secret.txt.gpg
$ gpg -d --batch --passphrase "testpass" /tmp/secret.txt.gpg
$ rm /tmp/secret.txt /tmp/secret.txt.gpg

確認ポイント:.gpg ファイルが作られ、復号で元の secret data が表示される。暗号方式が AES256 と分かる。

演習3:openssl でハッシュと乱数

実行コマンド(linuc-alma):

$ openssl version
$ echo "linuc" > /tmp/h.txt
$ openssl dgst -sha256 /tmp/h.txt
$ sha256sum /tmp/h.txt
$ openssl rand -base64 32
$ rm /tmp/h.txt

確認ポイント:openssl dgst -sha256sha256sum のハッシュ値が一致する(表示形式だけ違う)。openssl rand は実行のたびに違う値。

演習4:自己署名証明書を作って表示する

実行コマンド(linuc-alma):

$ openssl req -x509 -newkey rsa:2048 -keyout /tmp/key.pem -out /tmp/cert.pem -days 365 -nodes -subj "/CN=linuc-test"
$ openssl x509 -text -noout -in /tmp/cert.pem | head -13
$ rm /tmp/key.pem /tmp/cert.pem

確認ポイント:cert.pem(証明書)と key.pem(秘密鍵)が作られる。x509 -text の出力で Issuer と Subject が同じ(=自己署名)、Validity の有効期限が1年後になっている。

困ったらマニュアルを引きます。man ssh-keygen man ssh-copy-id man ssh-agent man gpg man openssl man openssl-req man openssl-x509openssl help でサブコマンド一覧も出ます。

理解度チェック

次の5問を ○×で答えてください。解答は記事末尾にあります。

  1. 共通鍵暗号は、暗号化と復号に異なる鍵を使う方式である。
  2. デジタル署名は、署名を秘密鍵で行い、検証を公開鍵で行う。
  3. SSH 鍵認証では、~/.ssh ディレクトリのパーミッションが緩すぎると sshd が鍵認証を拒否することがある。
  4. gpg -c は、鍵ペアを使わずパスフレーズだけでファイルを暗号化する対称暗号である。
  5. 自己署名証明書は、認証局(CA)の署名による信頼の連鎖を持つため、ブラウザは警告を出さない。

解答

  1. ×(共通鍵暗号は暗号化と復号に同じ鍵。異なる鍵を使うのは公開鍵暗号)
  2. ○(署名は秘密鍵、検証は公開鍵。暗号化(公開鍵で暗号化・秘密鍵で復号)とは逆向き)
  3. ○(秘密鍵 600 / ~/.ssh 700 が要件。緩いと拒否される)
  4. ○(-c=対称暗号。鍵ペア不要、パスフレーズだけ。AES256 が使われる)
  5. ×(自己署名は信頼の連鎖を持たない。ブラウザは「信頼できない」と警告する。一般公開には CA 署名証明書が必要)

次回予告

次回(第11回)は 「クラウドセキュリティの基礎 — IAM・公開鍵管理・SSH踏み台構成」 です。クラウドの責任共有モデル、IAM(ユーザー・ロール・ポリシー)、EC2 のキーペア、SSH 踏み台(Bastion Host)の役割を扱います。今回学んだ SSH 鍵が、クラウドでどう管理されるかを見ていきます。VM を使わない座学回です。

LinuC 102 試験対策シリーズ(全12回)

  1. シェル環境のカスタマイズ:環境変数・エイリアス・履歴・ロケール
  2. Bashスクリプト入門:if/for/関数で書く現場の自動化スクリプト
  3. ネットワーク基礎:TCP/IP・ip コマンド・NetworkManager
  4. ネットワークトラブルシューティングとDNSクライアント設定
  5. ユーザ・グループ管理と sudo 設定の実務(useradd, visudo)
  6. ジョブスケジューリングと時刻管理:cron, systemd timer, chrony, NTP
  7. ログ管理実践:journalctl と rsyslog の使い分け
  8. メール配送エージェント(MTA)の基本:postfix の動作確認
  9. ファイアウォール(firewalld / ufw)と SELinux 入門
  10. 暗号化によるデータ保護:SSH鍵認証・GnuPG・OpenSSL
  11. クラウドセキュリティの基礎:IAM・公開鍵管理・SSH踏み台構成
  12. オープンソースの文化:主要ライセンス(GPL/MIT/Apache)とコミュニティ
広告
Linux
スポンサーリンク