LoginSignup
14

More than 5 years have passed since last update.

Amazon ECR に特定 IAM ユーザからのみのアクセスを許可

Last updated at Posted at 2016-07-03

Amazon ECR 最高です。あ、個人的な要望ですが、東京リージョンよりも Docker Datacenter のセキュリティ機能切望してます。よろしくお願いします。

さて
会社 / プロジェクトで共通の Docker イメージどう管理してますか?
AWS アカウントを分けて運用したくなる方も多いと思います。

そんなとき、ECR ではどうするかというと、こうします。

仮定

Docker イメージの所有者(= ECR 管理者)と
その利用者は以下のものだったとして。

所有者
AWS Account ID 1234-5678-9012
Docker Image 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web
利用者
AWS Account ID 9876-5432-1098
IAM User ecr

所有者側の設定

特定 IAM ユーザへの許可は AWS コンソールからはできない1 ため
CLI から許可してみます。

1. ECR ポリシーの定義

987654321098 アカウントの ecr という IAM ユーザ2 に対してのみ
アクセス許可するなら、以下のような policy.json ファイルを定義します。

policy.json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "allow-iam-user",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::987654321098:user/ecr"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ]
        }
    ]
}

このとき、Principalarn:aws:iam::987654321098:root を指定すると、ポリシー的に許可された すべての IAM ユーザ からのアクセスが許可されます。
また、ここで許可している Actiondocker pull のみを許可するものです。push も許可する場合は 公式ドキュメント を確認してください。

2. 利用者からのアクセスを許可

CLI からリポジトリにポリシーをセットします。

change-ecr-policy
POLICY=`cat policy.json`
REPOSITORY="app/web"
aws ecr set-repository-policy --repository-name $REPOSITORY --policy-text $POLICY

利用者側の設定

1. IAM ポリシーの設定

IAM ユーザ ecr に以下の Action を許可します。
ECR に設定したポリシーとひとつ違うことに注意してください。
ecr:GetAuthorizationToken が多いですね!

iam-user-policy
 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "allow-ecr-read",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

2. クロスアカウントな ECR にログインする

2.1. 所有者の AWS アカウント ID を指定してログイン

get-login
eval "$(aws ecr get-login --registry-ids 123456789012)"

2.2. または生のトークンを利用してログイン

get-authorization-token
AUTH_DATA=$(aws ecr get-authorization-token --registry-ids 123456789012)
TOKEN=$(echo $AUTH_DATA | jq -r ".authorizationData[0].authorizationToken" | base64 --decode | awk -F":" '{ print $2 }')
ENDPOINT=$(echo $AUTH_DATA | jq -r ".authorizationData[0].proxyEndpoint")
docker login -u AWS -p $TOKEN $ENDPOINT

2.3 pull なり push なり

ログインが成功すれば、あとは許可されたリポジトリを操作できます。

docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web

 


  1. 2016/07/03 現在、いまのところ。 

  2. EC2 など IAM ロールへの許可は こちらの記事 にありました。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14