ちょっと話題の記事

[アップデート] AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになりました

VPCエンドポイントポリシーでマネジメントコンソールからサインインできるアカウントを制御できるぞ。なお、インターネットに抜けずに閉域網からマネジメントコンソールにアクセスを実現するものではない模様。
2023.05.11

インターネットに抜けずに閉域網からマネジメントコンソールにアクセスしたいな

こんにちは、のんピ(@non____97)です。

皆さんはインターネットに抜けずに閉域網からマネジメントコンソールにアクセスしたいなと思ったことはありますか? 私はあります。

世の中にはセキュリティルームなどインターネットへのルーティングがされていない / インターネットへのアクセスが許可されていないエリアがあったりします。

そして、システムの要件上、そのような場所から運用することが求められるケースがあります。

そのような環境でAWSの運用をするのはかなり大変です。何しろAWSマネジメントコンソールにアクセスするにはインターネットを経由しなければならないためです。

...と思っていると、「AWSマネジメントコンソールへのプライベートアクセスがGAされました」とアナウンスがありました。

これはとんでもないことです。

実際に試してみたので紹介します。

いきなりまとめ

  • インターネットに抜けずに閉域網からマネジメントコンソールにアクセスを実現するものではない
    • マネジメントコンソールで使用されるアセットにアクセスする際はインターネット接続が必要
    • 完全に閉じたネットワークからVPCエンドポイント経由でアクセスしようとすると、Unable to load contentと表示され、マネジメントコンソールのホームにアクセスすることはできない
  • ユーザーがネットワーク内から任意のAWSアカウントにサインインすることを防ぐ際に有効
  • VPCエンドポイントはマネジメントコンソールでアクセスするリージョンごとに以下の2つ
    • com.amazonaws.region.console
    • com.amazonaws.region.signin
  • マネジメントコンソールからus-east-1にアクセスする/しないに関わらず、us-east-1にもVPCエンドポイントが必要
  • DNSサーバーでaws.amazon.comのゾーンを作成し、以下のCNAMEレコード(Route 53 Private Hosted Zoneの場合はALIASレコード)が必要
    • region.signin.aws.amazon.com : com.amazonaws.region.consoleに対するレコード
    • region.console.aws.amazon.com : com.amazonaws.region.signinに対するレコード
    • signin.aws.amazon.com : com.amazonaws.region.consoleに対するレコード
    • console.aws.amazon.com : com.amazonaws.region.signinに対するレコード
  • サービスによっては上述のFQDNにマッチしないものがあるため、https[:]//configuration.private-access.console.amazonaws.com/region.confを確認の上、DNSレコードを作成する
  • インターネットを経由せずにマネジメントコンソールからサービスの操作を行いたい場合は、そのサービスのVPCエンドポイントを作成する必要がある
    • マネジメントコンソールからサービスの操作を行う場合、マネジメントコンソールを開いているブラウザから直接そのサービスのサービスエンドポイントにアクセスするものがある
  • 2023/5/11時点では東京リージョン非対応
  • 未対応のサービスも多数ある
  • VPCエンドポイント経由でマネジメントコンソールにアクセスした場合は、経由したVPCエンドポイントとVPCのIDを確認することができる

概要

AWSマネジメントコンソールへのプライベートアクセスとは

AWSマネジメントコンソールへのプライベートアクセスとは何を指しているのかから確認します。

AWS公式ドキュメントを確認すると、「VPCもしくはオンプレミスネットワーク内からマネジメントコンソールの使用を信頼されたアカウントのみに制限すること」と読み取れました。これにより、ユーザーがネットワーク内から任意のAWSアカウントにサインインすることを防ぐシナリオで役立つようです。

With AWS Management Console Private Access, you can limit the use of the AWS Management Console to your trusted accounts from within your Amazon Virtual Private Cloud (VPC) and on-premises networks.

AWS Management Console Private Access - AWS Management Console

AWS Management Console Private Access is useful in scenarios when you want to limit access to the AWS Management Console from your network only to a specified set of known AWS accounts in your organization. By doing so, you can you can prevent users from signing in to unexpected AWS accounts from within your network. You can implement these controls using the AWS Management Console VPC endpoint policy.

Overview of AWS Management Console Private Access security controls - AWS Management Console

そのため、「インターネットを抜けず閉域網からマネジメントコンソールにアクセスすること」に重きを置いているというよりかは、「マネジメントコンソールで利用可能なAWSアカウントを制限すること」が主題になりますね。

実際、マネジメントコンソールで使用されるアセットにアクセスする際は、引き続きインターネット接続が必要なようです。

Internet connectivity from your network is still required to access assets used by the AWS Management Console, such as static content (JavaScript, CSS, images), and all AWS services that are not enabled by AWS PrivateLink. For a list of the top-level domains used the AWS Management Console, see Troubleshooting.

Overview of AWS Management Console Private Access security controls - AWS Management Console

そのため、完全な閉域網からへのアクセスを行うことはできません。

仕組み

それでは、AWSマネジメントコンソールへのプライベートアクセスを実現するための仕組みを確認します。

一言で言えば、マネジメントコンソールアクセス時に対応したVPCエンドポイントを経由するようにDNSの設定を行います。

VPCエンドポイントはマネジメントコンソールでアクセスするリージョンごとに以下の2つが必要になります。

  • com.amazonaws.region.console
  • com.amazonaws.region.signin

ただし、マネジメントコンソールからus-east-1にアクセスする/しないに関わらず、us-east-1にもVPCエンドポイントが必要です。

You must always provision infrastructure and networking connectivity to the US East (N. Virginia) (us-east-1) Region, regardless of other Regions you use with the AWS Management Console.

Overview of AWS Management Console Private Access security controls - AWS Management Console

VPCエンドポイントの用意ができたら、作成したVPCエンドポイントを経由してマネジメントコンソールにアクセスするようにDNSの設定を行います。

具体的にはDNSサーバーでaws.amazon.comのゾーンを作成し、以下のCNAMEレコード(Route 53 Private Hosted Zoneの場合はALIASレコード)が必要になります。

  • region.signin.aws.amazon.com : com.amazonaws.region.consoleに対するレコード
  • region.console.aws.amazon.com : com.amazonaws.region.signinに対するレコード
  • signin.aws.amazon.com : com.amazonaws.region.consoleに対するレコード
  • console.aws.amazon.com : com.amazonaws.region.signinに対するレコード

基本的にはこちらのDNSレコードで良いですが、サービスによってはsupport.console.aws.amazon.comなどFQDNが異なる場合があります。

また、ブラウザから各サービスの操作を行う際に、VPCエンドポイントを経由させたい場合は別途対応したVPCエンドポイント(必要に応じて+DNSレコードも)を作成する必要があります。

ブラウザから各サービスの操作を行う際に、VPCエンドポイントを通るってどういうこと?」と思われた方は以下記事をご覧ください。

以下AWS公式ドキュメントでも紹介されていますが、要するに「マネジメントコンソールからサービスの操作を行う場合、マネジメントコンソールを開いているブラウザから直接そのサービスのサービスエンドポイントにアクセスするものがあるよ」ということです。

This section describes the various network paths that the requests generated by your AWS Management Console can take to AWS services. In general, AWS service consoles are implemented with a mix of direct browser requests and requests that are proxied by the AWS Management Console web servers to AWS services. These implementations are subject to change without notice.

Implementing identity-based policies and other policy types - AWS Management Console

そのサービスのVPCエンドポイントがない場合は、インターネットを経由してサービスエンドポイントにアクセスしようとします。

どのFQDNやサービス、機能がどのVPCエンドポイントと対応しているかはhttps[:]//configuration.private-access.console.amazonaws.com/region.confから確認できます。

2023/5/11時点でのus-east-1の場合(https[:]//configuration.private-access.console.amazonaws.com/us-east-1.config.json)は以下のとおりです。

us-east-1.config.json (長いので折りたたんでいます)
{
  "Version": "2020-10-12",
  "Region": "us-east-1",
  "ServiceDetails": [
    {
      "ServiceName": "com.amazonaws.us-east-1.console",
      "PrivateIpv4DnsNames": [
        "us-east-1.console.aws.amazon.com",
        "console.aws.amazon.com",
        "s3.console.aws.amazon.com",
        "global.console.aws.amazon.com",
        "*.widget.console.aws.amazon.com",
        "networkmanager.console.aws.amazon.com",
        "support.console.aws.amazon.com"
      ],
      "PrivateIpv6DnsNames": [],
      "VpcEndpointPolicyType": "IAM+CONSOLE",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.signin",
      "PrivateIpv4DnsNames": [
        "signin.amazonaws.com",
        "us-east-1.signin.amazonaws.com"
      ],
      "PrivateIpv6DnsNames": [
        "signin.amazonaws.com",
        "us-east-1.signin.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM+CONSOLE",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.access-analyzer",
      "PrivateIpv4DnsNames": [
        "access-analyzer.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.application-autoscaling",
      "PrivateIpv4DnsNames": [
        "application-autoscaling.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.appmesh",
      "PrivateIpv4DnsNames": [
        "appmesh.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.athena",
      "PrivateIpv4DnsNames": [
        "athena.us-east-1.amazonaws.com",
        "athena.us-east-1.api.aws"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.autoscaling",
      "PrivateIpv4DnsNames": [
        "autoscaling.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.autoscaling-plans",
      "PrivateIpv4DnsNames": [
        "autoscaling-plans.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.billingconductor",
      "PrivateIpv4DnsNames": [
        "billingconductor.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.codeguru-profiler",
      "PrivateIpv4DnsNames": [
        "codeguru-profiler.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.codeguru-reviewer",
      "PrivateIpv4DnsNames": [
        "codeguru-reviewer.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.comprehend",
      "PrivateIpv4DnsNames": [
        "comprehend.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.comprehendmedical",
      "PrivateIpv4DnsNames": [
        "comprehendmedical.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.databrew",
      "PrivateIpv4DnsNames": [
        "databrew.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.dms",
      "PrivateIpv4DnsNames": [
        "dms.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.drs",
      "PrivateIpv4DnsNames": [
        "drs.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.ec2",
      "PrivateIpv4DnsNames": [
        "ec2.us-east-1.amazonaws.com",
        "ec2.us-east-1.api.aws"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.ecs",
      "PrivateIpv4DnsNames": [
        "ecs.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.eks",
      "PrivateIpv4DnsNames": [
        "eks.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.elasticache",
      "PrivateIpv4DnsNames": [
        "elasticache.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.elasticfilesystem",
      "PrivateIpv4DnsNames": [
        "elasticfilesystem.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.elasticmapreduce",
      "PrivateIpv4DnsNames": [
        "elasticmapreduce.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.emr-containers",
      "PrivateIpv4DnsNames": [
        "emr-containers.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.emr-serverless",
      "PrivateIpv4DnsNames": [
        "emr-serverless.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.events",
      "PrivateIpv4DnsNames": [
        "events.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.evidently",
      "PrivateIpv4DnsNames": [
        "evidently.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.grafana",
      "PrivateIpv4DnsNames": [
        "grafana.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.groundstation",
      "PrivateIpv4DnsNames": [
        "groundstation.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.imagebuilder",
      "PrivateIpv4DnsNames": [
        "imagebuilder.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.inspector2",
      "PrivateIpv4DnsNames": [
        "inspector2.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.kendra",
      "PrivateIpv4DnsNames": [
        "kendra.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.kms",
      "PrivateIpv4DnsNames": [
        "kms.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.lambda",
      "PrivateIpv4DnsNames": [
        "lambda.us-east-1.amazonaws.com",
        "lambda.us-east-1.api.aws"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.license-manager",
      "PrivateIpv4DnsNames": [
        "license-manager.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.logs",
      "PrivateIpv4DnsNames": [
        "logs.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.mgn",
      "PrivateIpv4DnsNames": [
        "mgn.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.migrationhub-strategy",
      "PrivateIpv4DnsNames": [
        "migrationhub-strategy.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.monitoring",
      "PrivateIpv4DnsNames": [
        "monitoring.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.private-networks",
      "PrivateIpv4DnsNames": [
        "private-networks.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.rds",
      "PrivateIpv4DnsNames": [
        "rds.us-east-1.amazonaws.com",
        "rds.us-east-1.api.aws"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.redshift",
      "PrivateIpv4DnsNames": [
        "redshift.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.redshift-data",
      "PrivateIpv4DnsNames": [
        "redshift-data.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.rum",
      "PrivateIpv4DnsNames": [
        "rum.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.s3",
      "PrivateIpv4DnsNames": [
        "*.s3.us-east-1.amazonaws.com",
        "*.s3-accesspoint.us-east-1.amazonaws.com",
        "*.s3-control.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.s3-outposts",
      "PrivateIpv4DnsNames": [
        "s3-outposts.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.sqs",
      "PrivateIpv4DnsNames": [
        "sqs.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.ssm",
      "PrivateIpv4DnsNames": [
        "ssm.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.ssm-contacts",
      "PrivateIpv4DnsNames": [
        "ssm-contacts.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.ssm-incidents",
      "PrivateIpv4DnsNames": [
        "ssm-incidents.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.states",
      "PrivateIpv4DnsNames": [
        "states.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.synthetics",
      "PrivateIpv4DnsNames": [
        "synthetics.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.transfer",
      "PrivateIpv4DnsNames": [
        "transfer.us-east-1.amazonaws.com"
      ],
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.dynamodb",
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    },
    {
      "ServiceName": "com.amazonaws.us-east-1.s3",
      "VpcEndpointPolicyType": "IAM",
      "CrossRegionDependencies": []
    }
  ]
}

サポートしているAWSリージョンとサービス

2023/5/11時点でのサポートされているリージョンは以下の通りです。東京リージョンはまだですね。

  • 米国東部 (バージニア北部) : us-east-1
  • 米国東部 (オハイオ) : us-east-2
  • 米国西部 (オレゴン) : us-west-2
  • 欧州 (アイルランド) : eu-west-1
  • アジアパシフィック (シンガポール) : ap-southeast-1

2023/5/11時点でのサポートしているサービスは以下の通りです。

  • Amazon API Gateway
  • AWS App Mesh
  • AWS Application Migration Service
  • Amazon Athena
  • AWS Auto Scaling
  • AWS Billing Conductor
  • AWS Cloud Map
  • Amazon CloudFront
  • Amazon CloudWatch
  • AWS CodeArtifact
  • Amazon CodeGuru
  • Amazon Comprehend
  • Amazon Comprehend Medical
  • AWS Compute Optimizer
  • AWS Console Home
  • AWS Database Migration Service
  • AWS DeepRacer
  • Amazon DocumentDB
  • Amazon DynamoDB
  • Amazon EC2
  • Amazon EC2 Global View
  • EC2 Image Builder
  • Amazon EC2 Instance Connect
  • Amazon Elastic Container Registry
  • Amazon Elastic Container Service
  • AWS Elastic Disaster Recovery
  • Amazon Elastic File System
  • Amazon Elastic Kubernetes Service
  • Amazon ElastiCache
  • Amazon EMR
  • Amazon EventBridge
  • Amazon GameLift
  • AWS Global Accelerator
  • AWS Glue DataBrew
  • AWS Ground Station
  • Amazon GuardDuty
  • AWS Identity and Access Management
  • AWS Identity and Access Management Access Analyzer
  • Amazon Inspector
  • Amazon Kendra
  • AWS Key Management Service
  • Amazon Kinesis
  • Amazon Kinesis Data Analytics
  • Amazon Kinesis Data Firehose
  • Amazon Kinesis Video Streams
  • AWS Lambda
  • Amazon Lex
  • AWS License Manager
  • Amazon Managed Grafana
  • Amazon Managed Streaming for Apache Kafka
  • Amazon Managed Workflows for Apache Airflow (MWAA)
  • AWS Migration Hub Strategy Recommendations
  • Amazon MQ
  • Network Access Analyzer
  • AWS Network Manager
  • Amazon OpenSearch Service
  • AWS Organizations
  • Amazon S3 on Outposts
  • Amazon SageMaker
  • Amazon SageMaker Synthetic Data
  • Service Quotas
  • AWS Signer
  • Amazon Simple Email Service
  • Amazon Simple Queue Service
  • Amazon Simple Storage Service
  • AWS SQL Workbench
  • AWS Step Functions
  • AWS Support
  • AWS Systems Manager
  • AWS Transfer Family
  • Unified Settings
  • Amazon VPC IP Address Manager

最新のサポートしているAWSリージョンとサービスは以下AWS公式ドキュメントから確認できます。

やってみた

検証環境

それでは実際に試してみます。

検証環境は以下の通りです。

AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになりました検証環境構成図

SSMセッションマネージャーのポートフォワーディングでWindows ServerのEC2インスタンスにRDP接続して、そこからブラウザ(Microsoft Edge)でマネジメントコンソールにアクセスします。

なお、インターネットへのアクセスはない環境です。マネジメントコンソールで使用されるアセットにアクセスする際は、引き続きインターネット接続が必要とのことですが、どのタイミングで要求されるのか確認してみます。

VPCエンドポイントの用意

まず、必要なVPCエンドポイントの用意をします。

VPCやEC2インスタンス、セキュリティグループの作成は割愛します。

com.amazonaws.region.consoleを作成します。

consoleのVPCエンドポイントの作成

一旦エンドポイントポリシーはフルアクセスで作成します。

consoleのVPCエンドポイントの作成2

com.amazonaws.region.signinも同様に作成します。

signinのVPCエンドポイントの作成

作成したVPCエンドポイント一覧は以下の通りです。SSMセッションマネージャーでEC2インスタンスに接続するために、com.amazonaws.us-east-1.ssmなども作成しています。

VPCエンドポイントの一覧

Route 53 Private Hosted Zoneの作成とDNSレコードの追加

次にRoute 53 Private Hosted Zoneの作成とDNSレコードの追加を行います。

作成するRoute 53 Private Hosted Zoneのゾーン名はaws.amazon.comです。

Private Hosted Zoneの作成

Route 53 Private Hosted Zone作成後、VPCエンドポイントのALIASレコードを作成します。

Route 53 Private Hosted Zoneのレコードセット

EC2インスタンスからマネジメントコンソールにアクセス

それでは、EC2インスタンスからマネジメントコンソールにアクセスできることを確認します。

以下コマンドでSSMセッションマネージャーでポートフォワーディングをしてから、RDP接続をします。

> aws ssm start-session \
    --target  i-0b07711c4eb23a277  \
    --document-name AWS-StartPortForwardingSession \
    --parameters '{"portNumber":["3389"],"localPortNumber":["13389"]}'

RDP接続後、マネジメントコンソールにサインインする際のFQDNを名前解決します。

> nslookup signin.aws.amazon.com
Server:  ip-10-0-0-2.ec2.internal
Address:  10.0.0.2

Non-authoritative answer:
Name:    signin.aws.amazon.com
Address:  10.0.0.202

プライベートIPアドレスが返って来ましたね。

それでは、ブラウザ(Microsoft Edge)からhttps[:]//signin.aws.amazon.com/console/にアクセスします。

ユーザー名の入力

はい、アクセスできました。

ユーザー名を入力してSighn inをクリックします。

MFAの入力もできる

するとMFAの入力画面に遷移しました。

MFAのコードを入力してSubmitをクリックします。

Unable to load content

はい、Unable to load contentと表示され、マネジメントコンソールのホームにアクセスすることはできませんでした。

開発者ツールを眺めるとamazonaws.comというPrivate Hosted Zoneで設定していないドメインのJavaScriptファイルをリクエストして失敗していました。

その他にもリクエストに失敗しているものがあるので眺めてみましょう。

その時のURL

awsstatic.coma2z.comなどのドメインに対してもリクエストを投げて失敗していますね。

こちらのドメインに対応するVPCエンドポイントは存在しないため、やはりインターネットを抜けず閉域網からマネジメントコンソールにアクセスすることはできないようです。

インターネットへのアクセス経路を追加して再チャレンジ

インターネットへのアクセスは必ず必要とのことがわかったので、インターネットへのアクセス経路を追加して再チャレンジします。

検証環境は以下の通りです。

AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになりました検証環境構成図2

この構成に変更してからブラウザをリロードすると、マネジメントコンソールのホームを表示することができました。

マネジメントコンソールにアクセスできること

一部のサービスは、AWSマネジメントコンソールのプライベートアクセスでは使用できません。と表示されているため、VPCエンドポイント経由でアクセスできていることが分かりますね。

また、どのVPCエンドポイント、VPCを経由しているかはリージョン名の横のアイコンから確認できます。

VPCエンドポイントとVPCの確認

それでは、色々試してみましょう。

まず、別リージョン(us-east-2)にアクセスしてみます。

別リージョンにはアクセスできない

はい、アクセスできませんでした。これは対応するVPCエンドポイントを作成していないためです。

次にVPCのコンソールを開いてみます。

VPCのコンソールにアクセスできる

こちらはアクセスできましたね。

なお、ダークモードにしたタイミングで気づいたのですがマネジメントコンソールのプライベートアクセスに対応していないサービスのコンソールに遷移することはできないようです。

対応していないサービスにはアクセスできないようになっている

サービスを検索すると、より分かりやすくこのサービスは AWS マネジメントコンソールのプライベートアクセスでは利用できませんと表記されています。

このサービスは AWS マネジメントコンソールのプライベートアクセスでは利用できません

次に、S3のコンソールにアクセスしてみます。

S3のコンソールにはアクセスできない

S3のコンソールのFQDNは一般的なコンソールのFQDNregion.console.aws.amazon.comと異なり、s3.console.aws.amazon.comであるためアクセスできませんでした。

S3のコンソールにアクセスしたい場合は、s3.console.aws.amazon.comにアクセスした際にcom.amazonaws.region.consoleのIPアドレスを返すようにDNSレコードを設定しましょう。

VPCエンドポイントを使ったアカウントの制限

次に、VPCエンドポイントによるアカウントの制限を行います。

AWS公式ドキュメントに例があったので、こちらを参考に設定します。

com.amazonaws.us-east-1.signinのVPCエンドポイントのポリシーを以下のように変更します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalAccount": [
            "<AWSアカウント>"
          ]
        }
      }
    }
  ]
}

aws:PrincipalAccountで定義していないAWSアカウントにサインインしようとするとYour account doesn't have permission to use AWS Management Console Private Accessと怒られました。

Your account doesn't have permission to use AWS Management Console Private Access

しっかり効果を発揮できていますね。

次にcom.amazonaws.us-east-1.signinのVPCエンドポイントのポリシーをフルアクセスにして、com.amazonaws.us-east-1.consoleのVPCエンドポイントポリシーを以下のように変更します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:PrincipalAccount": [
            "<AWSアカウント>"
          ]
        }
      }
    }
  ]
}

こちらはaws:PrincipalAccountで定義していないAWSアカウントにサインイン状態で設定しました。

ブラウザをリロードすると、カスタムレイアウトをロードできませんでしたと表示されるようになりました。

カスタムレイアウトをロードできませんでした

サービスのコンソールにアクセスすると、Access Deniedと表示されるようになりました。

Access Denied

ただし、キャッシュが効いているのか今までアクセスしていたコンソールには継続してアクセスできます。

サインインした状態でconsoleのエンドポイントポリシーを変更しても継続してアクセスできる

一度サインアウトして、再度サインインしようとするとAccess Deniedと表示されるようになりました。

VPCエンドポイントポリシーでマネジメントコンソールからサインインできるアカウントを制御できるぞ

AWSマネジメントコンソールにVPCエンドポイント経由でアクセスできるようになったアップデートを紹介しました。

VPCエンドポイントポリシーを活用することで、マネジメントコンソールからサインインできるアカウントを制御できますね。

実際に導入する場合は、以下のようにaws.amazon.comのPrivate Hosted Zoneを関連付けたVPC上のRoute 53 Resolver Inbound Endpointに対してaws.amazon.comの条件付きフォワーダーを設定することになるのかなと思います。

vpce-architectures-4

抜粋 : Reference architecture - AWS Management Console

実際に触ってみたい方は、EC2インスタンスやWorkSpacesを使ったテスト環境のCloudFormationテンプレートがあるので、そちらを参照すると良いかと思います。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!