こんにちは、てつです!
全4回にわたって自宅サーバーの監視体制の構築していますが、監視云々の前にやるべきことがあったので、このタイミングでやっていこうと思います!
それは、公開鍵認証の導入です!
元々やろうと思っていたのですが、先日エラーのハンドリングでブラウザへのログイン試行を何回かしたときにふと、パスワード認証って総当たり攻撃の標的になるってこと思い出したんですよね。
これから監視体制をって時に初歩的なことすっ飛ばすのはよくないので、SSH周りのセキュリティを見直していこうと思います!
関連記事は下記に記載しておきます!

公開鍵認証とは?
「公開鍵認証」とは、例えるなら「絶対に盗まれない、世界に一つだけの物理的な鍵と錠前」です。
これまで使っていたいわゆるパスワード認証は、合言葉で認証するという方式で、盗まれるリスクと偶然あてられてしまうリスクがありました。
しかし、「公開鍵認証」は、物理的な「鍵」と「錠前(じょうまえ)」をセットで使う方式です。
公開鍵認証を導入すると、自分のPCの中に「秘密鍵」と「公開鍵」という2つのデータが作成されます。
表であらわすと以下のようになります。
| 名称 | 別名(例え) | 役割・扱い |
| 秘密鍵 | 自分だけの「本物の鍵」 | 自分のPC(手元)に厳重に保管します。絶対に他人に見せてはいけません。 |
| 公開鍵 | サーバーに置く「錠前(南京錠)」 | サーバーの玄関に設置しておきます。名前の通り、誰に見られても中身を盗まれる心配はありません。 |
実際にどうやってログインするのかというと、PCが持っている「秘密鍵」が、その錠前にピッタリ合えば、ガチャリと扉が開きます。
あなたがサーバーにログインしようとすると、サーバーが「この錠前に合う鍵を持ってる?」と聞いてきます。
なぜ「パスワード」より安全なのかというと、以下のような理由があります。
盗み聞き(パケットキャプチャ)に強い 通信の間を「合言葉(パスワード)」が流れないので、途中で盗み見られてもログインされる心配がありません。
「数打ちゃ当たる(総当たり攻撃)」が効かない パスワードは何万回も試せばいつか当たるかもしれませんが、鍵(暗号データ)のパターンは天文学的な数です。現代のコンピュータで片っ端から試しても、正解を見つけるのに何億年もかかります。
鍵を持っていない人は門前払い パスワード入力を求めることすら拒否する設定にできるので、サーバーの入り口で悪い人をシャットアウトできます。
なんとなく公開鍵認証についてイメージできたででしょうか?次はどのように導入するのかをステップごとに解説してきます。
構築のステップ
1. 鍵ペアの作成(自分のPC側)
「公開鍵」と「秘密鍵」を生成します。
鍵を作るときは「暗号方式」選びが重要です。今回は、最新の標準でセキュリティ強度が非常に高い「Ed25519」という方式を採用します。
2. 公開鍵をサーバーへ転送
サーバーの「許可リスト(authorized_keys)」に自分の公開鍵を登録します。
サーバーに「この鍵を持っている人だけ通していいよ」という名簿(錠前)を渡しに行く作業です。
3. 接続テスト
パスワードを打たずにログインできるか確認します。
ここが運用の分かれ道。必ず「新しいターミナル」を開いてテストします。今の接続を切らずに残しておくのが、万が一の際の命綱になります。
4. 【最重要】パスワード認証の禁止
設定を書き換え、パスワードログインを物理的に不可能にします。
これが「仕上げ」です。どんなに強力な鍵を作っても、パスワードという裏口が開いていては意味がありません。ここを完了して初めて、サーバーは「要塞」へと進化します。
※ステップ4を完了すると、物理的な鍵(秘密鍵)を失くすと二度と入れなくなります。バックアップの重要性も実践編で解説します
SSH公開鍵認証:実践
アの作成
まず手元のPCで(WindowsならPowerShellやVS Codeのターミナル)で「鍵」を作成します。
ssh-keygen -t ed25519
なぜこの設定か: -t ed25519 は、現代で最も推奨される「短くて最強」の暗号方式です。
操作のコツ: 実行後に保存場所やパスフレーズを聞かれますが、最初は何も入力せず Enterを3回連打 でOKです。
公開鍵をサーバーへ転送
さっきの手順で生成した公開鍵をサーバーに設置しに行きます。
ssh-copy-id username@サーバーのIPアドレス
解説: 自分のPCにある .pub(公開鍵)というファイルを、サーバーの許可リストへ自動で追記してくれる便利なコマンドです。
注意: ここで一度だけ、いつもの「パスワード」を聞かれます。
※画像のエラーメッセージにある通り、ssh-copy-id というコマンドは主にLinuxやMacで使われるもので、残念ながらWindowsのPowerShellには標準で入っていません。
PowerShellを開いたまま、以下のコマンドをコピーして実行してください(IPアドレスの部分はご自身のサーバーものに書き換えてください)。
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh username@IPアドレス "cat >> .ssh/authorized_keys"
コマンドの解説を少しします。
1.type ...:自分のPCにある「公開鍵(錠前)」の中身を読み取ります。
2.|(パイプ):読み取った中身を次のコマンドに渡します。
3.ssh ... "cat >> ...":サーバーにSSHで入り、受け取った中身をサーバー側の「許可リスト(authorized_keys)」というファイルの末尾に追記します。
もし、コマンドが複雑で不安な場合は、もっとも失敗しない以下の方法を試してみてください。
下記コマンドをサーバーではない方で実行してください。
cat ~\.ssh\id_ed25519.pub
これで出てきた「ssh-ed25519 AAA…」で始まる長い文字列を、マウスでコピーしてください!
そしたらサーバー側で以下のコマンドを実行し、さっきコピーした内容を右クリックで貼り付けして保存(Ctrl+O → Enter → Ctrl+X)します。
nano ~/.ssh/authorized_keys
この方法であれば「どっちで打っているか」が明確なので、ミスが少ないはずです。ぜひ試してみてください。
接続テストと「秘密鍵」のバックアップ
ここが大切です! パスワードなしでログインできるか確認し、同時に「鍵」のコピーを取ります。
1.テスト: 一度 exit して、再度 ssh username@サーバーのIP を叩きます。パスワードなしでシュッと入れれば成功!
2.バックアップ: 自分のPCの .ssh フォルダ内にある id_ed25519 (拡張子がない方)が「秘密鍵」です。
- これをUSBメモリや信頼できるクラウド、またはスマホに「予備の物理鍵」としてコピーしておいてください。
- 理由: PCが壊れた際、このデータがないとサーバーは永遠に開かない「開かずの金庫」になります。
【最重要】パスワード認証の禁止
いよいよ「裏口(パスワード)」を封鎖します。
以下のコマンドをサーバー側で実行してください。
sudo nano /etc/ssh/sshd_config
変更箇所: 以下の2点を探して書き換えます(# がついていたら消してください)。
PubkeyAuthentication yesPasswordAuthentication no
僕の場合はこの設定が#でコメントアウトされていたので消すだけで大丈夫でした。
設定を反映させた後、今繋いでいるターミナルは絶対に閉じないでください!
- 別の新しいターミナルを立ち上げる。
sshで接続してみる。- 無事に入れたら、本当の「要塞化」完了です!
もし設定をミスして PasswordAuthentication no のまま鍵認証も失敗すると、物理的にサーバーの前に座ってキーボードを叩かない限り、修復不能になります。
この「別ウィンドウでの確認」こそが、プロの現場での鉄則です。
まとめ
今回の作業で、僕のサーバーは「世界に一つだけの物理的な鍵(秘密鍵)」を持つ人しか入れない最強のセキュリティを手に入れました。
最後に、今回やったことを重要なポイントに絞って振り返っていこうと思います!
1. 公開鍵認証の3つのメリット
- 鉄壁のガード: 100万回パスワードを試されても、鍵がない限り侵入不可能です。
- ログインが快適: 面倒なパスワード入力から解放され、コマンド一つでシュッとログインできます。
- プロの標準: 現場のエンジニアが当たり前に使っている、信頼性の高い認証方式です。
2. 覚えておくべき「2つの鍵」の役割
- 秘密鍵(id_ed25519): あなたのPCに隠した「本物の鍵」。絶対に他人に見せてはいけません。
- 公開鍵(id_ed25519.pub): サーバーに設置した「錠前」。誰に見られても安全です。
3. 【最重要】運用上の注意点
- 秘密鍵は命の次に大事: PCの故障に備え、USBメモリや信頼できる場所に必ずバックアップを取っておきましょう。
- 設定変更は「命綱」を残して: 認証設定を変えるときは、今の接続を切らずに別のウィンドウでテストすること。これが「セルフ締め出し」を防ぐ最大の防御策です。
ここまでご精読ありがとうございました!
次からは監視体制構築に戻っていこうと思います!是非参考にしてください!

コメント