Sgroup to Sgroup (Ingress/Egress)
Ресурс Security Group to Security Group
представляет собой введенную нами абстра кцию, которая обеспечивает гибкое
управление и контроль сетевого трафика между разными группами безопасности, используя протоколы TCP, UDP и ICMP. Этот
ресурс позволяет точно настраивать, какой трафик может передаваться между группами, обеспечивая таким образом высокий
уровень защиты и контроля в сетевой инфраструктуре.
- Terraform module
- Terraform resource
- API
- nftables
Terraform module представляет собой высокоуровневую абстракцию над terraform resources, которая упрощает работу с ресурсами Terraform, скрывая сложность их непосредственного использования. Он предлагает простой и понятный интерфейс для взаимодействия, позволяя пользователям легко интегрироваться и управлять компонентами инфраструктуры без необходимости глубоко погружаться в детали каждого ресурса.
Далее везде в документе подразуме вается что все места, содержащие переменную $traffic
, могут принять одно из двух
значений: Ingress
Egress
. Аналогчично для $transport
подразумевается одно из четырех значений: tcp
, udp
,
icmpIPv4
, icmpIPv6
rules
- Структура, содержащая описание создаваемых правил.rules.$traffic[]
- Поле описывающий направление трафика.rules.$traffic[].sgroupSet[]
- Список, содержащий названия Security Group(s).rules.$traffic[].access.$transport
- Протокол L3/L4 уровня модели OSI.rules.$traffic[].access.$transport.action
- Действие для пакетов в сформированных правил в цепочке.rules.$traffic[].access.$transport.priority
- Поле определяющее порядок применения правил в цепочке.rules.$traffic[].access.$transport.log
- Включить/отключить логирование.rules.$traffic[].access.$transport.trace
- Включить/отключить трассировку.rules.$traffic[].access.$transport.ports[].description
- Формальное текстовое описание.rules.$traffic[].access.$transport.ports[].ports_to[]
- Набор открытых портов получат еляrules.$traffic[].access.$transport.ports[].ports_from[]
- Набор открытых портов отправителя.rules.$traffic[].access.$transport.types[].description
- Формальное текстовое описание.rules.$traffic[].access.$transport.types[].type[]
- Список, определяющий допустимые типы ICMP запросов.
название параметра | тип данных | значение по умолчанию | transport* | ||
---|---|---|---|---|---|
TCP | UDP | ICMP | |||
rules | Object[] | [] | ✔ | ✔ | ✔ |
rules.$traffic[] | Object[] | ✔ | ✔ | ✔ | |
rules.$traffic[].sgroupSet[] | String[] | ✔ | ✔ | ✔ | |
rules.$traffic[].access.$transport | Object | ✔ | ✔ | ✔ | |
rules.$traffic[].access.$transport.action | ✔ | ✔ | ✔ | ||
rules.$traffic[].access.$transport.priority | String | ✔ | ✔ | ✔ | |
rules.$traffic[].access.$transport.log | Boolean | false | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.trace | Boolean | false | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.ports[] | Object[] | "" | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.ports[].description | String | "" | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.ports[].ports_to[] | Integer[] | null | ✔ | ✔ | |
rules.$traffic[].access.$transport.ports[].ports_from[] | Integer[] | null | ✔ | ✔ | |
rules.$traffic[].access.$transport.types[] | Object[] | "" | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.types[].description | String | "" | ✔ | ✔ | ✔ |
rules.$traffic[].access.$transport.types[].type[] | Integer[] | null | ✔ |
Ограничения
name
:- Длина значения поля не должна превышать 256 символов.
- Знач ение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
rules.$traffic[].sgroupSet
:- Длина значения элемента не должна превышать 256 символов.
- Значение элемента должно начинаться и заканчиваться символами без пробелов.
- Повторения значений в списке не допускаются.
- Необходимо указать минимум одно значение.
rules.$traffic[].access.$transport.priority
:- Значения должны находиться в интервале от -32768 до 32767
rules.$traffic[].access.$transport.ports[].ports_to[]
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
rules.$traffic[].access.$transport.ports[].ports_from[]
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
rules.$traffic[].access.$transport.types[].type[]
:- Значение должно быть числом в диапазоне от 0 до 255.
- Повторения значений в списке не допускаются.
Пример использования
- TCP
- UDP
- ICMP4
- ICMP6
Ingress
name: "sg-local-example"
rules:
ingress:
- sgroupSet:
- "sg-example"
access:
tcp:
action: ACCEPT
priority: 0
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
Egress
name: "sg-local-example"
rules:
egress:
- sgroupSet:
- "sg-example"
access:
tcp:
action: ACCEPT
priority: 0
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
Ingress
name: "sg-local-example"
rules:
ingress:
- sgroupSet:
- "sg-example"
access:
udp:
action: ACCEPT
priority: 0
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
Egress
name: "sg-local-example"
rules:
egress:
- sgroupSet:
- "sg-example"
access:
udp:
action: ACCEPT
priority: 0
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
Ingress
name: "sg-local-example"
rules:
ingress:
- sgroupSet:
- "sg-example"
access:
icmpIPv4:
action: ACCEPT
priority: -100
logs: true
trace: true
types:
- description: "example"
type:
- 0
- 8
Egress
name: "sg-local-example"
rules:
egress:
- sgroupSet:
- "sg-example"
access:
icmpIPv4:
action: ACCEPT
priority: -100
logs: true
trace: true
types:
- description: "example"
type:
- 0
- 8
Ingress
name: "sg-local-example"
rules:
ingress:
- sgroupSet:
- "sg-example"
access:
icmpIPv6:
action: ACCEPT
priority: -100
logs: true
trace: true
types:
- description: "example"
type:
- 0
- 8
Egress
name: "sg-local-example"
rules:
egress:
- sgroupSet:
- "sg-example"
access:
icmpIPv6:
action: ACCEPT
priority: -100
logs: true
trace: true
types:
- description: "example"
type:
- 0
- 8
Terraform resource является ключевым элементом в Terraform, предназначенным для управления различными аспектами инфраструктуры через код. Он позволяет задавать, настраивать и управлять инфраструктурными компонентами без привязки к их конкретным типам, обеспечивая автоматизацию развертывания и поддержки инф раструктуры согласно подходу Infrastructure as Code (IaC).
items
- Список ресурсов создаваемые terraform ресурсом.items.$ruleName
- Уникальное имя создаваемого ресурса.items.$ruleName.traffic
- Поле описывающий направление трафика.items.$ruleName.transport
- Протокол L3/L4 уровня модели OSI.items.$ruleName.sg
- Security Group, с которой устанавливаются правила взаимодействия.items.$ruleName.sg_local
- Security Group относительно которой рассматриваются правила.items.$ruleName.ports
- Блок описывающий набор пар портов (src-dst).items.$ruleName.ports[].d
- Набор открытых портов получателяitems.$ruleName.ports[].s
- Набор открытых портов отправителя.items.$ruleName.logs
- Включить/отключить логирование.items.$ruleName.trace
- Включить/отключить трассировку.items.$ruleName.ip_v
- Версия IP для ICMP (IPv4 или IPv6).items.$ruleName.type
- Список, определяющий допустимые типы ICMP запросов.items.$ruleName.action
- Действие для пакетов в сформированных правил в цепочке.items.$ruleName.priority
- Поле определяющее порядок применения правил в цепочке.
название | обязательность | тип данных | значение по умолчанию | transport* | ||
---|---|---|---|---|---|---|
TCP | UDP | ICMP | ||||
items | да | Object | ✔ | ✔ | ✔ | |
items.$ruleName | да | Object | ✔ | ✔ | ✔ | |
items.$ruleName.traffic | да | ✔ | ✔ | ✔ | ||
items.$ruleName.transport | да | Enum("TCP", "UDP") | ✔ | ✔ | ||
items.$ruleName.sg | да | String | ✔ | ✔ | ✔ | |
items.$ruleName.sg_local | да | String | ✔ | ✔ | ✔ | |
items.$ruleName.ports | нет | Object[] | null | ✔ | ✔ | |
items.$ruleName.ports[].d | нет | String | "" | ✔ | ✔ | |
items.$ruleName.ports[].s | нет | String | "" | ✔ | ✔ | |
items.$ruleName.logs | нет | Boolean | false | ✔ | ✔ | ✔ |
items.$ruleName.trace | нет | Boolean | false | ✔ | ✔ | ✔ |
items.$ruleName.ip_v | да | Enum("IPv4", "IPv6") | ✔ | |||
items.$ruleName.type | да | String[] | null | ✔ | ||
items.$ruleName.action | да | ✔ | ✔ | ✔ | ||
items.$ruleName.priority | нет | Integer | ✔ | ✔ | ✔ |
Ограничения
items
:- Каждое правило должно обладать уникальным ключом для предотвращения конфликтов.
items.$ruleName
:- Форма ruleName должна быть организована в соответствии с определенной последовательностью, которую нужно соблюдать
"${transport}:sg-local(${sg_local})sg(${sg})${traffic}"
.
- Форма ruleName должна быть организована в соответствии с определенной последовательностью, которую нужно соблюдать
items.$ruleName.sg
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
items.$ruleName.sg_local
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
items.$ruleName.ports[].s
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
items.$ruleName.ports[].d
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
items.$ruleName.type[]
:- Значение должно быть числом в диапазоне от 0 до 255.
- Повторения значений в списке не допускаются.
items.$ruleName.priority
:- Значения должны находиться в интервале от -32768 до 32767
Пример использования
- TCP
- UDP
- ICMP4
- ICMP6
Ingress
resource "sgroups_ie_rules" "rules" {
items = {
"tcp:sg-local(sg-local-example)sg(sg-example)ingress" = {
traffic = "ingress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
transport = "tcp"
ports = [{
d = "80"
s = ""
}]
action = "ACCEPT"
priority = 0
}
}
}
Egress
resource "sgroups_ie_rules" "rules" {
items = {
"tcp:sg-local(sg-local-example)sg(sg-example)egress" = {
traffic = "egress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
transport = "tcp"
ports = [{
d = "80"
s = ""
}]
action = "ACCEPT"
priority = 0
}
}
}
Ingress
resource "sgroups_ie_rules" "rules" {
items = {
"udp:sg-local(sg-local-example)sg(sg-example)ingress" = {
traffic = "ingress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
transport = "udp"
ports = [{
d = "80"
s = ""
}]
action = "ACCEPT"
priority = 0
}
}
}
Egress
resource "sgroups_ie_rules" "rules" {
items = {
"udp:sg-local(sg-local-example)sg(sg-example)egress" = {
traffic = "egress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
transport = "udp"
ports = [{
d = "80"
s = ""
}]
action = "ACCEPT"
priority = 0
}
}
}
Ingress
resource "sgroups_ie_icmp_rules" "rules" {
items = {
"icmp4:sg-local(sg-local-example)sg(sg-example)ingress" = {
traffic = "ingress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
ip_v = "IPv4"
type = [0,8]
action = "ACCEPT"
priority = -100
}
}
}
Egress
resource "sgroups_icmp_rules" "rules" {
items = {
"icmp4:sg-local(sg-local-example)sg(sg-example)egress" = {
traffic = "egress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
ip_v = "IPv4"
type = [0,8]
action = "ACCEPT"
priority = -100
}
}
}
Ingress
resource "sgroups_ie_icmp_rules" "rules" {
items = {
"icmp6:sg-local(sg-local-example)sg(sg-example)ingress" = {
traffic = "ingress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
ip_v = "IPv6"
type = [0,8]
action = "ACCEPT"
priority = -100
}
}
}
Egress
resource "sgroups_icmp_rules" "rules" {
items = {
"icmp6:sg-local(sg-local-example)sg(sg-example)egress" = {
traffic = "egress"
logs = true
trace = true
sg_local = "sg-local-example"
sg = "sg-example"
ip_v = "IPv6"
type = [0,8]
action = "ACCEPT"
priority = -100
}
}
}