IPアドレス制限有りのAWS CloudShellで
Dockerコマンドが使えなかった時の対処方法

はじめに

こんにちは。クラウド活用推進担当の下平です。


みなさんはAWSマネジメントコンソールにアクセスする際にIPアドレス制限をかけて利用することはありますか。


AWSマネジメントコンソールへのIP制限はIAMポリシーから制限をかけることができるのですが、CloudShellやCloudFormationなど一部のリソースはAWSの内部IPアドレスから実行されるため、許可したIPアドレスと異なるIPアドレスから実行されるサービスについては利用できなくなることがあります。


今回は、CloudShellからDockerコマンドを使って、ECRリポジトリにイメージをPushしようとしたところ、アクセスが拒否されたため、その原因と対処方法についてご紹介します。


目次

  1. 対象読者
  2. やってみた結果
  3. 前提条件
  4. やったこと
  5. まとめ
  6. 参考資料

対象読者

AWSマネジメントコンソールにIPアドレス制限をかけて利用している方


やってみた結果

DockerのUser AgentをIPアドレス制限のかかったIAMポリシーから除外(許可)することで、CloudShellからDockerコマンドを使えるようになりました。


前提条件

IPアドレス制限有りの環境で、CloudShellを許可したい場合は、"aws:userAgent": "*exec-env/CloudShell*"をIAMポリシーから除外設定する必要があります。



<ポリシー設定例>


  • {
  •     "Version": "2012-10-17",
  •     "Statement": {
  •         "Effect": "Deny",
  •         "Action": "*",
  •         "Resource": "*",
  •         "Condition": {
  •             "NotIpAddress": {
  •                 "aws:SourceIp": [
  •                     "xxx.xxx.xxx.xxx/24",
  •                     "xxx.xxx.xxx.xxx/24"
  •                 ]
  •             },
  •             "Bool": {"aws:ViaAWSService": "false"},
  •             "StringNotLike": {
  •                 "aws:userAgent": "*exec-env/CloudShell*"
  •             }
  •         }
  •     }
  • }


やったこと

上記ポリシーを適用した状態で、CloudShellからECRのイメージをPushしようとしたところ、アクセスが拒否されてしまいました。



  • [cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest
  • The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository]
  • 143b1d5a5135: Preparing
  • ae4cf1712fe4: Waiting
  • b8228bed845b: Waiting
  • denied: User: arn:aws:sts::123456789012:assumed-role/AdministratorAccess/xxxx@xxxx.co.jp is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:ap-northeast-1:123456789012:repository/test-repository with an explicit deny in an identity-based policy


ECRコマンドの結果は返ってきます。


  • [cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ aws ecr list-images --repository-name test-repository
  • {
  •     "imageIds": [
  •         {
  •             "imageDigest": "sha256:9fa87137f30992ae0731ea2c2b85326641515e71c5bdda74f751e480e0b9b205",
  •             "imageTag": "latest"
  •         }
  •     ]
  • }


調べてみたところDockerコマンドのUser Agentは、Docker-Clientでリクエストを投げているようなので、IAMポリシーでこのUser Agentを許可してみたところCloudShellからDockerコマンドが利用できるようになりました。


<ポリシー設定例>


  • {
  •     "Version": "2012-10-17",
  •     "Statement": {
  •         "Effect": "Deny",
  •         "Action": "*",
  •         "Resource": "*",
  •         "Condition": {
  •             "NotIpAddress": {
  •                 "aws:SourceIp": [
  •                     "xxx.xxx.xxx.xxx/24",
  •                     "xxx.xxx.xxx.xxx/24"
  •                 ]
  •             },
  •             "Bool": {"aws:ViaAWSService": "false"},
  •             "StringNotLike": {
  •                 "aws:userAgent": "*exec-env/CloudShell*",
  •                 "*Docker-Client*" ## 追記
  •             }
  •         }
  •     }
  • }


下記の通りDockerイメージのPull/Pushができるようになりました。



  • [cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ docker pull nginx/test-repository:latest
  • latest: Pulling from sysdig/test-repository
  • e9cc6b7a7507: Pull complete
  • Digest: sha256:9fa87137f30992ae0731ea2c2b85326641515e71c5bdda74f751e480e0b9b205
  • Status: Downloaded newer image for nginx/test-repository:latest
  • nginx/test-repository:latest
  • [cloudshell-user@ip-xxx-xxx-xxx-xxx ~]$ docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository:latest
  • The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/test-repository]
  • 09a5db48a45a: Layer already exists
  • latest: digest: sha256:9fa87137f30992ae0731ea2c2b85326641515e71c5bdda74f751e480e0b9b205 size: 3016

まとめ

AWSマネジメントコンソールのIP制限をかけたいという要望は時々お聞きしますが、AWSの公式ドキュメントにも除外対象のサービスなどのナレッジはあまりなく、対処方法が分からない場合、最終手段としてIPアドレス制限のかかっていないロールにスイッチロールするということになってしまいます。


今回のように、公式には情報が載っていないものでも、実行元のリソースやIPアドレスが何かを特定できれば、ポリシーで許可できる可能性があるかもしれません。


今回の記事がみなさんのお役に立てれば幸いです。


参考リンク

IAM ロールを使用して特定の IP アドレスからの API コールを制限する | AWS re:Post

IAM ポリシーは Cloudshell からのみ許可されますか? | AWS re:Post

カテゴリー

クラウド基盤ソリューション