ISE and Python -

ISE and Python -

ISE and Python -

ISE and Python -

ISE and Python -
ISE and Python -
(028) 35124257 - 0933 427 079

ISE and Python

15-03-2022

Python là một ngôn ngữ lập trình phổ biến có trước JavaScript bắt đầu từ năm 1991. Python và JavaScript có cú pháp và phong cách hơi khác nhau nhưng thành công lâu dài của chúng so với nhiều ngôn ngữ khác trong gần 30 năm là do:

Chúng là ngôn ngữ thông dịch. Bất kỳ máy tính nào cũng có thể chạy mã nguồn dựa trên văn bản ngay lập tức và diễn giải các câu lệnh, cung cấp tính linh hoạt của nền tảng mà không cần biên dịch trước một tệp nhị phân cho mỗi và mọi nền tảng.

Tính linh hoạt của cùng một nền tảng này có nghĩa là các thư viện phần mềm mới - hoặc các gói - có thể được tải xuống bằng một lệnh đơn giản từ các kho lưu trữ (PyPI cho Python và NPM cho JavaScript) và ngay lập tức được các kỹ sư phần mềm sử dụng.

Chúng là mã nguồn mở và không được kiểm soát bởi một công ty: Java / Oracle, Swift / Apple, C # / Microsoft.

Tạo tập lệnh Python từ Postman

Một mẹo nữa mà Postman đã âm thầm giấu giếm là khả năng xuất các yêu cầu dưới dạng Đoạn mã cho nhiều ngôn ngữ lập trình và kịch bản khác nhau. Đây không phải là những chương trình cao cấp với các tùy chọn dòng lệnh và phân trang thông qua tất cả các tài nguyên nhưng nó giúp bạn nắm được 95% một tập lệnh cơ bản.

  1. Trong Postman Collections panel, chọn Cisco ISE API - ERS NetworkDevice POST networkdevice: Basic Static RADIUS & TACACS, và chọn Body > raw tab để xem định nghĩa thiết bị mạng cơ bản:

 {

     "NetworkDevice": {

         "name": "nad",

         "description": "",

         "authenticationSettings": {

             "networkProtocol": "RADIUS",

             "radiusSharedSecret": "C1sco12345"

         },

         "tacacsSettings": {

             "sharedSecret": "C1sco12345",

             "connectModeOptions": "OFF"

         },

         "NetworkDeviceIPList": [

             {

                 "ipaddress": "1.2.3.4",

                 "mask": 32

             }

         ],

         "NetworkDeviceGroupList": [

             "Location#All Locations",

             "IPSEC#Is IPSEC Device#No",

             "Device Type#All Device Types"

         ]

     }

 }

2. Đổi những giá trị này trong Postman JSON template:

  • name: simulator
  • ipaddress: 10.10.20.32 (IP address của RADIUS simulator trong DevNet Pod) |Khoan bấm Send lúc này. Nếu bạn lỡ bấm rồi, thì gửi lại request DEL networkdevice/{id} và bạn sẽ trở lại ban đầu.

3. Bạn muốn dùng JSON template đã chỉnh sửa này để tạo ra code Python để xài ngoài Postman. Ở mép phải của Postman, chọn Code Snippets có icon: để xem Code Snippet panel.

4. Dùng Code Snippets drop-down và chọn Python - Requests + kết hợp với library package mà bạn muốn, và bạn sẽ thấy code sau. Bạn có thể dùng IP 10.20.20.77 thay cho ISE hostname khi export APIs.

Requests hiện tại là HTTP package cho Python phổ biến nhất.

 import requests

 import json

 

 url = "https://ise-1.lab.devnetsandbox.local:9060/ers/config/networkdevice"

 

 payload = json.dumps({

 "NetworkDevice": {

     "name": "simulator",

     "description": "",

     "authenticationSettings": {

     "networkProtocol": "RADIUS",

     "radiusSharedSecret": "C1sco12345"

     },

     "tacacsSettings": {

     "sharedSecret": "C1sco12345",

     "connectModeOptions": "OFF"

     },

     "NetworkDeviceIPList": [

     {

         "ipaddress": "10.10.20.32",

         "mask": 32

     }

     ],

     "NetworkDeviceGroupList": [

     "Location#All Locations",

     "IPSEC#Is IPSEC Device#No",

     "Device Type#All Device Types"

     ]

 }

 })

 headers = {

 'Content-Type': 'application/json',

 'Accept': 'application/json',

 'Authorization': 'Basic ZXJzLWFkbWluOkMxc2NvMTIzNDU=',

 'Cookie': 'APPSESSIONID=DF86EDFE44A735F15628A87FE73CC643; JSESSIONIDSSO=B8E53F0E34AB665C9D18A54B1C170912'

 }

 

 response = requests.request("POST", url, headers=headers, data=payload)

 

 print(response.text)

Sử dụng DevNet DevBox

·  Bạn có 2 cách để kết nối đến DevBox:

  1. Web terminal trong browser từ Sandbox topology: nó thuận tiện và nhanh nhưng mà lại không hỗ trợ copy paste ngoài browser.

  2. Chương trình giả lập terminal trong máy bạn: you have to type in your credentials but after that you have all the capabilities of that application.

+ssh developer@10.10.20.50

+ssh 10.10.20.50 -l developer

Python Virtual Environment Setup

DevBox cài đặt phiên bản cũ hơn, dẫn đến xung đột của gói Python và Ansible mà chúng ta không thể gỡ cài đặt do phải có quyền root. Bạn phải cài đặt một môi trường ảo Python để cô lập các gói và phiên bản của mình. Sử dụng môi trường ảo để phát triển được coi là phương pháp hay nhất để đảm bảo rằng bạn có tất cả các dependencies chính xác. Ngoài ra, nếu bạn cảm thấy nó lộn xộn, bạn có thể xóa nó và bắt đầu lại.

Nếu bạn không quen với môi trường ảo, không sao, hãy chạy các lệnh sau:

1. Cập nhật Pip Installs Python (PIP) package manager để đảm bảo bạn có phiên bản mới nhất. Bỏ qua mọi cảnh báo.

pip3 install --upgrade pip

2. Cài đặt pipenv package để quản lý môi trường ảo:

pip3 install pipenv

3. Khởi tạo môi trường ảo của bạn với Python 3.9:

 pipenv install --python 3.9

4. Bắt đầu vào môi trường ảo:

pipenv shell

Sau khi bạn kích hoạt môi trường ảo, bạn sẽ nhận được lời nhắc có tiền tố (developer) để bạn biết rằng môi trường ảo đã được kích hoạt:

  (developer) [developer@devbox ~]$

Nếu bạn thoát khỏi terminal DevBox hoặc bị ngắt kết nối, bạn phải nhập lại lệnh pipenv shell để kích hoạt lại môi trường ảo sau khi kết nối lại.

5.Xác minh phiên bản Python của bạn trong môi trường ảo là 3.9.0:

 python --version

6.Cài đặt requests package mà script từ Postman ban nãy yêu cầu:

 pipenv install requests

Chạy Postman Script

Thông thường bạn chỉ cần copy và paste vào editor của bạn là có thể sử dụng được ngay. Trong DevBox, bạn phải tinh chỉnh một số thứ để nó hoạt động.

  1. Sau đây là một script được sửa đổi một chút so với script của Postman. Những thay đổi gồm:
    • Thêm #!/usr/bin/env python3 ở dòng đầu tiên, được gọi là "shebang" (hash# + bang! trong tiếng anh), trong Unix OSes để cho shell biết cần dùng chương trình gì để  thông dịch script. Trong trường hợp này, nó đang gọi chương trình env để tiếp tục gọi chương trình python3.
    • Thêm cặp khóa-giá trị verify=False trong requests để tắt xác nhận certificate .Bởi vì lab này sử dụng ISE tự ký chữ ký số cho nó nên requests sẽ gặp lỗi nếu chạy.
    • Thêm hai câu lệnh print để xem status_code và Location header, có chứa URL với resource ID của network device vừa tạo nếu thành công.

#!/usr/bin/env python3

 

import requests

import json

 

url = "https://ise-1.lab.devnetsandbox.local:9060/ers/config/networkdevice"

 

payload = json.dumps({

"NetworkDevice": {

  "name": "simulator",

  "description": "",

  "authenticationSettings": {

  "networkProtocol": "RADIUS",

  "radiusSharedSecret": "C1sco12345"

  },

  "tacacsSettings": {

  "sharedSecret": "C1sco12345",

  "connectModeOptions": "OFF"

  },

  "NetworkDeviceIPList": [

  {

      "ipaddress": "10.10.20.32",

      "mask": 32

  }

  ],

  "NetworkDeviceGroupList": [

  "Location#All Locations",

  "IPSEC#Is IPSEC Device#No",

  "Device Type#All Device Types"

  ]

}

})

headers = {

'Content-Type': 'application/json',

'Accept': 'application/json',

'Authorization': 'Basic YWRtaW46QzFzY28xMjM0NQ==',

'Cookie': 'APPSESSIONID=D3505C99C3044EC06AD4184662A0B19F; JSESSIONIDSSO=0A1FA892F29B6A39DB34F6D8812C6359'

}

 

# Use `verify=False` to disable ISE self-signed certificate validation errors

response = requests.request("POST", url, headers=headers, data=payload, verify=False)

 

print(response.status_code)            # show the status code number

print(response.headers["Location"])    # show the created resource-id

print(response.text)

2.Khi còn đang trong DevBox SSH session, tạo một file mới đặt tên là  ise_post_networkdevice_from_postman.py bằng editor mà bạn thích (nano, vi, vim, v.v.).

Nếu mà bạn vẫn chưa làm quen với editor nào hết, hãy thử bắt đầu với nano.

 nano ise_post_networkdevice_from_postman.py

3.Copy script ở trên vào trong editor rồi save nó lại.

Với nano, câu lệnh để lưu và thoát là ^+O (Ctrl+O) rồi Enter sau đó là ^+X (Ctrl+X)  .

4. Đổi quyền cho file để có thể chạy được:

 chmod 755 ise_post_networkdevice_from_postman.py

5.Chạy script. Mã 201 nghĩa là nó đã được tạo, và UUID ở cuối Location URL là  networkdevice id mới. Sẽ có một dòng trống trơn vì response.text - response body – trông không như lúc bạn tạo tài nguyên ở ERS. The additional print statements give you some satisfaction.

(developer) [developer@devbox ~]$ ./ise_post_networkdevice_from_postman.py

 201

 https://ise-1.lab.devnetsandbox.local:9060/ers/config/networkdevice/50dd81a0-d22c-11eb-a22c-723e1f0dfb0b

 (developer) [developer@devbox ~]$

6.Copy giá trị networkdevice's id mới của bạn (không phải id ở trên - hoàn toàn khác).

7.Vào Postman, click vào Environment Quick Look , rê chuột trên Current Value để xem id sau đó bấm icon hình bút chì để sửa lại nó, và dán id mới vào rồi bấm Enter.

8.Trong Postman, chọn NetworkDevice GET networkdevice/{id}, và bấm Send để xem network device của bạn.

Đây rõ ràng là một script cơ bản với một mục đích duy nhất. Có rất nhiều điều mà mọi người ngay lập tức muốn làm để làm cho nó linh hoạt hơn:

  • Dùng biến – variable cho hostname và port trong URL
  • Dùng biến mẫu trong gói payload
  • Sửa trường Authorization trong header để có thể tự động mã hóa username va password sang Base64
  • Dùng biến để xác thực certificate
  • Thay đổi format hoặc màu sắc của output để nhìn đẹp hơn
  • Lấy giá trị đầu vào từ command line
  • Đọc từ file CSV và gửi đến nhiều network device thông qua các POST request
  • Và còn hơn thế nữa…

Đây là lý do tại sao lập trình rất thú vị nhưng nó không phải là trọng tâm của lab này, vì vậy những cải tiến này sẽ được giao cho bạn trong thời gian rảnh rỗi và trí tưởng tượng của bạn.

Sử dụng RADIUS Simulator

Trình mô phỏng RADIUS có sẵn dưới dạng tập lệnh Python (python pez.py -c ise_dot1x_{username}.cfg) trên máy chủ CentOS Linux để thực hiện các yêu cầu Xác thực RADIUS thực đối với ISE. Điều này cho phép bạn kiểm tra cấu hình chính sách của mình với cả người dùng nội bộ ISE và người dùng Active Directory.

1.SSH đến RADIUS Simulator VM bằng mật khẩu C1sco12345, chấp nhận mọi key fingerprints:

 ssh developer@10.10.20.32
 developer@10.10.20.32's password: C1sco12345

2.Lệnh đơn giản để xác thực một user là:

Nhấn phím ↑ để quay trở lại câu lệnh trước để tiết kiệm công sức, khỏi cần phải gõ lại.

 python pez.py -c ise_dot1x_{username}.cfg

3.Output của script sẽ cho biết việc xác thực đã nhận được phản hồi Access-Accept hay Access-Reject:

 [developer@hcllinux pez]$ python pez.py -c ise_dot1x_tme.cfg

('acc_enable:', True)

host ipv4 address detected

10.10.20.77

Total time: 1.001

Average TPS: 1

Current TPS: 1

Access-Accept: 1

Access-Reject: 0

Errors: 0

Timeouts: 0

End: False

 

Total time: 1.001

Average TPS: 1

Current TPS: 1

Access-Accept: 1

Access-Reject: 0

Errors: 0

Timeouts: 0

End: True

 

[developer@hcllinux pez]$

Nếu bạn không nhận được output như trên, bạn phải xem lại cấu hình ISE cho policy, internal users, network devices, và Active Directory.

4.Những file ise_*.cfg có sẵn trong RADIUS simulator cho users trong Active Directory:

ise_dot1x_analyst.cfg

ise_dot1x_cio.cfg

ise_dot1x_contractor.cfg

ise_dot1x_cxo.cfg

ise_dot1x_devops.cfg

ise_dot1x_engineer.cfg

ise_dot1x_helpdesk.cfg

ise_dot1x_netadmin.cfg

ise_dot1x_netops.cfg

ise_dot1x_pm.cfg

ise_dot1x_secadmin.cfg

ise_dot1x_se.cfg

ise_dot1x_secops.cfg

ise_dot1x_tme.cfg

ise_dot1x_vendor.cfg

ise_dot1x_webops.cfg

5.Hai file configs này dành cho users không nằm trong Active Directory nên bạn có thể thử tài khoản internal user trong ISE:

 ise_dot1x_probe.cfg    # probe:C1sco12345
 ise_vpn.cfg            # employee:C1sco12345

6.Bạn có thể xem thử xem có xác thực và ủy quyền nào từ simulator trong ISE LiveLogs ở GUI theo 》 Operations 》 RADIUS 》 Live Logs.

7.Bạn cũng có thể sử dụng Cisco ISE API - MNT để xem cùng một phiên làm việc (sessions). Trong Postman Collections pane, chọn Cisco ISE API - MNT 》 GET ActiveList (all).

 Tất cả MNT API output đều ở dưới dạng XML.

         tme
         95:70:2B:E4:00:00
         10.10.20.32
         95:70:2b:e4:00:00
         ise-1
         21.0.0.2 

Sử dụng ciscoisesdk Python Package

Những gì bạn đã thấy với tập lệnh Postman Python là các URL thô được sử dụng để gửi các đoạn JSON tĩnh để cấu hình ISE. Nó không linh hoạt và không cung cấp các đối tượng và thuộc tính truyền thống có thể được vận hành theo cách lập trình. Sẽ thật tuyệt nếu bạn có thể đọc, tạo, cập nhật và xóa tài nguyên ISE của mình hoàn toàn bằng Python phải không?

Đó chính xác là những gì ciscoisesdk làm. Chúng tôi đã xây dựng gói Python ciscoisesdk để cung cấp các mô-đun Python để tương tác theo chương trình với các tài nguyên ISE. Cuối cùng không chỉ để bạn nghịch mà nó còn là nền tảng của bộ sưu tập cisco.ise Ansible. Nếu bạn muốn biết thêm về ciscoisesdk:

Bạn đã cài đặt gói requests bằng pipenv trong DevBox, quá trình này giống hệt đối với ciscoisesdk.

 Đừng quên bật Python virtual environment bằng câu lệnh pipenv shell nếu bạn không thấy chữ (developer)ở prompt terminal.

pipenv install ciscoisesdk

Tạo một Network Device

Hãy tạo một network device khác nhưng lần này sử dụng ciscoisesdk.

  1. Trong DevBox, tạo một file mới, đặt là isesdk_post_networkdevice.py.
  2. Copy script dưới vào file mới tạo trong DevBox.

#!/usr/bin/env python3

import json

from ciscoisesdk import api, ApiError

api_ = api.IdentityServicesEngineAPI(

            username='admin',

            password='C1sco12345',

            base_url='https://ise-1.lab.devnetsandbox.local',

            verify=False)

try:

    response = api_.network_device.create_network_device(

                        name="test_device",

                        description="",

                        profile_name="Cisco",

                        authentication_settings={

                            "networkProtocol": "RADIUS",

                            "radiusSharedSecret": "C1sco12345"

                        },

                        tacacs_settings={

                            "sharedSecret": "C1sco12345",

                            "connectModeOptions": "OFF"

                        },

                        network_device_iplist=[

                            {

                                "ipaddress": "10.10.20.33",

                                "mask": 32

                            }

                        ],

                        network_device_group_list=[

                            "Location#All Locations",

                            "IPSEC#Is IPSEC Device#No",

                            "Device Type#All Device Types"

                        ]

    )

    if (response.headers["Location"]) :

        print(response.headers["Location"])

    else :

        print(json.dumps(response.response, indent=2))

except ApiError as e:

    print(e)

3.Đổi quyền cho file để có thể chạy được:

 chmod 755 isesdk_post_networkdevice.py

4.Chạy script và bạn có thể thấy id của network device ở sau cùng của URL.

 ./isesdk_post_networkdevice.py

Nếu bạn thấy cảnh báo như là InsecureRequestWarning: Unverified HTTPS request is being made to host, bỏ qua nó bằng các thêm vào biến môi trường (environment) giá trị sau:

   export PYTHONWARNINGS="ignore:Unverified HTTPS request"

Lấy thông tin Network Device

Chúng ta đã tạo một network device với script trước đó. Với script đầu tiên của bạn với ciscoisesdk, hãy thử lấy thông tin chi tiết hơn.

  1. Trong DevBox, tạo file với tên là isesdk_get_networkdevice.py.
  2. Copy script sau và dán nó vào file vừa tạo trong DevBox.
#!/usr/bin/env python3
import json
from ciscoisesdk import api
api_ = api.IdentityServicesEngineAPI(username='admin',
                                    password='C1sco12345',
                                    base_url='https://ise-1.lab.devnetsandbox.local',
                                    verify=False)
try:
    response = api_.network_device.get_network_device_by_name('test_device').response
    print(json.dumps(response, indent=2))
except ApiError as e:
    print(e)

Lưu script.

Cho script quyền được thực thi: chmod 755 isesdk_get_networkdevice.py.

Chạy script với câu lệnh ./isesdk_get_networkdevice.py và bạn sẽ thấy tất cả các thuộc tính như ở trong Postman.

{
     "NetworkDevice": {
     "id": "3d3c90b0-d253-11eb-a22c-723e1f0dfb0b",
     "name": "test_device",
     "description": "",
     "authenticationSettings": {
         "networkProtocol": "RADIUS",
         "radiusSharedSecret": "C1sco12345",
         "enableKeyWrap": false,
         "dtlsRequired": false,
         "keyInputFormat": "ASCII",
         "enableMultiSecret": "false"
     },
     "tacacsSettings": {
         "sharedSecret": "C1sco12345",
         "connectModeOptions": "OFF"
     },
     "profileName": "Cisco",
     "coaPort": 0,
     "link": {
         "rel": "self",
         "href": "https://ise-1.lab.devnetsandbox.local/ers/config/networkdevice/name/test_device",
         "type": "application/json"
     },
     "NetworkDeviceIPList": [
         {
         "ipaddress": "10.10.20.33",
         "mask": 32
         }
     ],
     "NetworkDeviceGroupList": [
         "Location#All Locations",
         "IPSEC#Is IPSEC Device#No",
         "Device Type#All Device Types"
     ]
     }
 }

Đó là phần cuối của chuyến tham quan nhanh ciscoisesdk để chỉ cho bạn những điều cơ bản về cách sử dụng nó. Tham khảo tài liệu nếu bạn có bất kỳ câu hỏi nào về cách sử dụng bất kỳ đối tượng cụ thể nào trong các tập lệnh của riêng bạn.


FORM ĐĂNG KÝ MUA HÀNG
Đặt hàng
icon-cart
0