AWS S3へのアクセスをIPベースのホワイトリスト形式にする

Share Button

S3やそれをマウントしたEC2の個々人での勝手な使用でいつの間にかパブリックアクセスが開いてたりすると大変困るし、それは絶対に避けたい。ということでバケットポリシーをかなり厳しめに設定することにした。

本当は人間ごとにIAMが存在していればIAMごとに挙動を変えられるのだが、うちの組織はIAMをひとつにした上でその内部でEC2上に複数アカウントを作り、それを各人に割り当てることで対応しているので、個別のアクセスコントロールがかなり難しい。
とはいえ、とりあえず構成員以外の意図せぬアクセスだけは最低限遮断したいので、S3のGetObjectの挙動を原則Denyにした上で、NotIpAddressを使ってEC2がElastic IPで持っている固定のIPアドレスを指定、これによりIPアドレスレベルでの個別のホワイトリストが設定できるようになる。つまりこのIPアドレスに該当しない限りはGetObjectが全てAccess Deniedされる。すなわちEC2のアカウントの認証を通さない限りアクセスできなくなる。仮にパブリックURLが発行されていたとしてもだ。そこにブラウザからアクセスしてもちゃんとアクセスが遮断される。

本当はクレイジーに
“Action”: “s3:*”
(=S3の該当バケットへのあらゆる操作が全て遮断される)に指定したかったところだけど、それをすると出先からのアップロード(scpでのファイル転送)にすら対応できなくなって不満が噴出することが予想されるのでやめた。GetObjectさえ切っとけば少なくとも閲覧はできないのでとりあえずはいいかなという感じ。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "WhitelistConnection",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "EC2.ELASTIC.IP.ADDRESS1",
                        "EC2.ELASTIC.IP.ADDRESS2"
                    ]
                }
            }
        }
    ]
}

とりあえず大枠でのアクセスコントロールはできたので、次はS3バケット内でのユーザグループでのアクセスコントロールなどがうまくできないか調べなければならない。というのもs3fsでマウントしたS3以下のファイルは全て所有者がEC2のルートアカウントになってしまうため、ユーザグループの設定によるアクセスコントロールが思ったようにできないのだ。これは今後考えていく。

style="display:block; text-align:center;"
data-ad-layout="in-article"
data-ad-format="fluid"
data-ad-client="ca-pub-3546003055292762"
data-ad-slot="5749192034">


Share Button

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.