Настройка групп безопасности
Для групп безопасности действует принцип «весь трафик, который не разрешен, запрещен». Чтобы кластер работал:
-
Создайте правила в его группах безопасности, разрешающие нужный трафик для узлов кластера:
-
Служебный трафик внутри кластера.
Эти правила разрешают внутрикластерную коммуникацию и подключение к кластеру через API Kubernetes.
Совет
Поместите каждый из этих наборов правил в отдельную группу безопасности.
Тогда будет удобно применять эти группы безопасности к кластеру и его группам узлов.
-
-
(Опционально) Если вы планируете использовать L7-балансировщик Yandex Application Load Balancer вместе с кластером, то добавьте правила для балансировщика.
-
Примените группы безопасности с этими правилами к кластеру и группам узлов.
Вы можете задать более детальные правила для групп безопасности, например, разрешающие трафик только в определенных подсетях.
Важно
Для работы некоторых продуктов требуются дополнительные правила в группах безопасности. Подробности приведены в документации соответствующих продуктов.
Группы безопасности должны быть корректно настроены для всех подсетей, в которых будет размещен кластер. От этого зависит работоспособность и доступность кластера и запущенных в нем сервисов.
Перед изменением списка групп безопасности или настроек входящих в них правил убедитесь, что это не нарушит работу кластера и его групп узлов.
Внимание
Не удаляйте группы безопасности, привязанные к работающему кластеру или группе узлов. Это может привести к запрету прохождения сетевого трафика и нарушить работу кластера и его узлов.
Создать правила для служебного трафика
Важно
Настройка правил для служебного трафика — обязательное условие для работоспособности высокодоступного кластера.
Разрешить трафик для кластера и групп узлов
Чтобы кластер работал корректно, создайте правила для входящего и исходящего трафика, и примените их к кластеру и группам узлов:
-
Добавьте правила для входящего трафика, которые разрешают:
- Выполнять проверки состояния сетевого балансировщика нагрузки:
- Диапазон портов —
0-65535. - Протокол —
TCP. - Источник —
Проверки состояния балансировщика.
- Диапазон портов —
- Передавать служебный трафик между мастером и узлами:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Источник —
Группа безопасности. - Группа безопасности —
Текущая(Self).
- Диапазон портов —
- Проверять работоспособность узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud:
- Протокол —
ICMP. - Источник —
CIDR. - CIDR блоки — диапазоны адресов подсетей внутри Yandex Cloud, из которых будет осуществляться проверка работоспособности, например:
10.0.0.0/8.192.168.0.0/16.172.16.0.0/12.
- Протокол —
- Выполнять проверки состояния сетевого балансировщика нагрузки:
-
Добавьте правило для исходящего служебного трафика между мастером и узлами:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Назначение —
Группа безопасности. - Группа безопасности —
Текущая(Self).
- Диапазон портов —
Примечание
Если вы используете высокодоступный тип мастера, разрешите трафик для групп узлов до CIDR подсетей, в которых расположены хосты мастера, или до CIDR кластера. Это нужно для передачи служебного трафика между мастером и узлами.
Разрешить трафик для групп узлов
Чтобы группы узлов работали корректно, создайте правила для входящего и исходящего трафика, и примените их к группам узлов:
-
Добавьте правило для входящего трафика, которое разрешает передачу трафика между подами и сервисами:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Источник —
CIDR. - CIDR блоки — CIDR кластера и CIDR сервисов. Например,
10.96.0.0/16и10.112.0.0/16.
- Диапазон портов —
-
Добавьте правило для исходящего трафика, которое разрешает узлам в группе узлов подключаться к внешним ресурсам, например, чтобы скачивать образы с Docker Hub или работать с Yandex Object Storage:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Назначение —
CIDR. - CIDR блоки —
0.0.0.0/0.
Примечание
Если вы используете высокодоступный тип мастера и не хотите разрешать узлам подключаться к любым адресам (CIDR —
0.0.0.0/0), разрешите исходящий трафик до CIDR подсетей, в которых расположены хосты мастера, или до CIDR кластера. Это нужно, чтобы у узлов был доступ к мастеру.Примеры
-
Доступ к CIDR кластера:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Назначение —
CIDR. - CIDR блоки —
10.131.0.32/32.
- Диапазон портов —
-
Доступ к CIDR подсетей с хостами мастера:
- Диапазон портов —
0-65535. - Протокол —
Любой(Any). - Назначение —
CIDR. - CIDR блоки —
10.128.0.0/24,10.129.0.0/24,10.131.0.0/24.
- Диапазон портов —
- Диапазон портов —
Разрешить трафик для кластера
Чтобы кластер работал корректно и к нему можно было подключиться, создайте правила для входящего и исходящего трафика и примените их к кластеру:
-
Добавьте правила для входящего трафика, которые разрешают подключение к мастеру через порты
6443и443. Это позволит получить доступ к API Kubernetes и управлять кластером с помощьюkubectlи других утилит.Создайте два правила для входящего трафика, по одному для каждого порта:
- Диапазон портов —
443,6443. - Протокол —
TCP. - Источник —
CIDR. - CIDR блоки — укажите диапазон адресов подсетей, из которых будете управлять кластером, например:
85.23.23.22/32— для внешней сети.192.168.0.0/24— для внутренней сети.
- Диапазон портов —
-
Добавьте правила для исходящего трафика, которые разрешают:
-
Передачу трафика между мастером и подами
metric-server:- Диапазон портов —
4443. - Протокол —
TCP. - Назначение —
CIDR. - CIDR блоки — укажите CIDR кластера, например
10.96.0.0/16.
- Диапазон портов —
-
Подключение мастера к NTP-серверам для синхронизации времени:
- Диапазон портов —
123. - Протокол —
UDP. - Назначение —
CIDR. - CIDR блоки —
0.0.0.0/0.
- Диапазон портов —
-
Создать правило для подключения к сервисам из интернета
Чтобы запущенные на узлах сервисы были доступны из интернета и подсетей внутри Yandex Cloud, создайте правило для входящего трафика, и примените его к группе узлов:
- Диапазон портов —
30000-32767. - Протокол —
TCP. - Источник —
CIDR. - CIDR блоки —
0.0.0.0/0.
Создать правило для подключения к узлам по SSH
Чтобы получить доступ к узлам по протоколу SSH, создайте правило для входящего трафика и примените его к группе узлов:
- Диапазон портов —
22. - Протокол —
TCP. - Источник —
CIDR. - CIDR блоки — диапазоны адресов подсетей внутри Yandex Cloud, а также публичные IP-адреса компьютеров в интернете, например:
10.0.0.0/8.192.168.0.0/16.172.16.0.0/12.85.32.32.22/32.
Применить группы безопасности с правилами
В зависимости от правил, которые содержатся в группах безопасности, эти группы должны быть назначены кластеру или группе узлов:
| Группа безопасности | Объект, на который нужно назначить группу |
|---|---|
| Группа, разрешающая трафик для кластера и групп узлов | Кластер и группа узлов |
| Группа, разрешающая трафик для групп узлов | Группа узлов |
| Группа, разрешающая трафик для кластера | Кластер |
| Группа, разрешающая подключение к сервисам из интернета | Группа узлов |
| Группа, разрешающая подключение к узлам по SSH | Группа узлов |
Примеры правил
Группы безопасности для кластера Managed Service for Kubernetes
Пусть планируется создать кластер Kubernetes, в котором:
-
Используется следующая конфигурация:
- Высокодоступный мастер, размещенный в зонах доступности
ru-central1-a,ru-central1-bиru-central1-d. - Группа узлов
worker-nodes-a, размещенная в зоне доступностиru-central1-a. - CIDR кластера —
10.96.0.0/16, CIDR сервисов —10.112.0.0/16.
- Высокодоступный мастер, размещенный в зонах доступности
-
Применяются следующие политики по обмену трафиком:
-
Проверка работоспособности узлов с помощью ICMP-запросов разрешена из следующих подсетей внутри Yandex Cloud:
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16.
-
Подключение к сервисам из интернета разрешено с любых адресов —
0.0.0.0/0. -
Подключение к узлам по SSH разрешено только с одного адреса —
85.32.32.22/32. -
Доступ к API Kubernetes разрешен из одной подсети —
203.0.113.0/24.
-
Чтобы создать такой кластер:
-
Создайте группу безопасности
k8s-cluster-nodegroup-traffic, разрешающую трафик для кластера и групп узлов:yc vpc security-group create \ --name k8s-cluster-nodegroup-traffic \ --network-id <идентификатор_облачной_сети> \ --rule "description=healthchecks,direction=ingress,protocol=tcp,from-port=0,to-port=65535,predefined=loadbalancer_healthchecks" \ --rule "description=master-nodes,direction=ingress,protocol=any,from-port=0,to-port=65535,predefined=self_security_group" \ --rule "description=icmp,direction=ingress,protocol=icmp,v4-cidrs=[10.0.0.0/8,172.16.0.0/12,192.168.0.0/16]" \ --rule "description=master-nodes-outgoing,direction=egress,protocol=any,from-port=0,to-port=65535,predefined=self_security_group" -
Создайте группу безопасности
k8s-nodegroup-traffic, разрешающую трафик для групп узлов:yc vpc security-group create \ --name k8s-nodegroup-traffic \ --network-id <идентификатор_облачной_сети> \ --rule "description=pods-services,direction=ingress,protocol=any,from-port=0,to-port=65535,v4-cidrs=[10.96.0.0/16,10.112.0.0/16]" \ --rule "description=nodes-external-resources,direction=egress,protocol=any,from-port=0,to-port=65535,v4-cidrs=[0.0.0.0/0]" -
Создайте группу безопасности
k8s-cluster-traffic, разрешающую трафик для кластера:yc vpc security-group create \ --name k8s-cluster-traffic \ --network-id <идентификатор_облачной_сети> \ --rule "description=api-443,direction=ingress,protocol=tcp,port=443,v4-cidrs=[203.0.113.0/24]" \ --rule "description=api-6443,direction=ingress,protocol=tcp,port=6443,v4-cidrs=[203.0.113.0/24]" \ --rule "description=metric-server,direction=egress,protocol=tcp,port=4443,v4-cidrs=[10.96.0.0/16]" \ --rule "description=ntp-server,direction=egress,protocol=udp,port=123,v4-cidrs=[0.0.0.0/0]" -
Создайте группу безопасности
k8s-services-access, разрешающую подключение к сервисам из интернета:yc vpc security-group create \ --name k8s-services-access \ --network-id <идентификатор_облачной_сети> \ --rule "description=services-incoming,direction=ingress,protocol=tcp,from-port=30000,to-port=32767,v4-cidrs=[0.0.0.0/0]" -
Создайте группу безопасности
k8s-ssh-access, разрешающую подключение к узлам по SSH:yc vpc security-group create \ --name k8s-ssh-access \ --network-id <идентификатор_облачной_сети> \ --rule "description=ssh-access,direction=ingress,protocol=tcp,port=22,v4-cidrs=[85.32.32.22/32]" -
Создайте кластер и назначьте ему группы безопасности
k8s-cluster-nodegroup-traffic,k8s-cluster-traffic:yc managed-kubernetes cluster create \ --name k8s-cluster \ --network-id <идентификатор_облачной_сети> \ --service-account-id <идентификатор_сервисного_аккаунта_для_кластера> \ --node-service-account-id <идентификатор_сервисного_аккаунта_для_группы_узлов> \ --cluster-ipv4-range 10.96.0.0/16 \ --service-ipv4-range 10.112.0.0/16 \ --public-ip \ --master-location zone=ru-central1-a,subnet-id=<идентификатор_облачной_подсети_в_зоне_ru-central1-a> \ --master-location zone=ru-central1-b,subnet-id=<идентификатор_облачной_подсети_в_зоне_ru-central1-b> \ --master-location zone=ru-central1-d,subnet-id=<идентификатор_облачной_подсети_в_зоне_ru-central1-d> \ --security-group-ids <идентификатор_k8s-cluster-nodegroup-traffic>,<идентификатор_k8s-cluster-traffic>Идентификатор группы безопасности можно получить вместе с информацией о ней.
-
Создайте группу узлов и назначьте ей группы безопасности
k8s-cluster-nodegroup-traffic,k8s-nodegroup-traffic,k8s-services-access,k8s-ssh-access:yc managed-kubernetes node-group create \ --name worker-nodes-a \ --cluster-id <идентификатор_кластера> \ --location zone=ru-central1-a \ --fixed-size 1 \ --network-interface subnets=<идентификатор_подсети_в_зоне_ru-central1-a>,ipv4-address=nat,security-group-ids=[<идентификатор_k8s-cluster-nodegroup-traffic>,<идентификатор_k8s-nodegroup-traffic>,<идентификатор_k8s-services-access>,<идентификатор_k8s-ssh-access>]Идентификатор группы безопасности можно получить вместе с информацией о ней.
-
Создайте группы безопасности с необходимыми правилами:
resource "yandex_vpc_security_group" "k8s-cluster-nodegroup-traffic" { name = "k8s-cluster-nodegroup-traffic" description = "Правила группы разрешают служебный трафик для кластера и групп узлов. Примените ее к кластеру и группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для проверок состояния сетевого балансировщика нагрузки." from_port = 0 to_port = 65535 protocol = "TCP" predefined_target = "loadbalancer_healthchecks" } ingress { description = "Правило для входящего служебного трафика между мастером и узлами." from_port = 0 to_port = 65535 protocol = "ANY" predefined_target = "self_security_group" } ingress { description = "Правило для проверки работоспособности узлов с помощью ICMP-запросов из подсетей внутри Yandex Cloud." protocol = "ICMP" v4_cidr_blocks = ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"] } egress { description = "Правило для исходящего служебного трафика между мастером и узлами." from_port = 0 to_port = 65535 protocol = "ANY" predefined_target = "self_security_group" } } resource "yandex_vpc_security_group" "k8s-nodegroup-traffic" { name = "k8s-nodegroup-traffic" description = "Правила группы разрешают служебный трафик для групп узлов. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее передачу трафика между подами и сервисами." from_port = 0 to_port = 65535 protocol = "ANY" v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16"] } egress { description = "Правило для исходящего трафика, разрешающее узлам в группе узлов подключаться к внешним ресурсам." from_port = 0 to_port = 65535 protocol = "ANY" v4_cidr_blocks = ["0.0.0.0/0"] } } resource "yandex_vpc_security_group" "k8s-services-access" { name = "k8s-services-access" description = "Правила группы разрешают подключение к сервисам из интернета. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее подключение к сервисам." from_port = 30000 to_port = 32767 protocol = "TCP" v4_cidr_blocks = ["0.0.0.0/0"] } } resource "yandex_vpc_security_group" "k8s-ssh-access" { name = "k8s-ssh-access" description = "Правила группы разрешают подключение к узлам по SSH. Примените ее к группам узлов." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее подключение к узлам по SSH." port = 22 protocol = "TCP" v4_cidr_blocks = ["85.32.32.22/32"] } } resource "yandex_vpc_security_group" "k8s-cluster-traffic" { name = "k8s-cluster-traffic" description = "Правила группы разрешают трафик для кластера. Примените ее к кластеру." network_id = "<идентификатор_облачной_сети>" ingress { description = "Правило для входящего трафика, разрешающее доступ к API Kubernetes (порт 443)." port = 443 protocol = "TCP" v4_cidr_blocks = ["203.0.113.0/24"] } ingress { description = "Правило для входящего трафика, разрешающее доступ к API Kubernetes (порт 6443)." port = 6443 protocol = "TCP" v4_cidr_blocks = ["203.0.113.0/24"] } egress { description = "Правило для исходящего трафика, разрешающее передачу трафика между мастером и подами metric-server." port = 4443 protocol = "TCP" v4_cidr_blocks = ["10.96.0.0/16"] } egress { description = "Правило для исходящего трафика, разрешающее подключение мастера к NTP-серверам для синхронизации времени." port = 123 protocol = "UDP" v4_cidr_blocks = ["0.0.0.0/0"] } } -
Создайте кластер с группой узлов и примените группы безопасности с правилами следующим образом:
resource "yandex_kubernetes_cluster" "k8s-cluster" { name = "k8s-cluster" service_account_id = "<идентификатор_сервисного_аккаунта_для_кластера>" node_service_account_id = "<идентификатор_сервисного_аккаунта_для_групп_узлов>" cluster_ipv4_range = "10.96.0.0/16" service_ipv4_range = "10.112.0.0/16" network_id = "<идентификатор_облачной_сети>" master { master_location { zone = "ru-central1-a" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } master_location { zone = "ru-central1-b" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } master_location { zone = "ru-central1-d" subnet_id = "<идентификатор_облачной_подсети_в_зоне>" } security_group_ids = [ yandex_vpc_security_group.k8s-cluster-nodegroup-traffic.id, yandex_vpc_security_group.k8s-cluster-traffic.id ] public_ip = true } } resource "yandex_kubernetes_node_group" "worker-nodes-a" { cluster_id = yandex_kubernetes_cluster.k8s-cluster.id name = "worker-nodes-a" allocation_policy { location { zone = "ru-central1-a" } } scale_policy { fixed_scale { size = 1 } } instance_template { network_interface { nat = true subnet_ids = [<идентификатор_облачной_подсети>] security_group_ids = [ yandex_vpc_security_group.k8s-cluster-nodegroup-traffic.id, yandex_vpc_security_group.k8s-nodegroup-traffic.id, yandex_vpc_security_group.k8s-services-access.id, yandex_vpc_security_group.k8s-ssh-access.id ] } } }
Группы безопасности для L7-балансировщика Application Load Balancer и кластера Managed Service for Kubernetes
Пусть необходимо создать правила для следующих условий:
- Требуется развернуть в трех подсетях балансировщик с публичным IP-адресом, принимающий HTTPS-трафик. CIDR подсетей —
10.128.0.0/24,10.129.0.0/24и10.130.0.0/24. - При создании кластера были указаны CIDR кластера
10.96.0.0/16и CIDR сервисов10.112.0.0/16. - Группа узлов в кластере расположена в подсети, имеющей CIDR
10.140.0.0/24. - Подключаться к узлам по SSH и управлять кластером через API,
kubectlи другие утилиты можно только из CIDR203.0.113.0/24.
Создайте следующие группы безопасности и правила:
locals {
network-id = "<идентификатор_облачной_сети>"
}
resource "yandex_vpc_security_group" "alb" {
description = "Группа безопасности балансировщика"
name = "alb"
network_id = local.network-id
ingress {
description = "Правило для получения входящего HTTP-трафика"
port = 80
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Правило для получения входящего HTTPS-трафика"
port = 443
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
ingress {
description = "Правило для проверок состояния узлов балансировщика"
port = 30080
protocol = "TCP"
predefined_target = "loadbalancer_healthchecks"
}
egress {
description = "Правило для отправки трафика на узлы, в том числе для проверок состояния"
from_port = 0
to_port = 65535
protocol = "TCP"
v4_cidr_blocks = ["10.140.0.0/24"]
}
}
resource "yandex_vpc_security_group" "nodegroup-backend" {
description = "Группа безопасности группы узлов для проверок состояния бэкендов"
name = "nodegroup-backend"
network_id = local.network-id
ingress {
description = "Правило для проверок состояния бэкендов"
port = 10501
protocol = "TCP"
v4_cidr_blocks = ["10.128.0.0/24", "10.129.0.0/24", "10.130.0.0/24"]
}
}
resource "yandex_vpc_security_group" "k8s-cluster-nodegroup-traffic" {
description = "Группа безопасности кластера и группы узлов для служебного трафика"
name = "k8s-cluster-nodegroup-traffic"
network_id = local.network-id
ingress {
description = "Правило для сетевого балансировщика нагрузки"
from_port = 0
to_port = 65535
protocol = "TCP"
predefined_target = "loadbalancer_healthchecks"
}
ingress {
description = "Правило для трафика между мастером и узлами"
from_port = 0
to_port = 65535
protocol = "ANY"
predefined_target = "self_security_group"
}
ingress {
description = "Правило для проверки работоспособности узлов из подсетей внутри Yandex Cloud"
from_port = 0
to_port = 65535
protocol = "IPV6_ICMP"
v4_cidr_blocks = ["10.0.0.0/8", "192.168.0.0/16", "172.16.0.0/12"]
}
egress {
description = "Правило для трафика между мастером и узлами"
from_port = 0
to_port = 65535
protocol = "ANY"
predefined_target = "self_security_group"
}
}
resource "yandex_vpc_security_group" "nodegroup-traffic" {
description = "Группа безопасности группы узлов для служебного трафика"
name = "nodegroup-traffic"
network_id = local.network-id
ingress {
description = "Правило для трафика между подами и сервисами"
from_port = 0
to_port = 65535
protocol = "ANY"
v4_cidr_blocks = ["10.96.0.0/16", "10.112.0.0/16"]
}
egress {
description = "Правило для доступа к внешним ресурсам"
from_port = 0
to_port = 65535
protocol = "ANY"
v4_cidr_blocks = ["0.0.0.0/0"]
}
}
resource "yandex_vpc_security_group" "k8s-cluster-traffic" {
description = "Группа безопасности кластера для служебного трафика"
name = "k8s-cluster-traffic"
network_id = local.network-id
ingress {
description = "Правило для доступа к API Kubernetes"
port = 443
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
ingress {
description = "Правило для доступа к API Kubernetes"
port = 6443
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
egress {
description = "Правило для трафика между мастером и подами metric-server"
port = 4443
protocol = "TCP"
v4_cidr_blocks = ["10.96.0.0/16"]
}
}
resource "yandex_vpc_security_group" "nodegroup-services-access" {
description = "Группа безопасности группы узлов для подключения к сервисам из интернета"
name = "nodegroup-services-access"
network_id = local.network-id
ingress {
description = "Правило для доступа к сервисам из интернета и подсетей Yandex Cloud"
from_port = 30000
to_port = 32767
protocol = "TCP"
v4_cidr_blocks = ["0.0.0.0/0"]
}
}
resource "yandex_vpc_security_group" "nodegroup-ssh" {
description = "Группа безопасности группы узлов для подключения к узлам по SSH"
name = "nodegroup-ssh"
network_id = local.network-id
ingress {
description = "Правило для подключения к узлам по SSH"
port = 22
protocol = "TCP"
v4_cidr_blocks = ["203.0.113.0/24"]
}
}