Inleiding
In dit document wordt beschreven hoe u het gedrag van Cisco Prime Access Registrar (CPAR) 8.0 kunt aanpassen met behulp van scripts en uitbreidingspunten.
Voorwaarden
Vereisten
Cisco raadt kennis van de volgende onderwerpen aan:
Gebruikte componenten
De informatie in dit document is gebaseerd op de volgende software- en hardware-versies:
- CPAR 8.0 geïnstalleerd op CentOS 6.5 64-bits
De informatie in dit document is gebaseerd op de apparaten in een specifieke laboratoriumomgeving. Alle apparaten die in dit document worden beschreven, hadden een opgeschoonde (standaard)configuratie. Als uw netwerk live is, moet u zorgen dat u de potentiële impact van elke opdracht begrijpt.
Achtergrondinformatie
CPAR kan worden gewijzigd door zowel interne als externe scripts. Scripts kunnen worden geschreven in C / C ++ / Java / TCL. Scripts kunnen worden gebruikt om de verwerking van RADIUS-, TACACS- en DIAMETER-pakketten aan te passen. Scripts kunnen worden verwezen in CPAR in extensiepunten. Extensiepunten is een instelling/kenmerk dat onder sommige configuratie-elementen wordt weergegeven en waarmee naar een script kan worden verwezen. Volgens de referentiehandleiding is CPAR niet verantwoordelijk voor gegevensverlies, schade, enz. veroorzaakt door aangepaste scripts.
Hier is een voorbeeld van twee uitbreidingspunten onder netwerkapparaatconfiguratie
[ //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
Volgens de CPAR-beheergids zijn er meerdere beschikbare uitbreidingspunten. Een inkomend script kan worden verwezen naar elk van deze uitbreidingspunten:
- RADIUS-server
- Verkoper (van de directe klant)
- Client (individuele NAS)
- NAS-leverancier-achter-de-proxy
- client-achter-de-proxy
- Externe server (type RADIUS)
- dienst
Een authenticatie- of autorisatiescript kan op elk van deze uitbreidingspunten worden gebruikt:
- groepsverificatie
- gebruikersverificatie
- groepsvergunning
- Gebruikersautorisatie
Het uitgaande script kan worden verwezen naar elk van deze uitbreidingspunten:
- dienst
- client-achter-de-proxy
- NAS-leverancier-achter-de-proxy
- Client (individuele NAS)
- NAS-leverancier
- RADIUS-server
Het is van cruciaal belang om de volgorde te begrijpen waarin scripts door CPAR worden uitgevoerd, omdat er meerdere uitbreidingspunten zijn. Raadpleeg tabel 7-1 van de beheerdershandleiding om de volgorde van 29 beschikbare scripts/uitbreidingspunten te zien.
Een intern script is een script dat direct is geconfigureerd in CPAR CLI (aregcmd). Het vereist geen externe bestanden en veel programmeerkennis. Een extern script is een script dat is opgeslagen in een bestand in het besturingssysteem (CENTOS of RHEL) en waarnaar alleen wordt verwezen in CPAR CLI.
Configureren
Intern script voor uitgaand verkeer
In interne scripts kunt u deze modifiers gebruiken:
1. +RSP: - Voegt en kenmerk toe aan antwoord
2. -rsp: - Verwijdert attribuut uit respons
3. #rsp: - vervangt attribuut door nieuwe waarde
4. Hierboven kan worden gebruikt voor REQ (Request / Incoming Packet en ENV, wat Environment Dictionary is). Voorbeelden +req: of -env:
Voeg een intern script toe onder /Radius/Scripts. Configureer twee extra AVP-pakketten die moeten worden geretourneerd met Access-Accept: Filter-Id en Vendor-Specific (om deel te nemen aan het spraakdomein).
--> 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
Test met het gebruik van lokale radclient:
--> simple
p011
--> p011 send
p014
--> p014
Packet: code = Access-Accept, id = 18, length = 64, attributes =
Filter-Id = PhoneACL
Cisco-AVPair = device-traffic-class=voice
Sporen:
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
Intern script voor binnenkomend verkeer
Maak een nieuw script dat alle gebruikersnamen in het formaat user@domain vervangt om anoniem te worden en het toe te passen als inkomend script voor de service die u gebruikt.
Configureren:
--> 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
Test met radclient (verzoek wordt hoogstwaarschijnlijk afgewezen omdat de gebruikersnaam is gewijzigd in anoniem):
--> 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
Overtrekken:
Voordat de employee-service wordt uitgevoerd, worden drie scripts aangeroepen. Eerst roept CPAR CiscoIncomingScript op, vervolgens roept het ParseServiceHints op die zijn gekoppeld aan de configuratie van de localhost-client/netwerkapparaat. Het haalt de gebruikersnaam uit het pakket en zet het in het omgevingswoordenboek. Tweede script, test wordt aangeroepen en gebruikersnaam in omgevingswoordenboek wordt gewijzigd van <gebruikersnaam> in anoniem
LocalHost-client:
[ //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
Trace-uitvoer:
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
Extern script maken
Voeg een bestand nadip.tcl toe aan /opt/CSCOar/scripts/radius/tcl/ directory en voeg deze inhoud toe:
[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 ]
}
Inhoud van nadip.tcl regel voor regel uitgelegd:
Regel #1 Definitie en argumenten van de procedure. Verzoek, reactie, omgeving en drie beschikbare woordenboeken waar u sessie- / pakketgegevens kunt wijzigen.
Regel #2 Debugregel voor script dat wordt afgedrukt als trace level 2.
Regel #3 Inhoud van het NAS-IP-Adres attribuut in het verzoekwoordenboek voordat u deze waarde instelt.
Regel #4 Stel het Nas-IP-Address attribuut in het request dictionary in op waarde 1.2.3.4.
Lijn #5 Druk het NAS-IP-Adres attribuut opnieuw af.
Nadat het script is gemaakt en opgeslagen in het besturingssysteem, configureert u de CPAR-verwijzing naar het script. Stel taal in als TCL, bestandsnaam moet exact bestandsnaam met extensie zijn (in dit geval is het nadip.tcl). EntryPoint is de naam van de procedure in het bestand dat u als script wilt uitvoeren. Referentie gemaakt CPAR script onder service (incomingScript) en test met radclient.
Lijnen #2, #3, #5 kunnen worden waargenomen in het spoor:
--> 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
Overtrekken:
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