Open14

amazon guardduty

あかさたなあかさたな

amazon guarddutyでS3に配置したオブジェクトのウイルススキャンをする。
その結果を取得したい。

あかさたなあかさたな
あかさたなあかさたな

ウイルススキャンの設定方法

  1. GuardDutyコンソールで「S3のMalware Protection」で有効にする
  2. S3のバケット名とスキャンの範囲を選択(バケット内全てのオブジェクト or 特定のプレフィックスで始まるオブジェクト)
  3. オブジェクトにタグを付けるか選択
あかさたなあかさたな

オブジェクトにタグをつけない場合は、スキャンが完了する前にオブジェクトにアクセスすることが可能。
タグを付ける場合はキーがGuardDutyMalwareScanStatusのタグがスキャン後にオブジェクトに付与される。
値は以下のいずれか

  • NO_THREATS_FOUND – スキャンされたオブジェクトに脅威は見つかりませんでした。
  • THREATS_FOUND – スキャン中に潜在的な脅威が検出されました。
  • UNSUPPORTED – このオブジェクトのサイズが原因で GuardDuty はスキャンできません。
  • ACCESS_DENIED – GuardDuty はオブジェクトにアクセスできません。許可を確認してください。
  • FAILED – GuardDuty はオブジェクトをスキャンできませんでした。
あかさたなあかさたな

以下の権限を含むIAMロールをアタッチする必要がある

  • EventBridge アクションは、Malware Protection for S3 が S3 Event Notifications をリッスンできるように、EventBridge マネージドルールを作成および管理します。
  • Amazon S3 と EventBridge アクションは、このバケット内のすべてのイベントについて S3 Event Notifications を EventBridge に送信します。
  • Amazon S3 アクションは、アップロードされた S3 オブジェクトにアクセスし、スキャンされた S3 オブジェクトに定義済みのタグを追加します。
  • AWS Key Management Service (AWS KMS) キーアクションは、サポートされている DSSE-KMS と SSE-KMS を使用してテストオブジェクトをバケットにスキャンして配置する前に、オブジェクトにアクセスします。
あかさたなあかさたな

特定のS3オブジェクトに付与されているタグを取得する

あかさたなあかさたな
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class ManagingObjectTags {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";
        String keyName = "*** Object key ***";
        String filePath = "*** File path ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Create an object, add two new tags, and upload the object to Amazon S3.
            PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName, new File(filePath));
            List<Tag> tags = new ArrayList<Tag>();
            tags.add(new Tag("Tag 1", "This is tag 1"));
            tags.add(new Tag("Tag 2", "This is tag 2"));
            putRequest.setTagging(new ObjectTagging(tags));
            PutObjectResult putResult = s3Client.putObject(putRequest);

            // Retrieve the object's tags.
            GetObjectTaggingRequest getTaggingRequest = new GetObjectTaggingRequest(bucketName, keyName);
            GetObjectTaggingResult getTagsResult = s3Client.getObjectTagging(getTaggingRequest);

            // Replace the object's tags with two new tags.
            List<Tag> newTags = new ArrayList<Tag>();
            newTags.add(new Tag("Tag 3", "This is tag 3"));
            newTags.add(new Tag("Tag 4", "This is tag 4"));
            s3Client.setObjectTagging(new SetObjectTaggingRequest(bucketName, keyName, new ObjectTagging(newTags)));
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
あかさたなあかさたな

aws内のリソースで上記のコードを実行する場合、s3clientを作るときにwithCredentialswithRegionは必須ではない。
それぞれロールの権限と、デフォルトリージョンの設定が付与された状態でS3にアクセスできるっぽい。

あかさたなあかさたな
あかさたなあかさたな

1.x sdkではdoesObjectExistがあるのでそれ使えば確認可能
2.xだとそれがないので、headObject関数でとってきて、例外発生させるしかなさそう

public boolean exists(String bucket, String key) {
    try {
        HeadObjectResponse headResponse = client
                .headObject(HeadObjectRequest.builder().bucket(bucket).key(key).build());
        return true;
    } catch (NoSuchKeyException e) {
        return false;
    }
}