CentOS / UbuntuでsudoにRADIUSを追加して2要素認証を設定する
用語の簡単な定義
- RADIUS: ネットワーク認証と認可のためのプロトコル。
- PAM: Pluggable Authentication Modules、Linuxの認証フレームワーク。
- OTP: ワンタイムパスコード、一回限り有効な認証コード。
重要: 本手順は管理者権限(root)での操作が前提です。必ずテスト環境で検証してから本番に適用してください。
目的と適用範囲
目的: sudoコマンドによる管理操作に対してRADIUS経由の2要素認証を要求し、盗難・使い回し・弱パスワードによる横展開を防ぎます。RADIUSを仲介にする構成は、Active Directory/NPSやFreeRADIUS、WiKIDなど複数の2FAソリューションと組み合わせできます。
前提条件
- 対象はCentOS/RHEL 7系またはUbuntu 14.04系のサーバー。
- RADIUSサーバー(例: FreeRADIUS、Windows NPS、WiKID)が既に用意されているか別途用意できること。
- root権限またはsudo権限。
CentOS/RHEL 7での設定手順
以下はRHEL/CentOS 7上での手順です。
- 事前パッケージをインストール:
sudo yum -y install make gcc pam pam-devel
- pam_radiusのソースを入手(執筆時点で1.4が存在しましたが、最新版を確認してください):
wget ftp://ftp.freeradius.org/pub/radius/pam_radius-x.x.x.tar.gz
- ビルド手順:
tar -xzvf pam-radius-x.x.x.tar.gz
cd pam-radius-x.x.x
sudo ./configure
sudo make
- ライブラリを適切な場所へコピー:
cp pam_radius_auth.so /lib/security/
64ビット環境では:
cp pam_radius_auth.so /lib64/security/
- 設定ディレクトリを作成し、設定ファイルをコピー(名前を ‘server’ にします):
sudo mkdir /etc/raddb
cp pam_radius_auth.conf /etc/raddb/server
- /etc/raddb/server を編集してRADIUSサーバーのIPと共有シークレットを追加:
# server[:port] shared_secret timeout (s)
127.0.0.1 secret 1
radius_server_IP secret 3
#
# having localhost in your radius configuration is a Good Thing.
注: 開発や検証段階では、WiKIDなどを直接RADIUSサーバーにしてこのホストをクライアントとして追加し、動作確認を行うことができます。小さなテストを経て本番導入することを推奨します。
- sudoのPAM設定を変更: /etc/pam.d/sudo を開き、既存の “auth include system-auth” を以下に置き換えます:
auth required pam_radius_auth.so
これでCentOS/RHEL側の設定は完了です。RHEL/CentOS 5/6でも同様の手順で対応可能です。
Ubuntu 14.04での設定手順
Ubuntuではパッケージが用意されているので簡単です。
- pam-radiusパッケージをインストール:
sudo apt-get install libpam-radius-auth
- /etc/pam_radius_auth.conf を編集し、RADIUSサーバーと共有シークレットを設定:
# server[:port] shared_secret timeout (s)
127.0.0.1 secret 1
radius_server_IP secret 3
#
# having localhost in your radius configuration is a Good Thing.
- /etc/pam.d/sudo にpam_radiusを追加。common-authより上に次の行を挿入します:
auth required pam_env.so readenv=1 user_readenv=0
auth required pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth sufficient pam_radius_auth.so
@include common-auth
@include common-account
@include common-session-noninteractive
この設定により、sudo実行時にPAMがユーザー名とOTPをRADIUSサーバーへ転送して検証します。
実際のテスト方法
- SSHで別セッションを開き、sudoがロックアウトした場合にアクセスできるようにする。
- 管理者アカウントでsudoを実行し、通常のパスワード入力後にOTPの入力を求められることを確認する。
- RADIUSサーバーのログで認証フロー(アクセス要求、応答)を確認する。
よくある問題と対処(トラブルシューティング)
- 認証が失敗する: 共有シークレットが一致しているか、RADIUSサーバー側でクライアントIPを許可しているか確認。
- タイムアウト/ネットワークエラー: UDPポート1812がファイアウォールで許可されているか検査。RADIUSはUDPを使うためパケットロスに注意。
- sudoから期待どおりにPAMモジュールが呼ばれない: /etc/pam.d/sudo の行順やモジュールオプションを確認。 “required” と “sufficient” の扱いで挙動が変わる。
- ログ確認: /var/log/secure (CentOS/RHEL) や /var/log/auth.log (Ubuntu) を確認し、pam_radiusやRADIUSのエラーを探す。
代替アプローチと設計上の考慮
- SSHのパブリックキー + 2FA: 管理者のSSHログインに対しても2要素を要求したい場合、PAMでsshdの設定を変更するか、OTPを用いるプロキシを導入する。
- 1つのサーバーに統合しない: 認可はディレクトリ(例: LDAP/AD、NPS)で、認証(OTP)は別の2FAサーバーで行うと、責務を分離できる。
- ハードウェアトークン vs. ソフトトークン: 運用コストやユーザー体験を考慮して選択する。
いつこの方法が適さないか(反例)
- RADIUSが使用できない隔離環境や非常に高い可用性が求められる環境では不適。
- ネットワーク遅延が極めて高い環境ではOTPのUXが悪化する。
- 単純に少人数でオンプレの認証を簡潔に保ちたい場合は、別の軽量な2FAソリューションが適することがある。
運用チェックリスト(ロール別)
- システム管理者:
- RADIUSサーバーの冗長化検討。
- pam_radiusのバージョン管理とセキュリティパッチ適用。
- テストユーザーで検証を行う。
- セキュリティ担当:
- 監査ログの保持とアラート設定。
- 共有シークレットの安全な管理(Vault等)。
- ヘルプデスク/運用担当:
- ログイン問題の切り分け手順を用意。
- トークン紛失時のワークフローを定義。
セキュリティ強化のヒント
- 共有シークレットはファイルの権限で厳しく保護する(chmod 600など)。
- RADIUSサーバーとクライアント間は可能な場合TLSで保護する(RadSec等を検討)。
- sudoのPAM設定を誤ると管理者がロックアウトされる可能性があるため、必ず別シェルでリカバリ手段を確保する。
互換性と移行メモ
- pam_radius実装には複数の派生が存在します。OSディストリで提供されるパッケージとソースビルドの違いに注意。
- RHEL/CentOSのパス(/lib/security、/lib64/security)とUbuntuの提供パッケージは差異があります。
- 古いOSバージョンではパッケージ名やPAM設定の構成が異なる場合があるため、事前に確認してください。
テストケース(受け入れ基準)
- 管理者がsudoを実行したときにOTP入力を求められること。
- 正しいOTPであればコマンドが実行され、誤ったOTPでは拒否されること。
- RADIUSサーバーが不応答の場合、ログが出力され、復旧手順が動作すること。
終わりに(まとめ)
- RADIUSを介したsudoの2要素認証は、中央ディレクトリで認可を行い、別の2FAサーバーで認証検証する運用に有効です。
- 設定は比較的シンプルですが、PAMとRADIUSの挙動を正しく理解し、テストと運用手順を整備することが重要です。
まとめのキーポイント:
- pam_radiusはRADIUS経由でsudoに2FAを追加する簡潔な方法です。
- 共有シークレットとネットワーク設定、ログ監視を必ず確認してください。
- 本番導入前に検証環境で十分にテストし、リカバリ手順を用意してください。
著者
編集