Подключение сети к её пользователям

AWSBeginner
Практиковаться сейчас

Введение

Приложение может иметь работающий экземпляр и публичный адрес, но оставаться недоступным. Вы определите недостающий маршрут и узко ограниченное правило группы безопасности с помощью Terraform, а затем проверите как разрешённые, так и заблокированные подключения.

Вы должны понимать ссылки на ресурсы Terraform, VPC, подсети, интернет-маршруты и группы безопасности. Эта независимая среда предоставляет целевой сервер приложения, отдельное работающее эталонное приложение и подготовленные входные значения Terraform. Вы будете управлять только новыми ресурсами подключения.

Связь с сертификацией

Сертификация Задача экзамена Практика
Solutions Architect – Associate (SAA-C03) Задача 1.2 Подключение подсети VPC через интернет-шлюз и ограничение сетевого доступа к приложению по источнику и порту.

Обзор лабораторной работы

Обзор концепции: авторизованный клиент достигает подсети приложения через её интернет-шлюз и маршрут по умолчанию, а группа безопасности ограничивает доступ к порту приложения.

Создание маршрута в интернет

На этом шаге вы подключите интернет-шлюз к VPC приложения и явно свяжете таблицу маршрутизации с его подсетью.

Откройте Terminal и AWS View. Сеть приложения и эталонная сеть независимы. У application-server уже есть публичный адрес, потому что его подсеть назначает публичные IP при запуске. Сам по себе публичный адрес не создаёт маршрут в интернет или разрешение на входящий доступ.

В AWS View выберите application-server, User · 198.51.100.10 и Application · 8081, затем нажмите Send request. Ожидайте Blocked. Выберите reference-server с тем же клиентом и портом приложения, отправьте ещё один запрос и убедитесь, что эталонное приложение отвечает. Сохраняйте работоспособность этого эталонного приложения на протяжении всей лабораторной работы.

Перейдите в подготовленный рабочий каталог:

cd /home/labex/project/application-access

Предоставленный terraform.tfvars.json содержит идентификаторы VPC, подсети и группы безопасности этой новой среды. Terraform автоматически загружает эти входные значения. Прочитайте их перед использованием соответствующих переменных:

cat terraform.tfvars.json

Подготовленная конфигурация провайдера выбирает среду курса. Не нужно копировать идентификаторы из предыдущей VM или вводить личные учётные данные. Сохраните и выведите идентификатор предоставленного целевого экземпляра для последующей проверки. $(...) захватывает вывод команды, а --output text возвращает идентификатор обычным текстом.

TARGET_ID=$(aws ec2 \
  describe-instances \
  --filters Name=tag:Name,Values=application-server Name=instance-state-name,Values=running \
  --query 'Reservations[0].Instances[0].InstanceId' \
  --output text)
echo "$TARGET_ID"

Интернет-шлюз подключается к VPC. Таблица маршрутизации отправляет трафик к заданному назначению через соответствующий шлюз, а связь с подсетью определяет, какая таблица управляет подсетью. Без явной связи подсеть использует главную таблицу маршрутизации своей VPC. Оставьте эту предоставленную главную таблицу без изменений. Назначение 0.0.0.0/0 соответствует IPv4-адресам, для которых нет более конкретного маршрута; оно не даёт разрешения на прохождение через группу безопасности.

Создайте routing.tf. Heredoc с разделителем в кавычках записывает HCL буквально. Ссылки на ресурсы связывают маршрут с его таблицей и шлюзом, а связь подсети — с той же таблицей.

cat > routing.tf <<'HCL'
resource "aws_internet_gateway" "application" {
  vpc_id = var.vpc_id
}

resource "aws_route_table" "application" {
  vpc_id = var.vpc_id
}

resource "aws_route" "internet" {
  route_table_id         = aws_route_table.application.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.application.id
}

resource "aws_route_table_association" "application" {
  subnet_id      = var.subnet_id
  route_table_id = aws_route_table.application.id
}

output "route_table_id" {
  value = aws_route_table.application.id
}

output "subnet_id" {
  value = var.subnet_id
}
HCL

Инициализируйте, отформатируйте и проверьте конфигурацию:

terraform init
terraform fmt
terraform validate

Если init выводит Incomplete lock file information for providers, речь идёт о контрольных суммах для других платформ. Эта подготовленная VM использует linux_amd64; продолжайте после успешного завершения инициализации и валидации.

Изучите четыре добавления: шлюз, таблицу, маршрут и связь с подсетью. Предоставленный экземпляр и эталонная сеть не должны появляться среди ресурсов для замены или удаления.

terraform plan

Примените изменения и введите yes в ответ на запрос:

terraform apply

Сохраните и выведите идентификатор новой таблицы и идентификатор предоставленной подсети:

TABLE_ID=$(terraform output -raw route_table_id)
echo "$TABLE_ID"
SUBNET_ID=$(terraform output -raw subnet_id)
echo "$SUBNET_ID"

Независимо запросите таблицу маршрутизации. Найдите назначение по умолчанию, шлюз igw-... и связь с идентификатором вашей подсети. Локальный маршрут VPC также сохраняется.

aws ec2 \
  describe-route-tables \
  --route-table-ids "$TABLE_ID" \
  --query 'RouteTables[].{Routes:Routes[].{Destination:DestinationCidrBlock,Gateway:GatewayId},Subnets:Associations[].SubnetId}'

Подтвердите назначение публичных адресов в предоставленной подсети:

aws ec2 \
  describe-subnets \
  --subnet-ids "$SUBNET_ID" \
  --query 'Subnets[].{CIDR:CidrBlock,PublicIPOnLaunch:MapPublicIpOnLaunch}'

PublicIPOnLaunch имеет значение true. Эта настройка управляет вновь запускаемыми экземплярами; её изменение не назначает адрес уже существующему экземпляру задним числом. Теперь AWS View показывает фактический шлюз и действующую таблицу маршрутизации. Снова отправьте запрос User/8081 к приложению: он по-прежнему даёт Blocked, потому что ни одно входящее правило пока его не разрешает.

Разрешение доступа нужному клиенту и проверка границ

На этом шаге вы разрешите клиенту User обращаться к порту приложения и убедитесь, что другой клиент и другой порт остаются заблокированными.

Группа безопасности — сетевая граница с отслеживанием состояния, прикреплённая к сетевому интерфейсу экземпляра. Маршрутизация делает путь доступным; группа по-прежнему определяет, какие входящие подключения разрешены. У предоставленной группы приложения сейчас нет входящих правил.

Создайте один отдельный ресурс входящего правила для этой группы. cidr_ipv4 = "198.51.100.10/32" выбирает единственный IPv4-адрес клиента User. Оба значения порта, равные 8081, разрешают доступ только к слушающему порту приложения. Эталонное приложение использует собственную группу безопасности.

cat > access.tf <<'HCL'
resource "aws_vpc_security_group_ingress_rule" "application" {
  security_group_id = var.security_group_id
  ip_protocol       = "tcp"
  from_port         = 8081
  to_port           = 8081
  cidr_ipv4         = "198.51.100.10/32"
}

output "security_group_id" {
  value = var.security_group_id
}
HCL

Отформатируйте и проверьте конфигурацию, затем изучите план. Должно быть одно добавление входящего правила без замены экземпляра.

terraform fmt
terraform validate
terraform plan

Примените правило и подтвердите, введя yes:

terraform apply

Сохраните и выведите идентификатор существующей группы, затем прочитайте её фактическое разрешение на входящий доступ:

GROUP_ID=$(terraform output -raw security_group_id)
echo "$GROUP_ID"
aws ec2 \
  describe-security-groups \
  --group-ids "$GROUP_ID" \
  --query 'SecurityGroups[].{Group:GroupId,Ingress:IpPermissions}'

Разрешение должно описывать TCP-порт 8081 для источника 198.51.100.10/32. Подтвердите согласованность конфигурации и ресурсов Terraform:

terraform plan

Ожидайте No changes. Теперь выполните все три проверки в AWS View, каждый раз выбирая application-server:

Выберите User · 198.51.100.10 и Application · 8081. Нажмите Send request. Ожидайте Connected · 200 и сообщение Application network connected.

Состояние работающей среды: фактическая целевая сеть, выбранный источник и порт приложения дают успешный ответ. Идентификаторы ресурсов приведены как примеры. Измените источник на Unrelated · 198.51.100.20, оставьте порт 8081 и отправьте ещё один запрос. Ожидайте Blocked. Вернитесь к источнику User, выберите SSH · 22 и отправьте ещё один запрос. Ожидайте Blocked. Успешный запрос к приложению не разрешает доступ к отдельному слушающему порту SSH гостевой системы.

Результат указывает фактический источник, целевой экземпляр и порт. Request service unavailable — ошибка среды, а не доказательство ожидаемой блокировки сетью. Не расширяйте правило до 0.0.0.0/0: это откроет тот же слушающий порт приложения постороннему клиенту.

В документации провайдера AWS по входящим правилам описаны поля ресурса. Данные CLI, сопоставление Terraform и результаты фактических запросов должны согласовываться.

Удаление ресурсов подключения с сохранением приложений

На этом шаге вы удалите только ресурсы подключения под управлением Terraform и подтвердите, что предоставленные приложения остались нетронутыми.

Этот рабочий каталог управляет пятью ресурсами: интернет-шлюзом, таблицей маршрутизации, маршрутом по умолчанию, связью с подсетью и входящим правилом. VPC, подсеть, главная таблица маршрутизации, целевой экземпляр и эталонное приложение предоставлены независимо. Они находятся вне этого состояния и должны сохраниться.

Изучите план удаления:

terraform plan -destroy

Ожидайте удаление пяти ресурсов. Затем выполните удаление и введите yes:

terraform destroy

Убедитесь, что в состоянии нет адресов управляемых ресурсов:

terraform state list

Предоставленный целевой экземпляр должен по-прежнему работать с тем же идентификатором:

aws ec2 \
  describe-instances \
  --instance-ids "$TARGET_ID" \
  --query 'Reservations[].Instances[].{ID:InstanceId,State:State.Name,Subnet:SubnetId}'

В AWS View снова отправьте целевому экземпляру запрос User/8081. Он должен дать Blocked, потому что вы удалили ресурсы его подключения. Затем выберите reference-server, User и порт 8081 и отправьте запрос. Эталонное приложение по-прежнему должно возвращать Connected · 200 и Reference application.

Ваши файлы HCL остаются доступными для изучения. Последующий обычный план предложил бы повторно создать удалённые ресурсы; сохранение этой конфигурации после terraform destroy — нормальное поведение.

Резюме

Вы использовали ссылки Terraform, чтобы подключить интернет-шлюз, определить маршрут по умолчанию и связать таблицу маршрутизации с подсетью приложения. Затем вы добавили одно ограниченное входящее правило, проверили фактические границы по источнику и порту, подтвердили согласованность и удалили только свои ресурсы подключения, сохранив предоставленные приложения.