EC2インスタンスからJavaプログラムを実行しているS3バケットにアップロードできるのはrootユーザーだけなのはなぜですか?

アレックス

アプリケーションでS3バケットcrystal-dynにデータをアップロードする際に問題があります。このアップロードは、Centos-6インスタンスの同じプログラムで正常に機能しますが、RHEL7インスタンスでは失敗します。

クリスタルロールのロールがアタッチされたEC2インスタンスがあります。次に、この役割にはインラインポリシーのクリスタルポリシーがあります。

{
"RoleName": "crystal-role", 
"PolicyDocument": {
    "Version": "2012-10-17", 
    "Statement": [
        {
            "Action": [
                "ec2:DescribeInstances"
            ], 
            "Resource": "*", 
            "Effect": "Allow", 
            "Sid": "AllowDescribeInstances"
        }, 
        {
            "Action": [
                "s3:ListBucket", 
                "s3:GetBucketLocation"
            ], 
            "Resource": [
                "arn:aws:s3:::crystal-dyn" 
            ], 
            "Effect": "Allow", 
            "Sid": "AllowSeeLogBucket"
        }, 
        {
            "Action": [
                "s3:PutObject"
            ], 
            "Resource": [
                "arn:aws:s3:::crystal-dyn/*" 
            ], 
            "Effect": "Allow", 
            "Sid": "AllowPutLogs"
        }, 
        {
            "Action": [
                "kms:Encrypt", 
                "kms:GenerateDataKey"
            ], 
            "Resource": [
                "arn:aws:kms:us-east-1:566:key/a15912a107bb", 
                "arn:aws:kms:us-east-1:566201213358:key/158d81e9467a"
            ], 
            "Effect": "Allow", 
            "Sid": "AllowEncrypt"
        }, 
        {
            "Action": "sts:AssumeRole", 
            "Resource": "arn:aws:iam::389203956472:role/allow-cross-account-exec-api-qa2", 
            "Effect": "Allow", 
            "Sid": "AllowApiAccess"
        }
    ]
}, 
"PolicyName": "crystal-policy"
}

このポリシーでは、インスタンスで実行されているJavaアプリケーションがS3バケットにデータをアップロードできるようにする必要があります。ただし、これは発生しません。そこで、アップロードをテストするための簡単なJavaプログラムを作成しました。AmazonS3クライアントの作成には3つのバージョンを使用していることに注意してください。私はこれをコマンドラインから実行します:

java -cp ".:lib/*" org.examples.UploadObject

libには、次のjarファイルがあります。

aws-java-sdk-1.10.10.jar        aws-java-sdk-s3-1.11.339.jar  httpclient-4.5.5.jar  jackson-annotations-2.9.5.jar  jackson-databind-2.9.5.jar
aws-java-sdk-core-1.11.423.jar  commons-logging-1.1.3.jar     httpcore-4.4.9.jar    jackson-core-2.9.5.jar         joda-time-2.9.9.jar

Javaコード:

   String clientRegion = "us-east-1";
    String bucketName = "crystal-dyn";
    String stringObjKeyName = "stringToUploadTest";
    try {
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withCredentials(DefaultAWSCredentialsProviderChain.getInstance()).withRegion(clientRegion).build();
        System.out.println("s3Client=" + s3Client);
        s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
        System.out.println("Uploading String  is done");
    }
    catch(AmazonServiceException e) {
        e.printStackTrace();
    }
    catch(SdkClientException e) {
        e.printStackTrace();
    }
try {
        System.out.println("Uploading to S3 bucket=" + bucketName + " string=" + stringObjKeyName  + " Building with No Creds");
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(clientRegion).build();
        System.out.println("s3Client=" + s3Client);
        s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
        System.out.println("Uploading String  is done");
    }
    catch(AmazonServiceException e) {
        e.printStackTrace();
    }
    catch(SdkClientException e) {
        e.printStackTrace();
    }
    try {
        System.out.println("Uploading to S3 bucket=" + bucketName + " string=" + stringObjKeyName  + " Building with No Creds and No region");
        AmazonS3 s3Client = AmazonS3ClientBuilder.standard().build();
        System.out.println("s3Client=" + s3Client);
        s3Client.putObject(bucketName, stringObjKeyName, "Uploaded String Object");
        System.out.println("Uploading String  is done");
    }
    catch(AmazonServiceException e) {
        e.printStackTrace();
    }
    catch(SdkClientException e) {
        e.printStackTrace();
    }

このプログラムは、AmazonS3クライアントを作成する3つのバージョンすべてについて、EC2Linuxインスタンスのrootユーザーから実行された場合にのみ正常に機能します。他のすべてのユーザーについては、例外スタックを含む出力を取得しました。以下を参照してください。roodを含むどのユーザーも、認証情報を持つ.awsディレクトリを持っていないことに注意してください。

s3Client=com.amazonaws.services.s3.AmazonS3Client@682b2fa
com.amazonaws.SdkClientException: Unable to load AWS credentials from 
any provider in the chain: [EnvironmentVariableCredentialsProvider: 
Unable to load AWS credentials from environment variables (AWS_ACCESS_KEY_ID (or AWS_ACCESS_KEY) and AWS_SECRET_KEY (or AWS_SECRET_ACCESS_KEY)), SystemPropertiesCredentialsProvider: Unable to load AWS credentials from Java system properties (aws.accessKeyId and aws.secretKey), com.amazonaws.auth.profile.ProfileCredentialsProvider@20d525: profile file cannot be null, com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper@3f56875e: Unable to load credentials from service endpoint]
at com.amazonaws.auth.AWSCredentialsProviderChain.getCredentials(AWSCredentialsProviderChain.java:136)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.getCredentialsFromContext(AmazonHttpClient.java:1186)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.runBeforeRequestHandlers(AmazonHttpClient.java:776)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:726)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701) 
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:651)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4365)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4312)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1755)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:3448)
at org.examples.UploadObject.main(UploadObject.java:20)
Uploading to S3 bucket=dynarch-ac-logs-malachite-dyn 
string=stringToUploadTest Building with No Creds
s3Client=com.amazonaws.services.s3.AmazonS3Client@740773a3
com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: AF2735F42CCB60D0; S3 Extended Request ID: 7VyScO6XOs00oB/g0k8bqG3X3Ib01n4uT1xg8/2U72TCOKg8YKNIVgQrjjnF6XzUAfoB24wcYZY=), S3 Extended Request ID: 7VyScO6XOs00oB/g0k8bqG3X3Ib01n4uT1xg8/2U72TCOKg8YKNIVgQrjjnF6XzUAfoB24wcYZY=
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1660)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1324)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1074)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:745)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:719)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:701)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:669)
at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:651)
at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:515)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4365)
at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4312)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1755)
at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:3448)
at org.examples.UploadObject.main(UploadObject.java:33)
Uploading to S3 bucket=dynarch-ac-logs-malachite-dyn 
string=stringToUploadTest Building with No Creds and No region
com.amazonaws.SdkClientException: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.
at com.amazonaws.client.builder.AwsClientBuilder.setRegion(AwsClientBuilder.java:436)
at com.amazonaws.client.builder.AwsClientBuilder.configureMutableProperties(AwsClientBuilder.java:402)
at com.amazonaws.client.builder.AwsSyncClientBuilder.build(AwsSyncClientBuilder.java:46)
at org.examples.UploadObject.main(UploadObject.java:44)
アレックス

ルートへのアクセスのみを許可するiptablesルールに問題があるようです。

iptables -L | grep root
DROP       all  --  anywhere             instance-data.ec2.internal  ! owner UID match root

このルールが削除されると、アップロードはすべてのユーザーに対して機能します

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ