【FreeRADIUS講座 第5回】Wi-Fi認証の鉄板!EAP-PEAP認証構築と「オレオレ証明書」の正しい作り方

「そのアクセスポイント、本物ですか?」

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回までは、IDとパスワードによる認証の仕組みを整えてきました。

しかし、無線LAN(Wi-Fi)の世界には、有線LANにはない恐ろしい脅威が存在します。
それが「偽アクセスポイント(Evil Twin)」です。
攻撃者が「社内のWi-Fiと同じ名前(SSID)」の偽APを設置し、社員がうっかり接続してIDとパスワードを入力してしまう…という手口です。

コウ君

先生、それ怖すぎます!
スマホでWi-Fiを選ぶときって、SSIDしか見てないですもん。
もし同じ名前の偽物が飛んでたら、絶対気付かずに繋いじゃいます。
どうやって見分ければいいんですか?

リナックス先生

人間には見分けがつかないわ。
だからこそ、PCやスマホ(サプリカント)に自動で判断させるの。
そのための身分証明書が「電子証明書(サーバー証明書)」よ。
今回は、最も普及している認証方式「EAP-PEAP」を使って、安全なエンタープライズWi-Fi環境を作りましょう!

本記事では、FreeRADIUSでEAP-PEAP認証を構築するための全手順を解説します。
特に難関とされる「サーバー証明書の作成」と「Windowsクライアントの設定」を重点的にフォローします。

🔐 FreeRADIUS完全攻略講座(バックナンバー)


第1章:EAP-PEAP認証の仕組み

まずは敵を知りましょう。
「EAP(イーエーピー)」とは、PPPを拡張した認証プロトコルの総称です。
その中でも、PEAP(ピーアープ)は、Windows標準対応という利便性から、現在もっとも普及している方式です。

認証の流れ(ざっくり図解)

  1. 接続要求: クライアント(PC)がAPに接続。
  2. サーバー証明書の提示: RADIUSサーバーが、自分の身分証明書(サーバー証明書)をPCに送る。
  3. サーバーの検証: PCは「この証明書は信頼できるか?」をチェックする。(ここで偽APを見破る!)
  4. 暗号化トンネル確立: 信頼できたら、PCとサーバー間でTLS暗号化トンネルを作る。
  5. ID/PASS送信: 安全なトンネルの中で、ユーザーIDとパスワードを送る(MS-CHAPv2)。
  6. 認証完了: 合っていれば接続OK。

重要なのは、「IDを送る前に、サーバーが本物か確認する」という点です。
このために、FreeRADIUS側に「サーバー証明書」を設定する必要があります。


第2章:【最難関】サーバー証明書の作成

本来、サーバー証明書はVeriSignなどの認証局(CA)から購入するものですが、社内Wi-Fi用にお金をかけるのは大変です。
そこで、自分で認証局を立てて、自分で署名する「自己署名証明書(オレオレ証明書)」を作成します。

FreeRADIUSには、証明書作成を自動化するスクリプトが付属していますが、デフォルトだと有効期限が短かったりするので、少しカスタマイズして使います。

1. 作業ディレクトリへ移動

証明書関連のファイルは /etc/raddb/certs/ にあります。

cd /etc/raddb/certs/

ここに Makefileca.cnf, server.cnf といったファイルがあります。
まず、既存の(インストール時に作られたダミーの)証明書を削除します。

sudo rm -f *.pem *.der *.csr *.crt *.key *.p12 serial* index.txt*

2. 設定ファイルの編集(有効期限を延ばす)

デフォルトでは有効期限が「60日」など短く設定されている場合があり、すぐに切れて繋がらなくなります。
ca.cnfserver.cnf を編集して、10年(3650日)くらいに延ばしておきましょう。

sudo nano ca.cnf

default_days という項目を探して変更します。

default_days    = 3650

同様に server.cnf も変更します。

sudo nano server.cnf
# default_days = 3650 に変更

3. パスワードの変更(Makefile)

証明書作成時に使われるパスワードが passwords.mk に書かれています。
セキュリティのため、これも変更しておきます。

sudo nano passwords.mk
# 任意の文字列に変更
export CA_PASSWORD=MySecretPassword
export SERVER_PASSWORD=MySecretPassword

4. 証明書の作成(makeコマンド)

準備ができたら、魔法のコマンド make を実行します。
これ一発で、CA証明書、サーバー証明書、秘密鍵などが全て生成されます。

sudo make

エラーが出ずに終了したら、以下のファイルができているか確認してください。

  • ca.pem : ルート証明書(クライアントPCに入れるやつ)。
  • server.pem : サーバー証明書(公開鍵)。
  • server.key : サーバー秘密鍵。

5. 権限の修正

作成されたファイルは所有者が root になっています。
FreeRADIUS(radiusdユーザー)が読めるように権限を変更します。

sudo chown radiusd:radiusd *.pem *.key
sudo chmod 640 *.pem *.key

これで証明書の準備は完了です!


第3章:EAPモジュールの設定

作成した証明書を使うように、FreeRADIUSの設定を変更します。
設定ファイルは /etc/raddb/mods-available/eap です。

1. eap.confの編集

sudo nano /etc/raddb/mods-available/eap

eap { ... } ブロックの中にある tls-config tls-common { ... } セクションを探します。

tls-config tls-common {
    # 秘密鍵のパス
    private_key_file = ${certdir}/server.key

    # サーバー証明書のパス
    certificate_file = ${certdir}/server.pem

    # ルート証明書のパス
    ca_file = ${certdir}/ca.pem
    
    # 秘密鍵のパスワード(passwords.mkで設定したもの)
    private_key_password = "MySecretPassword"
    
    # ... (中略) ...
    
    # Diffie-Hellmanパラメータ(ここも確認)
    dh_file = ${certdir}/dh
}

dh ファイルがない場合は、sudo openssl dhparam -out /etc/raddb/certs/dh 2048 で作成してください(数分かかります)。

2. EAPタイプの設定

同じファイルの下の方に、peap { ... } というセクションがあります。
default_eap_type = mschapv2 となっていることを確認してください。

3. 設定の反映(再起動)

設定が終わったら、いつものようにデバッグモードで起動してエラーがないか確認します。

sudo systemctl stop radiusd
sudo radiusd -X

Ready to process requests と表示されればOKです。
この画面は開いたままにしておきましょう。


第4章:Windowsクライアントの設定(最重要)

ここが今回のハイライトです。
サーバー側の設定が完璧でも、クライアント(Windows)の設定を間違えると100%繋がりません。
特に「オレオレ証明書」を使う場合、Windowsに「この証明書を信じろ!」と教え込む必要があります。

ステップ1:ルート証明書(ca.pem)の取り出し

サーバー上の /etc/raddb/certs/ca.pem を、WinSCPなどを使って手元のWindows PCにダウンロードしてください。
ファイル名を my-wifi-ca.crt などに変更すると分かりやすいです。

ステップ2:証明書のインストール

  1. ダウンロードした .crt ファイルをダブルクリックします。
  2. 「証明書のインストール」をクリックします。
  3. 保存場所:「ローカル コンピューター」を選択(※管理者権限が必要です)。
  4. 「証明書をすべて次のストアに配置する」を選び、「参照」ボタンを押します。
  5. 【超重要】「信頼されたルート証明機関」フォルダを選択してOKを押します。
  6. 「次へ」→「完了」。「正しくインポートされました」と出ればOKです。

ステップ3:Wi-Fi接続プロファイルの手動作成

SSIDを選んでパスワードを入れるだけ…では上手くいかないことが多いです。
手動でプロファイルを作ります。

  1. 「コントロールパネル」→「ネットワークと共有センター」→「新しい接続またはネットワークのセットアップ」。
  2. 「ワイヤレスネットワークに手動で接続します」を選択。
  3. ネットワーク名: Wi-FiのSSIDを入力。
  4. セキュリティの種類: 「WPA2-エンタープライズ」を選択。
  5. 「次へ」を押し、「接続の設定を変更します」をクリック。

ステップ4:PEAPの詳細設定

プロパティ画面が開きます。

  1. 「セキュリティ」タブの「ネットワークの認証方法の選択」で「Microsoft: 保護されたEAP (PEAP)」が選ばれていることを確認し、「設定」ボタンをクリック。
  2. 「証明書を検証してサーバーのIDを検証する」にチェックを入れる(重要!)。
  3. 「信頼されたルート証明機関」のリストから、さきほどインポートした証明書(Common Nameなど)を探してチェックを入れる。
  4. 「認証方法を選択する」で「セキュリティで保護されたパスワード(EAP-MSCHAP v2)」を選び、「構成」ボタンをクリック。
  5. 「Windowsのログオン名とパスワードを…使う」のチェックを外す(重要!これを外さないとPCのログイン情報を勝手に送って失敗します)。
  6. 全てOKで閉じる。

第5章:接続テストとトラブルシューティング

さあ、緊張の一瞬です。
WindowsのWi-Fi一覧から対象のSSIDを選択し、「接続」をクリックします。

1. 認証画面

「サインイン」という画面が出て、ユーザー名とパスワードを求められます。
ここに、FreeRADIUSに登録した(usersファイル、またはDBの)ユーザー情報を入力します。

2. 接続成功!

しばらく待って「接続済み」になれば成功です!
サーバー側のデバッグログ(radiusd -X)には、以下のようなEAPのやり取りが流れているはずです。

...
(15) eap: Peer sent EAP Response (Identity)
(15) eap_peap: TLS Session established
(15) eap_peap: Tunneled data is valid
(15) Login OK: [testuser] ...

よくあるエラーと対策

Q1. 「接続できませんでした」と即座に出る
A. 証明書の信頼設定ミスです。
Windowsの設定で、ルート証明書が正しくインポートされていないか、PEAPの設定で証明書にチェックが入っていません。
面倒なら一時的に「証明書を検証して…」のチェックを外して試してみてください(繋がれば証明書周りが原因です)。

Q2. ユーザー名/パスワード入力後、何度も聞かれる
A. パスワード形式の問題です。
EAP-PEAP (MSCHAPv2) では、サーバー側がパスワードの「NTLMハッシュ」を知っているか、または「平文(Cleartext-Password)」を知っている必要があります。
FreeRADIUSのDBに登録する際、パスワードをMD5などでハッシュ化してしまっていませんか?
必ず Cleartext-Password で登録してください。

Q3. AndroidやiPhoneの場合は?
スマホはもっと簡単です。
接続時に「PEAP」を選び、「CA証明書」の欄で「検証しない(またはシステム証明書を使用)」を選べば繋がります(セキュリティ的には証明書をインストールすべきですが、検証なしでも動作はします)。


まとめ:これで「エンタープライズWi-Fi」の完成!

お疲れ様でした!
これで、あなたのWi-Fi環境は「ID/パスワード認証」+「電子証明書によるサーバー検証」という、企業のオフィスと同等レベルのセキュリティを手に入れました。

今回の重要ポイント:

  • EAP-PEAPは「サーバー証明書」と「ID/PASS」を使う方式。
  • make コマンドで簡単に自己署名証明書が作れる。
  • Windowsクライアントには「ルート証明書」を「信頼されたルート証明機関」に入れる必要がある。
  • Wi-Fiプロファイルを手動作成し、証明書の検証設定を行うのが確実。

しかし、これでもまだ完璧ではありません。
IDとパスワードが漏れてしまったら? 他人のスマホから勝手に繋がれてしまいますよね。
これを防ぐには、「パスワード」に加えて「スマホが持っているワンタイムパスワード」を組み合わせる「多要素認証(MFA)」が有効です。

次回、第6回は「セキュリティ極限強化!Google Authenticatorによる多要素認証」です。
FreeRADIUSとGoogle Authenticatorを連携させ、スマホアプリに表示される6桁のコードを使わないとWi-Fiに繋げない、鉄壁の要塞を構築します。
お楽しみに!

▼ エンジニアとしてのキャリアを加速させる ▼

証明書認証を実践
「VPS」で自分専用環境

おすすめVPSを見る

サーバー知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント