搭配 Systems Manager 合規使用 Chef InSpec 描述檔 - AWS Systems Manager

搭配 Systems Manager 合規使用 Chef InSpec 描述檔

AWS Systems Manager 與 Chef InSpec 整合。InSpec 是開放原始碼測試架構,允許您在 GitHub 或 Amazon Simple Storage Service (Amazon S3) 建立人們看得懂的描述檔。然後,您可以使用 Systems Manager 執行合規掃描,檢視合規與不合規的執行個體。描述檔能滿足適合運算環境的安全、合規或政策需求。舉例來說,您能夠建立描述檔,以便在使用合規 (AWS Systems Manager 的功能) 掃描執行個體時,執行下列檢查作業:

  • 檢查特定連接埠是開啟或關閉狀態。

  • 檢查特定應用程式是否正在執行。

  • 檢查是否已安裝特定套件。

  • 檢查特定屬性的 Windows 登錄機碼。

對於您以 Systems Manager 管理的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、內部部署伺服器或虛擬機器 (VM),您可以建立 InSpec 描述檔。以下 Chef InSpec 描述檔範例會檢查連接埠 22 是否為開啟狀態。

control 'Scan Port' do impact 10.0 title 'Server: Configure the service port' desc 'Always specify which port the SSH server should listen to. Prevent unexpected settings.' describe sshd_config do its('Port') { should eq('22') } end end

InSpec 內含資源集合,能協助您快速編寫檢查作業並稽核控制項。為了以 Ruby 撰寫這些控制項,InSpec 會採用 InSpec 特定領域語言 (DSL)。此外,您也能使用由廣大 InSpec 使用者社群所建立的描述檔。例如,GitHub 上的 DevSec chef-os-hardening 專案包含數十種描述檔,皆可保障執行個體與伺服器的安全。您能夠撰寫描述檔,並將其存放在 GitHub 或 Amazon S3 中。

運作方式

以下程序將說明如何結合使用 InSpec 描述檔與合規:

  1. 請找出要使用的預先定義 InSpec 描述檔,或建立自己的描述檔。您可以使用 GitHub 上預先定義的描述檔,立刻開始操作。有關如何建立自有 InSpec 描述檔的資訊,請參閱 Chef InSpec 描述檔

  2. 在公有或私有 GitHub 儲存庫或 S3 儲存貯體中存放描述檔。

  3. 請使用 Systems Manager 文件 (SSM 文件) AWS-RunInspecChecks,以透過 InSpec 描述檔執行合規操作。您能夠使用 Run Command (AWS Systems Manager 的功能) 開始合規掃描 (適用於隨需掃描),也能利用 State Manager (AWS Systems Manager 的功能) 來排程定期合規掃描。

  4. 利用合規 API 或 合規主控台來辨識未合規的執行個體。

注意

記下以下資訊。

  • Chef 會採用執行個體上的用戶端處理描述檔。因此,您不需要另外安裝用戶端。Systems Manager 執行 SSM 文件 AWS-RunInspecChecks 時,系統即會檢查是否已安裝用戶端。若尚未安裝,Systems Manager 就會在掃描期間安裝 Chef 用戶端,接著在掃描完成後解除安裝該用戶端。

  • 執行 SSM 文件 AWS-RunInspecChecks (如本主題所述) 會指派類型 Custom:Inspec 的合規項目到每個目標執行個體。若要指派此合規類型,文件會呼叫 PutComplianceItems API 操作。

執行 InSpec 合規掃描

本節所含的資訊會說明如何使用 Systems Manager 主控台和 AWS Command Line Interface (AWS CLI) 來執行 InSpec 合規掃描。主控台程序會說明如何設定 State Manager,以執行掃描作業。AWS CLI 程序則會說明如何設定 Run Command,以執行掃描作業。

使用 State Manager (主控台) 執行 InSpec 合規掃描

使用 State Manager 主控台透過AWS Systems Manager執行 InSpec 合規掃描

  1. 開啟位於 AWS Systems Managerhttps://console.aws.amazon.com/systems-manager/ 的 主控台。https://console.aws.amazon.com/systems-manager/

  2. 在導覽窗格中,選擇 State Manager

    -或-

    如果 AWS Systems Manager 首頁先開啟,選擇選單圖示 ( ) 以開啟導覽窗格,然後選擇 State Manager

  3. 選擇 Create association (建立關聯)

  4. Provide association details (提供關聯詳細資訊) 區段中,輸入一個名稱。

  5. Document (文件) 清單中,請選擇 AWS-RunInspecChecks

  6. Document version (文件版本) 清單中,選擇 Latest at runtime (執行時間的最新版本)

  7. 前往 Parameters (參數) 區段的 Source Type (來源類型) 清單,選擇 GitHub (GitHub)S3 (S3)

    若您選擇 GitHub (GitHub),請在 Source Info (來源資訊) 欄位中輸入公有或私有 GitHub 儲存庫的 InSpec 描述檔路徑。此處是由 Systems Manager 團隊提供的公有描述檔範例路徑,其來自以下位置:https://github.com/awslabs/amazon-ssm/tree/master/Compliance/InSpec/PortCheck

    {"owner":"awslabs","repository":"amazon-ssm","path":"Compliance/InSpec/PortCheck","getOptions":"branch:master"}

    如果您選擇 S3,請在 Source Info (來源資訊) 欄位中,輸入 S3 儲存貯體中的 InSpec 描述檔的有效 URL。

    如需 Systems Manager 如何整合 GitHub 及 Amazon S3 的詳細資訊,請參閱 從 GitHub 執行指令碼

  8. Targets (目標) 中,指定標籤、手動選取執行個體或指定資源群組,以識別您要執行這項操作的執行個體。

    注意

    如果您預期看到的 Amazon EC2 執行個體未列出,請參閱 故障診斷 Amazon EC2 受管執行個體可用性 以取得故障診斷秘訣。

  9. Specify schedule (指定排程) 區段中,使用排程建置器選項來建立排程,以指定合規掃描的執行時間。

  10. 對於 Rate control (速率控制):

    • Concurrency (並行) 中,指定可同時執行命令的執行個體數目或百分比。

      注意

      如果透過指定套用至受管執行個體的標籤或指定 AWS 資源群組選取了目標,且您不確定會以多少個執行個體為目標,則透過指定百分比限制可以同時執行文件之執行個體的數量。

    • Error threshold (錯誤閾值) 中,指定在特定數目或百分比之執行個體上的命令失敗之後,停止在其他執行個體上執行命令。例如,如果您指定三個錯誤,則 Systems Manager 會在收到第四個錯誤時停止傳送命令。仍在處理命令的執行個體也可能會傳送錯誤。

  11. (選用) 針對 Output options (輸出選項),若要將命令輸出儲存至檔案,請選取 Write command output to an S3 bucket (將命令輸出寫入至 S3 儲存貯體) 方塊。在方塊中輸入儲存貯體和字首 (資料夾) 名稱。

    注意

    授予能力以將資料寫入至 S3 儲存貯體的 S3 許可,會是指派給執行個體之執行個體描述檔的許可,而不是執行此工作之 IAM 使用者的許可。如需詳細資訊,請參閱建立 Systems Manager 的 IAM 執行個體描述檔。此外,若指定的 S3 儲存貯體位於不同的 AWS 帳戶 內,請確認與執行個體相關聯的執行個體描述檔具有寫入該儲存貯體的必要許可。

  12. 選擇 Create Association (建立關聯)。系統會隨即建立關聯,並自動執行合規掃描。

  13. 請稍候幾分鐘,等待掃描作業完成。接著,在導覽窗格中選擇 Compliance (合規)

  14. Corresponding managed instances (對應的受管執行個體) 中,尋找 Compliance Type (合規類型) 欄位是 Custom:Inspec (Custom:Inspec) 的執行個體。

  15. 選擇執行個體 ID,藉此檢視未合規狀態的詳細資訊。

使用 Run Command (AWS CLI) 執行 InSpec 合規掃描

  1. 如果您尚未安裝並設定 AWS Command Line Interface (AWS CLI),請進行相應的操作。

    如需相關資訊,請參閱安裝或升級 AWS 命令列工具

  2. 執行下列其中一個命令,即可從 GitHub 或 Amazon S3 執行 InSpec 描述檔。

    該命令會使用下列參數:

    • sourceType:GitHub 或 Amazon S3

    • sourceInfo:GitHub 或 S3 儲存貯體中的 InSpec 描述檔資料夾的 URL。該資料夾必須包含基本 InSpec 檔案 (*.yml),以及所有相關的控制項 (*.rb)。

    GitHub

    aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:tag_name","Values":["tag_value"]}]' --parameters '{"sourceType":["GitHub"],"sourceInfo":["{\"owner\":\"owner_name\", \"repository\":\"repository_name\", \"path\": \"Inspec.yml_file"}"]}'

    請見此處範例。

    aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:testEnvironment","Values":["webServers"]}]' --parameters '{"sourceType":["GitHub"],"getOptions":"branch:master","sourceInfo":["{\"owner\":\"awslabs\", \"repository\":\"amazon-ssm\", \"path\": \"Compliance/InSpec/PortCheck\"}"]}'

    Amazon S3

    aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:tag_name","Values":["tag_value"]}]' --parameters'{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.amazonaws.com/DOC-EXAMPLE-BUCKET/Inspec.yml_file\"}"]}'

    請見此處範例。

    aws ssm send-command --document-name "AWS-RunInspecChecks" --targets '[{"Key":"tag:testEnvironment","Values":["webServers"]}]' --parameters'{"sourceType":["S3"],"sourceInfo":["{\"path\":\"https://s3.amazonaws.com/DOC-EXAMPLE-BUCKET/InSpec/PortCheck.yml\"}"]}'
  3. 執行下列命令,以檢視合規掃描摘要。

    aws ssm list-resource-compliance-summaries --filters Key=ComplianceType,Values=Custom:Inspec
  4. 執行下列命令,以檢視不相容的執行個體的詳細資訊。

    aws ssm list-compliance-items --resource-ids instance_ID --resource-type ManagedInstance --filters Key=DocumentName,Values=AWS-RunInspecChecks