コンテンツにスキップ

virtual_secure_room_proxy pattern

概要

virtual_secure_room_proxy patternモジュールは、VPC内から外部へのアクセスに制限をかけるProxyを作成します。
本patternで作成されるProxyは本番環境からの情報漏洩防止を目的としており、仮想セキュアルーム内で利用することを想定しています。
仮想セキュアルームについては以下のガイドをご参照ください。

運用想定図

想定する適用対象環境

virtual_secure_room_proxy patternは、Runtime環境で使用されることを想定しています。

依存するpattern

virtual_secure_room_proxy patternは、事前に以下のpatternが適用されていることを前提としています。

pattern名 利用する情報
network pattern プライベートサブネット
ci_pipeline pattern Dockerコンテナレジストリ(Amazon ECR)

⚠️
本patern実行前に、ci_pipeline patternで作成されたECRにProxy用のコンテナイメージをPushしておく必要があります。
コンテナイメージの存在しない状態で本patternを適用すると、コンテナのデプロイと失敗を延々と繰り返す影響により意図しない課金を発生させる可能性があります。

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
AWS Fargate アプリケーションコンテナを動作させるサービスを構築します
Service Discovery コンテナへのエンドポイントを提供するRoute 53の機能を構築します

モジュールの理解に向けて

  • 本patternで作成されるProxyは、Amazon ECS(以下、ECSとする)を利用してコンテナでデプロイしています
  • Proxyのコンテナイメージを配置するコンテナレジストリには、Delivery環境にci_pipeline patternで作成したECRを使うことを想定しています
  • コンテナへのアクセスはLBやDNSを利用したユニークな名前を使用することが一般的であり、本patternではECSの機能であるService Discoveryを利用しています

リソース構成図

コンテナイメージのビルドについて

Eponaでは許可リスト形式でアクセス許可を行うことを想定しており、このための設定を適用してある コンテナイメージ を提供しています。
ただし、アクセスを許可したいドメインはユーザーや環境ごとに異なるため、基本的にはユーザー側でコンテナイメージをビルドする必要があります。
以下の例を参考に、Eponaで用意しているコンテナイメージに許可リスト(allowlist)を埋め込んだコンテナイメージをビルドしてください。

ℹ️
コンテナイメージのビルド方法については、Dockerの公式ページ等をご参照ください。

allowlist(※アクセスを許可したいドメインを羅列して記載)

⚠️
デフォルト設定として、AWS Management Consoleへのサインインに必須である以下のリストを記載しています。
ただし、AWSの利用に必要なドメイン情報は公式から公開されていないため、独自に検証して確認したリストになります。

.aws.amazon.com
.cloudfront.net
.aws.a2z.com
.amazonaws.com
.media-amazon.com
.awsstatic.com

Dockerfile

# Eponaで提供しているProxyのコンテナイメージをFROMに指定
FROM registry.gitlab.com/eponas/epona/proxy:v1.0.0
COPY ./allowlist /etc/squid/allowlist

なお、Eponaで提供しているコンテナイメージの 構成ファイルはこちらに置いてあります。 詳細を確認したい場合や、ユーザー側で自由にカスタマイズしたイメージを作成したい場合等にご参照ください。

⚠️
Proxyのデフォルト設定では、 RFC 1918に沿ったCIDRのプライベートアドレスからのみ Proxyを使用できるようになっています。
そのため、仮想セキュアルームを配置するPrivate Subnetに上記CIDR以外のCIDRを設定する場合は 設定ファイル(squid.conf)変更とコンテナイメージビルドが必要になります。

コンテナイメージのPushとコンテナデプロイについて

手動で行う方法

本patternでは、コンテナイメージのPushやコンテナイメージ変更によるコンテナの再デプロイは手動で行うことを想定しています。 具体的には、ECRにアクセス可能な環境からコンテナイメージをタグ付きでPushし、 その後に本patternのproxy_image_tag変数を書き換えてApplyすることで行います。
Applyが成功するとproxy_image_tagで指定したタグのコンテナイメージからコンテナのデプロイが行われ、自動的にアップデートされます。
なお、なんらかの理由で新しいコンテナイメージからコンテナのデプロイに失敗した場合、デプロイ処理が延々と行われてしまいます。
この状態を長期間続かせてしまうと意図しない課金を発生させる可能性がありますので、 デプロイ後は必ずクラスターのタスクがRUNNING状態になっているか確認することを推奨します。

コンテナイメージbuildとPushのコマンド例
AWS_DEFAULT_REGION=<リージョン名>
REPOSITORY_URL=<リポジトリURL>
IMAGE_TAG=<リポジトリに配置するイメージに付けるタグ>
# コンテナイメージにタグを付与してビルド
docker build . --tag ${REPOSITORY_URL}:${IMAGE_TAG}
# コンテナレジストリへログイン
aws ecr get-login-password --region ${AWS_DEFAULT_REGION} | docker login --username AWS --password-stdin ${REPOSITORY_URL}
# ECRへコンテナイメージをPush
docker push ${REPOSITORY_URL}

ℹ️
ECRのリポジトリURLは、ci_pipeline pattern実行後に以下の名前で出力されます。
container_image_repository_urls[リポジトリ名]

GitLab CI/CDを利用する方法

GitLab CI/CDによるアプリケーションのビルド・デプロイガイドをご確認ください。

Service Discoveryを利用したコンテナへのアクセスについて

通常コンテナはデプロイするたびにIPが変更されるため、クラスター外からコンテナへアクセスする際は都度IPを設定し直す必要が出てきてしまいます。
この問題に対し、本patternではService Discoveryを利用する解決策を採用しています。 Service Discoveryについては以下の記事をご参照ください。
Amazon ECS サービスディスカバリ

⚠️
仮想セキュアルームはMicrosoft ADを利用しています。 ただし、当該ADのDNSサーバーはVPC-provided DNSへ自動的にリクエストをフォワードしません。
このためService Discoveryを利用する際は、Microsoft ADのDNSサーバーへDNSフォワーダー設定が必要になります。 詳細や手順についてはこちらをご参照ください。

Proxyの設定方法について

Terraform適用後に出力されるProxyのエンドポイント(internal_container_endpoint)を WorkSpacesごとに手動で設定します。
設定方法は通常のWindowsでのProxy設定と同様なため、以下ページなどをご参照ください。

Internet Explorer と共にプロキシサーバーを使用する

⚠️
現時点では特にProxy利用必須とする仕組みの検討をしていないため、Proxyを設定しなくてもWorkSpacesの利用が可能になっています。
ただし、本番運用中の環境でProxyを利用せずにWorkSpacesを利用することはセキュリティの観点から非推奨な利用方法となります。
やむを得ず利用する場合は、リスクを理解した上でご利用ください。

サンプルコード

virtual_secure_room_proxy patternを使用したサンプルコードを、以下に記載します。

locals {
  # ci_pipeline patternで作成された
  ecr_repository = "[ecr-repository-url]
}

module "virtual_secure_room_proxy" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/virtual_secure_room_proxy?ref=v0.2.6"

  name_prefix       = "test"
  vpc_id            = data.terraform_remote_state.network.outputs.network.vpc_id
  container_subnets = data.terraform_remote_state.network.outputs.network.private_subnets

  service_discovery_namespace_name = "epona.internal"
  service_discovery_service_name   = "proxy"

  # FIXME: repository_urlには、Proxy用のコンテナイメージをPushした`ci_pipeline pattern`で作成されたECRのurlを指定
  repository_url        = "xxxxxxxxxxxxxxxx..dkr.ecr.ap-northeast-1.amazonaws.com/epona-internal-proxy"
  proxy_image_tag       = "v1.0"
  container_task_cpu    = "256"
  container_task_memory = "512"

  default_ecs_task_execution_iam_policy_name = "DefaultContainerServiceTaskExecution"
  default_ecs_task_execution_iam_role_name   = "DefaultContainerServiceTaskExecutionRole"

  tags = {
    Owner              = "john"
    Environment        = "runtime"
    RuntimeEnvironment = "development"
    ManagedBy          = "epona"
  }
}

作成されるリソース構成

関連するpattern

virtual_secure_room_proxy patternに関連するpatternを、以下に記載します。

pattern名 説明
virtual_secure_room_directory_service pattern WorkSpacesに接続するユーザーおよびパスワードを管理するDirectoryService
virtual_secure_room_workspaces Workspacesをデプロイするパターン

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
container_subnets コンテナサービスを配置する、サブネットIDのリスト list(string) n/a yes
name_prefix 作成するリソース名に付与する接頭辞 string n/a yes
repository_url ECSでデプロイするProxyコンテナイメージのリポジトリURL string n/a yes
service_discovery_namespace_name Service DiscoveryのNamespaceの名前(ドメイン名になる) string n/a yes
vpc_id VPC ID string n/a yes
container_service_desired_count コンテナサービス内の、タスクのインスタンス数 number 1 no
container_service_platform_version コンテナサービスを実行するプラットフォームのバージョン string "LATEST" no
container_task_cpu コンテナサービス内で実行されるタスクに割り当てるCPU string "256" no
container_task_execution_role_arn コンテナサービスのタスクに割り当てるタスク実行IAMロールのARN。create_default_ecs_task_execution_roleをfalseにする場合に指定すること string null no
container_task_memory コンテナサービス内で実行されるタスクに割り当てるメモリ string "512" no
create_default_ecs_task_execution_role デフォルトのタスク実行ロールを作成する場合、trueを指定する bool true no
default_ecs_task_execution_iam_policy_name デフォルトのタスク実行ロールを作成する場合のIAMポリシー名 string "DefaultContainerServiceTaskExecutionRolePolicy" no
default_ecs_task_execution_iam_role_name デフォルトのタスク実行ロールを作成する場合のIAMロール名 string "DefaultContainerServiceTaskExecutionRole" no
proxy_image_tag ECSでデプロイするProxyコンテナイメージに付けたタグ string "latest" no
service_discovery_service_name Service DiscoveryのNamespaceに作成するサービス名(サブドメイン名になる) string "proxy" no
tags このモジュールで作成されるリソースに付与するタグ map(string) {} no

Outputs

Name Description
internal_container_endpoint Proxyコンテナのエンドポイント

※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.