freeRADIUSの認証・認可をMSGraphとAzureADで実装した話

前回の書ききれなかった部分を書きます。

  • AzureADのセキュリティグループを利用した、NWスイッチログインの認可設定
  • NWスイッチログイン後の特権モード(Cisco-AVPair = "shell:priv-lvl=15"の事)
  • OAuth2認証時、環境変数のProxyが読み込まれずWebアクセスができなかった話

1. 特定のセキュリティグループ所属以外はRejectする

AzureADで接続許可用のグループを作成し、該当ユーザを参加させます。
/etc/freeradius/sites-enabled/defaultauthorizeoauth2のすぐ下に以下を追加します。

...
authorize {
...
        -ldap

        oauth2
if (updated) {
    if (!(&OAuth2-Group && &OAuth2-Group[*] == "ラディウスアクセス許可グループ")) {
    reject
    }
}

文字列の部分は、グループの名前の部分です。日本語でもOKでした。

2. NWスイッチログイン時の特権付与

/etc/freeradius/sites-enabled/defaultpost-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-perlmain.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#

まだ調べ切れていないので、次回に回します。