المقدمة
يصف هذا المستند كيفية تخصيص سلوك Cisco Prime Access Registrar (CPAR) 8.0 باستخدام البرامج النصية ونقاط الملحق.
المتطلبات الأساسية
المتطلبات
توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:
المكونات المستخدمة
تستند المعلومات الواردة في هذا المستند إلى إصدارات البرامج والمكونات المادية التالية:
- CPAR 8.0 المثبت على CentOS 6.5 إصدار 64 بت
تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.
معلومات أساسية
يمكن تعديل CPAR من خلال البرامج النصية الداخلية والخارجية على حد سواء. يمكن كتابة البرامج النصية في C/C++/Java/TCL. يمكن إستخدام البرامج النصية لتعديل معالجة حزم RADIUS و TACACS والقطر. يمكن الإشارة إلى البرامج النصية في CPAR في نقاط الامتداد. نقاط الامتداد هي إعداد/سمة تظهر تحت بعض عناصر التكوين وتسمح بالإشارة إلى برنامج نصي. وفقا للدليل المرجعي فإن حماية مستوى التحكم (CPAR) ليست مسؤولة عن أي فقد للبيانات أو تلفيات أو غير ذلك بسبب البرامج النصية المخصصة.
هنا مثال من إثنان امتداد نقطة تحت شبكة أداة تشكيل
[ //localhost/Radius/Clients/piborowi ]
Name = piborowi
Description =
Protocol = tacacs-and-radius
IPAddress = 192.168.255.15
SharedSecret = <encrypted>
Type = NAS
Vendor =
IncomingScript~ = // Extension point for incomming traffic
OutgoingScript~ = // Extension point for outgoing traffic
EnableDynamicAuthorization = FALSE
NetMask =
EnableNotifications = FALSE
EnforceTrafficThrottling = TRUE
وفقا لدليل إدارة حماية مستوى التحكم (CPAR)، هناك العديد من نقاط الامتداد المتاحة. يمكن الإشارة إلى برنامج نصي وارد في كل من نقاط الملحق التالية:
- خادم RADIUS
- المورد (للعميل المباشر)
- العميل (وحدات التخزين المتصلة بالشبكة (NAS) الفردية)
- NAS-Vendor-behind-proxy
- العميل وراء الوكيل
- الخادم البعيد (من النوع RADIUS)
- الخدمة
يمكن الإشارة إلى برنامج نصي للمصادقة أو التخويل في كل نقطة من نقاط الملحق التالية:
- مصادقة المجموعة
- مصادقة المستخدم
- تفويض المجموعة
- تفويض المستخدم
يمكن الرجوع إلى البرنامج النصي الصادر في كل من نقاط الملحق التالية:
- الخدمة
- العميل وراء الوكيل
- NAS-Vendor-behind-proxy
- العميل (وحدات التخزين المتصلة بالشبكة (NAS) الفردية)
- مورد NAS
- خادم RADIUS
من المهم فهم الترتيب الذي يتم من خلاله تنفيذ البرامج النصية بواسطة حماية مستوى التحكم (CPAR) نظرا لوجود نقاط امتداد متعددة. ارجع إلى الجدول 7-1 من دليل المسؤول للاطلاع على ترتيب 29 نقطة برمجة/امتداد متوفرة.
إن البرنامج النصي الداخلي هو الذي يتم تكوينه مباشرة في واجهة سطر الأوامر (CLI) لمعرف فئة المورد (CPAR) (aregcmd). إنه لا يتطلب أي ملفات خارجية و الكثير من المعرفة في البرمجة. البرنامج النصي الخارجي هو الذي يتم تخزينه في ملف في نظام التشغيل (CENTOS أو RHEL) ويشار إليه فقط في واجهة سطر الأوامر (CLI) الخاصة بمعالجات CPAR.
التكوين
برنامج نصي داخلي لحركة المرور الصادرة
في النصوص التفاعلية الداخلية يمكنك إستخدام هذه المعدلات:
1. +RSP: - إضافة وتسمية الاستجابة
2. -rsp: - يزيل السمة من الاستجابة
3. #rsp: - يستبدل السمة بقيمة جديدة
4. يمكن إستخدام أعلاه ل req (طلب/ربط و env، وهو قاموس البيئة). الأمثلة +req: أو -env:
إضافة نص تنفيذي داخلي تحت /RADIUS/النصوص التنفيذية. تكوين إثنين من AVP الإضافيين ليتم إرجاعهما مع حزمة قبول الوصول: معرف عامل التصفية والمورد المحدد (للانضمام إلى مجال الصوت).
--> ls -R
[ //localhost/Radius/Scripts/addattr ]
Name = addattr
Description =
Language = internal
Statements/
1. +rsp:Filter-Id=PhoneACL
2. +rsp:Cisco-AVPair=device-traffic-class=voice
--> ls -R
[ Services/local-users ]
Name = local-users
Description =
Type = local
IncomingScript~ =
OutgoingScript~ = addattr
OutagePolicy~ = RejectAll
OutageScript~ =
UserList = Default
EnableDeviceAccess = True
DefaultDeviceAccessAction~ = DenyAll
DeviceAccessRules/
1. switches
إختبار باستخدام رادclient المحلي:
--> simple
p011
--> p011 send
p014
--> p014
Packet: code = Access-Accept, id = 18, length = 64, attributes =
Filter-Id = PhoneACL
Cisco-AVPair = device-traffic-class=voice
التأثيرات:
07/31/2019 10:31:26.254: P2363: Running Service local-users's OutgoingScript: addattr
07/31/2019 10:31:26.254: P2363: Internal Script for 1 +rsp:Filter-Id=PhoneACL : Filter-Id = PhoneACL
07/31/2019 10:31:26.254: P2363: Setting value PhoneACL for attribute Filter-Id
07/31/2019 10:31:26.254: P2363: Trace of Response Dictionary
07/31/2019 10:31:26.254: P2363: Trace of Access-Request packet
07/31/2019 10:31:26.254: P2363: identifier = 18
07/31/2019 10:31:26.254: P2363: length = 30
07/31/2019 10:31:26.254: P2363: respauth = fb:63:14:3f:c1:fb:ac:03:7d:16:29:61:ba:ef:13:4f
07/31/2019 10:31:26.254: P2363: Filter-Id = PhoneACL
07/31/2019 10:31:26.254: P2363: Internal Script for 2 +rsp:Cisco-AVPair=device-traffic-class=voice : Cisco-AVPair = device-traffic-class=voice
07/31/2019 10:31:26.254: P2363: Setting value device-traffic-class=voice for attribute Cisco-AVPair
07/31/2019 10:31:26.254: P2363: Trace of Response Dictionary
07/31/2019 10:31:26.254: P2363: Trace of Access-Request packet
07/31/2019 10:31:26.254: P2363: identifier = 18
07/31/2019 10:31:26.254: P2363: length = 64
07/31/2019 10:31:26.254: P2363: respauth = fb:63:14:3f:c1:fb:ac:03:7d:16:29:61:ba:ef:13:4f
07/31/2019 10:31:26.254: P2363: Filter-Id = PhoneACL
07/31/2019 10:31:26.254: P2363: Cisco-AVPair = device-traffic-class=voice
برنامج نصي داخلي لحركة المرور الواردة
قم بإنشاء نص تنفيذي جديد يستبدل كل أسماء المستخدمين في التنسيق user@domain إلى مجهول وقم بتطبيقه كبرنامج نصي مضمن للخدمة التي تستخدمها.
التكوين:
--> cd /Radius/Scripts
--> add test
--> set language internal
--> cd Statements
--> add 1
--> cd 1
--> set statements "#req:User-Name=~(.*)(@[a-z]+.[a-z]+)~\anonymous"
--> ls -R
[ //localhost/Radius/Scripts/test ]
Name = test
Description =
Language = internal
Statements/
1. #env:User-Name=~(.*)~anonymous
--> ls -R /Radius/Services/employee-service/
[ /Radius/Services/employee-service ]
Name = employee-service
Description =
Type = local
IncomingScript~ = test
OutgoingScript~ =
OutagePolicy~ = RejectAll
OutageScript~ =
UserList = default
EnableDeviceAccess = FALSE
DefaultDeviceAccessAction~ = DenyAll
إختبار مع RADCLIENT (تم رفض الطلب على الأرجح لأنه تم تغيير اسم المستخدم إلى مجهول):
--> simple @cisco.com
p01e
--> p01e
Packet: code = Access-Request, id = 27, length = 72, attributes =
User-Name = <username>@cisco.com
User-Password = <password>
NAS-Identifier = localhost
NAS-Port = 7
--> p01e send
p020
--> p020
Packet: code = Access-Reject, id = 27, length = 35, attributes =
Reply-Message = Access Denied
التتبع:
قبل تنفيذ خدمة الموظف، يتم إستدعاء ثلاثة برامج نصية. تستدعي حماية مستوى التحكم (CPAR) الأولى CiscoIncomingScript، ثم تقوم باستدعاء ParseServiceHints المرفق بتكوين عميل/جهاز الشبكة المحلية. يستخرج اسم المستخدم من الحزمة ويضعه في قاموس البيئة. البرنامج النصي الثاني، تم إستدعاء الاختبار وتم تغيير اسم المستخدم في قاموس البيئة من <username> إلى مجهول
عميل المضيف المحلي:
[ //localhost/Radius/Clients/localhost ]
Name = localhost
Description =
Protocol = radius
IPAddress = 127.0.0.1
SharedSecret = <encrypted>
Type = NAS+Proxy
Vendor = Cisco
IncomingScript~ = ParseServiceHints
OutgoingScript~ =
EnableDynamicAuthorization = FALSE
NetMask =
EnableNotifications = FALSE
EnforceTrafficThrottling = TRUE
تتبع الإخراج:
07/31/2019 11:38:53.522: P2855: PolicyEngine: [SelectPolicy] Successful
07/31/2019 11:38:53.522: P2855: Using Client: localhost
07/31/2019 11:38:53.522: P2855: Using Vendor: Cisco
07/31/2019 11:38:53.522: P2855: Running Vendor Cisco's IncomingScript: CiscoIncomingScript
07/31/2019 11:38:53.522: P2855: Running Client localhost IncomingScript: ParseServiceHints
07/31/2019 11:38:53.522: P2855: Rex: environ->get( "Request-Type" ) -> "Access-Request"
07/31/2019 11:38:53.522: P2855: Rex: environ->get( "Request-Type" ) -> "Access-Request"
07/31/2019 11:38:53.522: P2855: Rex: environ->get( "User-Name" ) -> "<username>"
07/31/2019 11:38:53.522: P2855: Authenticating and Authorizing with Service employee-service
07/31/2019 11:38:53.522: P2855: Running Service employee-service's IncomingScript: test
07/31/2019 11:38:53.522: P2855: Numbered attribute got for the radius / tacacs packet. ignoring # User-Name
07/31/2019 11:38:53.523: P2855: Numbered attribute got for the radius / tacacs packet. ignoring # User-Name
07/31/2019 11:38:53.523: P2855: Numbered attribute got for the radius / tacacs packet. ignoring # User-Name
07/31/2019 11:38:53.523: P2855: Internal Script for 1 #env:User-Name=~(.*)~anonymous : User-Name = anonymous
07/31/2019 11:38:53.523: P2855: Setting value anonymous for attribute User-Name
07/31/2019 11:38:53.523: P2855: Trace of Environment Dictionary
07/31/2019 11:38:53.523: P2855: User-Name = anonymous
07/31/2019 11:38:53.523: P2855: NAS-Name-And-IPAddress = localhost (127.0.0.1)
07/31/2019 11:38:53.523: P2855: Authorization-Service = employee-service
07/31/2019 11:38:53.523: P2855: Source-Port = 51169
07/31/2019 11:38:53.523: P2855: Authentication-Service = employee-service
07/31/2019 11:38:53.523: P2855: Trace-Level = 1000
07/31/2019 11:38:53.523: P2855: Destination-Port = 1812
07/31/2019 11:38:53.523: P2855: Destination-IP-Address = 127.0.0.1
07/31/2019 11:38:53.523: P2855: Source-IP-Address = 127.0.0.1
07/31/2019 11:38:53.523: P2855: Enforce-Traffic-Throttling = TRUE
07/31/2019 11:38:53.523: P2855: Request-Type = Access-Request
07/31/2019 11:38:53.523: P2855: Script-Level = 6
07/31/2019 11:38:53.523: P2855: Provider-Identifier = Default
07/31/2019 11:38:53.523: P2855: Request-Authenticator = 5f:62:5a:72:0f:7b:a2:2a:9c:06:ba:2e:bd:f4:e4:4b
07/31/2019 11:38:53.523: P2855: Realm = cisco.com
07/31/2019 11:38:53.523: P2855: Getting User anonymous's UserRecord from UserList Default
07/31/2019 11:38:53.523: P2855: Failed to get User anonymous's UserRecord from UserList Default
07/31/2019 11:38:53.523: P2855: Running Vendor Cisco's OutgoingScript: CiscoOutgoingScript
07/31/2019 11:38:53.523: P2855: Trace of Access-Reject packet
07/31/2019 11:38:53.523: P2855: identifier = 27
07/31/2019 11:38:53.523: P2855: length = 35
07/31/2019 11:38:53.523: P2855: respauth = d3:7d:b3:f6:05:47:2c:66:d9:c0:01:7d:67:d7:93:99
07/31/2019 11:38:53.523: P2855: Reply-Message = Access Denied
07/31/2019 11:38:53.523: P2855: Sending response to 127.0.0.1
إنشاء برنامج نصي خارجي
إضافة ملف nadip.tcl إلى /opt/ciscoAr/scripts/radius/tcl/ دليل وإضافة هذا المحتوى:
[root@piborowi-cpar80-16 tcl]# cat /opt/CSCOar/scripts/radius/tcl/nadip.tcl
proc UpdateNASIP {request response environ} {
$request trace 2 "TCL CUSTOM_SCRIPT Updating NAS IP ADDRESS"
$request trace 2 "Before put: " [ $request get NAS-IP-Address ]
$request put NAS-IP-Address 1.2.3.4
$request trace 2 "After put: " [ $request get NAS-IP-Address ]
}
شرح محتوى nadip.tcl سطرا بسطر:
السطر الأول تعريف الإجراء والوسيطات. الطلب والاستجابة والضواحي وثلاثة قواميس متوفرة حيث يمكنك تعديل بيانات جلسة العمل/الحزمة.
السطر رقم 2 سطر تصحيح الأخطاء للنص النصي الذي سيتم طباعته كمستوى تتبع 2.
السطر رقم 3 محتوى سمة عنوان NAS-IP في قاموس الطلب قبل تعيين هذه القيمة.
السطر رقم 4 قم بتعيين سمة عنوان NAS-IP في قاموس الطلب على القيمة 1.2.3.4.
السطر رقم 5 طباعة سمة عنوان NAS-IP مرة أخرى.
بمجرد إنشاء البرنامج النصي وحفظه في نظام التشغيل، قم بتكوين مرجع CPAR إلى البرنامج النصي. تعيين اللغة ك TCL، يجب أن يكون اسم الملف دقيقا مع ملحق (في هذه الحالة هو nadip.tcl). EntryPoint هو اسم الإجراء في الملف الذي تريد تنفيذه كبرنامج نصي. قام المرجع بإنشاء برنامج نصي ل CPAR تحت الخدمة (IncomingScript) واختباره باستخدام Radclient.
يمكن ملاحظة الأسطر رقم 2، رقم 3، رقم 5 في التتبع:
--> ls -R /Radius/scripts/nadipaddress/
[ /Radius/Scripts/nadipaddress ]
Name = nadipaddress
Description =
Language = tcl <<<<<<<<
Filename = nadip.tcl <<<<<<<<
EntryPoint = UpdateNASIP <<<<<<<<
InitEntryPoint =
InitEntryPointArgs =
--> ls -R /Radius/services/employee-service/
[ /Radius/Services/employee-service ]
Name = employee-service
Description =
Type = local
IncomingScript~ = nadipaddress <<<<<<<<
OutgoingScript~ =
OutagePolicy~ = RejectAll
OutageScript~ =
UserList = default
EnableDeviceAccess = FALSE
DefaultDeviceAccessAction~ = DenyAll
التتبع:
07/31/2019 13:40:53.615: P3490: Running Service employee-service's IncomingScript: nadipaddress
07/31/2019 13:40:53.615: P3490: TCL CUSTOM_SCRIPT Updating NAS IP ADDRESS
07/31/2019 13:40:53.616: P3490: Tcl: request trace 2 TCL CUSTOM_SCRIPT Updating NAS IP ADDRESS -> OK
07/31/2019 13:40:53.616: P3490: Tcl: request get NAS-IP-Address -> <empty>
07/31/2019 13:40:53.616: P3490: Before put:
07/31/2019 13:40:53.616: P3490: Tcl: request trace 2 Before put: -> OK
07/31/2019 13:40:53.616: P3490: Tcl: request put NAS-IP-Address 1.2.3.4 -> OK
07/31/2019 13:40:53.616: P3490: Tcl: request get NAS-IP-Address -> 1.2.3.4
07/31/2019 13:40:53.616: P3490: After put: 1.2.3.4
07/31/2019 13:40:53.616: P3490: Tcl: request trace 2 After put: 1.2.3.4 -> OK