概要
IP制限したコンテナリポジトリがほしい。コンテナリポジトリで思いつくのは以下。
(1) dockerhubを利用する
(2) AWS ECR を利用する
(3) 自分で構築する(参考:5分で社内にプライベートなDocker Registryを立てる!)
(1)は、プライベートリポジトリを特定アカウントに共有する方法は見つけたが、IP制限は見つけられなかった。
(3)は、手間なのでやりたくない。
(2)を試してみることにした。
AWS ECRを利用してみる
リポジトリの構築
同じイメージタグ名でタグでプッシュすると、過去のイメージはタグなしとなる。
それを避けるために、タグのイミュータビリティは有効にしている。
IAMユーザの作成
特定IPからのみアクセスを許可する SourceIPRestriction というポリシーを用意した。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "SourceIPRestriction", "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "NotIpAddress": { "aws:SourceIp": [ "x.x.x.x/32" ] } } } ] }
※ECRのPermissionsでも操作できそうだが、AWSサービスと連携させる可能性があるためIAMユーザで制限した。
参考:Repository policy examples
SourceIPRestrictionとAmazonEC2ContainerRegistryPowerUserを合わせた、ecr_deploy というIAMユーザを作成した。
リポジトリへpushする
PS C:\WINDOWS\system32> aws configure --profile=ecr_deploy AWS Access Key ID [None]: AKIA... AWS Secret Access Key [None]: Z4aU... Default region name [None]: ap-northeast-1 Default output format [None]: json PS C:\WINDOWS\system32> aws --version aws-cli/2.1.15 Python/3.7.9 Windows/10 exe/AMD64 prompt/off PS C:\WINDOWS\system32> aws ecr get-login-password --region ap-northeast-1 --profile=ecr_deploy | docker login --username AWS --password-stdin 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com Login Succeeded PS C:\WINDOWS\system32> docker tag nginx:latest 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0 PS C:\WINDOWS\system32> docker push 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0 The push refers to repository [377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test] 4eaf0ea085df: Pushed 2c7498eef94a: Pushed 7d2b207c2679: Pushed 5c4e5adc71a8: Pushed 1.0: digest: sha256:13e4551010728646aa7e1b1ac5313e04cf75d051fa441396832fcd6d600b5e71 size: 1362
リポジトリをpullしてみる
PS C:\WINDOWS\system32> docker pull 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0 1.0: Pulling from private-test Digest: sha256:13e4551010728646aa7e1b1ac5313e04cf75d051fa441396832fcd6d600b5e71 Status: Image is up to date for 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0
特定IPアドレス以外から実施した場合は以下のエラーとなる
PS C:\WINDOWS\system32> docker pull 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test:1.0 Error response from daemon: pull access denied for 377343199566.dkr.ecr.ap-northeast-1.amazonaws.com/private-test, repository does not exist or may require 'docker login': denied: User: arn:aws:iam::377343199566:user/ecr_deploy is not authorized to perform: ecr:BatchGetImage on resource: arn:aws:ecr:ap-northeast-1:377343199566:repository/private-test with an explicit deny