Salem, MA
Date/Time: 2006:07:31 11:37:15
Camera: FUJIFILM
Model: FinePix F401
Exporsure Time: 1/600 [s]
FNumber: 7.0
Aperture Value: 5.6
Focal Length: 5.7 [mm]

y2blog » ArubaのAPを用いて認証VLANを実装してみる#7 (LDAPとの連携)

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)のセグメントに接続される筈だ.


LDAP User VL100 Login
"testuser100" アカウントを使って "Y2Test1x" へ接続

Success VL100 LDAP
"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のセキュリティー強化につながるだけでなく、エンドユーザ側の使い勝手も向上するのではないかと思う.

Calendar

August 2025
S M T W T F S
 12
3456789
10111213141516
17181920212223
24252627282930
31  
  • Blogroll

  • Meta