freeRADIUSの認証・認可をMSGraphとAzureADで実装した話
前回の書ききれなかった部分を書きます。
- AzureADのセキュリティグループを利用した、NWスイッチログインの認可設定
- NWスイッチログイン後の特権モード(Cisco-AVPair = "shell:priv-lvl=15"の事)
- OAuth2認証時、環境変数のProxyが読み込まれずWebアクセスができなかった話
1. 特定のセキュリティグループ所属以外はRejectする
AzureADで接続許可用のグループを作成し、該当ユーザを参加させます。
/etc/freeradius/sites-enabled/default
のauthorize
、oauth2
のすぐ下に以下を追加します。
... authorize { ... -ldap oauth2 if (updated) { if (!(&OAuth2-Group && &OAuth2-Group[*] == "ラディウスアクセス許可グループ")) { reject } }
文字列の部分は、グループの名前
の部分です。日本語でもOKでした。
2. NWスイッチログイン時の特権付与
/etc/freeradius/sites-enabled/default
のpost-auth
に設定します。
... post-auth { ... Post-Auth-Type REJECT { ... } if (!(&OAuth2-Group && &OAuth2-Group[*] == "ラディウスアクセス許可グループ")) { reject } else { update reply { Cisco-AVPair = 'shell:priv-lvl=15' } } }
ラディウスアクセス許可グループ
に参加している場合、Cisco-AVPair = 'shell:priv-lvl=15'
の属性を付けてスイッチにログインできます。1.と合わせてアクセス権限のコントロールができそうです。
属性値はネットワーク機器ベンダーで異なるようです。今回はVyOS
用に設定しています。
3. 認証できない(Proxyが有効にならない)
RADIUSがOAuth2でMSGraphに認証する構成で、以下のテストを実施した。
radtest radius@example.onmicrosoft.com password 10.24.2.10 1813 testing123
認証が通らず、RADIUSのログでは500エラーがでていた。
Error: rlm_perl: oauth2 worker (example.onmicrosoft.com): discovery failed: 500 Can't connect to login.microsoftonline.com:443 (Network is unreachable)
Proxyにはアクセスしたログがなかったため、そもそもお外に通信が出ていないっぽい。
freeradius-oauth2-perl
のmain.pm
を見てみた。
... my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy; ...
perlのクラスLWP::UserAgent
の、env_proxy()
メソッドを使っていました。環境変数から値を取ってくるようですが、これがうまくいっていないようでした。
環境変数を確認し、テストコードで動作確認してみました。
#!/usr/bin/perl use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new; $ua->timeout(10); $ua->env_proxy(); my $state = 'https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration'; my $req = POST($state); my $res = $ua->request($req); if ($res->is_success) { print $res->title . "\n"; } else { print $res->status_line . "\n"; }
結果Webアクセスでき、ページのtitleが表示されたのですが…
freeRADIUSではなぜかWebアクセスができない状態が続きました。
仕方ないのでmain.pm
をいじって、Proxyをベタで指定したらひとまず接続できました。
... my $ua = LWP::UserAgent->new; $ua->timeout(10); #$ua->env_proxy; $ua->proxy(['http', 'gopher', 'ftp', 'https'], 'http://10.24.1.10:8080/'); ...
その後調べて、freeradius.service
を実行しているユーザの環境変数が想定通りになっていないのでは?という疑問が出てきて、予想通りProxy環境変数が無かったのです。
root@freeradius:/etc/freeradius/sites-enabled# sudo -u freerad printenv |grep proxy root@freeradius:/etc/freeradius/sites-enabled#
まだ調べ切れていないので、次回に回します。