API(應用程序編程接口)就像秘密之門,允許不同的軟件程序進行通信。但并不是每個人都應該擁有每扇門的鑰匙,就像不是每個軟件都應該不受限制地訪問每個 API 一樣。
這些 API 將從銀行的移動應用程序到您最喜歡的社交媒體平臺的所有內容連接起來,處理敏感數據并執行關鍵功能。
如果沒有嚴格的授權協議,應用程序接口可能會被濫用,導致數據泄露、服務中斷和用戶信任度下降。
因此,這就是 API 授權發揮作用的地方。
API 授權就像一個守門員,確保只有擁有正確鑰匙的正確軟件才能打開大門,使用里面的資源。有效的 API 授權不僅僅是安全問題,它還能創造無縫、安全的用戶體驗。它確保授權應用程序只能訪問個人信息,并且這些應用程序只能在其允許的范圍內執行操作。
了解API授權
在討論 API 授權最佳實踐之前,我們必須了解兩個經常被混淆的概念之間的區別:授權和驗證。
身份驗證就是驗證身份。就像通過用戶名、密碼或生物識別技術確認用戶身份一樣。
授權則是在身份得到確認后,授予對資源或功能的訪問權限。例如,如果身份驗證是為了通過前門,那么授權則決定了用戶可以訪問大樓內的哪些房間和服務。
API授權最佳實踐
既然您現在了解了 API 授權的重要性,那就讓我們深入探討一下如何充分利用它的最佳實踐吧。
1.使用基于令牌的授權(JWT、OAuth 令牌)
基于令牌的授權,尤其是?JWT(JSON Web 令牌)和 OAuth 令牌,為管理 API 交互提供了一種安全高效的方式。例如
- 令牌支持無狀態身份驗證,這意味著服務器不需要為每個用戶維護會話狀態,從而實現更好的可擴展性。
- 令牌可以通過各種方式安全傳輸,并且比傳統的基于會話的身份驗證更不易受到 CSRF 攻擊。
- 令牌可以跨域使用,這使其成為微服務架構和單點登錄?(SSO) 應用程序的理想選擇。
- 令牌(尤其是 OAuth 令牌)可以包含范圍和權限,從而提供對經過身份驗證的用戶操作的精確控制。
如何使用 JWT 實現基于令牌的授權
JWT 通常在用戶成功驗證后生成。它們包含一個包含用戶信息和可能的權限的有效載荷。您可以使用 Node.js 中的 jsonwebtoken 或 Python 中的 PyJWT 等庫實現 JWT 授權。
首先,您需要生成 JWT 標記。下面是使用 PyJWT 的方法:
import jwtfrom datetime import datetime, timedeltasecret_key = 'YOUR_SECRET_KEY'payload = { 'sub': user_id, 'iat': datetime.utcnow(), 'exp': datetime.utcnow() + timedelta(days=1)}token = jwt.encode(payload, secret_key, algorithm='HS256')
然后,需要對每個請求進行驗證,以確定用戶是否被允許執行請求。令牌通常會在每個請求的授權頭中發送。服務器可以使用秘鑰解碼 JWT 并進行驗證。如果有效,服務器就會處理請求;如果無效,服務器就會返回錯誤信息。
from flask import Flask, request, jsonifyimport jwtimport datetimeapp = Flask(name)SECRET_KEY = "your_secret_key" # Replace with your secret keySample route that requires token-based authorization@app.route('/protected', methods=['GET'])def protected(): token = request.headers.get('Authorization') if not token: return jsonify({'message': 'Token is missing!'}), 403 try: # Decoding the token data = jwt.decode(token, SECRET_KEY, algorithms=["HS256"]) # You can use the data in the token as needed, for example: # user_id = data['user_id'] except jwt.ExpiredSignatureError: return jsonify({'message': 'Token has expired!'}), 403 except jwt.InvalidTokenError: return jsonify({'message': 'Invalid token!'}), 403 # Token is valid, process the request return jsonify({'message': 'Token is valid! You have access to protected routes.'})
2.實施細粒度訪問控制
細粒度訪問控制是一種安全管理方法,可對應用程序的權限和訪問權進行詳細控制。它能確保用戶或服務只擁有所需的訪問權限,并遵循最小特權原則。
如何實施細粒度訪問控制:
實施精細度訪問控制涉及幾個步驟:
- 定義角色和權限:識別系統中不同的用戶角色并定義每個角色的具體操作。
- 使用基于角色的訪問控制 (RBAC):實施 RBAC,根據角色授予資源訪問權限。每個角色都被分配了特定的權限。
- 考慮基于屬性的訪問控制 (ABAC):對于更復雜的場景,可以使用 ABAC,其中訪問決策基于屬性(用戶、資源、環境)的組合。
例如,如果您有一個 API,其中管理員和用戶的訪問權限不同。您可以使用可在應用程序中重復使用的獨立組件來實現訪問控制機制。
您所要做的就是:
首先,創建一個名為 “authorizer “的 Node.js 組件,讓您可以使用命令來實現驗證邏輯:
bit create node util/authorizer
如果操作正確,就會看到輸出結果:
接下來,實現授權邏輯:
export function authorizer(userId: string) { // Implement logic to retrieve the user's role if (userId === 'U001') { return "admin"; } return "customer"}
接下來,使用命令創建一個 Express App:
bit create express-app api
您將看到輸出結果:
接下來,讓我們通過更新 mock-route.ts 將授權器連接到應用程序。一開始,你會看到這樣的內容
讓我們添加一個新的中間件:
這將確保您的授權器組件在調用實際業務邏輯之前運行。運行 API 后,您應該會看到以下輸出:
通過函數鏈,我們實現了基于角色的訪問控制。裝飾器會檢查用戶的角色是否符合端點所需的角色。如果不匹配,則返回拒絕訪問消息。
當你不斷更新授權邏輯和更新應用程序時,比特的 CI 服務器–Ripple CI 會自動更新整個樹中的更改。
3. 安全API網關配置
API 網關是所有 API 請求的前門,為執行安全和操作策略提供了一個集中的場所。例如,API 網關可幫助您實現以下功能
- 增強的安全性:提供額外的安全層,防止 DDoS 攻擊、未經授權的訪問和 API 濫用等威脅。
- 速率限制和節流:防止 API 過度使用并確保用戶之間的公平使用。
- 數據轉換和驗證:確保傳入數據符合預期的格式和標準。
如何實施安全 API 網關配置:
您可以為自己的應用程序選擇多種 API Gateway 提供商。例如,亞馬遜 API Gateway、Kong 和谷歌 Apigee 都是最受歡迎的 API Gateway 平臺。
如果您計劃使用 AWS,可以按照其文檔中的步驟輕松創建 API 網關。不過,您還需要啟用一些額外的功能,以確保 API 網關的安全和高效。
- 設置速率限制— 在 AWS 管理控制臺中,導航到 Amazon API Gateway,選擇您的 API,然后轉到“保護”選項卡下的“限制”部分。在那里,您可以設置速率和突發限制。
- 啟用?SSL/TLS?— 確保 API Gateway 的自定義域名與 AWS Certificate Manager 中的 SSL/TLS 證書關聯。
- 實施?IP?限制— 使用 AWS Lambda 授權方驗證傳入請求的 IP 地址。部署該功能后,您可以通過在“授權”選項卡中為 API 網關創建新的授權者來選擇該功能。以下是 Python 中用于限制 IP 的示例 Lambda 函數:
import jsondef lambda_handler(event, context): ip_address = event['requestContext']['identity']['sourceIp'] allowed_ips = ['192.168.1.1'] # List of allowed IPs # Add logic here to check if the ip_address is in allowed_ips or not if ip_address not in allowed_ips: raise Exception('Unauthorized') return { 'principalId': 'user', 'policyDocument': { 'Version': '2012-10-17', 'Statement': [{ 'Action': 'execute-api:Invoke', 'Effect': 'Allow', 'Resource': event['methodArn'] }] } }
- 啟用?CloudWatch Logs?— 在 AWS 管理控制臺中,轉到 API 網關的設置。在CloudWatch?設置部分中,選中啟用CloudWatch Log選項。將日志級別設置為INFO以記錄所有請求和響應,或將日志級別設置為ERROR以僅記錄錯誤響應。
4. 加密傳輸中和靜態的敏感數據
對傳輸中和靜態的敏感數據進行加密是保護數據免遭未經授權的訪問和泄露的基本安全實踐。傳輸中加密可保護數據在客戶端和服務器之間移動時的安全,而靜態加密則可保護存儲在磁盤或數據庫上的數據。
如何在傳輸中實施加密
如果使用自己的網絡服務器,則必須手動設置和管理 SSL/TLS 證書。首先,需要從可信的證書頒發機構(CA)獲取證書,如 Let’s Encrypt、DigiCert、GoDaddy 等。然后,配置服務器以使用 CA。例如,下面是如何使用 Nginx 配置 SSL:
- 修改 Nginx 配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/sites-available/your_site)。
- 在服務器塊中添加 SSL 設置:
server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/your/fullchain.pem; # Path to your fullchain.pem from CA ssl_certificate_key /path/to/your/privkey.pem; # Path to your private key from CA # Strong encryption settings (consider using recommendations from Mozilla's SSL Configuration Generator) ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256...'; # Other server configurations...}
如果你使用的是云服務,它們會為處理 SSL/TLS 提供完全托管的服務。例如,您可以使用 AWS 證書管理器來管理 AWS 托管的服務。
如何實施靜態加密
您可以在數據庫級別、應用程序級別或使用基于云的工具實施靜態加密。
- 數據庫級加密:許多現代數據庫提供內置加密功能。例如:
- SQL Server:透明數據加密。
- MySQL:InnoDB 表空間加密。
- MongoDB:加密存儲引擎。
- 應用程序級加密:應用程序級加密應用于高敏感數據,甚至在存儲到數據庫之前對其進行加密。您可以使用密碼學等庫來實現此目的:
from cryptography.fernet import Fernet# Generate a keykey = Fernet.generate_key()cipher_suite = Fernet(key)# Encrypt dataencrypted_data = cipher_suite.encrypt(b"Sensitive Data")# Decrypt datadecrypted_data = cipher_suite.decrypt(encrypted_data)
最后的想法
強大的應用程序接口授權對于確保數字資產安全和維護用戶信任至關重要。
通過實施本文討論的最佳實踐,開發人員可以顯著增強應用程序的 API 安全性,同時確保合規性并防范各種網絡威脅。
原文鏈接:Best-Practices for API Authorization
編譯:冪簡集成