To be completed!
此篇為個人學習筆記
課程:Automate Cybersecurity Tasks with Python-Google @ Coursera
主題
探索 Python 程式語言,並撰寫程式碼以自動化資安作業流程。
# Python 介紹
# 資安導向 Python 入門
Python 可自動化的任務包括:
- 日誌分析
- 惡意軟體分析
- 訪問控制管理列表 (ACL)
- 入侵偵測
- 合規檢查
- 分析網絡流量
Jupyter Notebook
點 2 下編輯 cell, Shift Enter 執行
# 核心元件
使用 // 可將計算結果向下取整為整數。
Tuple(元組)
- 不可變的資料結構,可包含多種資料型別。
- 與可修改的 list 相比,tuple 更適合用於需保證不被更動的資料,如資安中的識別碼。
- tuple 使用小括號定義,且比 list 更節省記憶體,適合大量資料處理。
- 例:
("ray", 13, True)
Dictionary
字典由鍵值對組成,每個鍵對應一個值,適合需要快速查詢的情境。例:
{ 1: "East", | |
2: "West", | |
3: "North", | |
4: "South" } |
Set
一組無序且唯一的資料元素,元素不可重複,且可包含任意資料型別。例: {"jlanksy", "drosas", "nmason"}
變數命名時,應遵守以下規範:
- 使用底線分隔單字,如
login_attempts,並避免相似或過長的名稱。 - 另一常見命名規範是將每個單字的首字母大寫,如
loginAttempt。
# 條件與迴圈
in 可用於迴圈,也可用於條件式中判斷元素是否存在於序列中。
無限迴圈可用 CTRL + C (或 CTRL + Z )中斷。
# 寫高效的 Python 程式
# 函數
參數 (Parameter) 是在定義函式時宣告的變數;
引數 (Argument) 則是呼叫函式時實際傳入的值。
在函式中使用了與全域變數同名的變數,Python 會視為新的區域變數。
my_variable = 10 | |
def my_function(): | |
global my_variable #宣告此變數是使用全域的同名變數 | |
my_variable = 20 | |
my_function() | |
print(my_variable) # 20 |
最佳實踐
- 避免全域與區域變數同名,以防混淆。
- 函式可讀取全域變數,但不建議修改全域變數。
- 傳遞資料應使用參數而非依賴全域變數,以提升可維護性與可讀性。
sorted() 用來對可迭代物件排序,預設為遞增排序,並回傳新串列,不會更動原資料。
# 社群
模組 (module) 是包含可重複使用程式碼的 Python 檔案;
函式庫 (library) 是模組的集合。
Python 標準函式庫 (Standard Library) 中的常用模組:
re模組:用於搜尋日誌檔案中的特定模式。csv模組:提供處理 .csv 檔案的功能。glob和os模組:用於與作業系統或命令列互動。time和datetime模組:提供與時間戳記相關的操作。statistics模組:提供許多數值統計計算的功能,如:mean():計算平均值median():計算中位數
匯入整個模組後,使用格式 模組.函式() 呼叫函式。
使用 from 模組 import 函式 可匯入特定函式。匯入後可直接使用函式名稱,不需加上模組前綴。
Jupyter Notebook 中,需透過 %pip install 安裝外部函式庫 (External Libraries)。
可讀性
- 風格指南:指導文件寫作、格式化與設計的手冊。
- PEP 8 風格指南:針對 Python 程式設計的風格規範。
- 如:應保持每行小於 79 字元。
- 每次縮排使用四個空格。
# 字串和串列
# 字串
作為資安分析師,字串數據是最常接觸的數據類型之一。這些字串通常包含 IP 位址、用戶名稱、URL 和員工 ID 等,工作中可能需要擷取部分內容驗證有效性。
字串可以使用負數索引,負數是從字串尾端反向計算的位置。
字串是不可變(Immutable)的,即建立後無法修改內容的物件。
字串函式與方法
str(),len(),.upper(),.lower().index(): 尋找特定字元或子字串首次出現的位置,不存在會報錯。
# 串列和演算法
串列方法
.insert(i, x):在索引i的位置插入元素x,原有元素會往後移動。.remove(x):移除清單中第一個出現的元素x,後方元素會往前移動。若有重複,僅刪除第一個。.append(x).index(x):回傳元素x首次出現的索引。
# 正規表達式
import rere.findall(模式字串, 目標字串)
模式符號
\w:匹配英數字與底線.:匹配所有字元(含符號)\d:匹配單一數字(0–9)\s:匹配單一空格\.:匹配句點.字元
數量表示
+:1 次或以上*:0 次或以上- 使用
{}限定重複次數{n}:指定字元必須重複 n 次(如\d{2}代表連續兩位數){n,m}:指定重複次數在 n 到 m 次之間(如\d{1,3}比對 1 至 3 位數)- Python 從左到右掃描字串,完成一次比對後從下一個字元繼續。
撰寫正規表示式模式
將欲搜尋的內容拆解為小單位並用正規表示式符號表示,如:
\w+:\s\d+:用來擷取「使用者名稱 + 冒號 + 空格 + 數字」格式的資訊。
import re | |
pattern = r"\w+:\s\d+" #r 可加可不加 | |
re.findall(pattern, employee_logins_string) |
搭配 re.findall() 使用,可從複雜字串中擷取出關鍵欄位。記得測試模式以避免漏抓或誤抓資料。
# Python 實踐
# 自動化
使用 Python 強化 CI/CD 的資安自動化
Python 可用來將安全檢查自動化整合至 CI/CD 流程中,實現 DevSecOps(開發、資安、運維協作)。這讓安全成為整個開發流程中的共同責任,並在每個階段持續自動執行資安任務。
Python 能提升速度、減少錯誤,幫助在開發早期找出漏洞並確保一致性。它能減輕資安團隊負擔,並促進 DevSecOps 文化,使資安成為整體開發流程的一部分。
在 CI/CD 中可自動化的資安任務:
安全性測試
- SAST(靜態應用程式安全測試)
使用 Python 執行 SAST 工具,在程式碼建置前掃描安全弱點;也可用在發現高風險問題時終止流程。 - DAST(動態應用程式安全測試)
在應用程式運行時於測試環境執行 DAST 工具。 - SCA(軟體組成分析)
控制 SCA 工具,掃描相依套件(如開源元件)是否存在已知弱點。
弱點掃描
可針對以下目標進行:
- 容器映像檔
- 基礎架構組態
- CI/CD 工具本身
合規性檢查
可自動產出合規報告,確保流程符合政策,如:
- 程式碼是否遵循安全編碼準則
- 雲端與基礎設施是否符合資安配置標準
機密管理自動化
檢查是否將敏感憑證(如 API 金鑰)誤寫入程式碼。也可整合 HashiCorp Vault 等機密管理工具,於部署時安全地存取與注入機密資料。
自動執行安全政策(Policy as Code)
Python 與 CI/CD 工具整合良好,能:
- 在流程中執行資安自動化腳本
- 利用 API 操作建置流程或呼叫資安工具
- 透過擴充模組與腳本整合資安邏輯
- 自動建置安全測試環境
- 檢查程式碼品質與安全性
# 檔案處理
將文件導入 python
開啟檔案 & 讀取內容
with open("update_log.txt", "r") as file: | |
updates = file.read() | |
print(updates) |
with:確保檔案用完後自動關閉,避免資源未釋放或檔案損壞open():開啟檔案;第一個參數為檔名或檔案路徑(需為字串),第二個參數為模式:- "r":讀取模式
- "w":覆寫寫入
- "a":附加寫入
.read():將整個檔案內容讀取為一個字串,便於後續操作。
寫入檔案
line = "jrafael,192.168.243.140,4:56:27,True" | |
with open("access_log.txt", "a") as file: | |
file.write(line) |
.write():寫入字串至檔案(必須是字串型別)
處理檔案內容
.split():將字串切割成清單- 指定分隔符,會依據這個符號來切割字串。如:
.split(",")。 - 不指定分隔符,預設以空白字元來分割字串。
- 指定分隔符,會依據這個符號來切割字串。如:
.join():將清單合併成一個字串- 是用在「分隔符」字串上,而不是用在清單本身。
- 清單作為參數傳入
.join(),用來決定要合併的內容。 - 例:
"\n".join(users)
操作流程
檔案內容(字串)→ .split() → 清單 → 處理清單 → .join() → 字串 → .write() 寫入檔案
# Debug
錯誤類型
- 語法錯誤(Syntax Errors)
- 邏輯錯誤(Logic Errors)
- 例外(Exceptions),解決方式建議:
- NameError → 確保變數或函式已定義。
- IndexError → 檢查列表長度或使用 len ()。
- TypeError → 檢查型別,可用 type () 測試。
- FileNotFoundError → 檢查路徑與檔名拼寫是否正確。
攔截例外小技巧,讓程式不中斷:
try: | |
print(usernames[3]) | |
except IndexError: | |
print("錯誤:索引超出範圍!") |
現在許多 IDE 可加入 AI 協助工具,例如:Gemini Code Assist