🍣

GuardDuty Malware Protection for S3の検証

に公開

やりたいこと

GuardDuty Malware Protection for S3の検証

検証したい項目

  • マルウェアの検知テスト
  • 検知したファイルに対して付けられるタグの内容確認
  • 検知した場合に通知できるように設定する
  • GuardDuty Malware Protection for S3で使用する権限
  • 特定のタグがついたオブジェクトをGetできないようにする

検証項目の調査

マルウェアの検知テスト

安全な検知テストとして「EICARファイル」を使用する。

手法:https://dev.classmethod.jp/articles/upload-eicar-to-s3-with-cloudshell/

検知したファイルに対して付けられるタグの内容確認

S3のオブジェクトを検査した際に脅威を検知しなかった場合のタグ。

S3のオブジェクトを検査した際に脅威を検知した場合タグ。

SecurityHubで通知を受け取った場合こういった通知が発報される。

検知した場合に通知できるように設定する

GuardDutyで検知する為SecurityHubを使用していれば追加の対応は特に不要である。
SecurityHubなど設定していない場合はGuardDutyからの通知機能も使える。

https://docs.aws.amazon.com/guardduty/latest/ug/guardduty_findings_eventbridge.html

GuardDuty Malware Protection for S3で使用する権限

  S3MalwareProtectionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub "s3-malware-protection-role"
      AssumeRolePolicyDocument:
        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Principal": {
                "Service": "malware-protection-plan.guardduty.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        }

  S3MalwareProtectionRolePolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: !Sub "s3-malware-protection-policy"
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Sid: AllowManagedRuleToSendS3EventsToGuardDut
            Effect: Allow
            Action:
              - events:PutRule
              - events:DeleteRule
              - events:PutTargets
              - events:RemoveTargets
            Resource:
              - !Sub "arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
            Condition:
              StringLike:
                "events:ManagedBy": "malware-protection-plan.guardduty.amazonaws.com"
          - Sid: AllowGuardDutyToMonitorEventBridgeManagedRule
            Effect: Allow
            Action:
              - events:DescribeRule
              - events:ListTargetsByRule
            Resource:
              - !Sub "arn:aws:events:${AWS::Region}:${AWS::AccountId}:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
          - Sid: AllowPostScanTag
            Effect: Allow
            Action:
              - s3:PutObjectTagging
              - s3:GetObjectTagging
              - s3:PutObjectVersionTagging
              - s3:GetObjectVersionTagging
            Resource:
              - !Sub "arn:aws:s3:::<BucketName>/*"
          - Sid: AllowEnableS3EventBridgeEvents
            Effect: Allow
            Action:
              - s3:PutBucketNotification
              - s3:GetBucketNotification
            Resource:
              - !Sub "arn:aws:s3:::<BucketName>"
          - Sid: AllowPutValidationObject
            Effect: Allow
            Action:
              - s3:PutObject
            Resource:
              - !Sub "arn:aws:s3:::<BucketName>/malware-protection-resource-validation-object"
          - Sid: AllowGuardDutyToReadS3Bucket
            Effect: Allow
            Action:
              - s3:ListBucket
            Resource:
              - !Sub "arn:aws:s3:::<BucketName>"
          - Sid: AllowMalwareScan
            Effect: Allow
            Action:
              - s3:GetObject
              - s3:GetObjectVersion
            Resource:
              - !Sub "arn:aws:s3:::<BucketName>/*"
          - Sid: AllowDecryptForMalwareScan
            Effect: Allow
            Action:
              - kms:GenerateDataKey
              - kms:Decrypt
            Resource:
              - !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/${S3KmsKey}"
            Condition:
              StringEquals:
                "kms:ViaService": "s3.amazonaws.com"
      Roles:
        - !Ref S3MalwareProtectionRole

特定のタグがついたオブジェクトをGetできないようにする

バケットポリシーに下記のようなアクセス制御を入れれば特定のタグがついているリソースに対する制限をかけることが可能である。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DenyGetObjectForMalicious",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<BucketName>/*",
            "Condition": {
                "StringEquals": {
                    "s3:ExistingObjectTag/GuardDutyMalwareScanStatus": "THREATS_FOUND"
                }
            }
        }
    ]
}

参考

https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/gdu-malware-protection-s3.html

https://dev.classmethod.jp/articles/upload-eicar-to-s3-with-cloudshell/

https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazons3.html

https://docs.aws.amazon.com/guardduty/latest/ug/malware-protection-s3-iam-policy-prerequisite.html

Discussion