Amazon GuardDutyを設定した時の備忘録です。
Amazon GuardDutyとは
以下の機能を持っています。
不正なAWS APIの利用を検知、およびネットワークIDS、といった感じのサービスです。
初期設定
GuardDutyに関する設定部分のみ、詳細に記載していきます。
VPC Flowlogsの設定
解析対象となるVPC Flowlogsの出力設定を実施します。
CLoudTrailの設定
解析対象となるCloudTrailの出力設定を実施します。
GuardDutyの設定
GuardDutyのコンソールに進んで、 Get Started
をクリックします。
Enable GuadDuty
をクリックします。
これで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
作成した鍵に、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 enable-key-rotation ^ --key-id (kme-key-id)
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の情報を入力します。
なにかミスっている場合は、コンソールでエラー表示されます。
検知する脅威について
検知した脅威はFindingsタブで表示されます。どんな脅威が検知されるのか、サンプルとして確認できる機能があり、以下はそのサンプル実行結果のコンソール画面です。
より具体的にどんな脅威が検知されるのかは、マニュアルで公開してくれています。いわゆる脅威のことを、 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発砲が可能です。