GuardDutyの設定方法

Amazon GuardDutyを設定した時の備忘録です。

Amazon GuardDutyとは

以下の機能を持っています。

  • CloudTrailイベント分析
    • CloudTrailイベントを継続的に分析し、AWSアカウントとインフラストラクチャのすべてのアクセスと動作をモニタリングします
  • VPCフローログとDNSログの分析
    • VPCフローログおよびDNSリクエストと応答を継続的に分析し、AWSアカウントとワークロードで悪意のある動作、不正な動作、または予期しない動作を識別します

不正なAWS APIの利用を検知、およびネットワークIDS、といった感じのサービスです。

初期設定

GuardDutyに関する設定部分のみ、詳細に記載していきます。

VPC Flowlogsの設定

解析対象となるVPC Flowlogsの出力設定を実施します。

VPC フローログ

CLoudTrailの設定

解析対象となるCloudTrailの出力設定を実施します。

証跡の作成

GuardDutyの設定

GuardDutyのコンソールに進んで、 Get Started をクリックします。

f:id:goodbyegangster:20191206053019p:plain

Enable GuadDuty をクリックします。

f:id:goodbyegangster:20191206053118p:plain

これでGuardDutyが利用開始されます。

追加設定:S3バケットの結果出力

GuardDutyにて検知された結果は、当然コンソールに表示される他、S3へも自動的に連携することが可能です。そのための設定。

結果のエクスポート

KMSキーの作成

まず、KMS Keyを作成します。GuardDutyはこの鍵を利用して、暗号化したデータをS3に連携してくれます。

> aws kms create-key ^
--description "key-guardduty" ^
--key-usage "ENCRYPT_DECRYPT" ^
--origin "AWS_KMS" ^
--tags TagKey=System,TagValue=GuardDuty

aws kms create-key

作成した鍵に、GuardDutyが利用できるようのPolocyを追加してあげます。下記のようなJSONのPolicyファイルを作成してあげます。

{
  "Id": "key-consolepolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Enable IAM User Permissions",
      "Effect": "Allow",
      "Principal": {"AWS": "arn:aws:iam::111122223333:root"},
      "Action": "kms:*",
      "Resource": "*"
  },
  {
      "Sid": "Allow GuardDuty to use the key",
      "Effect": "Allow",
      "Principal": {"Service": "guardduty.amazonaws.com"},
      "Action": "kms:GenerateDataKey",
      "Resource": "arn:aws:kms:[region]:111122223333:key/[KMSKeyId]"
    }
  ]
}

put-key-policy コマンドを利用して、上記で作成したポリシーに更新します。

> aws kms put-key-policy ^
--key-id (kme-key-id) ^
--policy-name default ^
--policy file://C:\tmp\kms\kms-policy.json

aws kms put-key-policy

鍵のローテーション設定も有効にしておきます。

> aws kms enable-key-rotation ^
--key-id (kme-key-id)

aws kms enable-key-rotation

S3バケットの作成

検知した結果を連携したいS3バケットBucket Policyに、以下のPolicyを設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Allow GuardDuty to use the getBucketLocation operation",
      "Effect": "Allow",
      "Principal": {
        "Service": "guardduty.amazonaws.com"
      },
      "Action": "s3:GetBucketLocation",
      "Resource": "arn:aws:s3:::[myBucketName]"
    },
    {
      "Sid": "Allow GuardDuty to upload objects to the bucket",
      "Effect": "Allow",
      "Principal": {
        "Service": "guardduty.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::[myBucketName]/[optional prefix]/*"
    },
    {
      "Sid": "Deny unencrypted object uploads. This is optional",
      "Effect": "Deny",
      "Principal": {
        "Service": "guardduty.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::[myBucketName]/[optional prefix]/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption": "aws:kms"
        }
      }
    },
    {
      "Sid": "Deny incorrect encryption header. This is optional",
      "Effect": "Deny",
      "Principal": {
        "Service": "guardduty.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::[myBucketName]/[optional prefix]/*",
      "Condition": {
        "StringNotEquals": {
          "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:[region]:111122223333:key/[KMSKeyId]"
        }
      }
    },
    {
      "Sid": "Deny non-HTTPS access",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::[myBucketName]/*",
      "Condition": {
        "Bool": {
          "aws:SecureTransport": "false"
        }
      }
    }
  ]
}

GuardDutyの設定

GuardDutyのコンソール画面にて、これまでに作成したS3とkmsの情報を入力します。

f:id:goodbyegangster:20191206053338p:plain

なにかミスっている場合は、コンソールでエラー表示されます。

検知する脅威について

検知した脅威はFindingsタブで表示されます。どんな脅威が検知されるのか、サンプルとして確認できる機能があり、以下はそのサンプル実行結果のコンソール画面です。

GuardDuty 結果サンプルの生成

f:id:goodbyegangster:20191206053419p:plain

より具体的にどんな脅威が検知されるのかは、マニュアルで公開してくれています。いわゆる脅威のことを、 Finding Type と表現されています。

アクティブな結果タイプ

また、GuardDutyが動作しているのか検証するために、テスト用の仕組みを用意してくれています。VPCレベルからテスト用環境を作成するCloudFormationテンプレートを用意してくれており、そのVPC上でLaunchされたEC2で、テスト用スクリプトを実行することで、 Finding Type に合致する悪意ある振る舞いを実行してくれるようです。

PoC (実証支援) - 複数の一般的な結果と GuardDuty 結果の自動生成

github: awslabs/amazon-guardduty-tester

GuardDutyがちゃんと動作しているのか、一番簡単な確認方法ですと、rootユーザでAWSコンソールにログインすると、以下のFinding Typeがあがってきます。

Policy:IAMUser/RootCredentialUsage

通知

GuardDutyは、脅威を検知した場合、Cloudwatch Eventを発行してくれます。そのため、GuardDutyをトリガーとするCloudwatch Ruleを作成し、そのターゲットにSNSを指定すれば、脅威検知時にMail発砲が可能です。

GuardDuty の CloudWatch イベント ルールおよびターゲットの作成