Kebijakan lintas akun bucket AWS S3 dicampur dengan akun internal

Aug 21 2020

kami menggunakan bucket s3 untuk berbagi file antara dua perusahaan. Kami membuat bucket S3 pribadi dan kami telah mendedikasikan pengguna untuk aplikasi yang menggunakan bucket ini (menggunakan aws_key dan aws_secret). Kami menemukan bahwa kami tidak memiliki akses ke getObject, tetapi kami berhasil memasukkan PutObject ke keranjang.

Saya juga telah membuat peran dengan izin ke keranjang ini dan menetapkannya ke application_user, tetapi itu tidak menyelesaikan masalah.

Jadi tujuan utamanya adalah untuk membaca, mendaftar, meletakkan akses dari akun eksternal dan pengguna IAM internal ke keranjang S3 yang sama. Saya akan menunjukkan bahwa perusahaan eksternal memiliki akses ke sana, sekarang dengan kebijakan ini. Saya tidak memiliki akses ke akun aws eksternal.

Di bawah ini ada kebijakan sumber daya untuk s3.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SharedS3Bucket",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::199999999999:root",    <--- external account 
                    "arn:aws:iam::111111111111:user/application_user" <-- our application user
                ]
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketAcl",
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::shared-bucket",
                "arn:aws:s3:::shared-bucket/*"
            ]
        }
    ]
}

Jawaban

1 MLu Aug 26 2020 at 07:39

Izin S3 sedikit rumit karena Anda tidak hanya memiliki izin Bucket yang perlu dikhawatirkan, tetapi juga setiap Objek yang Anda unggah memiliki izinnya sendiri-sendiri.

Kebijakan Bucket Anda di atas mengizinkan kedua perusahaan mengunggah objek, dan berfungsi seperti yang Anda lihat. Namun ketika perusahaan eksternal mengunggah suatu objek, izin defaultnya hanya memungkinkan pembacaan oleh pembuatnya , yaitu oleh perusahaan eksternal. Meskipun itu ada di keranjang Anda secara default, Anda tidak dapat membacanya jika diunggah oleh orang lain. Itu agak kontra-intuitif.

Solusinya adalah memastikan bahwa Objek yang diunggah memiliki ACL yang memungkinkan pembacaan oleh kedua akun.

Anda juga perlu menambahkan s3:PutObjectAclke daftar izin Kebijakan Bucket agar ini berfungsi.

Demikian pula jika Anda mengunggah dari baris perintah, Anda dapat mengubah objek acl setelah mengunggah dengan aws s3api put-object-acl.

Semoga membantu :)