網路安全管理日益重要,而 Python 的豐富生態圈提供許多工具可以協助自動化這些工作。本文將介紹如何結合 Netmiko、Pyshark 和 InquirerPy 等函式庫,開發一個能檢查裝置安全設定、捕捉分析網路封包,並具備互動式命令列介面的自動化工具。透過 Python 的靈活性與這些函式庫的便捷性,可以大幅提升網路管理效率和安全性。此工具的設計著重於模組化和易用性,讓使用者能輕鬆地執行各種網路管理任務,例如日誌收集、裝置組態、檔案傳輸等等。文章中也包含了程式碼範例和詳細的說明,方便讀者理解和應用。

網路裝置安全檢查與強化

在網路安全管理中,檢查和強化網路裝置的安全設定是至關重要的。本篇文章將討論如何使用 Python 和 Netmiko 函式庫來檢查網路裝置的安全設定,並提供一些範例程式碼來說明如何檢查路由器設定中的密碼安全性以及連線埠的安全性。

檢查路由器密碼安全性

在許多網路裝置中,預設的密碼設定可能存在安全風險。攻擊者可以輕易地猜測或破解這些密碼,從而獲得對網路裝置的未授權存取。因此,檢查和強化密碼安全性是非常重要的。

範例程式碼:檢查使用者名稱和密碼

from netmiko import Netmiko
from re import findall
from concurrent.futures import ThreadPoolExecutor

# 定義目標主機
host = ["10.10.10.1", "10.10.10.2", "10.10.10.3"]

def collect_cpu(ip):
    # 設定裝置連線資訊
    device = {"host": ip, "username": "admin", "password": "cisco", "device_type": "cisco_ios"}
    command = "show run"
    net_connect = Netmiko(**device)
    output = net_connect.send_command(command)
    
    # 擷取使用者名稱相關資訊
    username = findall("username.*", output)
    for user in username:
        secret = findall("secret", user)
        username_value = findall("username (\S+) ", user)
        
        # 檢查密碼是否為安全設定
        if secret:
            print(f"{ip}: '{username_value[0]}' 的密碼是安全的。")
        else:
            print(f"{ip}: '{username_value[0]}' 的密碼是不安全的。")

# 使用 ThreadPoolExecutor 進行平行處理
with ThreadPoolExecutor(max_workers=50) as executor:
    result = executor.map(collect_cpu, host)

內容解密:

  1. 連線設定:使用 Netmiko 函式庫連線到指定的網路裝置,並執行 show run 命令來擷取設定資訊。
  2. 擷取使用者名稱:使用正規表示式從輸出結果中擷取包含 username 的行。
  3. 檢查密碼安全性:檢查擷取到的使用者名稱相關資訊中是否包含 secret 關鍵字,以判斷密碼是否為安全設定。
  4. 平行處理:使用 ThreadPoolExecutor 對多個目標主機進行平行處理,以提高效率。

檢查連線埠安全性

除了密碼安全性外,網路裝置的連線埠安全性也是非常重要的。未使用的連線埠如果未被關閉,可能會被惡意利用,從而導致安全風險。

範例程式碼:檢查連線埠狀態

from netmiko import Netmiko
from re import findall
from concurrent.futures import ThreadPoolExecutor

# 定義目標主機
host = ["10.10.10.1", "10.10.10.2", "10.10.10.3"]

def collect_cpu(ip):
    # 設定裝置連線資訊
    device = {"host": ip, "username": "admin", "password": "cisco", "device_type": "cisco_ios"}
    command = "show ip interface brief"
    net_connect = Netmiko(**device)
    output = net_connect.send_command(command)
    
    # 擷取介面資訊
    interfaces = findall("GigabitEthernet.*", output)
    for port in interfaces:
        int_name = findall("(GigabitEthernet\d+/\d+)", port)
        port_shutdown = findall("administratively down", port)
        port_up = findall("up\s+up", port)
        
        # 檢查連線埠狀態
        if not port_shutdown and not port_up:
            print(f"{ip}: '{int_name[0]}' 連線埠未被關閉,存在安全風險。")

# 使用 ThreadPoolExecutor 進行平行處理
with ThreadPoolExecutor(max_workers=50) as executor:
    result = executor.map(collect_cpu, host)

內容解密:

  1. 連線設定:使用 Netmiko 函式庫連線到指定的網路裝置,並執行 show ip interface brief 命令來擷取介面資訊。
  2. 擷取介面資訊:使用正規表示式從輸出結果中擷取包含 GigabitEthernet 的行。
  3. 檢查連線埠狀態:檢查擷取到的介面資訊中是否包含 administratively downup up,以判斷連線埠是否為安全狀態。
  4. 平行處理:使用 ThreadPoolExecutor 對多個目標主機進行平行處理,以提高效率。

使用pyshark模組進行網路封包捕捉與分析

在網路安全與監控領域,封包捕捉和分析是一項至關重要的技術。Wireshark是目前最流行的網路封包分析工具,而pyshark則是一個根據Python的簡單封包捕捉模組。本文將介紹如何使用pyshark模組捕捉和分析網路封包。

安裝pyshark模組

首先,我們需要安裝pyshark模組。可以在終端機中使用以下指令進行安裝:

pip install pyshark

使用pyshark捕捉封包

以下是一個簡單的範例,展示如何使用pyshark捕捉網路封包:

import pyshark

# 建立LiveCapture物件,指定要捕捉封包的網路介面
capture = pyshark.LiveCapture(interface='Wi-Fi')

# 使用sniff_continuously方法捕捉指定數量的封包
packets = capture.sniff_continuously(packet_count=3)

# 列印捕捉到的封包資訊
for pckt in packets:
    print(f"\n\nPacket: \n{pckt}")

內容解密:

  1. 匯入pyshark模組:首先,我們需要匯入pyshark模組,以便使用其提供的功能。
  2. 建立LiveCapture物件:透過pyshark.LiveCapture類別建立一個用於捕捉封包的物件,並指定要監聽的網路介面(例如Wi-Fi)。
  3. 捕捉封包:使用sniff_continuously方法開始捕捉封包,並指定要捕捉的封包數量(此例中為3)。
  4. 列印封包資訊:最後,將捕捉到的封包資訊逐一列印出來。

進階使用:使用findall函式進行封包分析

pyshark模組提供了豐富的功能,可以對捕捉到的封包進行深入分析。例如,可以使用findall函式來查詢特定的封包內容。

網路自動化工具開發

隨著網路規模的日益擴大,網路自動化管理變得越來越重要。本章將介紹如何使用Python開發一個根據命令列介面的網路自動化工具。

InquirerPy模組簡介

InquirerPy是一個Python命令列介面(CLI)模組,允許使用者透過互動式介面選擇執行不同的任務。我們將使用InquirerPy模組來開發我們的網路自動化工具。

安裝InquirerPy模組

可以使用以下指令安裝InquirerPy模組:

pip install InquirerPy

使用InquirerPy建立CLI介面

以下是一個簡單的範例,展示如何使用InquirerPy建立一個CLI介面:

from InquirerPy import inquirer

# 定義選項
options = ['收集日誌', '組態裝置', '傳輸檔案']

# 顯示選項並取得使用者選擇
action = inquirer.select(
    message='請選擇一個操作:',
    choices=options,
).execute()

# 根據使用者選擇執行相應操作
if action == '收集日誌':
    print('開始收集日誌...')
elif action == '組態裝置':
    print('開始組態裝置...')
elif action == '傳輸檔案':
    print('開始傳輸檔案...')

內容解密:

  1. 匯入InquirerPy模組:首先匯入InquirerPy模組。
  2. 定義選項:定義使用者可選擇的操作。
  3. 顯示選項並取得使用者選擇:使用inquirer.select方法顯示選項並取得使用者的選擇。
  4. 執行相應操作:根據使用者的選擇執行相應的操作。

網路自動化工具設計

我們的網路自動化工具將整合多個功能,包括收集日誌、組態裝置、傳輸檔案等。透過InquirerPy模組,我們可以為使用者提供一個友好的CLI介面,簡化網路管理任務。

網路自動化工具設計與InquirerPy模組應用

在現代網路管理中,自動化工具扮演著至關重要的角色。本文將介紹如何利用Python及其相關模組設計一個網路自動化工具,並著重探討InquirerPy模組在提升使用者互動體驗方面的應用。

InquirerPy模組簡介

InquirerPy是一個Python模組,旨在簡化命令列介面(CLI)應用程式的使用者互動體驗。它提供了多種提示(prompt)型別,讓開發者能夠輕鬆地實作複雜的使用者輸入處理。

支援的提示型別

InquirerPy模組支援多種提示型別,包括但不限於:

  1. 文字提示(text prompt):接受使用者輸入,並傳回輸入值。
  2. 選擇提示(select prompt):顯示一系列選項供使用者選擇。
  3. 確認提示(confirm prompt):詢問使用者是否確認某項操作。
  4. 密碼提示(secret prompt):隱藏使用者輸入的內容,常用於輸入密碼等敏感資訊。

InquirerPy模組使用範例

以下將逐一介紹InquirerPy模組中各個提示型別的使用方法及範例程式碼。

文字提示(text prompt)

文字提示允許使用者輸入文字,並傳回輸入的值。其使用方法如下:

from InquirerPy import inquirer

name = inquirer.text(message="你最喜歡的顏色是什麼:").execute()
print(f"你最喜歡的顏色是 {name}")

執行上述程式碼後,使用者會被提示輸入他們最喜歡的顏色。輸入後,程式會輸出使用者輸入的顏色名稱。

選擇提示(select prompt)

選擇提示提供一系列選項供使用者選擇。其使用方法如下:

from InquirerPy import inquirer

fruit = inquirer.select(
    message="你最喜歡的水果是什麼:",
    choices=["香蕉", "蘋果", "藍莓", "橙子"]
).execute()
print(f"你最喜歡的水果是 {fruit}")

執行上述程式碼後,使用者會被提示從提供的選項中選擇他們最喜歡的水果。選擇後,程式會輸出使用者選擇的水果名稱。

確認提示(confirm prompt)

確認提示用於詢問使用者是否確認某項操作。其使用方法如下:

from InquirerPy import inquirer

confirm = inquirer.confirm(message="確認:").execute()
print(confirm)

執行上述程式碼後,使用者會被提示確認是否繼續。若使用者輸入y,則confirm變數將為True;否則為False

密碼提示(secret prompt)

密碼提示用於隱藏使用者輸入的內容,常用於輸入密碼等敏感資訊。其使用方法如下:

from InquirerPy import inquirer

password = inquirer.secret(message="輸入裝置密碼:").execute()
print(password)

執行上述程式碼後,使用者輸入的密碼將被隱藏,程式仍能正確接收並輸出輸入的密碼。

網路自動化工具設計

根據InquirerPy模組,我們設計了一個網路自動化工具,該工具提供了17個不同的指令碼,用於執行諸如從網路裝置收集日誌、安裝套件、進行ping測試和檔案傳輸等任務。

工具結構

該工具的結構如下:

  • main.py:呼叫各個類別和函式以執行指令碼,並利用InquirerPy模組提供使用者介面。
  • network_devices.py:包含與網路裝置相關的指令碼,如收集日誌、組態裝置等。
  • servers.py:包含與伺服器相關的指令碼。
  • others.py:包含其他未被歸類別到前述類別的指令碼,如工具和繪圖功能。

設計考量

在設計該工具時,我們考慮到可維護性和可讀性,將功能劃分為不同的Python檔案和類別。這種結構使得未來新增更多特定用途的指令碼變得更加容易,從而增強了工具的擴充套件性和實用性。

#### 內容解密:

此網路自動化工具利用InquirerPy模組提升了使用者互動體驗,並透過模組化的設計提高了工具的可維護性和擴充套件性。未來,我們可以根據需要進一步擴充該工具的功能,使其支援更多廠商的網路裝置和系統。

網路自動化工具開發

自動化工具結構設計

本工具採用模組化設計,將不同功能劃分為多個Python檔案。主要的目錄結構如下: / main.py network_devices.py servers.py others.py hosts.yaml input/ command_list.txt device_list.txt output/ Output Files

檔案功能說明

  • main.py:主程式入口,負責呼叫其他模組並提供使用者介面
  • network_devices.py:網路裝置相關操作,如日誌收集、裝置組態等
  • servers.py:伺服器相關操作,如組態收集和資源使用情況監控
  • others.py:其他輔助工具,如子網路計算器、繪圖功能等
  • hosts.yaml:Nornir模組使用的裝置登入資訊檔案

主程式開發

模組匯入

首先匯入必要的模組和類別:

from InquirerPy import inquirer
from network_devices import *
from servers import *
from others import *

主選單實作

使用InquirerPy模組建立主選單:

main_task = inquirer.select(
    message="選擇主要任務:",
    choices=["收集日誌", "裝置組態", "檔案傳輸", "伺服器組態", "其他", "離開"]).execute()

子任務處理

根據使用者選擇執行相應的子任務,以「收集日誌」為例:

if main_task == "收集日誌":
    sub_task = inquirer.select(
        message="選擇子任務:",
        choices=["單一裝置", "多裝置", "收集裝置資訊", "收集CPU使用率", 
                "傳送收集的日誌", "離開"]).execute()
    
    if sub_task == "單一裝置":
        ip = inquirer.text(message="裝置IP: ").execute()
        username = inquirer.text(message="使用者名稱: ").execute()
        password = inquirer.secret(message="密碼: ").execute()
        command = inquirer.text(message="執行命令: ").execute()
        collect_logs.from_one_device(ip, username, password, command)
    # 其他子任務處理...

功能實作細節

1. 日誌收集功能

實作從單一或多個裝置收集日誌的功能。對於多裝置操作,可從input/device_list.txt檔案讀取裝置清單。

2. 裝置組態功能

提供組態網路裝置的功能,可透過Netmiko或Nornir模組實作。

3. 檔案傳輸功能

實作透過SCP或SFTP協定上傳檔案到裝置或伺服器的功能。

程式碼最佳實踐

  1. 模組化設計:將不同功能劃分到不同的Python檔案中,提高程式碼的可維護性。
  2. 錯誤處理:在關鍵操作中加入適當的錯誤處理機制。
  3. 安全性考慮:妥善處理敏感資訊,如密碼等。

圖表展示範例

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Python網路裝置安全檢查與自動化

package "安全架構" {
    package "網路安全" {
        component [防火牆] as firewall
        component [WAF] as waf
        component [DDoS 防護] as ddos
    }

    package "身份認證" {
        component [OAuth 2.0] as oauth
        component [JWT Token] as jwt
        component [MFA] as mfa
    }

    package "資料安全" {
        component [加密傳輸 TLS] as tls
        component [資料加密] as encrypt
        component [金鑰管理] as kms
    }

    package "監控審計" {
        component [日誌收集] as log
        component [威脅偵測] as threat
        component [合規審計] as audit
    }
}

firewall --> waf : 過濾流量
waf --> oauth : 驗證身份
oauth --> jwt : 簽發憑證
jwt --> tls : 加密傳輸
tls --> encrypt : 資料保護
log --> threat : 異常分析
threat --> audit : 報告生成

@enduml

內容解密:

此圖展示了主要Python檔案之間的依賴關係。main.py作為主程式入口,分別呼叫了其他三個模組。network_devices.py需要讀取input/device_list.txt中的裝置清單,而servers.py則使用hosts.yaml中的組態資訊。