yuj1osm's tech blog

クラウドやセキュリティなど

Amazon GuardDuty Malware Protection for Amazon S3 がリリースされました

AWS re:Inforce 2024にて、Amazon GuardDuty Malware Protection for Amazon S3 がリリースされましたので、早速検証してみました。

aws.amazon.com

aws.amazon.com

アップデート概要

  • GuardDuty Malware Protection の拡張機能で、選択した S3 バケットへの悪意のあるファイルのアップロードを検出

  • GuardDutyが有効になっていない場合、GuardDuty Malware Protection for Amazon S3機能のみの有効化もできる

  • スキャンしたオブジェクトにはGuardDutyMalwareScanStatusというタグが付与され、タグの値によって脅威と判定されたか分かる
    タグの値は以下の通り

    • NO_THREATS_FOUND : 潜在的な脅威を検出しなかった
    • THREATS_FOUND : 潜在的な脅威を検出した
    • UNSUPPORTED : 当該オブジェクトのスキャンをサポートしていない
    • ACCESS_DENIED : オブジェクトにアクセスできない
    • FAILED : マルウェアスキャンを実行できない

タグの詳細は以下のドキュメントにも記載があります docs.aws.amazon.com

  • 料金はオブジェクトのサイズと数による従量課金 料金は以下の通り
    • 1カ月のファイルサイズにおいて $0.79 / GB
    • 1カ月のファイル数において $0.282 / 1k

aws.amazon.com

Malware Protection for Amazon S3を有効化

GuardDutyの「S3のMalware Protection」から「S3のMalware Protectionを有効化」を押下します。

スキャン対象のS3バケットは「S3バケット内のすべてのオブジェクト」、タグ付けは「オブジェクトにタグを付ける」を選択します。
Malware Protection for Amazon S3機能のためのIAMロールを作成します。
「アクセス許可を表示」を押下します。

IAMロールに必要なポリシーが表示されるので、これらをコピーしておきます。

参考までにポリシーと信頼関係は以下のようになっています。

ポリシー

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowManagedRuleToSendS3EventsToGuardDuty",
      "Effect": "Allow",
      "Action": [
        "events:PutRule",
        "events:DeleteRule",
        "events:PutTargets",
        "events:RemoveTargets"
      ],
      "Resource": [
        "arn:aws:events:ap-northeast-1:3<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": [
        "arn:aws:events:ap-northeast-1:<accountID>:rule/DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3*"
      ]
    },
    {
      "Sid": "AllowPostScanTag",
      "Effect": "Allow",
      "Action": [
        "s3:PutObjectTagging",
        "s3:GetObjectTagging",
        "s3:PutObjectVersionTagging",
        "s3:GetObjectVersionTagging"
      ],
      "Resource": [
        "arn:aws:s3:::test-s3mal-bucket/*"
      ]
    },
    {
      "Sid": "AllowEnableS3EventBridgeEvents",
      "Effect": "Allow",
      "Action": [
        "s3:PutBucketNotification",
        "s3:GetBucketNotification"
      ],
      "Resource": [
        "arn:aws:s3:::test-s3mal-bucket"
      ]
    },
    {
      "Sid": "AllowPutValidationObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::test-s3mal-bucket/malware-protection-resource-validation-object"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::test-s3mal-bucket"
      ]
    },
    {
      "Sid": "AllowMalwareScan",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::test-s3mal-bucket/*"
      ]
    },
    {
      "Sid": "AllowDecryptForMalwareScan",
      "Effect": "Allow",
      "Action": [
        "kms:GenerateDataKey",
        "kms:Decrypt"
      ],
      "Resource": "arn:aws:kms:ap-northeast-1:<accountID>:key/<key_id>",
      "Condition": {
        "StringLike": {
          "kms:ViaService": "s3.*.amazonaws.com"
        }
      }
    }
  ]
}

信頼関係

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "malware-protection-plan.guardduty.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

続いて、IAMロールを作成します。
エンティティタイプはカスタム信頼ポリシーとし、コピーした信頼関係をペーストします。

ポリシーはいったんロールを作成し後にインラインポリシーとして追加します。
ロール名を入力しロールを作成します。

インラインポリシーのアクセス許可で、コピーしたポリシーをペーストします。

ポリシー名を入力しポリシーを作成します。

S3のMalware Protectionを有効化の画面に戻り、作成したIAMロールを選択し、「有効にする」を押下します。

S3のMalware Protectionが有効化されました。

スキャン状況の監視ができるようです。

IAMポリシーではS3とEventBridgeへの権限がありました。
そこで、EventBridgeを確認してみると、「DO-NOT-DELETE-AmazonGuardDutyMalwareProtectionS3-<文字列>」というルールが作成されています。
イベントパターンとターゲットを見ると、S3バケットにオブジェクトが作成されたらguardduty-malware-protection-planが起動して、スキャンが行われる仕組みのようです。

マルウェアを検知させる

S3バケットにeicarファイルをアップロードします。
ちなみに、S3のMalware Protectionが有効化したときに「malware-protection-resource-validation-object」というテストファイルも自動作成されているようです。

モニタリングを見ていると、スキャンされており感染判定されていることを観測できます。

eicarファイルには「GuardDutyMalwareScanStatus : THREATS_FOUND」というタグが付いており、潜在的な脅威を検出したと判定されていることが分かります。

ちなみに、有効化時に作られた「malware-protection-resource-validation-object」というテストファイルのタグを見てみると、「GuardDutyMalwareScanStatus : NO_THREATS_FOUND」というタグが付いており、潜在的な脅威と判定されなかったことが分かります。

検出結果の確認

それでは検出結果を見ていきます。
GuardDutyの「検出結果」を見ると、重要度「高」で検出結果タイプが「Object:S3/MaliciousFile」が検出されています。

詳細を見ると、検出理由やオブジェクトの情報が表示されています。

マルウェアから保護する

スキャン後にオブジェクトにタグ付けが行われるので、タグベースのアクセス制御 (TBAC) をバケットポリシーに仕込むことで、アクセス元からマルウェアを隔離できます。

docs.aws.amazon.com

ポリシー例があるので、S3バケットポリシーに設定します。

タグが「GuardDutyMalwareScanStatus": "NO_THREATS_FOUND"」以外のオブジェクトへのアクセスを拒否するという内容です。

タグベースのアクセス制御 (TBAC) をバケットポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "NoReadExceptForClean",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::555555555555:root",
                    "arn:aws:iam::555555555555:role/IAM-role-ARN",
                    "arn:aws:iam::555555555555:assumed-role/role-ARN/GuardDutyMalwareProtection"
                ]
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "StringNotEquals": {
                    "s3:ExistingObjectTag/GuardDutyMalwareScanStatus": "NO_THREATS_FOUND"
                }
            }
        },
        {
            "Sid": "OnlyGuardDutyCanTag",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::555555555555:root",
                    "arn:aws:iam::555555555555:role/IAM-role-ARN",
                    "arn:aws:iam::555555555555:assumed-role/role-ARN/GuardDutyMalwareProtection"
                ]
            },
            "Action": "s3:PutObjectTagging",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
}

試しに無害のファイルをS3バケットにアップロードします。

こちらは「GuardDutyMalwareScanStatus : NO_THREATS_FOUND」でした。

AWS CloudShellでローカルコピーしてみると、eicarファイルだけブロックされました。

$ aws s3 cp s3://test-s3mal-bucket/test.txt ./
download: s3://test-s3mal-bucket/test.txt to ./test.txt           
$ aws s3 cp s3://test-s3mal-bucket/eicar.com ./
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

まとめ

Amazon GuardDuty Malware Protection for Amazon S3 を試してみました。
検出だけでなく、隔離の仕組みを簡単に実装できるのは嬉しい点です。

ユースケースとしては、不特定多数のユーザがS3バケットへファイルをアップロードできるようなアプリケーションで効果を発揮すると思います。
一方で、ログ保存など内部で使われていて、不特定多数のユーザからアップロードする余地のないS3バケットには、無理に設定する必要はなさそうです。
用途に応じて活用しましょう。

タグの付与やEventBridgeを自由にカスタマイズできるので、運用者に通知メールを送ったり、他のバケットへ隔離するといったこともできそうです。
要件に応じて柔軟に設計すると良いでしょう。

GuardDutyの活用範囲もどんどん増えているので、ぜひ活用してみてください。

AWS IAM Access Analyzer が未使用のアクセスを改善するための推奨事項を提供

AWS re:Inforce 2024にて、AWS IAM Access Analyzer が未使用のアクセスを改善するための推奨事項を提供するようになりました。

aws.amazon.com

aws.amazon.com

アップデート概要

  • 昨年、未使用のアクセスの検査機能が登場

  • 今回のアップデートにより、未使用のアクセスを修正するための実用的な推奨事項を提供するようになった

未使用のアクセスアナライザーを作成

IAMのアクセスアナライザーから「未使用のアクセス」を選択し、アナライザーを作成します。

分析タイプを「未使用のアクセス分析」にし、その他はデフォルトのままアナライザーを作成します。

検出結果を確認

しばらく待つと、未使用のアクセス一覧が検出されます。

「未使用のIAMロール」を確認すると、詳細な推奨事項を確認できます。
今回の例では、当該ロールの確認や削除が推奨されています。

「未使用の許可」を確認すると、ポリシーの修正案を提示してくれます。

Previewボタンを押下すると、修正案のビフォー/アフターも確認できます。

まとめ

具体的な修正案を提示してくれるため、開発者が未使用のアクセス許可を調整することがより簡単になりました。
特に、AWSを使い続けていると気付かぬうちにIAMロールが増えていることが多いので、これを機に棚卸してみると良いかもしれません。

AWS IAM の MFA でパスキーが使えるようになりました

AWS re:Inforce 2024が始まり、セキュリティ関連のアップデートが増えてきました。
IAMのMFAでパスキーが使えるようになりましたので、検証してみました。

aws.amazon.com

aws.amazon.com

アップデート概要

  • ルートユーザとIAMユーザのMFA(多要素認証)でパスキーが使えるようになった

  • Apple MacBook の Touch ID や Windows Hello 顔認識などの組み込み認証システムなどをサポートしている

パスキーを登録

IAMで任意のユーザを作成します。
「セキュリティ認証情報」タブから「MFAデバイスの割り当て」を押下します。

「パスキーまたはセキュリティキー」を選択します。

今回はスマホQRコードを撮影し、パスキーを登録してみました。
画面の指示通りに操作するとパスキーを登録できます。

パスキーによるログイン

一度IAMユーザをログアウトし、再度ログインしてみます。

パスキーが求められるようになりました。

バイスに表示される手順通りに認証手続きをすると、AWSマネジメントコンソールにログインできました。

まとめ

パスキーによってより強固な認証ができそうです。
前述のニュースブログに記載の通り、最初のリリースではパスワードとパスキーの併用が必要になる点は注意です。

Amazon CloudWatch が生成AI を活用した自然言語クエリ生成をサポート

Amazon CloudWatch が生成AI を活用した自然言語クエリ生成をサポートしたので、検証してみました。

aws.amazon.com

なお、こちらは昨年にプレビューが出ており、今回一般提供になりました。

aws.amazon.com

アップデート概要

  • Logs Insights と Metrics Insights 向けに、生成 AI を活用した自然言語クエリ生成ができるようになった

自然言語でクエリを生成してみる

CloudWatchのログのインサイトを見ると、クエリを記載するところに「Query generator」のボタンがるので押下します。

自然言語で調査したい内容を記載し、「新しいクエリを生成」を押下するとクエリが生成されます。

まとめ

簡単にクエリを生成できるため、クエリ作成経験が浅くても簡単にログを調査できるようになると思います。
生成AI技術の発達により、今後もクエリ生成関連のアップデートが増えてくると考えられるので、今後の生成AI系アップデートに期待です。

AWS Organizations でメンバーアカウントのルートメールアドレスを一元管理できるようになりました

AWS Organizations でメンバーアカウントのルートメールアドレスを一元管理できるようになったので、検証してみました。

aws.amazon.com

アップデート概要

  • 従来は、各メンバーアカウントにルートユーザでログインしないと、ルートメールアドレスを変更できなかった

  • 今回のアップデートにより、AWS Organizations の管理アカウントからメンバーアカウントのルートメールアドレスを一元管理できるようになった

管理アカウントからメールアドレスを変更してみる

AWS OrganizationsのAWSアカウントから変更対象のアカウントを押下します。

「アクション」より「Eメールアドレスを変更」を押下します。

新しいEメールアドレスを入力すると、メールアドレス宛に認証コードが届きます。

届いた認証コードを入力します。

変更が完了すると、管理アカウントと変更対象のメンバーアカウントそれぞれのEメールアドレス宛に変更通知メールが届きます。

メンバーアカウント側で、古いEメールアドレスを使ったルートログインをすると想定通りログインできません。

新しいEメールアドレスを使ったルートログインをするとログインできます。
パスワードは古いEメールアドレスで使っていたものを引き継いでいます。
また、メンバーアカウントのアカウント情報からも、Eメールアドレスが変更されていることを確認できます。

まとめ

管理アカウントから簡単にメンバーアカウントのルートメールアドレスを変更できました。
従来では、複数のメンバーアカウントでメールアドレスを変更する場合、各メンバーアカウントにログインして変更する必要がありました。
今回のアップデートにより、メンバーアカウントの管理がより一層楽になりました。

re:Invent 2023のハンズオンセッション参加レポート

ラスベガスで開催されたAWS re:Invent 2023のハンズオンセッションについてご紹介します。

ハンズオンセッションとは

re:Inventでは多くのハンズオンセッションが用意されており、AWSサービスを応用した開発や最新機能をいち早く試せるので、手を動かして学びたい人にとって非常におすすめです。
ハンズオンは「AWS Workshop Studio」を利用し、一時的なAWSアカウントと手順書で行うので、料金の心配はなく気軽に参加できます。

ハンズオンセッションにはいくつか種類があり、以下のようなものがあります。

Builders' Session

少人数の参加者にAWSの技術者がつき、直接解説を受けることができます。

Workshop

大人数の参加者がおり、前半に説明があり、後半に各自でハンズオン形式で進めていきます。

Game Day

その場に居合わせた参加者3~4名でチームを組み、与えられた課題を解いていく競技形式です。

ハンズオンセッションのご紹介

今回体験したハンズオンをいくつかご紹介します。

SEC303: Container thread detection with AWS security services

Builders' Session形式のハンズオンセッションです。
AWSセキュリティサービスを使って、コンテナの脅威を検出したり、修正をデプロイする方法を学びます。

最初に、Security HubやConfigの見方を学びます。

その後、ConfigでEKSの脆弱性を検知するルールを作成します。

ルールをいくつか作った後、今度はKubescapeをSecurity Hubと統合してEKS監視する手法を学びます。
これにより、EKSの脆弱性を検知できたので、次にこれらをCI/CDで修正していく作業になります。

Code PipelineにInspectorを統合し、パイプラインを実行します。

脆弱なDockerfileベースイメージなので、パイプラインは失敗するようになっています。

Dockerfileベースイメージを編集し、別のパブリックイメージからNodejsを構築したり、更新したりして脆弱性を消し込んでいきます。

最終的にパイプラインが成功したら達成です。

ENT307: The Microsoft on AWS adventure game

Workshop形式のハンズオンセッションです。
AWS環境を国と見立てて、魔物から守るための国の構築をゲーム形式で実施します。
Microsoft製品をふんだんに使ったワークショップのため、AWSMicrosoft製品の両方を学ぶことができます。

Windows Server、Windows File Sever、SQL Server などを構築しAD連携します。
タスクをこなしていき、最終的に以下の構成図のものができます。

Managed Microsoft ADによる冗長化やOSメンテナスからの解放など、様々な気づきが得られます。

GHJ302: Network Topology Titans

Game Day形式のハンズオンセッションです。
その場で一緒になった人たちとチームを組み、企業のエンジニアとして雇われ、様々な課題を解決する内容です。
ネットワークサービスに特化した内容であり、本格的な構築やトラシューなどを体験できます。

まとめ

ハンズオンを通して、AWSサービスを応用したソリューション開発や新サービスの理解が一層深まりました。
手を動かしながら、質問やディスカッションができるため、現地参加の場合はぜひハンズオンセッションに参加してみてください。

re:Invent 2023で発表されたAWS Security Hubのアップデートまとめ

AWS re:Invent 2023にて、AWSセキュリティサービスについてたくさんのアップデートがありました。
今回は、AWS Security Hubのアップデートについてご紹介します。

AWS Security Hub コントロールカスタマイズ

Security Hubのマネージドコントロールをカスタマイズできるようになりました。
例えば、ACMで発行された証明書の更新間隔はデフォルトで30日ですが、組織のポリシーに合わせて45日や60日に変更可能です。

aws.amazon.com

「カスタムポリシー」→「コントロールパラメーターのカスタマイズ」から設定可能です。

Security Hubのコントロールは組織にとって必ずしもベストではないので、自組織に合わせてカスタマイズできるのは嬉しいアップデートです。

AWS Security Hub ダッシュボード機能強化

サマリダッシュボードのウィジェットをカスタマイズできるようになりました。
また、ダッシュボードでAWSアカウントやリソースタグによるフィルタリングができるようになり、自身にとって使いやすいカスタマイズが可能です。

aws.amazon.com

脅威や脆弱性のランキングも表示できます。
また、右のウィジェットからドラッグ&ドロップでグラフを配置できます。

運用者にとって、統一的なダッシュボードを用途に合わせてカスタマイズできるのは、非常にありがたい機能です。
今回のアップデートで、Security Hubがより使いやすくなったと思います。

AWS Security Hub の新しい一元的な設定機能

委任管理者アカウントから、一元的な設定ができるようになりました。
これにより、アカウントやリージョンに渡って、特定の標準やコントロールを柔軟に行うことができるようになります。
例えば、特定のコントロールを組織単位で無効化したり、コントロールパラメータのカスタマイズを特定アカウントのみに適用させることが可能です。

aws.amazon.com

設定を見てみます。
Security Hubの「設定」→「中央設定を開始」を押下します。

「リージョン」からポリシーを適用させる任意のリージョンを選択します。

「設定タイプ」から「Security Hubの設定をカスタマイズ」を選択します。

「カスタムポリシー」の画面で「特定のコントロールを無効化」を選択し、無効化するコントロールを選択します。
ここでも、アップデート「AWS Security Hub コントロールカスタマイズ」の機能を利用できます。

そして、設定したポリシーをどこの組織やアカウントに適用するかを指定します。

最後に、これまで設定してきたポリシーの名前、説明、タグを入力して完了です。

従来は個々のメンバーアカウントでコントロールの有効/無効をしていましたが、今回のアップデートで一元的に管理できるため、運用が容易になると思います。

AWS Security Hub での新しい検出結果の追加を発表

Findingに新たなメタデータを追加し、対応の優先度付けやコンテキストの理解を支援するようになりました。
具体的には、AWSアカウント名、リソースタグ、アプリケーションタグが付与されます。

aws.amazon.com

Security Hubの「検出結果」から「詳細」を見ると、AWSアカウント名やリソースタグが表示されています。

JSONログにも同様に表示されています。

検出結果に情報を付与するにはユーザ側で作り込みが必要でしたが、今回のアップデートで作り込みが不要になりました。
例えば、従来からログに載っているアカウントIDからアカウント名を特定するのは手間のかかる作業でしたが、ログに情報が載っているので調査もしやすくなります。
運用者にとっても非常に嬉しいアップデートだと思います。

まとめ

今回は従来のセキュリティサービスをより使いやすくするための、痒い所に手が届くアップデートが多かったと思います。
Security HubはAWS環境のセキュリティ対策に必要不可欠であるため、今後のアップデートにも期待です。