Hyper-Vを利用したサーバ検証環境の構築 その6 RADIUSの再構築

1. 前書き

前回の続きです。
RADIUSをAzureADと連携させるためにfreeradius-oauth2-perlを使うつもりでした。前回記載した構築手順が誤っていたようなので、再構築します。前回のサーバは破棄し、新たに作り直します。

2. Ubuntuの準備(手順省略)

利用しているバージョンは22.04です。

3. FreeRADIUSのインストール

FreeRADIUS 3.2を利用することにしました。freeradius-oauth2-perlnetworkradiusの手順に従って作業します。
gitからfreeradius-oauth2-perlをcloneします。 場所は/opt配下です。ほかの場所だとソースコードを変更することになります。注意してください。

# gitにproxyを設定
user@freeradius:~$ git config --global http.proxy http://10.24.1.10:8080

# gitからfreeradius-oauth2-perlをクローン
user@freeradius:~$ cd /opt
user@freeradius:/opt$ git clone https://github.com/jimdigriz/freeradius-oauth2-perl.git
user@freeradius:/opt$ cd freeradius-oauth2-perl
user@freeradius:/opt/freeradius-oauth2-perl$

freeradius-oauth2-perlを準備します。

user@freeradius:~$ sudo apt-get -y install --no-install-recommends ca-certificates curl libjson-pp-perl libwww-perl

このページに従いaptのリポジトリを変更します。

NetworkRADIUS PGP 公開キーを追加します。
Proxy経由でcurlするため、-xオプションを追加しています。

user@freeradius:~$ curl -s 'https://packages.networkradius.com/pgp/packages%40networkradius.com' -x http://10.24.1.10:8080 | \
    sudo tee /etc/apt/keyrings/packages.networkradius.com.asc > /dev/null

すべての freeradius パッケージが Network RADIUS リポジトリからインストールされるようにします。

user@freeradius:~$ printf 'Package: /freeradius/\nPin: origin "packages.networkradius.com"\nPin-Priority: 999\n' | \
    sudo tee /etc/apt/preferences.d/networkradius > /dev/null

APT ソース リストを追加します。

echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/packages.networkradius.com.asc] http://packages.networkradius.com/freeradius-3.2/ubuntu/jammy jammy main" | \
    sudo tee /etc/apt/sources.list.d/networkradius.list > /dev/null

最後に、APT データベースを更新し、パッケージをインストールします。

sudo apt-get update
sudo apt-get install freeradius

正常にインストールされたか確認します。

user@freeradius:~$ dpkg-query --showformat '${Maintainer}\n' -W freeradius
Network RADIUS SARL <info@networkradius.com>

出力に「Network RADIUS SARL」と表示されていることを確認します。前回のインストール方法だと「Ubuntu」と表示されてしまいました。

4. OAuth2の為の、アプリの登録(AzureAD)

このページを参考に、AzureADでアプリの登録をします。なおAzureADそのものの作成はここでは省略します。
この登録でメモが必要な値は以下の2つです。

  • アプリケーション(クライアント)ID
  • クライアントシークレットの値
    クライアントシークレットの値は、作成時以降は非表示になってしまうので注意してください。

  • AzureActiveDirectoryの画面に遷移し、「追加」→「アプリの登録」を選択します。

  • 名前に[freeradius-oauth2-perl]を入力、この組織ディレクトリのみに含まれるアカウント (既定のディレクトリ のみ - シングル テナント)、リダイレクトURIは空白で登録します。
  • 「証明書とシークレット」に移動し、「新しいクライアント シークレット」をクリックします。 この「値」は 今後の設定で使いますが、この画面を抜けたら見れなくなるので、必ずメモしてください。

  • APIアクセス許可を追加します。
  • Microsoft Graph」をクリックし、「Directory.Read.All」を有効にします。

  • 「規定のディレクトリに管理者の同意を与えます」をクリックして「はい」を押します。

    以上でAzureADの準備は終わりです。

5. FreeRADIUSのConfig設定

oauth2.0認証を有効にするための手順です。編集するのは以下2つのファイルです。

  • /etc/freeradius/proxy.conf
  • /etc/freeradius/sites-enabled/default
proxy.confを編集する

proxy.confには凡例でrealm example.comの記載がありますので、それより前に以下を記載します。
%{Realm}はそのままでexample.onmicrosoft.comを読み込みます。

realm example.onmicrosoft.com {
    oauth2 {
        discovery = "https://login.microsoftonline.com/%{Realm}/v2.0"
        client_id = "4. でメモしたアプリケーション(クライアント)ID"
        client_secret = "4. でメモしたクライアントシークレットの値"
        cache_password = yes
    }
}

※discoveryのURLはどうやらhttps://login.microsoftonline.com/%{Realm}/v2.0/.well-known/openid-configurationを取ってくるようです。

defaultを編集する
  • authorizeでは、-ldapの後、コメント化された#dailyの前にOAuth2を追加する必要があります。
  • authenticateでは、一番最後にAuth-Type oauth2{oauth2}を追加します。
  • post-authでは、コメント化された#ldapの後、そしてexecの前にoauth2を追加する必要があります。
authorize {
    ...

    -ldap

    oauth2
    #if (updated) {
    #
    #    # uncomment to enforce the group membership 'network-users'
    #    if (!(&OAuth2-Group && &OAuth2-Group[*] == "network-users")) {
    #        reject
    #    }
    #
    #    # uncomment to use group membership for VLAN assignment
    #    update {
    #        Tunnel-Type := VLAN
    #        Tunnel-Medium-Type := IEEE-802
    #        Tunnel-Private-Group-ID := 11
    #    }
    #    if (&OAuth2-Group) {
    #        if (&OAuth2-Group[*] == "staff") {
    #            update {
    #                Tunnel-Private-Group-ID := 13
    #            }
    #        } elsif (&OAuth2-Group[*] == "students") {
    #            update {
    #                Tunnel-Private-Group-ID := 15
    #            }
    #        } else {
    #            update {
    #                Tunnel-Private-Group-ID := 17
    #            }
    #        }
    #    }
    #
    #}

    #daily

    ...
}

...

authenticate {
    ...

#   Auth-Type eap {
#       ...
#   }

    Auth-Type oauth2 {
        oauth2
    }
}

post-auth {
    ...

    #ldap

    oauth2

    exec

    ...
}
FreeRADIUSの再起動と接続テスト

systemctl restart freeradiusでサービス再起動する。
以下コマンドで接続テストを実施。

radtest radius@example.onmicrosoft.com password 10.24.2.10 1813 testing123

Received Access-Acceptすれば成功です。

6. 書ききれなかったこと

いくつかありますので、次回記載します。

  • OAuth2認証時、WebProxyのPATHが通っていなかったので対処法(たぶんおま環)
  • AzureADのセキュリティグループによる接続のコントロール(許可G以外はReject
  • その場合のネットワークスイッチログイン時の特権付与