📑

【セキュリティ】公開鍵認証の仕組みを理解する

に公開

はじめに

SSHでの接続設定などでよく目にする「公開鍵認証」ですが、「なんとなく使っているけど仕組みはよくわからない…」という方も多いのではないでしょうか?

この記事では、初心者の方でも理解できるように、難しい数式や理論は使わず、図解を交えて公開鍵認証の基本をわかりやすく解説します。

なお、この記事では、概念的理解の補助を目的としています。

クライアント認証方式

サーバにログインしたり、通信したりする際には、「あなたが本当に本人かどうか」を確認する必要があります。
この確認の仕組みを「認証方式」と呼びます。

特にSSH接続などでは、クライアント(ユーザー側)が「自分はこのユーザー本人です」と証明する必要があります。
そのときによく使われるのが、以下の2つのクライアント認証方式です。

  • パスワード認証
  • 公開鍵認証

パスワード認証とは

最も一般的な認証方法で、ユーザー名とパスワードを使って本人確認を行なう方法です。
私たちがWebサービスにログインするときと同じ仕組みです。

仕組み

  • ユーザーがSSHなどでサーバに接続
  • サーバ側が「パスワードを入力してください」と要求
  • 正しいパスワードが入力されると、ログインが許可される

しかし、この認証方法は、悪意のある第三者がユーザ名とパスワードを総当たり的に試して不正ログインできてしまう余地があります(ブルートフォース攻撃)。

セキュリティの観点から、運用環境ではパスワード認証は無効化し、公開鍵認証に切り替えることが推奨されています。

公開鍵認証とは

公開鍵認証方式とは、鍵を使ってログインする仕組みのことです。
公開鍵認証は、公開鍵と秘密鍵のペアを使って本人確認を行なう認証方式です。

パスワードのように「何かを知っている」ではなく、「何かを持っている(秘密鍵)」ことを証明することで、安全な接続を実現します。

## 鍵は2つでセット

  • 公開鍵(public key):他人に渡してもOK。サーバに登録しておく。
  • 秘密鍵(private key):絶対に他人に渡してはいけない。自分のPCに保管しておく。

この2つの鍵は、暗号化と復号のためのペアになっていて、どちらか一方で暗号化した情報は、もう一方でしか復号できないようになっています。

公開鍵認証の流れ

1. クライアント側で公開鍵認証に使用するための「公開鍵」「秘密鍵」のペアを作成

ssh-keygen -t rsa -b 4096 -C "email@example.com"

このコマンドは、
RSA方式の4096ビットのSSH鍵ペアを作成し、「email@example.com」というコメントを付ける、
ということを意味しています。

  • -t: --typeの略
  • rsa: RSA暗号方式
    ed25519という暗号方式もあり、増えてきている。
  • -b: --bits の略
  • 4096: 鍵の長さが 4096ビット
  • -C: --comment の略
  • "email@example.com" : 鍵の所有者を表すコメント
    ※ このコメントは、生成された公開鍵(ファイル)の末尾に付きます。
    ※ GitHubやサーバに鍵を登録するとき、このコメントでどのPCや誰の鍵かを見分けやすくするのに役立ちます。

これにより、RSA方式で鍵ペアを作成し、以下のディレクトリにそれぞれ保存されます。

  • ユーザー秘密鍵: ~/.ssh/id_rsa
  • ユーザー公開鍵: ~/.ssh/id_rsa.pub

2. 公開鍵をサーバに登録(~/.ssh/authorized_keys など)

公開鍵をサーバに登録(~/.ssh/authorized_keys など)します。
作成した公開鍵ファイル(例:id_rsa.pub)を、接続先のサーバにコピーします。
このとき、サーバ上のユーザーのホームディレクトリにある ~/.ssh/authorized_keys ファイルに追記することで、「この公開鍵を持っている人ならログインを許可する」とサーバが認識します。

3. SSH接続時、サーバがクライアントにランダムなメッセージを送信

SSH接続を開始すると、サーバはまず「この人が本当に正しい秘密鍵を持っているのか?」を確認するために、**ランダムな文字列(チャレンジ)**をクライアントに送ります。

このランダムな文字列は、本人確認のための一時的な問題のようなものです。
つまり、このチャレンジを正しく処理できたら「本人」と認める、という仕組みです。

4. クライアントは秘密鍵で署名し、サーバに返す

クライアント側では、受け取ったチャレンジに対して、チャレンジをハッシュ関数に渡してハッシュ値を取得します。このハッシュ値を自分の秘密鍵を使って署名デジタル署名)を行ないます。

この署名済みのメッセージをサーバに送り返すことで、「自分はこの秘密鍵を持っていますよ」という証明をしていることになります。

重要なのは、秘密鍵自体は絶対に送られないという点です。
送るのは「署名された応答」だけなので、秘密鍵は常に安全に自分のPC内に保たれます。

5. サーバは登録済みの公開鍵で検証し、一致すれば認証成功

最後に、サーバ側では、あらかじめ登録しておいた公開鍵を使って、クライアントから送られてきた署名を検証します。

署名が公開鍵と正しく一致

「この人は正しい秘密鍵を持っている」と判断して、ログインを許可します。

署名が一致しない場合

「他人による不正アクセスの可能性あり」として、接続を拒否します。

まとめ

公開鍵認証は、安全性の高いログイン方法で、特にSSH接続などでよく使われます。
「公開鍵」と「秘密鍵」のペアで動作する仕組みを理解することが重要。
パスワードよりも安全・便利で、開発や運用において必須の知識です。

はじめはとっつきにくく感じるかもしれませんが、実際に鍵を生成して使ってみると簡単にログインができるようになります。積極的に使ってみましょう!

最後までお読みいただき、ありがとうございました。

参考・画像引用元URL

https://knowledge.sakura.ad.jp/3543/

https://milestone-of-se.nesuke.com/sv-advanced/digicert/public-private-key/

https://server-setting.info/blog/public-key-auth.html

Discussion