パスワードが盗まれても、破られない扉を作る。
こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、電子証明書を使った鉄壁のWi-Fi認証(EAP-PEAP)を構築しました。
しかし、セキュリティの世界に「絶対」はありません。
もし、社員のPCがマルウェアに感染し、IDとパスワード、そして証明書までもが盗み出されてしまったら?
攻撃者はその情報を使い、社外から堂々とVPNやWi-Fiに侵入できてしまいます。
先生、それじゃあ何をしても無駄ってことですか!?
パスワードを長くしても盗まれたら終わりだし、証明書もコピーされたらおしまい…。
もう打つ手なしじゃないですか!
諦めるのは早いわ、コウ君。
盗まれた情報だけでは突破できない「最後の壁」を追加すればいいの。
それが「多要素認証(MFA)」よ。
スマホに表示される、30秒ごとに変わる「ワンタイムパスワード」を使えば、たとえIDとパスワードが流出しても、犯人は侵入できないわ!
今回は、FreeRADIUSとGoogle Authenticator(スマホアプリ)を連携させ、最強のセキュリティ環境を構築します。
Linuxの認証機構「PAM」を駆使する高度な内容ですが、手順通りに進めれば必ず動きます。
🔐 FreeRADIUS完全攻略講座(バックナンバー)
- 【第1回】RADIUSサーバーとは?仕組みの完全図解とインストール
- 【第2回】基本設定とユーザー追加(clients.conf/users)&接続テスト
- 【第3回】脱・テキスト管理!MariaDB(MySQL)との連携設定
- 【第4回】Web GUIで楽々管理!daloRADIUSの導入と設定
- 【第5回】Wi-Fi認証の鉄板!EAP-PEAP認証と電子証明書の作成
- 【第6回】セキュリティ極限強化!Google Authenticatorによる多要素認証
- 【第7回】「誰がいつ繋いだ?」ログ管理とアカウンティングの極意
- 【第8回】トラブルシューティングと冗長化(Failover)構成
第1章:RADIUSにおける多要素認証(MFA)の仕組み
通常、多要素認証といえば「ID/PASS入力後に、スマホに通知が来て承認する」といったWebの仕組みを想像するかもしれません。
しかし、Wi-FiやVPNのプロトコル(RADIUS)では、そのような対話的な画面を出すことは困難です。
パスワード連結方式(Concatenation)
そこで、RADIUS認証では「パスワードの後ろにワンタイムコードをくっつけて入力する」という方式が一般的です。
- パスワード:
secretpass - スマホのコード:
123456 - 入力するパスワード:
secretpass123456
サーバー側は、受け取った文字列を分割し、前半をパスワードとして、後半をワンタイムコードとしてそれぞれ検証します。
認証フローとPAMの役割
FreeRADIUS単体ではGoogle Authenticatorの検証はできません。
そこで、Linuxの標準的な認証APIである「PAM (Pluggable Authentication Modules)」を利用します。
- FreeRADIUSがリクエストを受け取る。
- FreeRADIUSは判断をPAMに丸投げする。
- PAMはGoogle Authenticatorモジュールを使ってコードを検証する。
- PAMが「OK」を出せば、FreeRADIUSも「OK」を返す。
第2章:Google Authenticatorのインストール
まずは、AlmaLinux 9にGoogle AuthenticatorのPAMモジュールをインストールします。
標準リポジトリにはないため、EPELリポジトリを利用します。
1. EPELリポジトリとパッケージの導入
# EPELリポジトリの有効化 sudo dnf install epel-release -y # Google Authenticatorのインストール sudo dnf install google-authenticator -y # QRコード表示用ライブラリ(任意) sudo dnf install qrencode-libs -y
2. 検証用ユーザーの作成
今回は、Linuxのローカルユーザー(OSユーザー)に対してMFAを設定します。
テスト用に vpnuser を作成し、パスワードを設定します。
sudo useradd vpnuser sudo passwd vpnuser # パスワード(例: vpnpass123)を設定
第3章:ワンタイムパスワード設定ファイルの作成
ここが運用のキモです。
通常、Google Authenticatorの設定ファイルは各ユーザーのホームディレクトリ(/home/user/.google_authenticator)に作成されます。
しかし、FreeRADIUS(radiusdユーザー)が他人のホームディレクトリを覗きに行くのは、権限やSELinuxの観点からトラブルの元です。
そこで、設定ファイルを専用ディレクトリに集約する構成にします。
1. 設定ファイル置き場の作成
sudo mkdir /etc/raddb/google_auth sudo chown radiusd:radiusd /etc/raddb/google_auth sudo chmod 700 /etc/raddb/google_auth
2. トークンの生成(google-authenticatorコマンド)
vpnuser になりすましてコマンドを実行するのではなく、root権限で作成して配置します。
以下のコマンドを実行してください。
google-authenticator -t -d -f -r 3 -R 30 -w 17 -s /etc/raddb/google_auth/vpnuser
オプション解説:
-t: 時間ベース(TOTP)を使用。-d: トークンの再利用を禁止。-f: 強制的にファイルを作成。-r 3 -R 30: 30秒間に3回失敗したらロック(総当たり攻撃対策)。-w 17: 時刻ズレを許容するウィンドウサイズ(前後計17ステップ許容)。-s [path]: 設定ファイルの保存先を指定。
3. QRコードの登録
コマンドを実行すると、画面に巨大なQRコードと、シークレットキー(文字)が表示されます。
スマホの「Google Authenticator」アプリを開き、+ボタンからQRコードをスキャンしてください。
これでスマホ側の準備は完了です。
4. 権限の修正
作成されたファイルの所有者を radiusd に変更します。
これを忘れるとFreeRADIUSが読み込めず認証失敗します。
sudo chown radiusd:radiusd /etc/raddb/google_auth/vpnuser
第4章:PAMの設定(/etc/pam.d/radiusd)
FreeRADIUSがPAMを利用する際の設定ファイルを編集します。
デフォルトでは /etc/pam.d/radiusd というファイルが存在します。
設定ファイルの編集
既存の内容を全てコメントアウト(または削除)し、以下の内容に書き換えます。
sudo nano /etc/pam.d/radiusd
書き換え内容:
# 1. まずLinuxの標準パスワード認証を行う
auth required pam_unix.so
# 2. 次にGoogle Authenticatorの認証を行う
# secret=でファイルの場所を指定。${USER}は自動でユーザー名に置換される
auth required pam_google_authenticator.so secret=/etc/raddb/google_auth/${USER}
# アカウント管理(有効期限切れなどをチェック)
account required pam_unix.so
この設定により、「Linuxのパスワードが合っている」かつ「OTPが合っている」場合のみ、認証が通るようになります。
第5章:FreeRADIUSの設定(PAMモジュールの有効化)
最後に、FreeRADIUS側で「PAMを使って認証するよ」という設定を行います。
1. ユーザー定義(usersファイル)の変更
これまで使っていた /etc/raddb/users(mods-config/files/authorize)を編集します。vpnuser に対して、特定のパスワードを設定するのではなく「PAM認証を使う」ように指示します。
sudo nano /etc/raddb/mods-config/files/authorize
以下のように記述します。
# vpnuserはPAM認証を使用する vpnuser Auth-Type := PAM
※前回までの Cleartext-Password := ... の行はコメントアウトまたは削除してください。
2. PAMモジュールの確認
デフォルトでPAMモジュールは有効になっていますが、念のため確認します。/etc/raddb/sites-enabled/default を開き、authenticate セクションを見ます。
authenticate {
...
# pam の行がコメントアウトされていないことを確認
pam
...
}
3. 再起動(デバッグモード)
設定を反映させるために再起動しますが、まずはデバッグモードで起動してエラーがないか確認します。
sudo systemctl stop radiusd sudo radiusd -X
Ready to process requests となればOKです。
第6章:接続テストとSELinuxの壁
いよいよテストです。
成功するかドキドキの瞬間ですが、十中八九、最初は失敗します。(SELinuxのため)
1. radtestでの接続(失敗パターンの確認)
別ターミナルからテストします。
パスワードは 「Linuxパスワード」+「スマホの6桁コード」 を続けて入力します。
例:パスワード vpnpass123、コード 567890 → vpnpass123567890
radtest vpnuser vpnpass123567890 localhost 1812 testing123
もし Access-Reject になり、デバッグログに pam_google_authenticator ... failed to open secret file ... と出ていたら、SELinuxがブロックしています。
2. SELinuxのトラブルシューティング
FreeRADIUS(radiusd)が、/etc/raddb/google_auth/ 以下のファイルを読み込むことを、SELinuxはデフォルトで許可していません。
これを許可するポリシーを作成します。
一時的に無効化して確認:
sudo setenforce 0 # もう一度radtestを実行 → Access-Accept になればSELinuxが原因確定
恒久対策(ポリシー作成):
# 監査ログから拒否されたログを抽出し、許可ルールを作成 sudo grep radiusd /var/log/audit/audit.log | audit2allow -M my-radius-auth # 作成されたルールを適用 sudo semodule -i my-radius-auth.pp # SELinuxを有効に戻す sudo setenforce 1
これで、SELinuxが有効なままでも認証が通るようになります。
第7章:実際の運用イメージと注意点
MFA環境が無事に構築できました。
実際の運用では、ユーザーにどうアナウンスすればよいでしょうか。
1. ユーザーへの案内
Wi-FiやVPNクライアントのパスワード入力欄には、「いつものパスワードの後ろに、アプリの6桁の数字を続けて入力してください」と案内します。
例:
パスワード:apple
ワンタイム:123456
入力値:apple123456
2. タイムアウト値の調整
MFAを行う場合、ユーザーがスマホを取り出してコードを確認する時間が必要なため、認証に時間がかかります。
FreeRADIUSやクライアント(Wi-Fi AP)のタイムアウト設定を少し長め(10秒〜30秒)にしておくと、認証失敗のトラブルを減らせます。
3. スマホを忘れた・紛失した時の対応
スマホがないとログインできません。
緊急時対応として、管理者だけが知っている「緊急用コード」をPAM設定に追加するか、一時的にMFAを無効にしたアカウントを発行する運用フローを決めておきましょう。
第8章:トラブルシューティング集
Q1. コードが合っているのに認証失敗する
原因: サーバーの時刻ズレ。
対策: TOTP(時間ベース)認証は、サーバーとスマホの時刻が一致していないと失敗します。chronyd などでNTP同期が正しく行われているか確認してください。
Q2. “Permissions on … are too permissive” エラー
原因: 設定ファイルの権限が緩すぎる。
対策: /etc/raddb/google_auth/ 以下のファイルは、所有者(radiusd)以外が読めないように 400 または 600 である必要があります。chmod 600 /etc/raddb/google_auth/vpnuser を実行してください。
まとめ:最強の認証サーバーが完成!
お疲れ様でした!
これであなたのRADIUSサーバーは、金融機関レベルのセキュリティ強度を手に入れました。
今回の重要ポイント:
- RADIUSのMFAは「パスワード連結入力」が基本。
- LinuxのPAM機能と
google-authenticatorを組み合わせる。 - 設定ファイルは
/etc/raddb/google_auth/に集約する。 - SELinuxの設定(audit2allow)が成功の鍵。
ここまでで、「認証」に関してはほぼ完璧です。
しかし、運用を続けると次に必要になるのが「誰が、いつ、どのくらい接続していたか」という記録(ログ)の管理です。
次回、第7回は「『誰がいつ繋いだ?』ログ管理とアカウンティングの極意」です。
認証ログだけでなく、セッション時間や通信量をDBに記録し、集計・分析する方法を解説します。
「先月のWi-Fi利用時間レポート」などが作れるようになりますよ。お楽しみに!
▼ エンジニアとしてのキャリアを加速させる ▼
MFAを実験
「VPS」で自分専用環境
サーバー知識を年収に
「ITエンジニア転職」

コメント