2015年9月10日木曜日

IAMポリシーを利用して、Amazon S3にIPアドレス制限

Amazon S3の特定のバケツに、IAMポリシーを利用して、IPアドレス制限を掛ける方法です。
特定のユーザにAccess Key IDを発行して、S3の操作を制限させることができます。
たとえば、社外のユーザにS3にファイルをアップロードしてもらったりするようなシチュエーションがあったときなどに、使える方法だと思います。
以下、設定方法です。

IAMサービスを選択してポリシーを作っていきます。
Services -> IAM -> Policies -> Create Policy -> Create Your Own Policy

ポリシーの内容は、以下のようにします。

Policy Name:
好きな名前を入力します。
この例では、S3-IP-Restrictions とします。

Policy Document:
Statementを3つ書きます。
上から2つは、AWS CLIで操作できるようにするためのものです。もし、AWS CLIからアクセスせず、なんらかのプログラムを書いてアクセスするならば、一番下のStatementだけ書けばOKです。
"aws:SourceIp"項目では、IPアドレス100.100.100.101と100.100.100.102を許可します。設定では、後ろにサブネットマスク/32もつけてあげます。
"Resource"には、アクセス許可をするS3のバケツを指定します。この例では my-s3-bucket というバケツを使います。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1441865835000",
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets" 
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "100.100.100.101/32",
                        "100.100.100.102/32"
                    ]
                }
            },
            "Resource": [
                "arn:aws:s3:::*" 
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation" 
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "100.100.100.101/32",
                        "100.100.100.102/32"
                    ]
                }
            },
            "Resource": "arn:aws:s3:::my-s3-bucket" 
        },
        {
            "Effect": "Allow",
            "Action": [
                "*" 
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "100.100.100.101/32",
                        "100.100.100.102/32"
                    ]
                }
            },
            "Resource": [
                "arn:aws:s3:::my-s3-bucket/*" 
            ]
        }
    ]
}

-> Validate Policy でポリシーの書式チェックが出来ます
もし問題なかったら -> Create Policy でポリシー設定完了です。
ポリシーの一覧で、Filter: Customer Managed Polices を選択すると、作成したポリシーが出てきます。
あとは、Users作成をして、Groups設定でこのポリシーを選択すればOKです。

AWS CLIでアクセスできるかチェックしてみましょう。

AWS CLIのprofileを設定
$ aws configure --profile myprofile
AWS Access Key ID [None]: xx
AWS Secret Access Key [None]: xx
Default region name [None]: ap-northeast-1
Default output format [None]:
my-s3-bucket の中身を見る
$ aws s3 ls s3://my-s3-bucket --profile myprofile
2015-09-10 15:24:42          6 hello.txt
2015-09-10 15:10:09          2 test.txt
test.txtをアップロード
$ aws s3 cp test.txt s3://my-s3-bucket/test.txt --profile myprofile
対象外のバケツの中が見れない事を確認
$ aws s3 ls s3://this-is-test/ --profile myprofile
対象外のバケツにアップロードできないことを確認
$ aws s3 cp test.txt s3://this-is-test/test.txt --profile myprofile

以上で、S3のIPアドレス制限の設定が完了です。
注意事項としては、操作はできませんが、他のバケツ名も見えてしまう、というところがあります。これを制限する良い方法があったら、おしえていただけると嬉しいです。

Title pic from Providing Access to an IAM User in Another AWS Account That You Own - AWS Identity and Access Management
References
S3のアクセスコントロールまとめ - Qiita
Example Policies for Administering AWS Resources - AWS Identity and Access Management