LinuC レベル1 102試験対策シリーズの第10回です。前回はファイアウォールと SELinux で「アクセスを制限する」層を学びました。今回は 「データそのものを守る」 層 ── 暗号化です。共通鍵暗号と公開鍵暗号の違いから始め、SSH 鍵認証(ssh-keygen)、GnuPG(gpg)でのファイル暗号化・署名、OpenSSL(openssl)でのハッシュ・証明書操作を実機で読み解きます。盗聴・改ざん・なりすましからデータを守る、現場必須の技術です。
環境前提
- ディストロ: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回 オープンソースの文化
この記事で身につくこと
- 共通鍵暗号と公開鍵暗号の違いを説明できる
ssh-keygenで鍵ペアを生成し、ssh-copy-idで公開鍵を配布できる~/.ssh/のパーミッション要件を理解しているgpgでファイルの暗号化・復号ができるopensslでハッシュ計算・自己署名証明書の作成・証明書表示ができる
第1章:なぜ暗号化が必要なのか
1.1 平文通信の危険
かつてサーバへのリモートログインには telnet、ファイル転送には ftp が使われていました。今これらがほぼ使われないのは、通信内容が平文(暗号化されていない)だからです。経路の途中でパケットを覗かれれば、パスワードもファイル内容もそのまま読まれてしまいます。
暗号技術は、次の3つを守るために使われます。
- 機密性:盗聴されても内容が読めない(暗号化)
- 完全性:改ざんされたら気づける(ハッシュ・署名)
- 認証:通信相手が本物だと確認できる(署名・証明書)
誰のためかというと ── 開発者のため(コードや認証情報を守る)、運用者のため(サーバ間通信を安全にする)、そして利用者のため(個人情報の漏洩を防ぐ)。暗号化は「特別なことをするとき」ではなく、通信とデータ保管の標準装備です。
第2章:共通鍵暗号と公開鍵暗号
2.1 共通鍵暗号 ── 同じ鍵で暗号化・復号
共通鍵暗号(対称鍵暗号)は、暗号化と復号に 同じ鍵を使います。代表は AES。処理が高速で、大量のデータの暗号化に向きます。
弱点は 鍵配送問題です。暗号文を送る相手に「鍵」を渡さなければ復号できませんが、その鍵を安全に渡す手段がそもそも問題になります。鍵を平文で送れば、盗聴者にも鍵が渡ってしまいます。
2.2 公開鍵暗号 ── 2つで1組の鍵
公開鍵暗号(非対称鍵暗号)は、公開鍵と秘密鍵のペアを使います。代表は RSA、楕円曲線暗号(ECC)。
- 公開鍵で暗号化したものは、対応する秘密鍵でしか復号できない
- 公開鍵は名前のとおり 誰に渡してもよい。秘密鍵だけ厳重に守る
これで鍵配送問題が解決します。受信者が公開鍵をばらまき、送信者はその公開鍵で暗号化する。復号できるのは秘密鍵を持つ受信者だけ。弱点は 処理が遅いことです。
2.3 ハイブリッド方式 ── 両者のいいとこ取り
実際の SSH / TLS(HTTPS)/ GPG は、両方を組み合わせた ハイブリッド方式です。
- 実データは 共通鍵暗号で暗号化(速い)
- その共通鍵(セッション鍵)を 公開鍵暗号で相手に渡す(安全)
「速さ」と「安全な鍵配送」を両立する、よくできた仕組みです。

2.4 デジタル署名 ── 鍵の使い方を逆にする
公開鍵暗号は、鍵の使い方を逆にすると デジタル署名になります。
- 暗号化:公開鍵で暗号化 → 秘密鍵で復号(機密性)
- 署名:秘密鍵で署名 → 公開鍵で検証(完全性+認証)
「秘密鍵を持つ本人にしか作れない署名」を、誰でも公開鍵で検証できる。これで「本物が作った」「改ざんされていない」が確認できます。

📖 試験Tipsボックス1:共通鍵と公開鍵
主題:1.10.3(重要度:高)
出題パターン:「共通鍵暗号と公開鍵暗号の違いは?」「鍵配送問題とは?」「デジタル署名はどちらの鍵で行う?」
暗記ポイント
- 共通鍵暗号=暗号化と復号に同じ鍵、速い、鍵配送問題あり(AES 等)
- 公開鍵暗号=公開鍵で暗号化・秘密鍵で復号、遅い、鍵配送問題を解決(RSA / ECC 等)
- 実用はハイブリッド(データは共通鍵、その鍵を公開鍵で配送)── SSH / TLS / GPG すべてこれ
- デジタル署名は 秘密鍵で署名・公開鍵で検証(暗号化と逆向き)
第3章:SSH 鍵認証
3.1 パスワード認証より鍵認証
SSH には2つの認証方式があります。
- パスワード認証:パスワードを入力。総当たり攻撃(ブルートフォース)に弱い。第7回で見た
/var/log/secureの「Failed password」は、この攻撃の記録 - 公開鍵認証:秘密鍵を持っていることで認証。秘密鍵はネットワークを流れないため、盗聴・総当たりに強い
本番サーバでは 鍵認証だけを許可し、パスワード認証を無効化(sshd_config の PasswordAuthentication 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_keys | 600 |
公開鍵(*.pub) | 644(配ってよい) |
実行コマンド(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-keygen や ssh-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 -sha256 と sha256sum は 同じ 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 サイトで鍵マークが出るのはこの検証が通った印です。

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 -textやopenssl s_clientで有効期限・発行者を確認。期限切れはサービス停止に直結するため監視対象にする - 鍵ローテーション:鍵は永久ではない。定期的に、また担当者の異動・退職時に、鍵を作り直して古い鍵を
authorized_keysから削除する
第9章:ヒヤリハット
現場ヒヤリハット:秘密鍵を GitHub に公開してしまった
新人エンジニアが、自分の作業用スクリプト一式を GitHub のリポジトリにアップロードした。便利になったと喜んでいたが、数時間後にセキュリティ担当から連絡が来た。「リポジトリに id_ed25519(拡張子なしの秘密鍵)がコミットされている」。
原因は、作業ディレクトリごと git add . でコミットしたこと。~/.ssh/ をコピーして作業フォルダに置いていたため、秘密鍵まで巻き込まれた。GitHub の公開リポジトリは、世界中の自動スキャナが常時クロールしており、公開された鍵・トークンは数分で収集される。
対応:
- その秘密鍵は即座に「漏洩した」とみなす。コミットを消しても、Git の履歴やスキャナのキャッシュには残るため、ファイルを消すだけでは不十分
- 漏洩した鍵に対応する公開鍵を、全サーバの
~/.ssh/authorized_keysから削除(失効)する - 新しい鍵ペアを生成してローテーション。新しい公開鍵を各サーバに配布し直す
- その鍵でアクセスできた範囲に不正アクセスの痕跡がないか、
/var/log/secureやjournalctl -u sshdを調査する
教訓と予防:
- 秘密鍵・パスワード・API トークンは絶対にリポジトリに入れない。
.gitignoreにid_*、*.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 -sha256 と sha256sum のハッシュ値が一致する(表示形式だけ違う)。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-x509。openssl help でサブコマンド一覧も出ます。
理解度チェック
次の5問を ○×で答えてください。解答は記事末尾にあります。
- 共通鍵暗号は、暗号化と復号に異なる鍵を使う方式である。
- デジタル署名は、署名を秘密鍵で行い、検証を公開鍵で行う。
- SSH 鍵認証では、
~/.sshディレクトリのパーミッションが緩すぎると sshd が鍵認証を拒否することがある。 gpg -cは、鍵ペアを使わずパスフレーズだけでファイルを暗号化する対称暗号である。- 自己署名証明書は、認証局(CA)の署名による信頼の連鎖を持つため、ブラウザは警告を出さない。
解答
- ×(共通鍵暗号は暗号化と復号に同じ鍵。異なる鍵を使うのは公開鍵暗号)
- ○(署名は秘密鍵、検証は公開鍵。暗号化(公開鍵で暗号化・秘密鍵で復号)とは逆向き)
- ○(秘密鍵 600 /
~/.ssh700 が要件。緩いと拒否される) - ○(
-c=対称暗号。鍵ペア不要、パスフレーズだけ。AES256 が使われる) - ×(自己署名は信頼の連鎖を持たない。ブラウザは「信頼できない」と警告する。一般公開には CA 署名証明書が必要)
次回予告
次回(第11回)は 「クラウドセキュリティの基礎 — IAM・公開鍵管理・SSH踏み台構成」 です。クラウドの責任共有モデル、IAM(ユーザー・ロール・ポリシー)、EC2 のキーペア、SSH 踏み台(Bastion Host)の役割を扱います。今回学んだ SSH 鍵が、クラウドでどう管理されるかを見ていきます。VM を使わない座学回です。
LinuC 102 試験対策シリーズ(全12回)
- シェル環境のカスタマイズ:環境変数・エイリアス・履歴・ロケール
- Bashスクリプト入門:if/for/関数で書く現場の自動化スクリプト
- ネットワーク基礎:TCP/IP・ip コマンド・NetworkManager
- ネットワークトラブルシューティングとDNSクライアント設定
- ユーザ・グループ管理と sudo 設定の実務(useradd, visudo)
- ジョブスケジューリングと時刻管理:cron, systemd timer, chrony, NTP
- ログ管理実践:journalctl と rsyslog の使い分け
- メール配送エージェント(MTA)の基本:postfix の動作確認
- ファイアウォール(firewalld / ufw)と SELinux 入門
- 暗号化によるデータ保護:SSH鍵認証・GnuPG・OpenSSL
- クラウドセキュリティの基礎:IAM・公開鍵管理・SSH踏み台構成
- オープンソースの文化:主要ライセンス(GPL/MIT/Apache)とコミュニティ
