返回文章列表

REST API安全與Python應用程式佈署

本文探討如何強化 REST API 安全性,包含速率限制、使用者會話管理及兩步驟驗證等實務做法。同時,文章也涵蓋了 Python 後端應用程式的佈署流程,包含 Docker 容器化、Kubernetes 協調、CI/CD 最佳實務、

Web 開發 系統設計

在現今的網路應用程式開發中,REST API 的安全性和後端應用程式的佈署效率至關重要。本文將探討如何使用 Flask 框架強化 REST API 的安全性,並詳細介紹如何利用 Docker 和 Kubernetes 等技術佈署 Python 後端應用程式。首先,我們將探討如何實施速率限制以防止 API 濫用,接著說明安全的使用者會話管理機制,並介紹如何實施兩步驟驗證以提升安全性。佈署方面,文章將引導讀者使用 Docker 容器化 Python 應用程式,並說明如何利用 Dockerfile 建立映像檔、執行容器以及使用 Kubernetes 進行容器協調。此外,文章還涵蓋了 CI/CD 最佳實務、Nginx 作為反向代理的設定方式,以及 SSL 證書和 HTTPS 的組態,以確保應用程式的安全性、可擴充套件性和高用性。

強化REST API安全與使用者會話管理

在開發安全的網路應用程式時,保護REST API和實施有效的使用者會話管理至關重要。本文將探討如何使用Flask框架實作這些安全措施,包括速率限制、使用者會話管理和兩步驟驗證。

實施速率限制

速率限制是保護API免受濫用和拒絕服務(DoS)攻擊的關鍵技術。Flask-Limiter是一個強大的擴充套件,能夠輕鬆地為API端點新增速率限制。

from flask import Flask, jsonify
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address

app = Flask(__name__)
limiter = Limiter(
    app,
    key_func=get_remote_address,
    default_limits=["200 per day", "50 per hour"]
)

@app.route("/api/resource")
@limiter.limit("10 per minute")
def get_resource():
    return jsonify({"data": "This is rate-limited"})

內容解密:

  1. 初始化Flask-Limiter:透過Limiter類別初始化速率限制器,指定應用程式、鍵值函式和預設速率限制。
  2. default_limits引數:設定預設的速率限制,例如每天200次請求,每小時50次請求。
  3. @limiter.limit裝飾器:為特定的API端點(如/api/resource)設定自定義的速率限制,例如每分鐘10次請求。
  4. get_remote_address函式:根據客戶端的遠端地址進行速率限制,有效防止單一客戶端的濫用。

使用者會話管理

使用者會話管理對於維護應用程式的安全性至關重要,尤其是在處理無狀態的HTTP協定和使用者互動時。

核心概念

  1. 會話建立:使用者成功登入後,伺服器建立一個會話,通常由一個會話識別符號(session ID)表示。該ID必須是唯一且不可預測的,以防止攻擊者猜測或偽造有效的會話ID。
  2. 會話儲存:會話資料可以儲存在客戶端(在cookie中)或伺服器端(在資料函式庫或記憶體儲存中)。每種方法都有其效能和安全性影響。
  3. 會話過期:會話應具有定義的生命週期,在此之後自動過期,以防止舊會話被無限期使用,從而降低安全風險。
  4. 會話維護:在會話期間,管理和更新會話詳細資訊非常重要,同時確保會話免受諸如固定或劫持等威脅。

實施安全的會話管理

使用Flask,可以實作上述會話管理的各個方面:

from flask import Flask, session, request, redirect, url_for
from flask_session import Session

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 用於簽署會話cookie的金鑰
app.config['SESSION_TYPE'] = 'filesystem'  # 將會話儲存在檔案系統上
Session(app)

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user = validate_user(username, password)
    if user:
        session['user_id'] = user.id  # 在會話中儲存使用者識別符號
        return redirect(url_for('dashboard'))
    return 'Invalid username or password', 401

app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=1)  # 一小時後過期
app.config['SESSION_COOKIE_SECURE'] = True  # 透過HTTPS傳送會話cookie
app.config['SESSION_COOKIE_HTTPONLY'] = True  # 防止XSS攻擊
app.config['SESSION_COOKIE_SAMESITE'] = 'Lax'  # 防止CSRF攻擊

內容解密:

  1. 會話建立和處理:使用者登入成功後,Flask自動建立一個會話,並將使用者ID儲存在會話中。
  2. 會話儲存組態:透過Flask-Session擴充套件,將會話資料儲存在伺服器端的檔案系統上,提高安全性。
  3. 會話過期設定:組態PERMANENT_SESSION_LIFETIME,使會話在一小時後自動過期,防止舊會話被利用。
  4. 安全相關組態:設定SESSION_COOKIE_SECURESESSION_COOKIE_HTTPONLYSESSION_COOKIE_SAMESITE,確保會話cookie透過HTTPS傳輸,防止XSS和CSRF攻擊。

實施兩步驟驗證

兩步驟驗證(2FA)是一種增強應用程式安全性的有效方法,透過要求使用者提供兩種不同的驗證資訊來確認其身份。

步驟1:為使用者生成金鑰

當使用者選擇啟用2FA時,生成一個用於生成時間基一 次性密碼(TOTP)的金鑰,並將其安全地儲存在使用者資料中。

import pyotp

def generate_secret():
    return pyotp.random_base32()

def setup_2fa(user_id):
    secret = generate_secret()
    save_secret_to_user_profile(user_id, secret)
    return secret

內容解密:

  1. generate_secret函式:生成一個隨機的Base32編碼金鑰,用於TOTP生成。
  2. setup_2fa函式:為特定使用者設定2FA,生成並儲存金鑰到使用者資料中。

步驟2:將金鑰與驗證器應用連結

透過顯示一個二維碼,讓使用者使用TOTP生成應用(如Google Authenticator)掃描並繫結金鑰。

def get_totp_uri(secret, user_email):
    totp = pyotp.TOTP(secret)
    return totp.provisioning_uri(user_email, issuer_name="UniversityApp")

內容解密:

  1. get_totp_uri函式:根據生成的金鑰和使用者電子郵件,建立一個TOTP組態URI,用於生成二維碼供使用者掃描。

步驟3:在登入時驗證TOTP

使用者登入時,除了密碼外,還需要輸入TOTP應用生成的驗證碼,並使用儲存在使用者資料中的金鑰進行驗證。

def verify_totp(token, user_id):
    user_secret = get_secret_from_user_profile(user_id)
    totp = pyotp.TOTP(user_secret)
    return totp.verify(token)

內容解密:

  1. verify_totp函式:根據使用者輸入的驗證碼和從使用者資料中檢索的金鑰,驗證TOTP的有效性。

佈署Python後端應用程式

簡介

本章節將概述佈署Python後端應用程式的關鍵要素。讀者將學習到能夠提升Web應用程式可擴充套件性、安全性和效能的重要工具和技術。本章首先簡要介紹Docker和容器技術,接著描述如何利用這些技術封裝應用程式環境。

Docker與容器技術概述

容器化技術已經徹底改變了應用程式的佈署和管理流程,作為傳統虛擬化的輕量級替代方案。Docker是目前最知名、使用最廣泛的容器化工具。透過Docker,開發者可以建立標準化的軟體開發單元,稱為容器,其中包含應用程式及其所有依賴項。

瞭解容器化

容器化涉及將應用程式及其環境(依賴項、組態、指令碼和二進位制檔案)封裝到一個容器中。與需要獨立作業系統的虛擬機器(VM)不同,容器分享主機系統的OS核心,但保持獨立的處理程式、檔案系統和網路。這使得容器比傳統VM更高效、更易於管理,且資源密集度更低。

Docker在容器化中的角色

Docker提供了管理容器生命週期的工具和平台。由於其易用性、豐富的工具和健全的生態系統,Docker已成為容器技術的代名詞。Docker使用簡單的語法,允許使用者透過一系列簡單的命令建立、傳輸和執行容器。

以下是Docker的關鍵組成部分:

  • Dockerfile:一個包含所有命令的文字檔案,使用者可以在命令列上呼叫這些命令來組裝映像。使用docker build,使用者可以建立自動化構建,依次執行多個命令列指令。
  • Docker映像:本質上是容器的快照,一個不可變的檔案。映像作為Docker的構建區塊,可以儲存在登入檔中,並被提取以建立容器。
  • Docker容器:Docker映像的例項。容器代表單個應用程式、處理程式或服務的執行。
  • Docker Hub/登入檔:為Docker使用者提供主機和分享映像的空間的服務。由Docker Inc.維護的公共Docker Hub託管了成千上萬個映像,這些映像中包含了預先封裝的應用程式、服務和實用程式。

Docker的主導地位

Docker的主導地位可歸因於以下幾個因素:

  • 可移植性:一旦建立了Docker容器,就可以在任何安裝了Docker的機器上執行,無論底層環境如何。這消除了「在我的機器上可以執行」的問題。
  • 版本控制和重用性:映像可以被版本化、儲存在登入檔中,並多次重用。組織可以透過使用維護和更新的安全補丁的基本映像來提高效率。
  • 隔離:Docker確保在容器中執行的應用程式彼此隔離,也與主機系統隔離。這種隔離提高了安全性,並允許在同一主機上執行多個容器而不會相互幹擾。
  • 可擴充套件性和微服務:Docker的輕量級特性允許快速擴充套件。可以快速啟動和停止容器,更優雅地處理應用程式需求的峰值。Docker有助於微服務架構,因為它允許將應用程式的每個部分放在單獨的容器中,並獨立擴充套件。

使用Docker進行Python應用程式的容器化

為Python應用程式建立Docker映像

首先,需要為Python應用程式建立一個Docker映像。這涉及到建立一個Dockerfile,定義了構建映像所需的步驟。

# 使用官方Python映像作為基礎
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製需求檔案
COPY requirements.txt .

# 安裝依賴項
RUN pip install --no-cache-dir -r requirements.txt

# 複製應用程式碼
COPY . .

# 暴露應用程式的連線埠
EXPOSE 8000

# 執行應用程式
CMD ["python", "app.py"]

內容解密:

  1. FROM python:3.9-slim:使用官方Python 3.9映像作為基礎映像,slim版本是為了減小映像大小而最佳化的版本。
  2. WORKDIR /app:在容器中設定工作目錄為/app
  3. COPY requirements.txt .:將主機上的requirements.txt檔案複製到容器的當前工作目錄。
  4. RUN pip install --no-cache-dir -r requirements.txt:安裝requirements.txt中列出的所有Python依賴項。
  5. COPY . .:將主機上的當前目錄(即應用程式碼)複製到容器的當前工作目錄。
  6. EXPOSE 8000:宣告容器在執行時將監聽的連線埠。
  7. CMD ["python", "app.py"]:定義容器啟動時執行的預設命令,即執行Python應用程式。

Kubernetes與容器協調

Kubernetes是一個強大的容器協調平台,可以自動擴充套件和管理跨伺服器叢集的多個容器。它對於需要高用性和可擴充套件性的應用程式至關重要。

CI/CD最佳實踐

在本章中,我們還將探討Python後端應用程式的CI/CD最佳實踐,包括自動化測試、構建和佈署流程,以提高開發效率和軟體品質。

Nginx作為反向代理

Nginx可以用作反向代理,處理客戶端請求並將其轉發到適當的伺服器。它還可以用於SSL終止、負載平衡和提高Python應用程式的安全性。

SSL證書和HTTPS組態

組態SSL證書和HTTPS對於保護敏感資料和維持終端使用者信任至關重要。本文將指導如何為Python應用程式組態HTTPS。

擴充套件Python應用程式

最後,本章將討論如何擴充套件Python應用程式,以確保它們能夠滿足使用者需求而不會降低效能。這包括使用負載平衡、快取和其他最佳實踐來提高應用程式的可擴充套件性。

此圖示說明瞭使用Docker和Kubernetes佈署Python後端應用程式的高階架構:

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 此圖示說明瞭使用Docker和Kubernetes佈署Python後端應用程式的高階架構:

rectangle "HTTP/HTTPS請求" as node1
rectangle "請求轉發" as node2
rectangle "存取" as node3
rectangle "管理" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

內容解密:

  1. 客戶端向Nginx反向代理傳送HTTP/HTTPS請求:客戶端的請求首先到達Nginx,Nginx作為反向代理,將請求轉發到後端的Docker容器。
  2. Nginx將請求轉發到多個Docker容器:Nginx根據負載平衡策略,將請求分發到不同的Docker容器,以實作負載平衡和高用性。
  3. Docker容器存取Kubernetes叢集:這些Docker容器由Kubernetes叢集管理,Kubernetes負責容器的排程和管理。
  4. Kubernetes叢集跨多個伺服器佈署:Kubernetes叢集可以跨多個伺服器佈署,提高了應用程式的可擴充套件性和容錯能力。

本章節全面介紹了佈署Python後端應用程式的關鍵技術和最佳實踐,從Docker和Kubernetes到CI/CD流程、Nginx組態和SSL證書設定,為讀者提供了從理論到實踐的全方位指導。

使用 Docker 容器化 Python 應用程式

Docker 提供了一個簡便的方式來容器化 Python 應用程式,讓佈署過程更加順暢,並確保在不同環境中的一致性。以下將介紹如何使用 Docker 容器化一個簡單的 Python Flask 應用程式。

建立 Dockerfile

首先,我們需要建立一個 Dockerfile,定義如何構建 Docker 映像檔。以下是一個範例 Dockerfile:

# 使用官方 Python 執行環境作為父映像檔
FROM python:3.8-slim

# 設定容器中的工作目錄
WORKDIR /app

# 將當前目錄內容複製到容器中的 /app 目錄
COPY . /app

# 安裝 requirements.txt 中指定的套件
RUN pip install --no-cache-dir -r requirements.txt

# 將容器中的 5000 連線埠對應到外部
EXPOSE 5000

# 定義環境變數
ENV NAME World

# 當容器啟動時執行 app.py
CMD ["python", "app.py"]

內容解密:

  1. FROM python:3.8-slim:使用官方的 Python 3.8 映像檔作為基礎,slim 版本較小,適合生產環境。
  2. WORKDIR /app:設定容器內的工作目錄為 /app
  3. COPY . /app:將主機當前目錄下的所有檔案複製到容器的 /app 目錄中。
  4. RUN pip install –no-cache-dir -r requirements.txt:安裝 requirements.txt 中列出的 Python 套件。
  5. EXPOSE 5000:宣告容器將使用 5000 連線埠。
  6. ENV NAME World:設定環境變數 NAMEWorld
  7. CMD [“python”, “app.py”]:指定容器啟動時執行的命令。

建置 Docker 映像檔

在包含 Dockerfile 的目錄中執行以下命令來建置 Docker 映像檔:

docker build -t university-app .

內容解密:

  • docker build:用於根據 Dockerfile 建置 Docker 映像檔的命令。
  • -t university-app:將建置的映像檔標記為 university-app

執行 Docker 容器

建置完成後,可以執行以下命令來啟動容器:

docker run -p 4000:5000 university-app

內容解密:

  • docker run:用於啟動新容器的命令。
  • -p 4000:5000:將主機的 4000 連線埠對應到容器的 5000 連線埠。

這樣,你就可以透過 http://localhost:4000 存取 Flask 應用程式。