無伺服器架構的興起伴隨著 API 安全性的挑戰,由於 API 暴露於網際網路,容易遭受攻擊。本文將探討如何利用 API Gateway、請求驗證、輸入清理以及訊息驗證等機制,強化無伺服器 API 的安全性。同時,也將深入探討資料加密的重要性,包含靜態加密和傳輸加密,並說明如何利用 AWS KMS 有效管理加密金鑰,建立完善的金鑰管理策略,保護應用程式和使用者資料的安全。最後,提供一些金鑰管理的最佳實務,例如使用安全金函式庫、避免在安全金函式庫外儲存機密資料、確保金鑰受到保護,以及使用獨立金鑰和管理金鑰的生命週期等,以降低安全風險。

保護無伺服器API的安全

無伺服器API的安全是一個重要的議題,因為它們通常暴露在網際網路上,容易受到攻擊。API Gateway提供了一些安全功能,例如與AWS WAF整合,提供細粒度的保護。

請求驗證

API Gateway可以對請求進行驗證,確保請求符合預期的格式和結構。例如,可以使用JSON Schema定義預期的輸入結構和格式,API Gateway會將這些驗證規則應用於請求體。如果請求失敗驗證,API Gateway會傳回400 Bad Request HTTP回應。

請求驗證的實作

請求驗證可以透過API Gateway的請求驗證功能實作。例如,可以定義一個JSON Schema來描述預期的輸入結構和格式:

{
  "title": "my-request-model",
  "type": "object",
  "properties": {
    "message": { "type": "string" },
    "status": { "type": "string" }
  },
  "required": ["message"]
}

這個JSON Schema定義了一個物件,包含兩個屬性:messagestatusmessage屬性是必需的,而status屬性是可選的。

深入輸入驗證和清理

深入輸入驗證和清理應該在Lambda函式中進行,尤其是在資料轉換、儲存或傳遞給事件匯流排或訊息佇列時。這可以保護應用程式免受SQL注入攻擊等威脅。

訊息驗證在事件驅動架構中

在事件驅動架構中,訊息驗證通常在系統之間的整合點進行。例如,當第三方Webhook傳送訊息給事件代理時,需要驗證這些訊息以確保它們來自可信任的源頭。

使用JSON Web Tokens進行訊息驗證

可以使用JSON Web Tokens (JWT)作為訊息傳輸協定。JWT可以用於簽署和加密訊息,確保只有授權的消費者才能存取訊息。例如,可以使用巢狀JWTs來簽署和加密訊息:

const payload = { data: { hello: "world" } };
const signedJWT = await new SignJWT(payload)
 .setProtectedHeader({ alg: "ES256" })
 .sign(privateKey);

這個例子中,使用私鑰簽署訊息,並將簽署的訊息加密使用分享秘密。

保護資料的重要性

在 serverless 應用中,資料是最寶貴的資產。這包括使用者的個人資料、第三方整合資料以及應用本身的資料。為了保護這些資料,需要使用加密技術。

什麼是加密?

加密是一種限制資料存取的技術,使用加密演算法和金鑰來保護明文資料。只有具有相同金鑰的人才能解密資料。

加密型別

加密可以分為兩類別:靜態加密(encryption at rest)和傳輸加密(encryption in transit)。

  • 靜態加密:適用於儲存或快取的資料,例如 EventBridge 事件匯流排或歸檔、SQS佇列中的訊息、S3儲存桶中的物件或 DynamoDB 表中的專案。
  • 傳輸加密:適用於服務之間傳輸的資料,例如使用 Transport Layer Security (TLS) 的 HTTPS 端點。

AWS 服務的加密支援

大多數 AWS 服務都提供原生加密支援,並與 AWS Secrets Manager 和 AWS Key Management Service (KMS) 整合。這意味著加密和解密資料以及管理相關加密金鑰的過程大多被抽象化。

AWS KMS

AWS KMS 是一個完全管理的服務,支援生成和管理用於保護資料的加密金鑰。當使用 AWS 服務的原生加密控制時,會使用 KMS 來建立和管理必要的加密金鑰。

KMS 金鑰型別

KMS 金鑰可以分為兩類別:AWS 管理金鑰和客戶管理金鑰。AWS 管理金鑰是由 AWS 建立、管理、輪換和使用的加密金鑰。客戶管理金鑰是由客戶建立、擁有和管理的加密金鑰。

資料保護最佳實踐

  • 總是啟用靜態加密和傳輸加密。
  • 限制儲存和傳輸的資料量。
  • 持續審查資料模型和事件 payload 以確保刪除冗餘屬性。
  • 使用 AWS KMS 來管理加密金鑰。

透過遵循這些最佳實踐,可以有效保護 serverless 應用的資料安全。

關於伺服器無法安全性與金鑰管理的重要性

隨著應用程式的成長,它將使用各種加密金鑰和機密資料來處理加密和資料安全。因此,建立明確且可行的金鑰管理守則對於您的團隊至關重要。以下是一些建議:

  • 使用安全金函式庫:始終使用安全金函式庫來儲存加密金鑰和機密資料,例如 AWS KMS、Secrets Manager 或 Systems Manager Parameter Store(具有安全字串)。
  • 永遠不要在安全金函式庫外儲存機密資料:例如,不要在本地機器或程式碼倉函式庫中儲存金鑰。只在執行時取得金鑰和機密資料,不要快取它們。
  • 確保金鑰受到未經授權存取的保護:例如,在存取 KMS 金鑰的 IAM 政策中強制執行最小許可權。
  • 使用獨立金鑰:當需要多個金鑰時,使用不同的金鑰而不是在服務或客戶之間共用金鑰。
  • 管理金鑰的生命週期:根據金鑰型別和其預期用途,制定一個旋轉金鑰(和演算法)的策略。金鑰旋轉可以是手動或自動的。

從產業生態圈的動態變化來看,無伺服器應用程式盛行的同時,API 安全及資料保護的重要性也日益凸顯。本文涵蓋了 API 請求驗證、輸入清理、訊息驗證及資料加密等關鍵環節,展現了構建安全可靠無伺服器架構的最佳實務。透過 API Gateway 的請求驗證和 Lambda 函式的深度輸入清理,可以有效防禦常見的攻擊,例如 SQL 注入。此外,在事件驅動架構中使用 JWT 進行訊息驗證,更強化了系統間訊息傳遞的安全性。值得一提的是,文章強調了資料加密的重要性,並詳細說明瞭靜態加密和傳輸加密的應用場景,以及 AWS KMS 的使用,這對於保障使用者資料和應用程式資料的安全至關重要。然而,目前無伺服器安全仍面臨一些挑戰,例如第三方函式庫的安全性及冷啟動時的效能影響。展望未來,隨著 Serverless 生態的持續發展,預期會有更多自動化安全工具和服務出現,簡化安全組態和管理的複雜度。玄貓認為,開發團隊應將安全融入 Serverless 開發生命週期的每個階段,並持續關注最新的安全最佳實務,才能有效降低安全風險,打造真正安全可靠的無伺服器應用。