【FreeRADIUS講座 第6回】セキュリティ極限強化!Google Authenticatorによる多要素認証(MFA)構築完全ガイド

パスワードが盗まれても、破られない扉を作る。

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、電子証明書を使った鉄壁のWi-Fi認証(EAP-PEAP)を構築しました。

しかし、セキュリティの世界に「絶対」はありません。
もし、社員のPCがマルウェアに感染し、IDとパスワード、そして証明書までもが盗み出されてしまったら?
攻撃者はその情報を使い、社外から堂々とVPNやWi-Fiに侵入できてしまいます。

コウ君

先生、それじゃあ何をしても無駄ってことですか!?
パスワードを長くしても盗まれたら終わりだし、証明書もコピーされたらおしまい…。
もう打つ手なしじゃないですか!

リナックス先生

諦めるのは早いわ、コウ君。
盗まれた情報だけでは突破できない「最後の壁」を追加すればいいの。
それが「多要素認証(MFA)」よ。
スマホに表示される、30秒ごとに変わる「ワンタイムパスワード」を使えば、たとえIDとパスワードが流出しても、犯人は侵入できないわ!

今回は、FreeRADIUSとGoogle Authenticator(スマホアプリ)を連携させ、最強のセキュリティ環境を構築します。
Linuxの認証機構「PAM」を駆使する高度な内容ですが、手順通りに進めれば必ず動きます。

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


第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)」を利用します。

  1. FreeRADIUSがリクエストを受け取る。
  2. FreeRADIUSは判断をPAMに丸投げする。
  3. PAMはGoogle Authenticatorモジュールを使ってコードを検証する。
  4. 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、コード 567890vpnpass123567890

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」で自分専用環境

おすすめVPSを見る

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

転職エージェントを見る

コメント