使用 AWS Lambda 自動化 AWS 帳戶AWS Managed Microsoft AD 從 移除 Amazon EC2項目 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 AWS Lambda 自動化 AWS 帳戶AWS Managed Microsoft AD 從 移除 Amazon EC2項目

由 Dr. Rahul Sharad Gaikwad (AWS) 和 Tamilselvan P (AWS) 建立

環境:PoC 或試行

技術: DevOps;基礎設施;管理和治理

工作負載:所有其他工作負載

AWS 服務: AWS Directory Service;Amazon EC2;Amazon EventBridge;AWSLambda;AWSSystems Manager;AWSAuto Scaling

Summary

Active Directory (AD) 是一種 Microsoft 指令碼工具,可管理網域資訊和使用者與網路服務的互動。它廣泛用於受管服務供應商 (MSPs) 以管理員工憑證和存取許可。由於 AD 攻擊者可以使用非作用中帳戶嘗試並入侵組織,因此請務必尋找非作用中帳戶,並在例行維護排程中停用這些帳戶。使用 AWS Directory Service for Microsoft Active Directory,您可以將 Microsoft Active Directory 作為受管服務執行。此模式可協助您設定 AWS Lambda 自動化,以快速尋找和移除非作用中帳戶。

如果下列案例適用於您的組織,此模式可協助您:

  • 集中式 AD 管理 – 如果您的組織有多個 AWS 帳戶,則每個 都有自己的 AD 部署,在所有 帳戶中一致地管理使用者帳戶和存取許可可能很困難。透過跨帳戶 AD 清除解決方案,您可以集中方式停用或移除所有 AD 執行個體的非作用中帳戶。

  • AD 重組或遷移 – 如果您的組織計劃重組或遷移其 AD 部署,跨帳戶 AD 清理解決方案可協助您準備環境。此解決方案可協助您移除不必要的或非作用中帳戶、簡化遷移程序,並減少潛在的衝突或問題。

使用此模式時,您可以獲得下列優點:

  • 改善資料庫和伺服器效能,並從非作用中帳戶修正安全漏洞。

  • 如果您的 AD 伺服器託管在雲端,移除非作用中帳戶也可以降低儲存成本,同時改善效能。您的每月帳單可能會減少,因為頻寬費用和運算資源都可能減少。

  • 使用乾淨的 Active Directory 讓潛在的攻擊者處於儲存貯體。

先決條件和限制

先決條件

限制

  • 在子帳戶中建立資源不會透過 Terraform 自動執行。您必須使用 手動建立下列資源 AWS Management Console:

    • 將 Amazon EC2終止事件傳送至父帳戶的 Amazon EventBridge 規則

    • 使用信任政策在子帳戶中建立 Amazon EC2跨帳戶角色

    • VPC 對等或 Transit Gateway 連線

  • 有些 AWS 服務 並非所有 都提供 AWS 區域。如需區域可用性,請參閱AWS 服務 依區域 。如需特定端點,請參閱服務端點和配額 ,然後選擇服務的連結。

產品版本

架構

下圖顯示 解決方案的高階架構。

使用 Lambda 自動化從跨AWS帳戶移除EC2項目的程序。

架構圖說明下列程序:

  1. 在子帳戶中, EventBridge 規則會收集所有 Amazon EC2終止事件。規則會將 EventBridge 出現在父帳戶中的事件傳送至其中。

  2. 從父帳戶中 EventBridge 收集所有事件,並包含觸發 Lambda 函數 的規則ADcleanup-Lambda

  3. 父帳戶會從父帳戶或子帳戶接收任何終止事件,並觸發 Lambda 函數。

  4. Lambda 函數會使用 Python boto 模組呼叫 Amazon EC2 Auto Scaling 群組,並取得隨機執行個體 ID。執行個體 ID 用於執行 Systems Manager 命令。

  5. Lambda 函數EC2會使用 boto 模組對 Amazon 進行另一個呼叫。Lambda 函數會取得執行中 Windows 伺服器的私有 IP 地址,並將地址儲存在暫時變數中。在步驟 5.1 和 5.2 中,會從子帳戶收集執行中的 Windows EC2執行個體。

  6. Lambda 函數會再次呼叫 Systems Manager,以取得連線至 的電腦資訊 AWS Directory Service。

  7. AWS Systems Manager 文件有助於在 Amazon EC2 Windows 伺服器上執行 PowerShell 命令,以取得連接至 AD 之電腦的私有 IP 地址。(Systems Manager 文件使用步驟 4 中取得的執行個體 ID。)

  8. AD 網域使用者名稱和密碼會儲存在 AWS Systems Manager Parameter Store., AWS Lambda 而 Systems Manager 會呼叫 Parameter Store,並取得用來連線至 AD 的使用者名稱和密碼值。

  9. 使用 Systems Manager 文件,指令碼 PowerShell 會使用在步驟 4 中稍早取得的執行個體 ID 在 Amazon EC2 Windows 伺服器上執行。

  10. Amazon AWS Directory Service 會使用 PowerShell 命令EC2連線至 ,並移除非使用中或非使用中的電腦。

工具

AWS 服務

  • AWS Directory Service 提供多種方法,可搭配 AWS 服務 其他 Amazon Elastic Compute Cloud (Amazon )EC2、Amazon Relational Database Service (Amazon ) for SQL Server 和 Amazon FSx for Windows File Server 等 使用 Microsoft Active Directory (ADRDS)。

  • AWS Directory Service for Microsoft Active Directory 可讓您的目錄感知工作負載 AWS 和資源在 中使用 Microsoft Active Directory AWS 雲端。

  • Amazon Elastic Compute Cloud (Amazon EC2) 在 中提供可擴展的運算容量 AWS 雲端。您可以視需要啟動任意數量的虛擬伺服器,,並快速進行擴展或縮減。

  • Amazon EventBridge 是一種無伺服器事件匯流排服務,可協助您將應用程式與各種來源的即時資料連線。例如, AWS Lambda 函數、使用API目的地HTTP的叫用端點,或其他 中的事件匯流排 AWS 帳戶。

  • AWS Identity and Access Management (IAM) 透過控制誰經過身分驗證並獲授權使用資源,協助您安全地管理對 AWS 資源的存取。使用 IAM,您可以指定誰或什麼可以存取 中的 服務和資源 AWS、集中管理精細許可,以及分析跨 優化許可的存取 AWS。

  • AWS Lambda 是一項運算服務,可協助您執行程式碼,無需佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。

  • AWS Systems Manager 可協助您管理在 中執行的應用程式和基礎設施 AWS 雲端。它可簡化應用程式和資源管理、縮短偵測和解決操作問題的時間,並協助您大規模安全地管理 AWS 資源。

  • AWS Systems Manager 文件會定義 Systems Manager 在受管執行個體上執行的動作。Systems Manager 包含 100 多個預先設定的文件,可讓您用來在執行時間時指定參數。

  • AWS Systems Manager 參數存放區是 的功能, AWS Systems Manager 並提供安全的階層式儲存,以進行組態資料管理和秘密管理。

其他工具

  • HashiCorp Terraform 是一種開放原始碼基礎設施作為程式碼 IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

  • PowerShell 是在 Windows、Linux 和 macOS 上執行的 Microsoft 自動化和組態管理程式。

  • Python 是一種一般用途的電腦程式設計語言。

程式碼儲存庫

此模式的程式碼可在 GitHub aws-lambda-ad-cleanup-terraform-samples 儲存庫中使用。

最佳實務

  • 自動加入網域。 當您啟動要成為 AWS Directory Service 網域一部分的 Windows 執行個體時,請在執行個體建立程序中加入網域,而不是稍後手動新增執行個體。若要自動加入網域,請在啟動新執行個體時,從網域加入目錄下拉式清單中選取正確的目錄。如需詳細資訊,請參閱 AWS Directory Service 管理指南 中的無縫加入 Amazon EC2 Windows 執行個體至 AWS Managed Microsoft AD Active Directory

  • 刪除未使用的帳戶。 在 AD 中尋找從未使用過的帳戶是常見的。與保留在系統中的停用或非作用中帳戶一樣,忽略未使用的帳戶可能會拖慢 AD 系統的速度,或使您的組織容易遭受資料外洩。

  • 自動化 Active Directory 清除。 為了協助降低安全風險並防止過時的帳戶影響 AD 效能,應定期執行 AD 清理。您可以撰寫指令碼來完成大多數 AD 管理和清除任務。範例任務包括移除停用和停用的帳戶、刪除空和停用的群組,以及尋找過期的使用者帳戶和密碼。

史詩

任務描述所需的技能

在子帳戶中建立跨帳戶角色。

若要在子帳戶中建立跨帳戶角色,請執行下列動作:

  1. 針對每個子帳戶,ec2crossaccountrole 使用名為 的受管政策來建立名為 的角色AmazonEC2ReadOnlyAccess (如需詳細資訊,請參閱 IAM 文件中的使用自訂信任政策建立角色。)

  2. 自訂信任政策區段中,新增下列程式碼:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${Parentaccountid}:role/ADcleanuprole" }, "Action": "sts:AssumeRole" } ] }
DevOps 工程師

在子帳戶中建立事件規則。

若要為每個子帳戶建立 EventBridge 規則,請執行下列動作:

  1. 登入下層 AWS 帳戶,然後在 開啟 Amazon EventBridge 主控台https://console.aws.amazon.com/events/

  2. 在導覽窗格中,選擇規則

  3. 選擇建立規則

  4. 輸入 名稱,以及規則的選擇性描述。

  5. 針對事件匯流排 ,選取AWS預設事件匯流排

  6. 針對規則類型 選擇具有事件模式 的規則

  7. 選擇 Next (下一步)

  8. 對於事件模式 ,請貼上下列程式碼:

    { "source": ["aws.ec2"], "detail-type": ["EC2 Instance State-change Notification"], "detail": { "state": ["terminated"] } }
  9. 選擇 Next (下一步)

  10. 針對目標類型 ,選擇不同帳戶或區域中的事件匯流排。 針對事件匯流排作為目標 ,輸入父帳戶的事件匯流排 Amazon Resource Name (ARN)。

  11. 針對執行角色 ,選擇為此特定資源建立新角色。

  12. 選擇下一步以檢閱新規則的詳細資訊,然後選擇建立

如需更多詳細資訊,請參閱 Amazon 使用者指南 中的在 Amazon 中建立對事件做出反應的規則 EventBridge EventBridge

DevOps 工程師

建立EC2執行個體並加入 AD。

若要為 Windows 建立EC2執行個體,請執行下列動作:

  1. 使用此模式程式碼儲存庫 中可用的EC2WindowsUserdata指令碼。

  2. 在使用者資料指令碼中,修改下列程式碼以使用父帳戶中Directory service addresses的值:

    set-DnsClientServerAddress -InterfaceIndex 6 -ServerAddresses $(Directory service addresses)

DevOps 工程師
任務描述所需的技能

建立專案資料夾並新增檔案。

若要複製儲存庫並建立專案資料夾,請執行下列動作:

  1. 開啟此模式的GitHub 儲存庫

  2. 選擇程式碼按鈕,以查看複製下拉式清單中要複製的選項。

  3. HTTPS索引標籤上,使用 Web 複製複製中URL提供的 。 URL

  4. 在機器上建立資料夾,並使用專案名稱命名。

  5. 在本機機器中開啟終端機,然後導覽至此資料夾。

  6. 若要複製 git 儲存庫,請使用下列命令。

    git clone <repository-URL>.git

  7. 複製儲存庫之後,請使用下列命令前往複製的目錄。

    cd <directory name>/terraform-aws-lambda-ad-cleanup/multiple-account-cleanup

  8. 在複製的儲存庫中,在您選擇的整合開發環境 (IDE) 中開啟此專案。

DevOps 工程師

建置 adcleanup.zip 檔案。

若要壓縮 lambda_function.py 檔案,請執行下列命令:

zip -r adcleanup.zip lambda_function.py

DevOps 工程師
任務描述所需的技能

提供 Terraform 變數的值。

對於子帳戶,請在terraform.tfvars檔案中提供下列arn變數的值作為字串類型:

  • lambda_env_cross_role_arn

  • child_account_cross_role_arn

DevOps 工程師

初始化 Terraform 組態。

若要初始化包含 Terraform 檔案的工作目錄,請執行下列命令:

terraform init

DevOps 工程師

預覽變更。

您可以在部署基礎設施之前預覽 Terraform 對基礎設施所做的變更。若要驗證 Terraform 會視需要進行變更,請執行下列命令:

terraform plan —-var-file=examples/terraform.tfvars

DevOps 工程師

執行提議的動作。

若要驗證terraform plan命令的結果是否如預期,請執行下列動作:

  1. 執行下列命令:terraform apply

  2. 登入 AWS Management Console,並確認資源是否存在。

DevOps 工程師
任務描述所需的技能

執行和測試 Lambda 函數。

若要驗證部署是否成功執行,請執行下列動作:

  1. 登入 AWS Management Console,然後開啟 Lambda 主控台。開啟函數頁面,然後選取以 ADcleanup-Lambda-* 開頭的函數名稱。

  2. 在函數概觀頁面上,在程式碼來源區段的程式碼索引標籤上選擇測試

  3. 若要儲存測試事件,請提供事件的名稱,然後選擇儲存 。若要測試事件,請再次選擇測試

執行結果會顯示函數的輸出。

DevOps 工程師

檢視從父帳戶執行 EventBridge 規則的結果。

若要檢視以父帳戶中的 Amazon EC2終止事件為基礎的 EventBridge 規則結果,請執行下列動作:

  1. 從父帳戶終止EC2執行個體。

  2. 開啟父帳戶的 Lambda 主控台。開啟函數頁面,然後選取以 ADcleanup-Lambda-* 開頭的函數名稱。

  3. 選擇監控索引標籤,然後選擇檢視 CloudWatch 日誌

在 CloudWatch 主控台中,日誌群組頁面會顯示 Lambda 函數的結果。

DevOps 工程師

從子帳戶檢視 EventBridge 規則執行的結果。

若要檢視以子帳戶中的 Amazon EC2終止事件為基礎的 EventBridge 規則結果,請執行下列動作:

  1. 從子帳戶終止EC2執行個體。

  2. 開啟父帳戶的 Lambda 主控台。開啟函數頁面,然後選取以 ADcleanup-Lambda-* 開頭的函數名稱。

  3. 選擇監控索引標籤,然後選擇檢視 CloudWatch 日誌

在 CloudWatch 主控台中,日誌群組頁面會顯示 Lambda 函數的結果。

DevOps 工程師
任務描述所需的技能

清除基礎設施。

若要清除您建立的基礎設施,請使用下列命令:

terraform destroy

若要確認 destroy 命令,請輸入 yes

DevOps 工程師

清除後驗證。

確認資源已成功移除。

DevOps 工程師

故障診斷

問題解決方案

AWS Directory Service (父帳戶) 與 Amazon EC2執行個體 (子帳戶) 之間的連線問題 – 即使可以使用VPC對等,您仍無法將子帳戶的電腦加入 AD。

在 中新增路由VPCs。如需指示,請參閱 AWS Directory Service 文件中的設定目錄擁有者與目錄取用者帳戶之間的VPC對等連線

相關資源

AWS 文件

其他資源