Systems Manager Compliance で Chef InSpec プロファイルを使用する - AWS Systems Manager

Systems Manager Compliance で Chef InSpec プロファイルを使用する

AWS Systems Manager は Chef InSpec と統合します。InSpec はオープンソースのテストフレームワークで、GitHub または Amazon Simple Storage Service (Amazon S3) に保存するために、人が読み取り可能なプロファイルを作成できます。その後、Systems Manager を使用してコンプライアンススキャンを実行し、準拠または非準拠のノードを表示できます。プロファイルは、コンピューティング環境のセキュリティ、コンプライアンス、またはポリシー要件です。例えば、AWS Systems Manager の一機能である Compliance でノードをスキャンするとき、次のチェックを実行するプロファイルを作成できます

  • 特定のポートが開いているか閉じているかをチェックします。

  • 特定のアプリケーションが実行中かどうかをチェックします。

  • 特定のパッケージがインストールされているかどうかをチェックします。

  • 特定のプロパティの Windows レジストリキーをチェックします。

Amazon Elastic Compute Cloud (Amazon EC2) インスタンスと、Systems Manager で管理しているオンプレミスサーバーまたは仮想マシン (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 には、チェックや監査コントロールを迅速に書き込みするのに役立つリソースのコレクションが含まれています。InSpec は InSpec ドメイン固有言語 (DSL) を使用して、これらのコントロールを Ruby で書き込みます。InSpec ユーザーの大規模なコミュニティで作成されたプロファイルを使用することもできます。たとえば、GitHub の DevSec chef-os-hardening プロジェクトには、ノードをセキュリティで保護するのに役立つ数多くのプロファイルが含まれています。GitHub または Amazon S3 にプロファイルを記述して保存できます。

仕組み

ここでは、Compliance で InSpec プロファイルを使用するプロセスの仕組みを説明します。

  1. 事前定義された InSpec プロファイルを使用するよう指定するか、独自に作成します。GitHub の事前定義されたプロファイルを使用して始めることができます。独自の InSpec プロファイルを作成する方法については、「Chef InSpec Profiles」を参照してください。

  2. パブリックまたはプライベートの GitHub リポジトリ、または S3 バケットにプロファイルを保存します。

  3. Systems Manager ドキュメント (SSM ドキュメント) AWS-RunInspecChecks を使用して、InSpec プロファイルで Compliance を実行します。Compliance スキャンは、AWS Systems Manager の一機能である Run Command を使用してオンデマンドスキャンを開始することも、AWS Systems Manager の一機能である State Manager を使用して定期的な Compliance スキャンをスケジュールすることもできます。

  4. Compliance API または Compliance コンソールを使用して、準拠していないノードを識別します。

注記

以下の情報に注意してください。

  • 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 コンプライアンススキャンを実行する

AWS Systems Manager コンソールを使用して State Manager で InSpec コンプライアンススキャンを実行するには

  1. AWS 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] または [S3] を選択します。

    [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] (ターゲット) セクションで、タグの指定、インスタンスやエッジデバイスの手動選択、リソースグループの指定により、このオペレーションを実行するマネージドノードを選択します。

    注記

    表示されるはずのマネージドノードが表示されない場合は、トラブルシューティングのヒントについて「マネージドノードの可用性のトラブルシューティング」を参照してください。

  9. [Specify schedule (スケジュールを指定)] セクションで、スケジュールビルダーオプションを使用してコンプライアンススキャンを実行するタイミングを指定するスケジュールを作成します。

  10. [レート制御] の場合:

    • [Concurrency] (同時実行数) の場合、コマンドを同時に実行するマネージドノードの数または割合を指定します。

      注記

      マネージドノードに適用されるタグを指定するか、AWS リソースグループを指定してターゲットを選択し、ターゲットとなるマネージドノードの数が不明な場合は、割合を指定してドキュメントを同時に実行できるターゲットの数を制限します。

    • [Error threshold] (エラーのしきい値) で、ノードの数または割合のいずれかで失敗した後、他のマネージドノードでのコマンドの実行をいつ停止するか指定します。例えば、3 つのエラーを指定した場合、4 番目のエラーが受信されると、Systems Manager はコマンドの送信を停止します。コマンドを処理しているマネージドノードもエラーを送信する可能性があります。

  11. (オプション) コマンド出力をファイルに保存する場合は、[Output options] の [Write command output to an S3 bucket] ボックスを選択します。ボックスにバケット名とプレフィックス (フォルダ) 名を入力します。

    注記

    S3 バケットにデータを書き込む機能を許可する S3 アクセス許可は、このタスクを実行する IAM ユーザーのものではなく、インスタンスに割り当てられたインスタンスプロファイル (EC2 インスタンスの場合) または IAM サービスロール (オンプレミスマシン) のものです。詳細については、「Systems Manager の IAM インスタンスプロファイルを作成する」または「ハイブリッド環境用の IAM サービスロールを作成する」を参照してください。さらに、指定された S3 バケットが別の AWS アカウント にある場合は、マネージドノードに関連付けられたインスタンスプロファイルまたは IAM サービスロールが、そのバケットへの書き込みに必要なアクセス許可があることを確認してください。

  12. [関連付けの作成] を選択します。システムにより関連付けが作成され、コンプライアンススキャンが自動的に実行されます。

  13. スキャンが完了するまで数分待ってから、ナビゲーションペインの [Compliance] (コンプライアンス) を選択します。

  14. [Corresponding managed instances] (対応するマネージドインスタンス) で、[Compliance Type] (コンプライアンスタイプ) の列が [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\"}"]}'

    Simple Storage Service (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 node_ID --resource-type ManagedInstance --filters Key=DocumentName,Values=AWS-RunInspecChecks