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.
{
"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:
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:
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.
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 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.
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.
#!/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:
Đâ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.
#!/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.
isesdk_get_networkdevice.py
.
#!/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.