びぼうろぐ

ネ申エクセルからの卒業

【CentOS8】ActiveDirectory+GoogleAuthenticatorなRADIUSサーバを立てる

Windows Server でもRADIUSサーバは作れるようなんですが、Google Authenticator は Windows Server に対応していないみたいですよね(´・ω・`)

NPS を RADIUS サーバーとして計画する | Microsoft Docs

そのためGoogle Authenticator を利用するRADIUSサーバをLinuxで組んでみます。
前回の記事で扱ったActiveDirectoryのユーザ情報を利用する方法も組み合わせてみます。

構成&前提

  • OS: CentOS8(1911)
    • minimal
    • GoogleAuthenticator導入済み*1
    • ドメイン参加済み*2
    • SELinuxPermissive or Disabled にしておく
    • FreeRADIUS: 3.0.17
  • ドメインコントローラ: Windows Server 2019(評価版)
    • ドメイン名: test.com
    • 動作確認用として適当なユーザ(user1)を作っておきましょう

手順

インストール

$ sudo yum install -y freeradius freeradius-utils

$ radiusd -v
radiusd: FreeRADIUS Version 3.0.17, for host x86_64-redhat-linux-gnu
FreeRADIUS Version 3.0.17
Copyright (C) 1999-2017 The FreeRADIUS server project and contributors
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE
You may redistribute copies of FreeRADIUS under the terms of the
GNU General Public License
For more information about these matters, see the file named COPYRIGHT

設定変更

radiusdには各ユーザのホームディレクトリにあるファイルを参照・変更してもらう必要があるので、実行ユーザをrootに変更します。 また認証ログを出力するようにします。

# 以下の通り変更します
$ sudo vi /etc/raddb/radiusd.conf

304c304
<       auth = no
---
>       auth = yes
312,313c312,313
<       auth_badpass = no
<       auth_goodpass = no
---
>       auth_badpass = yes
>       auth_goodpass = yes
400,401c400,401
<       user = radiusd
<       group = radiusd
---
>       user = root
>       group = root

PAMモジュールを有効化します。

# 設定ファイルの確認
$ sudo ls -l /etc/raddb/sites-enabled/
合計 0
lrwxrwxrwx. 1 root radiusd 26 11月 14 06:51 default -> ../sites-available/default
lrwxrwxrwx. 1 root radiusd 31 11月 14 06:51 inner-tunnel -> ../sites-available/inner-tunnel
# 実体は/etc/raddb/sites-available/default

# 以下の通り変更します
$ sudo vi /etc/raddb/sites-available/default

513c513
< #     pam
---
>       pam

# 使用可能なモジュールにPAMを追加
$ sudo ln -s /etc/raddb/mods-available/pam /etc/raddb/mods-enabled/pam

# 所有権を既存のSymlinkに合わせる
$ sudo chown -h root:radiusd /etc/raddb/mods-enabled/pam

認証方式を設定します。

# 以下を追記します
$ sudo vi /etc/raddb/users

DEFAULT Auth-Type := PAM 

RADIUSを利用するクライアントを定義します。

# 以下を追記します
$ sudo vi /etc/raddb/clients.conf

client my_devices {
        ipaddr = 192.168.0.0/16
        secret = hogehogehoge
        require_message_authenticator = no
        nas_type = other
}

RADIUSの認証には Google Authenticator のみ使用するように変更します。

# ファイルの内容を以下の通りに変更します
$ sudo vi /etc/pam.d/radiusd
#%PAM-1.0
auth            requisite       pam_google_authenticator.so
account         required        pam_permit.so
session         required        pam_permit.so

FirewallRADIUS通信を許可します。

$ sudo firewall-cmd --permanent --zone=public --add-service=radius
$ sudo firewall-cmd --reload

サービスを開始します。

$ sudo systemctl start radiusd
$ sudo systemctl enable radiusd

動作確認

事前にドメインユーザ(user1@test.com)としてRADIUSサーバにログインし、google-authnticatorコマンドを実行しておきます。

# ローカルで認証させてみる
$ radtest user1@test.com <6桁のコード> localhost 0 testing123
Sent Access-Request Id 1 from 0.0.0.0:33629 to 127.0.0.1:1812 length 84
        User-Name = "user1@test.com"
        User-Password = "856363"
        NAS-IP-Address = <radius's_address>
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "856363"
Received Access-Accept Id 1 from 127.0.0.1:1812 to 127.0.0.1:33629 length 20

# 外部のクライアントとして認証させる
$ radtest user1@test.com <6桁のコード> <radius's_address> 0 hogehogehoge
Sent Access-Request Id 171 from 0.0.0.0:35101 to <radius's_address>:1812 length 84
        User-Name = "user1@test.com"
        User-Password = "741359"
        NAS-IP-Address = <radius's_address>
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "741359"
Received Access-Accept Id 171 from 192.168.0.240:1812 to 192.168.0.240:35101 length 20

‘Received Access-Accept‘が返ってきているので、認証に成功していますね!

SELinuxのポリシー修正

radiusdの動きに変更を加えたので、SELinuxのポリシーを修正します。

# SELinuxの出力確認
$ sudo audit2allow -a

#============= radiusd_t ==============
allow radiusd_t auth_home_t:file { getattr open read unlink };
allow radiusd_t user_home_dir_t:dir { add_name remove_name write };
allow radiusd_t user_home_dir_t:file { create open read rename setattr write };

# ポリシーの作成
$ sudo audit2allow -a -M radiusd_ga
******************** 重要 ***********************
このポリシーパッケージを有効にするには、以下を実行して下さい:

semodule -i radiusd_ga.pp

# 作成したポリシーのインポート
$ sudo semodule -i radiusd_ga.pp

とりあえず動くところまで確認できたので、あとは公式のドキュメントを見ながらチューニングしましょう。

参考

*1:【CentOS8】GoogleAutheticatorのOTPでサーバにsshする を参照してください

*2:【CentOS8】ActiveDirectoryのユーザでLinuxsshする を参照してください