AWS S3 と Google SecOps を統合する

このドキュメントでは、AWS S3 を Google Security Operations と統合する方法について説明します。

ユースケース

  1. バケットを管理する
  2. バケットからファイルをダウンロードする
  3. ファイルをバケットにアップロードする

始める前に

Google SecOps で AWS S3 統合を構成する前に、ネットワーク環境と AWS 認証情報がすべての運用上の前提条件を満たしていることを確認します。

統合用に環境を準備するには、次の操作を完了してください。

  1. Google SecOps と AWS S3 リージョン サービス エンドポイント間のネットワークの見通しを確認します。

  2. 適切な IAM 権限を持つ AWS プログラム API 認証情報(アクセスキー ID とシークレット アクセスキー)を取得します。

  3. Google SecOps 内でインテグレーション インスタンスを構成してテストする。

ネットワークの要件

Google SecOps は、HTTPS REST API と AWS Python SDK(boto3)を使用して AWS S3 サービスと直接通信します。

ネットワーク環境が次の接続ルールを満たしていることを確認します。

  • アウトバウンド HTTPS アクセス: ポート 443/TCP 経由で、Google SecOps インスタンスまたはリモート エージェントから AWS S3 リージョン エンドポイント(s3.<region>.amazonaws.com または s3.amazonaws.com)へのアウトバウンド HTTPS 通信を有効にします。

    詳細については、AWS ドキュメントの AWS サービス エンドポイントをご覧ください。

  • プロキシ構成: 組織がアウトバウンド トラフィックを HTTP/HTTPS プロキシ経由でルーティングする場合は、Google SecOps サーバーまたはリモート エージェント ホストで標準環境プロキシ変数(HTTP_PROXY、HTTPS_PROXY、NO_PROXY)を構成します。

認証と認証情報

AWS S3 との統合では、AWS Signature バージョン 4 を使用してリクエストを認証するためのプログラムによる API 認証情報が必要です。

AWS 環境が次の認証要件を満たしていることを確認します。

  • プログラムによる認証情報: AWS IAM ユーザーまたはロールに関連付けられた有効な AWS アクセスキー ID と AWS 秘密鍵を取得します。

    IAM ID の作成と認証情報の生成については、AWS ドキュメントの IAM ユーザーのアクセスキーの管理と IAM ID をご覧ください。

  • 最小権限: 権限を自動化されたワークフローに必要なアクションとバケット リソースのみに制限し、認証情報を定期的にローテーションします。

    セキュリティに関する推奨事項の詳細については、AWS ドキュメントの IAM のセキュリティに関するベスト プラクティスをご覧ください。

アクションの権限を構成する

認証を行う AWS IAM ID に、Google SecOps ハンドブックが実行するアクションに必要な特定の権限を付与します。

次の表で、AWS S3 アクションの最小権限を確認してください。

アクション名 必要な AWS IAM 権限 (ActionName:Permission) 前提条件の権限 説明 / リソース スコープ
バケットからファイルをダウンロードする s3:GetObject s3:ListAllMyBuckets S3 バケットからオブジェクトをダウンロードします。リソース: arn:aws:s3:::<bucket-name>/*。
バケット ポリシーを取得する s3:GetBucketPolicy s3:ListAllMyBuckets バケット アクセス ポリシーを取得します。リソース: arn:aws:s3:::<bucket-name>。
バケット オブジェクトを一覧表示する s3:ListBucket s3:ListAllMyBuckets S3 バケット内のオブジェクトを一覧表示します。リソース: arn:aws:s3:::<bucket-name>。
バケットを一覧表示する s3:ListAllMyBuckets — アカウントが所有するすべての S3 バケットを一覧表示します。リソース: *。
ping s3:ListAllMyBuckets — 統合の接続を検証します。リソース: *。
バケット ポリシーを設定する s3:PutBucketPolicy s3:ListAllMyBuckets S3 バケット ポリシーを設定または変更します。リソース: arn:aws:s3:::<bucket-name>。
Upload File To Bucket s3:PutObject s3:ListAllMyBuckets オブジェクトを S3 バケットにアップロードします。リソース: arn:aws:s3:::<bucket-name>/*。

クイック リファレンス(ActionName:Permission)

次のクイック リファレンスを使用して、各アクションに必要な権限を確認してください。

Ping: s3:ListAllMyBuckets
Download File From Bucket: s3:GetObject, s3:ListAllMyBuckets
Get Bucket Policy: s3:GetBucketPolicy, s3:ListAllMyBuckets
List Bucket Objects: s3:ListBucket, s3:ListAllMyBuckets
List Buckets: s3:ListAllMyBuckets
Set Bucket Policy: s3:PutBucketPolicy, s3:ListAllMyBuckets
Upload File To Bucket: s3:PutObject, s3:ListAllMyBuckets

IAM ポリシーの例(最小権限)

次のポリシーの例は、Google SecOps で AWS S3 アクションをすべて実行するために必要な権限を示しています。

IAM ポリシーの作成とアタッチの手順については、AWS ドキュメントの IAM ポリシーの作成をご覧ください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "SecOpsS3Discovery",
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": "*"
    },
    {
      "Sid": "SecOpsS3BucketOperations",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket",
        "s3:GetBucketPolicy",
        "s3:PutBucketPolicy"
      ],
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Sid": "SecOpsS3ObjectOperations",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::*/*"
    }
  ]
}

統合のパラメータ

次のパラメータを使用して統合を構成します。

パラメータの表示名 種類 デフォルト値 必須 説明
AWS アクセスキー ID 文字列 なし ○ 統合で使用する AWS アクセスキー ID。
AWS シークレット キー パスワード なし ○ 統合で使用する AWS シークレット キー。
AWS のデフォルト リージョン 文字列 なし ○ 統合で使用する AWS のデフォルト リージョン(例: us-west-2)。
リモートで実行 チェックボックス オフ いいえ 構成した統合をリモートで実行するには、フィールドのチェックボックスをオンにします。オンにすると、リモート ユーザー(エージェント)を選択するオプションが表示されます。

Google SecOps で統合を構成する手順については、統合を構成するをご覧ください。

必要に応じて、後の段階で変更できます。統合インスタンスを構成すると、ハンドブックで使用できるようになります。複数のインスタンスの構成とサポートの詳細については、複数のインスタンスのサポートをご覧ください。

操作

アクションの詳細については、 デスクから保留中のアクションに対応すると手動による対策を実行するをご覧ください。

バケットからファイルをダウンロードする

AWS S3 のバケットからファイルをダウンロードします。

パラメータ

パラメータの表示名 種類 デフォルト値 必須 説明
バケット ファイルパス 文字列 s3://{bucket_name}/{file_name} ○ バケット内のファイルへのパスを指定します。例: s3://siemplify/syslog/log.txt
ダウンロード パス 文字列 なし ○ ファイルをダウンロードするパスを指定します。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
{
"bucket_file_path": "s3://testsiemplify/test/123.txt"
"download_path": "/usr/bin/share/download.txt"
}

ケースウォール

結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 200(is_success = true)の場合「AWS S3 から「{0}」が正常にダウンロードされました」.format(bucket_file_path)

他のステータス コードの場合(is_success=false):「アクションは AWS S3 から「{0}」をダウンロードできませんでした。理由: そのダウンロード パスのファイルはすでに存在します。」

アクションが失敗し、ハンドブックの実行が停止します。

間違った認証情報、サーバーへの接続なし、SDK エラーなど、致命的なエラーの場合: 「アクション「バケットからファイルをダウンロード」の実行エラー。理由: {0}」.format(error.Stacktrace)

全般

バケット ポリシーを取得する

AWS S3 からバケット ポリシーに関する情報を取得します。

パラメータ

パラメータの表示名 種類 デフォルト値 必須 説明
バケット名 文字列 なし ○ ポリシー情報を取得するバケットの名前を指定します。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
{
    "Policy": {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AddPerm",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::testsiemplify/*"
            }
        ]
    }
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 200(is_success = true)の場合「AWS S3 の「{0}」バケットのポリシーに関する情報が正常に取得されました」.format(bucket_name)

他のステータス コードの場合(is_success=false):「アクションは AWS S3 の「{0}」バケットのポリシーに関する情報を返すことができませんでした」.format(bucket_name)

アクションが失敗し、ハンドブックの実行が停止します。

間違った認証情報、サーバーへの接続なし、その他など、致命的なエラーの場合: 「アクション「バケット ポリシーの取得」の実行エラー。理由: {0}」.format(error.Stacktrace)

全般

バケット オブジェクトを一覧表示する

ユーザーがユーザー アカウントを無効にできるようにします。リクエストの本文には、無効にするユーザーが含まれます。アカウントの有効化プロパティを false に設定する必要があります。

パラメータ

パラメータの表示名 種類 デフォルト値 必須 説明
バケット名 文字列 なし ○ オブジェクトの取得元となるバケットの名前を指定します。
返されるオブジェクトの最大数 Integer なし × 返すオブジェクトの数を指定します。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
"Contents": [
        {
            "Key": "text.txt",
            "LastModified": %Y-%m-%dT%H:%M:%S,
            "ETag": "d41d8cd98f00b204e9800998ecf8427e",
            "Size": 0,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "lab_aws",
                "ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
            }
        },
        {
            "Key": "text_1.txt",
            "LastModified": %Y-%m-%dT%H:%M:%S,
            "ETag": "d41d8cd98f00b204e9800998ecf8427e",
            "Size": 0,
            "StorageClass": "STANDARD",
            "Owner": {
                "DisplayName": "lab_aws",
                "ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
            }
        }
    ]
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 200(is_success = true)の場合「AWS S3 で「{0}」バケットのオブジェクトが正常に返されました」.format(bucket_name)

他のステータス コードの場合(is_success=false):「アクションは AWS S3 の「{0}」バケットのオブジェクトを返すことができませんでした」.format(bucket_name)

アクションが失敗し、ハンドブックの実行が停止します。

認証情報が誤っている、サーバーへの接続がないなどの致命的なエラーの場合、その他: 「アクション「バケット オブジェクトの一覧表示」の実行エラー。理由: {0}」.format(error.Stacktrace)

一般
Case Wall テーブル

テーブル名:「{0}」バケット オブジェクト

列:

  • キー(Key としてマッピング)
  • 最終更新日(LastModified としてマッピング)
  • サイズ(バイト)(Size としてマッピング)
  • オーナー(Owner/DisplayName としてマッピング)
  • ストレージ クラス(ストレージ クラスとしてマッピング)
全般

バケットの一覧表示

AWS S3 からバケットのリストを取得します。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
{
    "Buckets": [
        {
            "CreationDate": %Y-%m-%dT%H:%M:%S,
            "Name": "testsiemplify"
        }
    ],
    "Owner": {
        "DisplayName": "lab_aws",
        "ID": "935dc3fed0e1d2c5b12242cf9927370824f2438681a2d3c0523f254dbde41aba"
    },
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 200(is_success = true)の場合「AWS S3 で使用可能なバケットが正常に一覧表示されました。」

他のステータス コードの場合(is_success=false):「アクションは AWS S3 で使用可能なバケットを一覧表示できませんでした。

アクションが失敗し、ハンドブックの実行が停止します。

間違った認証情報、サーバーへの接続なし、その他など、致命的なエラーが報告された場合:「アクション「バケットの一覧表示」の実行エラー。理由: {0}」.format(error.Stacktrace)

全般

Ping

Google Security Operations Marketplace タブの統合構成ページで提供されているパラメータを使用して、AWS S3 への接続をテストします。

ユースケース

接続をテストします。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

成功した場合:

「指定された接続パラメータを使用して AWS S3 サーバーに正常に接続されました。」

アクションが失敗し、ハンドブックの実行が停止します。

不成功の場合:

「AWS S3 サーバーに接続できませんでした。エラーは {0}」.format(exception.stacktrace)

全般

バケット ポリシーを設定する

AWS S3 のバケットにポリシーを設定します。

パラメータ

パラメータの表示名 種類 デフォルト値 必須 説明
バケット名 文字列 なし ○ ポリシーを更新するバケットの名前を指定します。
ポリシー JSON オブジェクト 文字列 なし ○ バケットに設定するポリシーの JSON オブジェクトを指定します。例については、https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html をご覧ください。

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
bucket_policy = {
    'Version': '2012-10-17',
    'Statement': [{
        'Sid': 'AddPerm',
        'Effect': 'Allow',
        'Principal': '*',
        'Action': ['s3:GetObject'],
        'Resource': f'arn:aws:s3:::{bucket_name}/*'
    }]
}
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 204(is_success = true)の場合「AWS S3 で「{0}」バケットのポリシーが正常に更新されました」.format(bucket_name)

他のステータス コードの場合(is_success=false):「アクションは AWS S3 の「{0}」バケットのポリシーを更新できませんでした」.format(bucket_name)

アクションが失敗し、ハンドブックの実行が停止します。

間違った認証情報、サーバーへの接続なし、その他など、致命的なエラーの場合:「アクション「バケット ポリシーの設定」の実行エラー。理由: {0}」.format(error.Stacktrace)

Upload File To Bucket

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

パラメータ

パラメータの表示名 種類 デフォルト値 必須 説明
ファイルパス 文字列 なし ○ アップロードする必要があるファイルのパスを指定します。
バケットのアップロード パス 文字列 s3://{bucket_name}/{file_name} ○ パスをアップロードするバケット内のパスを指定します。例: s3://siemplify/syslog/log.txt

実行

このアクションはエンティティに対しては実行されません。

アクションの結果

スクリプトの結果
スクリプトの結果名 値のオプション 例
is_success True/False is_success:False
JSON の結果
{
"bucket_upload_path": "s3://testsiemplify/test/123.txt"
"file_path": "/usr/bin/share/download.txt"
}
ケースウォール
結果のタイプ 値 / 説明 種類
出力メッセージ *

アクションが失敗したり、ハンドブックの実行を停止したりすることはありません。

ステータス コード == 200(is_success = true)の場合「「{0}」が AWS S3 {1} バケットに正常にアップロードされました」.format(file_path, バケット名(s3:// の後の最初の文字列))

ファイルが存在しない場合(is_success = false)「アクションは「{0}」を AWS S3 にアップロードできませんでした。理由: そのアップロード パスのファイルは存在しません。」

アクションが失敗し、ハンドブックの実行が停止します。

間違った認証情報、サーバーへの接続なし、SDK エラーなど、致命的なエラーの場合:「アクション「バケットにファイルをアップロード」の実行エラー。理由: {0}」.format(error.Stacktrace)

全般

さらにサポートが必要な場合 コミュニティ メンバーや Google SecOps のプロフェッショナルから回答を得ることができます。