8
16
2025
ArubaのAPを用いて認証VLANを実装してみる#7 (LDAPとの連携)
RADIUSサーバをLDAPサーバと連携させる
前回の記事で認証VLANの実装方法について説明したが、テスト環境なのでRADIUSサーバ側のユーザ情報を記載したファイル内に認証VLANに関する属性値を記載したが、この方法ではユーザ情報に変更がある度に毎回RADIUSサーバ側の設定ファイルを更新しなければならないので、数人程度の規模の組織や家庭などでなければ使い物にならないだろう.
会社や大学などの組織では大抵の場合、エンドユーザのアカウント情報を集中管理するための何らかのディレクトリシステムが運用されている.Windows系のPCが多い組織では、Active Directoryを中心としたシステム、アカデミック系の機関では昔からUNIX系のOSがメインだったこともあり、LDAPを中心としたシステムで構成することが一般的だろう.
ユーザに関する情報はこれらのディレクトリシステムによって集中管理されており、ネットワーク接続のためのユーザ情報を別なRADIUSサーバ上で管理するというのは運用や管理の手間を考えると非現実的な方法だ.
この問題を解決する簡単な方法として、RADIUSサーバ側にはエンドユーザ情報を持たせないで、RADIUSサーバが参照すべきユーザ情報や属性については外部のディレクトリシステムへ問い合わせる仕組みを導入するのが一般的な運用方法だ.この方法であればディレクトリシステムの運用は現行のワークフローが既に確立しているので、管理や運用のコストは低いだろう.
但し、既存のディレクトリシステムがRADIUSサーバと連携していてネットワーク認証もこのディレクトリサーバによって認証される仕組みが整っている場合は良いが、ディレクトリサーバが全くネットワーク認証の事を考慮せずに作成されている場合は結構厄介だ.既存の運用中のディレクトリシステムに手を加えることはかなりリスキーな改修となるので、それなりの準備期間と改修コストが掛かるだろう.
今回は、FreeRADIUSサーバを既存のOpenLDAPサーバと連携させる方法について紹介する.尚、今回のテスト用に用いたOpenLDAPはRHEL7.4以降の環境では非推奨扱いになり、世の中的には 389 Directory Server へ移行する流れのようだ.LDAPサーバそのものの構築についてはまた別な機会に紹介しようと思う.
FreeRADIUSをLDAP連携させるためのスキーマファイルの準備
既存のLDAPサーバが稼働しているのであれば、そこにRADIUS関連のスキーマを追加して、エンドユーザのエントリーにRADIUS関連の属性データを追加するという手順を踏めば良いのだが、既存のLDAPサーバがどのように構成されているのかによって手順が異なるので、今回はこのテストのために新規でOpeLDAPサーバを立ち上げることにした.
今回実験用に立ち上げたOpenLDAPサーバはFreeRADIUSと連携して認証VLANの機能を実現するための物で、いい加減な実装なのでセキュリティー的な配慮は殆ど行っていないので、本番環境に実装する場合はLDAP側のセキュリティー対策やFirewall関連の設定などを精査する必要があるだろう.
FreeRADIUSをLDAP連携させる場合の注意点などについて、”Authenticating Users with LDAP” に記載されているので、一通り目を通して置くこと良いだろう.
FreeRadiusのGitHub上にドキュメント “freeradius-server/doc/schemas/ldap/openldap/” に、RADIUS関連のスキーマファイルが置かれている.”freeradiu.schema” と LDIF形式の “freeradius.ldif” があるので、OpenLDAPのスキー マファイルのディレクトリ(通常は “/etc/openldap/schema/”)にコピーしておく.
“freeradiu.schema”の内容に目を通して、前回の記事で紹介した認証VLANで必要となるRADIUSの”Tunnel Attributes” 関連の3つの属性に対応するLDAPの”attributetype”が含まれていることが確認出来るだろう.
RADIUS LDAP
"Tunnel-Type" 'radiusTunnelType'
"Tunnel-Medium-Type" 'radiusTunnelMediumType'
"Tunnel-Private-Group-ID" 'radiusTunnelPrivateGroupId'
上記の “freeradiu.schema” と LDIF形式の “freeradius.ldif” のファイルは、FreeRADIUSの公式リポジトリに置かれた物であるが、 ”redBorder” というGitHubのリポジトリにも LDAP関連のRADISU用スキーマファイルが置かれている.
”https://github.com/redBorder/freeradius/tree/master/doc/schemas/ldap”
OpenLDAP用の他に、”iPlanet Directory Server” 用のスキーマ定義ファイルが置かれているが、2013年当時の物のようだ.内容を詳しく見ていないが、今回の認証VLANの実装用途ではどちらを使っても問題なさそうだ.今回は、FreeRADIUSのリポジトリではなく、redBorder版の “openldap.ldif”, “openldap.schema” ファイルを用いた.ファイル名が紛らわしかったので、それぞれ”radius.ldif”, “radius.schema”に変更してある.
OpenLDAPのスキーマディレクトリ内のファイルをリスティングしておく.OpenLDAPのインストール時にデフォルトでインストールされるスキーマファイル以外にも、QNAPのLDAPからの移行用のスキーマやSamba関連のスキーマが追加されている.(日付が “May 22” となっているファイルがデフォルトでインストールされているファイル群)
[root@ns7 schema]# pwd
/etc/openldap/schema
[root@ns7 schema]# ls -la
total 708
drwxr-xr-x 2 root root 4096 Aug 16 09:06 .
drwxr-xr-x. 5 root root 92 Aug 16 08:53 ..
-rw-r--r-- 1 root root 28047 Aug 16 09:00 apple.ldif
-rw-r--r-- 1 root root 33278 Aug 16 09:00 apple.schema
-rw-r--r-- 1 root root 444 Aug 16 09:00 apple_auxillary.ldif
-rw-r--r-- 1 root root 718 Aug 16 09:00 apple_auxillary.schema
-r--r--r-- 1 root root 2036 May 22 2024 collective.ldif
-r--r--r-- 1 root root 6191 May 22 2024 collective.schema
-r--r--r-- 1 root root 1845 May 22 2024 corba.ldif
-r--r--r-- 1 root root 8063 May 22 2024 corba.schema
-r--r--r-- 1 root root 20619 May 22 2024 core.ldif
-r--r--r-- 1 root root 20506 May 22 2024 core.schema
-r--r--r-- 1 root root 12006 May 22 2024 cosine.ldif
-r--r--r-- 1 root root 73995 May 22 2024 cosine.schema
-r--r--r-- 1 root root 3594 May 22 2024 dsee.ldif
-r--r--r-- 1 root root 3374 May 22 2024 dsee.schema
-r--r--r-- 1 root root 4842 May 22 2024 duaconf.ldif
-r--r--r-- 1 root root 10389 May 22 2024 duaconf.schema
-r--r--r-- 1 root root 3500 May 22 2024 dyngroup.ldif
-r--r--r-- 1 root root 3523 May 22 2024 dyngroup.schema
-r--r--r-- 1 root root 3481 May 22 2024 inetorgperson.ldif
-r--r--r-- 1 root root 6267 May 22 2024 inetorgperson.schema
-r--r--r-- 1 root root 2979 May 22 2024 java.ldif
-r--r--r-- 1 root root 13901 May 22 2024 java.schema
-r--r--r-- 1 root root 2082 May 22 2024 misc.ldif
-r--r--r-- 1 root root 2387 May 22 2024 misc.schema
-r--r--r-- 1 root root 121865 May 22 2024 msuser.ldif
-r--r--r-- 1 root root 113752 May 22 2024 msuser.schema
-r--r--r-- 1 root root 1218 May 22 2024 namedobject.ldif
-r--r--r-- 1 root root 1574 May 22 2024 namedobject.schema
-r--r--r-- 1 root root 6809 May 22 2024 nis.ldif
-r--r--r-- 1 root root 7640 May 22 2024 nis.schema
-r--r--r-- 1 root root 3308 May 22 2024 openldap.ldif
-r--r--r-- 1 root root 1514 May 22 2024 openldap.schema
-r--r--r-- 1 root root 6904 May 22 2024 pmi.ldif
-r--r--r-- 1 root root 20467 May 22 2024 pmi.schema
-rw-r--r-- 1 root root 4571 Aug 16 09:01 ppolicy.ldif
-rw-r--r-- 1 root root 20489 Aug 16 09:01 ppolicy.schema
-rw-r--r-- 1 root root 12383 Aug 16 09:01 radius.ldif
-rw-r--r-- 1 root root 14479 Aug 16 09:01 radius.schema
-rw-r--r-- 1 root root 14275 Aug 16 09:06 samba.ldif
-rw-r--r-- 1 root root 23182 Aug 16 09:06 samba.schema
スキーマファイルの追加
RADIUS関連のスキーマファイルが用意できたところで、OpenLDAPにこのスキマーを追加インストールする.スキーマをインストールする方法はLDAPサーバによって異なるが、今回は OpeLDAP V2.6 でのインストール方法を示す.尚、OpenLDAPの古いバージョン(V2.4より前のバージョン)では、スキーマの変更方法は異なる.
[root@ns7 schema]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/radius.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=radius,cn=schema,cn=config"
[root@ns7 ~]# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn <== スキーマファイルの検索
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: cn=schema,cn=config
dn: cn={0}core,cn=schema,cn=config
dn: cn={1}cosine,cn=schema,cn=config
dn: cn={2}nis,cn=schema,cn=config
dn: cn={3}inetorgperson,cn=schema,cn=config
dn: cn={4}radius,cn=schema,cn=config <=== 今回追加した "RADIUS" のスキーマ
dn: cn={5}samba,cn=schema,cn=config
dn: cn={6}ppolicy,cn=schema,cn=config
dn: cn={7}apple_auxillary,cn=schema,cn=config
dn: cn={8}apple,cn=schema,cn=config
[root@ns7 ~]#
エンドユーザのエントリーを修正する
今回追加したRADIUS用のスキーマで定義されている認証VLAN用のRADIUS属性はLDAPサーバ上の各ユーザのエントリーには反映されていないので、既存のユーザエントリーに対しては認証VLAN用の3つのRADIUS属性をLDAPの項目として追加する必要がある.
3つのRADIUS属性の内、実際にユーザに紐付くのは “radiusTunnelPrivateGroupId” だけでなので、他の2つの属性 “radiusTunnelType” と”radiusTunnelMediumType” は全員共通なので、LDAP側に持たなくても良いのだが、LDAPのエントリー内容を見た際に、これらの属性が認証VLANに関する属性であることを解りやすくするために敢えて項目として載せている.
“radiusTunnelType” と”radiusTunnelMediumType” は RADIUSサーバ側に全員共通のエントリー項目として記載している.
LDAPのエントリーを修正する方法は色々あるが、LDAPAdministratorやWEBベースの phpLDAPAdminなどのGUIベースのツールを用う方法や、Unix系のコマンドラインに慣れているのであれば、OpenLDAPと共にインストールされる ldapaddやldapmodifyなどのコマンドラインツールを使って、LDIF形式のファイルを駆使してエントリーの編集作業を行うのが一番手っ取り早いだろう.
今回は試験用のユーザエントリーを一から作るのが面倒だったので、QNAP上のLDAP(中身はOpenLDAP)でユーザアカウント “y2admin” を作成し、そのLDIFデータを取り出し、それをテスト用のLDAPサーバ(OpenLDAP V2.6)にインポートしている.
QNAP上のLDAPに登録された ユーザ “y2admin” のLDIFファイルの内容は次のようになっている.
[~] # ldapsearch -x -h localhost -D "cn=xxxxxxx,dc=home,dc=yoko" -b "uid=y2admin,ou=people,dc=home,dc=yoko" -W -LLL
Enter LDAP Password:
dn: uid=y2admin,ou=people,dc=home,dc=yoko
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: sambaIdmapEntry
objectClass: apple-user
cn: y2admin
sn: y2admin
uid: y2admin
uidNumber: 1000000
gidNumber: 1000000
userPassword:: e0NSWVBUfS ---------- EeFZIdFd5QjNKVS4=
homeDirectory: /home/y2admin
shadowLastChange: 20315
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
shadowInactive: 0
shadowFlag: 0
displayName: y2admin
sambaSID: S-1-5-21-4011659892-1488691106-2880545186-1002
sambaLMPassword: FA8CFFF ------------ 6954A50
sambaNTPassword: 6821C54 ------------ FC59A7B1D7B
sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
00000000
sambaPwdLastSet: 1755301771
sambaAcctFlags: [U ]
sambaKickoffTime: 0
この内容をそのままテスト用のOpenLDAPサーバにインポートする.今回は”y2admin”ユーザは既に既存のLDAP上に登録されているという前提なので何も編集しない.(今回はテストなのでLDIFデータをLDIFファイルを使わずにインラインで直接入力している)
[root@ns7 ~]# ldapadd -x -D cn=yyyyyyy,dc=home,dc=yoko -W <<__EOD__
dn: uid=y2admin,ou=people,dc=home,dc=yoko
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: sambaIdmapEntry
objectClass: apple-user
cn: y2admin
sn: y2admin
uid: y2admin
uidNumber: 1000000
gidNumber: 1000000
userPassword:: e0NSWVBUfS ---------- EeFZIdFd5QjNKVS4=
homeDirectory: /home/y2admin
shadowLastChange: 20315
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
shadowInactive: 0
shadowFlag: 0
displayName: y2admin
sambaSID: S-1-5-21-4011659892-1488691106-2880545186-1002
sambaLMPassword: FA8CFFF ------------ 6954A50
sambaNTPassword: 6821C54 ------------ FC59A7B1D7B
sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
00000000
sambaPwdLastSet: 1755301771
sambaAcctFlags: [U ]
sambaKickoffTime: 0
__EOD__
Enter LDAP Password:
adding new entry "uid= y2admin,ou=people,dc=home,dc=yoko"
[root@ns7 ~]#
この"y2admin" ユーザのエントリーに、認証VLAN用の3つのRADIUS属性項目を追記することにする.この3つの属性に加え、RADIUS用のobjectClass : radiusprofile もエントリーに追加する必要がある.ldapmodifyコマンドの内容は次のようになるだろう.
[root@ns7 ~]# ldapmodify -x -D cn= yyyyyyy,dc=home,dc=yoko -W <<__EOD__
dn: uid=y2admin,ou=people,dc=home,dc=yoko
changetype: modify
add: objectClass
objectClass: radiusprofile
-
add: radiusTunnelType
radiusTunnelType: 13
-
add: radiusTunnelMediumType
radiusTunnelMediumType: 6
-
add: radiusTunnelPrivateGroupId
radiusTunnelPrivateGroupId: 250
__EOD__
Enter LDAP Password:
modifying entry "uid=y2admin,ou=people,dc=home,dc=yoko"
[root@ns7 ~]# ldapsearch -x -h localhost -D "cn=Manager,dc=home,dc=yoko" -b "uid=y2admin,ou=people,dc=home,dc=yoko" -W -LLL
Enter LDAP Password:
dn: uid=y2admin,ou=people,dc=home,dc=yoko
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: sambaIdmapEntry
objectClass: apple-user
objectClass: radiusprofile
cn: y2admin
sn: y2admin
uid: y2admin
uidNumber: 1000000
gidNumber: 1000000
userPassword:: e0NSWVBUfS ---------- EeFZIdFd5QjNKVS4=
homeDirectory: /home/y2admin
shadowLastChange: 20315
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
shadowInactive: 0
shadowFlag: 0
displayName: y2admin
sambaSID: S-1-5-21-4011659892-1488691106-2880545186-1002
sambaLMPassword: FA8CFFF ------------ 6954A50
sambaNTPassword: 6821C54 ------------ FC59A7B1D7B
sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
00000000
sambaPwdLastSet: 1755301771
sambaAcctFlags: [U ]
sambaKickoffTime: 0
radiusTunnelType: 13
radiusTunnelMediumType: 6
radiusTunnelPrivateGroupId: 250
[root@ns7 ~]#
新規でユーザを追加する場合は、ユーザの全てのエントリーを記載したLDIFファイルをldapaddコマンドでそのままインポートすれば良い.既存のディレクトリ管理システムを用いてユーザ管理を行っている場合は、新規ユーザ作成用のテンプレート等に、RADIUS関係の項目を追加するなどの修正が必要となるだろう.
LDAPと連携させるためのRADIUS側の設定
テスト用のLDAPサーバの準備ができたところで、今度はRADIUS側の設定を変更し、LDAPサーバから該当するユーザの"radiusTunnelPrivateGroupId" の値を取得し、RADIUSサーバがその値をVLANのIDとしてオーセンティケータであるAPに渡すための設定変更を行う.
先ず最初に、"/etc/raddb/sites-enabled/default" ファイルの内容を変更する.このファイルは1,200行以上もあるので、変更箇所を探すのが大変なので、行番号付きで変更箇所を提示する.
465 # configure the 'smbpasswd' module.
466 # smbpasswd
467
468 #
469 # The ldap module reads passwords from the LDAP database.
470 -ldap <=== マイナス記号を削除して "ldap" へ
471
472 #
473 # If you're using Active Directory and PAP, then uncomment
612 # However, it is necessary for Active Directory, because
613 # Active Directory won't give the passwords to FreeRADIUS.
614 #
615 # Auth-Type LDAP { <=== コメントを削除(3行分)
616 # ldap
617 # }
618
619 #
620 # Allow EAP authentication.
621 eap
622
同様に、同じディレクトリ内の、"/etc/raddb/sites-enabled/inner-tunnel" ファイル内にも ldapを使わないという設定が入っているので、こちらもldapを使う設定に変更する.
153 # smbpasswd
154
155 #
156 # The ldap module reads passwords from the LDAP database.
157 -ldap <=== マイナス記号を削除して "ldap" へ
158
242 # LDAP servers do not.
243 #
244 # Auth-Type LDAP { <=== コメントを削除(3行分)
245 # ldap
246 # }
247
248 #
ユーザ情報の定義ファイル "users" ( "/etc/raddb//mods-config/files/authorize" へのシンボリックリンク ) に、下記の行を追記する.追記の場所はテスト用のRADIUSローカルアカウントの定義の前あたりが良いだろう.ユーザ認証のデフォルトをLDAPへ問い合わせる様に設定する.
RADIUS属性として"Tunnel-Type = 13" と "Tunnel-Medium-Type = 6" を全員共通の属性として与えてあるが、LDAP側から対応する属性が得られた場合は、この属性値はLDAP側の値でオーバライドされる.
203
204 # On no match, the user is denied access.
205 #
206 #=========================================================================#
207 # Authentication Method : LDAP Account #
208 #=========================================================================#
209 DEFAULT Auth-Type = LDAP
210 Tunnel-Type = 13,
211 Tunnel-Medium-Type = 6,
212 Fall-Through = Yes
213
214
215
216 #########################################################
217 # You should add test accounts to the TOP of this file! #
218 # See the example user "bob" above. #
219 #########################################################
220 #
221 radtest007 Cleartext-Password := "Hi32da4"
222 Reply-Message := "Welcome, %{User-Name}"
223 ###########################################################
224 #
225 #=========================================================================#
226 # Test user account for authenticated VLAN
227 vl100user Auth-Type:=EAP, Cleartext-Password := "ImVL100"
228 Tunnel-Type = 13,
229 Tunnel-Medium-Type = 6,
230 Tunnel-Private-Group-Id = 100
231
232 vl200user Auth-Type:=EAP, Cleartext-Password := "ImVL200"
233 Tunnel-Type = 13,
234 Tunnel-Medium-Type =6,
235 Tunnel-Private-Group-Id = 200
"/etc/raddb/dictionay" ファイルの末尾に次の記述を加える.
#
# These attributes are examples
#
#ATTRIBUTE My-Local-String 3000 string
#ATTRIBUTE My-Local-IPAddr 3001 ipaddr
#ATTRIBUTE My-Local-Integer 3002 integer
#
#
#=============================================================================
# LDAP
VALUE Auth-Type LDAP 5
#=============================================================================
最後に、"/etc/raddb/mods-available/ldap" ファイルを編集して、今回設置したLDAPサーバに接続(バインド)するための設定を行う. 今回はテスト環境なので、LDAPSではなくLDAP(389)でLDAPサーバへ接続する.本番環境ではLDAPSでの接続を使うようにする.
LDAPサーバとの通信はLDAP(389)なので、IPアドレスでも構わないが、LDAPSでの接続では FQDN で接続するようにする.今回はテストなので接続用のアカウントに管理ユーザを使っているが、本番環境ではLDAP側のアカウント権限やアクセス権をきちんと設定してセキュリティーを高める工夫が必要になる.
LDAPの接続情報の他に、RADIUS側の属性とLDAP側の属性情報のマッピングを指定する部分があるが、ここでは RADIUS側の 'NT-Password' と 'Tunnel-Private-Group-ID' をマッピングしている.
今回は、EAP-PEAP(MSCHAPv2)による認証を行うので、ユーザのパスワード情報は'sambaNTPassword'を用いているが、QNAPのLDAPではsmbldap-toolsで作成されたパスワードハッシュを'sambaNTPassword'に設定しているようなので、パスワードのハッシュはこの値を使うことにする.この辺の設定はLDAP側でどのようなパスワード情報を持っているのかによって適宜変更する必要があるだろう.
LDAPではユーザのパスワード情報をどのように記録するのかはLDAPクライアントとの整合性の問題があり、いつも苦労することになる.
認証VLANのID情報に用いるRADIUS属性 'Tunnel-Private-Group-ID' の返答を LDAPの'radiusTunnelPrivategroupId' 属性から取得した値をそのままRADIUS応答として返すように競ってしている.
...
# Lightweight Directory Access Protocol (LDAP)
#
ldap {
# Note that this needs to match the name(s) in the LDAP server
# certificate, if you're using ldaps. See OpenLDAP documentation
# for the behavioral semantics of specifying more than one host.
#
# Depending on the libldap in use, server may be an LDAP URI.
# In the case of OpenLDAP this allows additional the following
# additional schemes:
# - ldaps:// (LDAP over SSL)
# - ldapi:// (LDAP over Unix socket)
# - ldapc:// (Connectionless LDAP)
# server = 'localhost'
# server = 'ldap.rrdns.example.org'
# server = 'ldap.rrdns.example.org'
#========================================================
server = 'ns.admin.home.yoko'
#========================================================
#========================================================
# identity = 'cn=admin,dc=example,dc=org'
# password = mypass
identity = 'cn=yyyyyy,dc=home,dc=yoko'
password = Naisyo!
#========================================================
# Unless overridden in another section, the dn from which all
# searches will start from.
#========================================================
base_dn = 'dc=home,dc=yoko'
#========================================================
...
# Note: LDAP attribute names should be single quoted unless you want
# the name value to be derived from an xlat expansion, or an
# attribute ref.
update {
control:Password-With-Header += 'userPassword'
# control:NT-Password := 'ntPassword'
# reply:Reply-Message := 'radiusReplyMessage'
#===================================================================================#
# reply:Tunnel-Type := 'radiusTunnelType'
# reply:Tunnel-Medium-Type := 'radiusTunnelMediumType'
# reply:Tunnel-Private-Group-ID := 'radiusTunnelPrivategroupId'
#===================================================================================#
reply:Tunnel-Private-Group-ID := 'radiusTunnelPrivategroupId'
#===================================================================================#
#===================================================================================#
control:NT-Password := 'sambaNTPassword'
#===================================================================================#
# Where only a list is specified as the RADIUS attribute,
# the value of the LDAP attribute is parsed as a valuepair
# in the same format as the 'valuepair_attribute' (above).
control: += 'radiusControlAttribute'
request: += 'radiusRequestAttribute'
reply: += 'radiusReplyAttribute'
}
"/etc/raddb/mod-available/ldap" ファイルの編集が終わったら、"/etc/raddb/mod-enabled/" ディレクトリ内に"/etc/raddb/mod-available/ldap" ファイルのシンボリックリンクを作成する.この作業を行わないとFreeRADIUSサーバはLDAPが有効にならない.
[root@nsauth6 mods-enabled]# pwd
/etc/raddb/mods-enabled
[root@nsauth6 mods-enabled]# ls -la
total 8
drwxr-x---. 2 root radiusd 4096 Aug 16 19:23 .
drwxr-xr-x. 9 root radiusd 4096 Aug 16 17:30 ..
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 always -> ../mods-available/always
lrwxrwxrwx. 1 root radiusd 29 Jan 31 2025 attr_filter -> ../mods-available/attr_filter
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 chap -> ../mods-available/chap
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 date -> ../mods-available/date
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 detail -> ../mods-available/detail
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 detail.log -> ../mods-available/detail.log
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 digest -> ../mods-available/digest
lrwxrwxrwx. 1 root radiusd 33 Jan 31 2025 dynamic_clients -> ../mods-available/dynamic_clients
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 eap -> ../mods-available/eap
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 echo -> ../mods-available/echo
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 exec -> ../mods-available/exec
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 expiration -> ../mods-available/expiration
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 expr -> ../mods-available/expr
lrwxrwxrwx. 1 root radiusd 23 Jan 31 2025 files -> ../mods-available/files
lrwxrwxrwx. 1 root radiusd 25 Jan 31 2025 linelog -> ../mods-available/linelog
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 logintime -> ../mods-available/logintime
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 mschap -> ../mods-available/mschap
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 ntlm_auth -> ../mods-available/ntlm_auth
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 pap -> ../mods-available/pap
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 passwd -> ../mods-available/passwd
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 preprocess -> ../mods-available/preprocess
lrwxrwxrwx 1 root radiusd 34 Jan 31 2025 proxy_rate_limit -> ../mods-available/proxy_rate_limit
lrwxrwxrwx. 1 root radiusd 25 Jan 31 2025 radutmp -> ../mods-available/radutmp
lrwxrwxrwx. 1 root radiusd 23 Jan 31 2025 realm -> ../mods-available/realm
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 replicate -> ../mods-available/replicate
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 soh -> ../mods-available/soh
lrwxrwxrwx. 1 root radiusd 26 Jan 31 2025 sradutmp -> ../mods-available/sradutmp
lrwxrwxrwx 1 root radiusd 22 Jan 31 2025 totp -> ../mods-available/totp
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 unix -> ../mods-available/unix
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 unpack -> ../mods-available/unpack
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 utf8 -> ../mods-available/utf8
[root@nsauth6 mods-enabled]#
[root@nsauth6 mods-enabled]# ln -s ../mods-available/ldap ldap <=== シンボリックリンクの作成
[root@nsauth6 mods-enabled]# ls -la
total 8
drwxr-x---. 2 root radiusd 4096 Aug 16 19:31 .
drwxr-xr-x. 9 root radiusd 4096 Aug 16 17:30 ..
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 always -> ../mods-available/always
lrwxrwxrwx. 1 root radiusd 29 Jan 31 2025 attr_filter -> ../mods-available/attr_filter
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 chap -> ../mods-available/chap
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 date -> ../mods-available/date
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 detail -> ../mods-available/detail
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 detail.log -> ../mods-available/detail.log
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 digest -> ../mods-available/digest
lrwxrwxrwx. 1 root radiusd 33 Jan 31 2025 dynamic_clients -> ../mods-available/dynamic_clients
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 eap -> ../mods-available/eap
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 echo -> ../mods-available/echo
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 exec -> ../mods-available/exec
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 expiration -> ../mods-available/expiration
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 expr -> ../mods-available/expr
lrwxrwxrwx. 1 root radiusd 23 Jan 31 2025 files -> ../mods-available/files
lrwxrwxrwx 1 root root 22 Aug 16 19:31 ldap -> ../mods-available/ldap
lrwxrwxrwx. 1 root radiusd 25 Jan 31 2025 linelog -> ../mods-available/linelog
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 logintime -> ../mods-available/logintime
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 mschap -> ../mods-available/mschap
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 ntlm_auth -> ../mods-available/ntlm_auth
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 pap -> ../mods-available/pap
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 passwd -> ../mods-available/passwd
lrwxrwxrwx. 1 root radiusd 28 Jan 31 2025 preprocess -> ../mods-available/preprocess
lrwxrwxrwx 1 root radiusd 34 Jan 31 2025 proxy_rate_limit -> ../mods-available/proxy_rate_limit
lrwxrwxrwx. 1 root radiusd 25 Jan 31 2025 radutmp -> ../mods-available/radutmp
lrwxrwxrwx. 1 root radiusd 23 Jan 31 2025 realm -> ../mods-available/realm
lrwxrwxrwx. 1 root radiusd 27 Jan 31 2025 replicate -> ../mods-available/replicate
lrwxrwxrwx. 1 root radiusd 21 Jan 31 2025 soh -> ../mods-available/soh
lrwxrwxrwx. 1 root radiusd 26 Jan 31 2025 sradutmp -> ../mods-available/sradutmp
lrwxrwxrwx 1 root radiusd 22 Jan 31 2025 totp -> ../mods-available/totp
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 unix -> ../mods-available/unix
lrwxrwxrwx. 1 root radiusd 24 Jan 31 2025 unpack -> ../mods-available/unpack
lrwxrwxrwx. 1 root radiusd 22 Jan 31 2025 utf8 -> ../mods-available/utf8
[root@nsauth6 mods-enabled]#
[root@nsauth6 mods-enabled]# chown -h root:radiusd ldap <=== とりあえずgroupを"radiusd" に変更(やらなくても良い)
以上でLDAPサーバとの連携のための設定変更作業が終了したので、"systemctl restart radiusd" でRADIUSサーバを再起動させればFreeRADIUSがLDAPサーバと連携するようになる.
LDAP連携テスト
FreeRADIUSサーバからLDAPサーバへユーザ情報を問い合わせる設定が済んだので、とりあえずRADIUSサーバからLDAPサーバへの問い合わせが正常に行われることを確認する.RRADIUSサーバ上でldapsearchコマンドを使ってユーザ "y2admin"の情報を取得してみる.
[root@nsauth6 mods-available]# ldapsearch -x -H ldap://ns.admin.home.yoko -D "cn=yyyyyyy,dc=home,dc=yoko" -b "uid=y2admin,ou=people,dc=home,dc=yoko" -W
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#
# y2admin, people, home.yoko
dn: uid=y2admin,ou=people,dc=home,dc=yoko
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: sambaIdmapEntry
objectClass: apple-user
objectClass: radiusprofile
cn: y2admin
sn: y2admin
uid: y2admin
uidNumber: 1000000
gidNumber: 1000000
userPassword:: e0NSWVBUfS ----------- eFZIdFd5QjNKVS4=
homeDirectory: /home/y2admin
shadowLastChange: 20315
shadowMin: 0
shadowMax: 99999
shadowWarning: 7
shadowExpire: -1
shadowInactive: 0
shadowFlag: 0
displayName: y2admin
sambaSID: S-1-5-21-4011659892-1488691106-2880545186-1002
sambaLMPassword: FA8CF---------------8D76954A50
sambaNTPassword: 6821C---------------3BFC59A7B1D7B
sambaPasswordHistory: 00000000000000000000000000000000000000000000000000000000
00000000
sambaPwdLastSet: 1755301771
sambaAcctFlags: [U ]
sambaKickoffTime: 0
radiusTunnelType: 13
radiusTunnelMediumType: 6
radiusTunnelPrivateGroupId: 250
# search result
search: 2
result: 0 Success
# numResponses: 2
# numEntries: 1
[root@nsauth6 mods-available]#
FreeRADIUSからLDAPサーバへの問い合わせは正常のようだ.
LDAP連携させたRADIUSサーバでの接続テスト
LDAPサーバ上に新規に作成した"testuser100" アカウントを使って実際に無線LANクライントから "Y2Test1x" へ接続してみる.ログイン認証が成功すると、このユーザはVLAN100(172.25.100.0/24)のセグメントに接続される筈だ.

"testuser100" アカウントを使って "Y2Test1x" へ接続

"testuser100" に割り当てたVLAN100 (172.25.100.0/24)のセグメントに接続されている
【実験君】LDAPの"radiusTunnelPrivateGroupId" で RADIUSの設定 をオーバライドするのか?
"/etc/raddb/users" に "Tunnel-Private-Group-Id = 200" を追加設定し、VLAN情報を設定していないアカウント"radtest007" と"testuser100" でログインしてみる.
# On no match, the user is denied access.
#
#=========================================================================#
# Authentication Method : LDAP Account #
#=========================================================================#
DEFAULT Auth-Type = LDAP
Tunnel-Type = 13,
Tunnel-Medium-Type = 6,
Tunnel-Private-Group-Id = 200,
Fall-Through = Yes
【結果】 "radtest007" ===> VLAN200 にアサインされる
"testuser100" ===> VLAN100 にアサインされる
この結果から、"Test1x" に接続した場合、ユーザ側にVLAN情報が設定されていない場合は、RADIUS側で設定したデフォルトのVLAN200にアサインされるが、LDAP上にVLAN情報が設定されている場合はそのVLANにアサインされる.つまり、LDAP側のVLAN情報でオーバーライドされることになる.
以上で、今回のAruba Instant On Wireless AP を用いた認証VLANの実装方法についての一連の解説を終了することにする.認証VLANと聞くと設定が難しく、専門のネットワークエンジニアでなければ実装は難しいと思われがちだが、RADIUSサーバだけでも比較的簡単に実装することが可能であることが理解できたであろうか.
無線LANの場合は、使用するAPが認証VLANに対応可能であるという条件があるので、Aruba以外の安価なスモールビジネス用のAPでは難しいかもしれないが、認証VLANを実現できれば無線LANのセキュリティー強化につながるだけでなく、エンドユーザ側の使い勝手も向上するのではないかと思う.