IPアドレス制限有りのAWS CloudShellで
Dockerコマンドが使えなかった時の対処方法
Dockerコマンドが使えなかった時の対処方法
こんにちは。クラウド活用推進担当の下平です。
みなさんはAWSマネジメントコンソールにアクセスする際にIPアドレス制限をかけて利用することはありますか。
AWSマネジメントコンソールへのIP制限はIAMポリシーから制限をかけることができるのですが、CloudShellやCloudFormationなど一部のリソースはAWSの内部IPアドレスから実行されるため、許可したIPアドレスと異なるIPアドレスから実行されるサービスについては利用できなくなることがあります。
今回は、CloudShellからDockerコマンドを使って、ECRリポジトリにイメージをPushしようとしたところ、アクセスが拒否されたため、その原因と対処方法についてご紹介します。
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しようとしたところ、アクセスが拒否されてしまいました。
ECRコマンドの結果は返ってきます。
調べてみたところ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ができるようになりました。
AWSマネジメントコンソールのIP制限をかけたいという要望は時々お聞きしますが、AWSの公式ドキュメントにも除外対象のサービスなどのナレッジはあまりなく、対処方法が分からない場合、最終手段としてIPアドレス制限のかかっていないロールにスイッチロールするということになってしまいます。
今回のように、公式には情報が載っていないものでも、実行元のリソースやIPアドレスが何かを特定できれば、ポリシーで許可できる可能性があるかもしれません。
今回の記事がみなさんのお役に立てれば幸いです。