特定のIP制限からのみアクセス可能なコンテナリポジトリがほしい

  • 投稿者:
  • 投稿カテゴリー:aws / docker

概要

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