本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
安全最佳實務
正確管理身分驗證、存取控制和安全性對於 Terraform AWS 提供者的安全使用至關重要。本節概述以下方面的最佳實務:
-
最低權限存取的 IAM 角色和許可
-
保護登入資料,以協助防止未經授權存取 AWS 帳戶和資源
-
遠端狀態加密以協助保護敏感資料
-
基礎設施和原始程式碼掃描以識別組態錯誤
-
遠端狀態儲存的存取控制
-
Sentinel 政策強制執行以實作控管護欄
當您使用 Terraform 管理 AWS 基礎設施時,遵循這些最佳實務有助於強化您的安全狀態。
遵循最低權限原則
最低權限是基本安全原則,是指僅授予使用者、程序或系統執行其預期功能所需的最低許可。這是存取控制的核心概念,也是防止未經授權的存取和潛在資料外洩的預防措施。
本節多次強調最低權限原則,因為它與 Terraform 如何對雲端提供者進行身分驗證和執行動作直接相關,例如 AWS。
當您使用 Terraform 佈建和管理 AWS 資源時,它會代表需要適當許可才能進行 API 呼叫的實體 (使用者或角色)。未遵循最低權限會開啟主要安全風險:
-
如果 Terraform 具有超出所需範圍的過多許可,意外的錯誤設定可能會進行不必要的變更或刪除。
-
如果 Terraform 狀態檔案或登入資料遭到入侵,過度寬鬆的存取授權會增加影響範圍。
-
未遵循最低權限會違反安全最佳實務和法規合規要求,以授予最低必要存取權。
使用 IAM 角色
盡可能使用 IAM 角色而非 IAM 使用者來增強 Terraform AWS 提供者的安全性。IAM 角色提供可自動輪換的臨時安全登入資料,無需管理長期存取金鑰。角色也透過 IAM 政策提供精確的存取控制。
使用 IAM 政策授予最低權限存取
仔細建構 IAM 政策,以確保角色和使用者只有其工作負載所需的最低許可集。從空白政策開始,並反覆新增允許的服務和動作。若要達成此目的:
-
啟用 IAM Access Analyzer 以評估政策,並反白顯示可移除的未使用許可。
-
手動檢閱政策,以移除對角色的預期責任不重要的任何功能。
-
使用 IAM 政策變數和標籤來簡化許可管理。
建構良好的政策只授予足夠的存取權,以履行工作負載的責任,而且沒有其他任何功能。在操作層級定義動作,並僅允許呼叫特定資源所需的 APIs。
遵循此最佳實務可減少影響範圍,並遵循職責分離和最低權限存取的基本安全原則。視需要逐步開始嚴格且開放的存取,而不是開始開放並稍後嘗試限制存取。
擔任本機身分驗證的 IAM 角色
當您在本機執行 Terraform 時,請避免設定靜態存取金鑰。反之,請使用 IAM 角色暫時授予特殊存取權限,而不會暴露長期憑證。
首先,建立具有必要最低許可的 IAM 角色,並新增信任關係
信任關係政策範例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/terraform-execution" }, "Action": "sts:AssumeRole" } ] }
然後,執行 AWS CLI 命令 aws sts assume-role 來擷取角色的短期登入資料。這些登入資料通常有效一小時。
AWS CLI 命令範例:
aws sts assume-role --role-arn arn:aws:iam::111122223333:role/terraform-execution --role-session-name terraform-session-example
命令的輸出包含存取金鑰、私密金鑰和工作階段字符,可用於驗證 AWS:
{ "AssumedRoleUser": { "AssumedRoleId": "AROA3XFRBF535PLBIFPI4:terraform-session-example", "Arn": "arn:aws:sts::111122223333:assumed-role/terraform-execution/terraform-session-example" }, "Credentials": { "SecretAccessKey": " wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY", "SessionToken": " AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE", "Expiration": "2024-03-15T00:05:07Z", "AccessKeyId": "ASIAIOSFODNN7EXAMPLE" } }
AWS 提供者也可以自動處理擔任該角色
擔任 IAM 角色的提供者組態範例:
provider "aws" { assume_role { role_arn = "arn:aws:iam::111122223333:role/terraform-execution" session_name = "terraform-session-example" } }
這會在 Terraform 工作階段的持續時間嚴格授予更高的權限。臨時金鑰無法洩漏,因為它們會在工作階段的最長持續時間之後自動過期。
相較於長期存取金鑰,此最佳實務的主要優點包括改善安全性、以最低權限對角色進行精細存取控制,以及透過修改角色的許可輕鬆撤銷存取權。透過使用 IAM 角色,您也可以避免將秘密直接存放在本機的指令碼或磁碟上,這可協助您在團隊中安全地共用 Terraform 組態。
使用 IAM 角色進行 Amazon EC2 身分驗證
當您從 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體執行 Terraform 時,請避免在本機存放長期憑證。反之,請使用 IAM 角色和執行個體描述檔自動授予最低權限許可。
首先,建立具有最低許可的 IAM 角色,並將該角色指派給執行個體描述檔。執行個體描述檔允許 EC2 執行個體繼承角色中定義的許可。然後,透過指定執行個體描述檔來啟動執行個體。執行個體將透過連接的 角色進行身分驗證。
在您執行任何 Terraform 操作之前,請確認該角色存在於執行個體中繼資料中,以確認登入資料已成功繼承。
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/iam/security-credentials/
此方法可避免將永久 AWS 金鑰硬式編碼為執行個體內的指令碼或 Terraform 組態。臨時登入資料可透過執行個體角色和設定檔以透明方式提供給 Terraform。
此最佳實務的主要優點包括改善長期憑證的安全性、降低憑證管理開銷,以及開發、測試和生產環境之間的一致性。IAM 角色身分驗證可簡化從 EC2 執行個體執行的 Terraform,同時強制執行最低權限存取。
使用 HCP Terraform 工作區的動態登入資料
HCP Terraform 是由 HashiCorp 提供的受管服務,可協助團隊使用 Terraform 跨多個專案和環境佈建和管理基礎設施。當您在 HCP Terraform 中執行 Terraform 時,請使用動態登入
優點包括更容易進行秘密輪換、跨工作區的集中式憑證管理、最低權限許可,以及消除硬式編碼金鑰。相較於長期存取金鑰,依賴雜湊暫時性金鑰可增強安全性。
在 中使用 IAM 角色 AWS CodeBuild
在 中 AWS CodeBuild,使用指派給 CodeBuild 專案的 IAM 角色來執行您的組建。這可讓每個組建自動從角色繼承臨時登入資料,而不是使用長期金鑰。
在 HCP Terraform 上遠端執行 GitHub 動作
設定 GitHub 動作工作流程以在 HCP Terraform 工作區上遠端執行 Terraform。依賴動態登入資料和遠端狀態鎖定,而不是 GitHub 秘密管理。
將 GitHub 動作與 OIDC 搭配使用,並設定 AWS 登入資料動作
使用 OpenID Connect (OIDC) 標準透過 IAM 聯合 GitHub Actions 身分
搭配 OIDC 和 使用 GitLab AWS CLI
使用 OIDC 標準透過 IAM 聯合 GitLab 身分
搭配舊版自動化工具使用唯一的 IAM 使用者
如果您有自動化工具和指令碼,缺乏使用 IAM 角色的原生支援,您可以建立個別 IAM 使用者來授予程式設計存取權。最低權限原則仍然適用。將政策許可降至最低,並依賴每個管道或指令碼的個別角色。當您遷移到更現代化的工具或指令碼時,請開始原生支援角色,並逐漸轉換到這些角色。
警告
IAM 使用者具有長期登入資料,這會造成安全風險。為了協助降低此風險,建議您只為這些使用者提供執行任務所需的許可,並在不再需要這些使用者時將其移除。
使用 Jenkins AWS 登入資料外掛程式
使用 Jenkins 中的AWS 登入資料外掛程式
持續監控、驗證和最佳化最低權限
隨著時間的推移,可能會授予可能超過所需最低政策的額外許可。持續分析存取權,以識別和移除任何不必要的權利。
持續監控存取金鑰用量
如果您無法避免使用存取金鑰,請使用 IAM 登入資料報告來尋找超過 90 天的未使用存取金鑰,以及撤銷使用者帳戶和機器角色的非作用中金鑰。提醒管理員手動確認移除作用中員工和系統的金鑰。
監控金鑰用量可協助您最佳化許可,因為您可以識別和移除未使用的權利。當您遵循此最佳實務進行存取金鑰輪換時,它會限制登入資料生命週期並強制執行最低權限存取。
AWS 提供多種服務和功能,您可以用來為管理員設定提醒和通知。以下是一些選項:
-
AWS Config
:您可以使用 AWS Config 規則來評估 AWS 資源的組態設定,包括 IAM 存取金鑰。您可以建立自訂規則來檢查特定條件,例如早於特定天數的未使用存取金鑰。違反規則時, AWS Config 可以開始評估修補或傳送通知到 Amazon Simple Notification Service (Amazon SNS) 主題。 -
AWS Security Hub
:Security Hub 提供 AWS 帳戶安全狀態的完整檢視,並可協助偵測和通知您潛在的安全問題,包括未使用或非作用中的 IAM 存取金鑰。Security Hub 可以在聊天應用程式中與 Amazon EventBridge 和 Amazon SNS 或 Amazon Q Developer 整合,以傳送通知給管理員。 -
AWS Lambda
:Lambda 函數可以由各種事件呼叫,包括 Amazon CloudWatch Events 或 AWS Config 規則。您可以撰寫自訂 Lambda 函數來評估 IAM 存取金鑰用量、執行其他檢查,以及在聊天應用程式中使用 Amazon SNS 或 Amazon Q Developer 等服務傳送通知。
持續驗證 IAM 政策
使用 IAM Access Analyzer 評估連接到角色的政策,並識別任何未使用的服務或授予的多餘動作。實作定期存取檢閱,以手動驗證政策是否符合目前的需求。
比較現有政策與 IAM Access Analyzer 產生的政策,並移除任何不必要的許可。您也應該向使用者提供報告,並在寬限期後自動撤銷未使用的許可。這有助於確保最少的政策保持有效。
主動且頻繁地撤銷過時的存取,可將違規期間可能面臨風險的登入資料降至最低。自動化提供永續、長期的憑證衛生和許可最佳化。遵循此最佳實務,透過主動跨 AWS 身分和資源強制執行最低權限來限制影響範圍。
安全的遠端狀態儲存
遠端狀態儲存
無法保護遠端狀態可能會導致嚴重問題,例如遺失狀態資料、無法管理基礎設施、意外刪除資源,以及暴露狀態檔案中可能存在的敏感資訊。因此,保護遠端狀態儲存對於生產級 Terraform 使用至關重要。
啟用加密和存取控制
使用 Amazon Simple Storage Service (Amazon S3) 伺服器端加密 (SSE) 加密靜態遠端狀態。
限制對協作工作流程的直接存取
-
在 HCP Terraform 或 Git 儲存庫內 CI/CD 管道中建構協作工作流程,以限制直接狀態存取。
-
依賴提取請求、執行核准、政策檢查和通知來協調變更。
遵循這些準則有助於保護敏感資源屬性,並避免與團隊成員的變更發生衝突。加密和嚴格的存取保護有助於減少攻擊面,協作工作流程可實現生產力。
使用 AWS Secrets Manager
Terraform 中有許多資源和資料來源,可將純文字的秘密值存放在 狀態檔案中。避免將秘密存放在 狀態 ― 請AWS Secrets Manager改用 。
不嘗試手動加密敏感值
持續掃描基礎設施和原始程式碼
主動持續掃描基礎設施和原始程式碼,以找出暴露的登入資料或設定錯誤等風險,以強化您的安全狀態。透過重新設定或修補資源,快速解決問題清單。
使用 AWS 服務進行動態掃描
使用 AWS Amazon Inspector
執行靜態分析
將 Checkov
確保提示修復
對於所有掃描問題清單,請視需要更新 Terraform 組態、套用修補程式或手動重新設定資源,以確保及時修復。解決根本原因以降低風險等級。
同時使用基礎設施掃描和程式碼掃描,可在 Terraform 組態、佈建的資源和應用程式程式碼之間提供分層洞見。這可透過預防性、偵測性和反應性控制來最大化風險與合規的涵蓋範圍,同時更早地將安全性嵌入軟體開發生命週期 (SDLC)。
強制執行政策檢查
使用 HashiCorp Sentinel 政策
Sentinel 政策可以定義 Terraform 組態的要求或限制,以符合組織標準和最佳實務。例如,您可以使用 Sentinel 政策來:
-
需要所有資源上的標籤。
-
將執行個體類型限制為核准清單。
-
強制執行強制性變數。
-
防止破壞生產資源。
將政策檢查嵌入 Terraform 組態生命週期中,可主動強制執行標準和架構準則。Sentinel 提供共用政策邏輯,有助於加速開發,同時防止未經核准的實務。