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 檔案的功能。
  • globos 模組:用於與作業系統或命令列互動。
  • timedatetime 模組:提供與時間戳記相關的操作。
  • 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 re
  • re.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