Sgroup to Sgroup
Данный тип правил управляет обменом данными между различными группами безопасности. Он автоматически создает два правила на хостах: одно для исходящего трафика от инициирующей стороны и другое для входящего трафика от группы безопасности, к которой предоставлен доступ.
- Terraform module
- Terraform resource
- API
- nftables
Terraform module представляет собой высокоуровневую абстракцию над terraform resources, которая упрощает работу с ресурсами Terraform, скрывая сложность их непосредственного использования. Он предлагает простой и понятный интерфейс для взаимодействия, позволяя пользователям легко интегрироваться и управлять компонентами инфраструктуры без необходимости глубоко погружаться в детали каждого ресурса.
Далее везде в документе подразумевается что все места, содержащие переменную $transport
иогут принимать одно из
четырех значений: tcp
, udp
, icmpIPv4
, icmpIPv6
.
rules
- Структура, содержащая описание создаваемых правил.rules.s2s[]
- Список правил, описывающий сетевое взаимодействие текущей Security Group с внешней Security Group.rules.s2s[].sgroupSet[]
- Список, содержащий названия Security Group(s).rules.s2s[].access.$transport
- Протокол L3/L4 уровня модели OSI.rules.s2s[].access.$transport.action
- Действие для пакетов в сформированных правил в цепочке.rules.s2s[].access.$transport.priority
- Поле определяющее порядок применения правил в цепочке.rules.s2s[].access.$transport.log
- Включить/отключить логирование.rules.s2s[].access.$transport.trace
- Включить/отключить трассировку.rules.s2s[].access.$transport.ports[].description
- Формальное текстовое описание.rules.s2s[].access.$transport.ports[].ports_to[]
- Набор открытых портов получателяrules.s2s[].access.$transport.ports[].ports_from[]
- Набор открытых портов отправителя.rules.s2s[].access.$transport.types[].description
- Формальное текстовое описание.rules.s2s[].access.$transport.types[].type[]
- Список, определяющий допустимые типы ICMP запросов.
название параметра | тип данных | значение по умолчанию | transport* | ||
---|---|---|---|---|---|
TCP | UDP | ICMP | |||
rules | Object[] | [] | ✔ | ✔ | ✔ |
rules.s2s | Object | ✔ | ✔ | ✔ | |
rules.s2s.sgroupSet[] | String[] | ✔ | ✔ | ✔ | |
rules.s2s.access.$transport | Object[] | ✔ | ✔ | ✔ | |
rules.s2s[].access.$transport.action | ✔ | ✔ | ✔ | ||
rules.s2s[].access.$transport.priority | String | ✔ | ✔ | ✔ | |
rules.s2s[].access.$transport.log | Boolean | false | ✔ | ✔ | ✔ |
rules.s2s[].access.$transport.trace | Boolean | false | ✔ | ✔ | ✔ |
rules.s2s.access.$transport.ports[].description | String | "" | ✔ | ✔ | ✔ |
rules.s2s.access.$transport.ports[].ports_to[] | Integer[] | null | ✔ | ✔ | |
rules.s2s.access.$transport.ports[].ports_from[] | Integer[] | null | ✔ | ✔ | |
rules.s2s[].access.$transport.types[].type[] | Integer[] | null | ✔ |
Ограничения
name
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
rules.s2s[].sgroupSet
:- Длина значения элемента не должна превышать 256 символов.
- Значение элемента должно начинаться и заканчиваться символами без пробелов.
- Повторения значений в списке не допускаются.
- Необходимо указать минимум одно значение.
rules.s2s[].access.$transport.priority
:- Значения должны находиться в интервале от -32768 до 32767
rules.s2s[].access.$transport.ports[].ports_to[]
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
rules.s2s[].access.$transport.ports[].ports_from[]
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
rules.s2s[].access.$transport.types[].type[]
:- Значение должно быть числом в диапазоне от 0 до 255.
- Повторения значений в списке не допускаются.
Пример использования
- TCP
- UDP
- ICMP4
- ICMP6
name: sg-local-example
rules:
s2s:
- sgroupSet:
- sg-example
access:
tcp:
action: ACCEPT
priority: -200
logs: true
trace: true
ports:
- description: ""
ports_from:
- 64231
ports_to:
- 443
- 80
name: sg-local-example
rules:
s2s:
- sgroupSet:
- sg-example
access:
udp:
action: ACCEPT
priority: -200
logs: true
trace: true
ports:
- description: ""
ports_from:
- 64231
ports_to:
- 443
- 80
name: sg-local-example
rules:
s2s:
- sgroupSet:
- sg-example
access:
icmpIPv4:
action: ACCEPT
priority: -300
logs: true
trace: true
types:
- description: ""
Types:
- 0
- 8
name: sg-local-example
rules:
s2s:
- sgroupSet:
- sg-example
access:
icmpIPv6:
action: ACCEPT
priority: -300
logs: true
trace: true
types:
- description: ""
Types:
- 0
- 8
Terraform resource является ключевым элементом в Terraform, предназначенным для управления различными аспектами инфраструктуры через код. Он позволяет задавать, настраивать и управлять инфраструктурными компонентами без привязки к их конкретным типам, обеспечивая автоматизацию развертывания и поддержки инфраструктуры согласно подходу Infrastructure as Code (IaC).
items
- Список ресурсов создаваемые terraform ресурсом.items.$ruleName
- Уникальное имя создаваемого ресурса.items.$ruleName.transport
- Протокол L3/L4 уровня модели OSI.items.$ruleName.sg_from
- Security Group, с которой устанавливаются правила взаимодействия.items.$ruleName.sg_to
- 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.transport | да | Enum("TCP", "UDP") | ✔ | ✔ | ||
items.$ruleName.sg_from | да | String | ✔ | ✔ | ✔ | |
items.$ruleName.sg_to | да | 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})"
.
- Форма ruleName должна быть организована в соответствии с определенной последовательностью, которую нужно соблюдать
items.$ruleName.sg_from
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
items.$ruleName.sg_to
:- Длина значения поля не должна превышать 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
resource "sgroups_rules" "rules" {
items = {
"tcp:sg(sg-local-example)sg(sg-example)" = {
sg_from = "sg-local-example"
sg_to = "sg-example"
logs = true
trace = true
transport = "tcp"
ports = [{
d = "443,80"
s = "64231"
}]
action = "ACCEPT"
priority = -200
}
}
}
resource "sgroups_rules" "rules" {
items = {
"udp:sg(sg-local-example)sg(sg-example)" = {
sg_from = "sg-local-example"
sg_to = "sg-example"
logs = true
trace = true
transport = "udp"
ports = [{
d = "443,80"
s = "64231"
}]
action = "ACCEPT"
priority = -200
}
}
}
resource "sgroups_icmp_rules" "rules" {
items = {
"sg(sg-local-example)sg(sg-example)icmp4" => {
sg_from = "sg-local-example"
sg_to = "sg-example"
logs = true
trace = true
ip_v = "IPv4"
type = [0,8]
action = "ACCEPT"
priority = -300
}
}
}
resource "sgroups_icmp_rules" "rules" {
items = {
"sg(sg-local-example)sg(sg-example)icmp6" => {
sg_from = "sg-local-example"
sg_to = "sg-example"
logs = true
trace = true
ip_v = "IPv6"
type = [0,8]
action = "ACCEPT"
priority = -300
}
}
}
Боле е подробную документацию по API можно посмотреть здесь.
Более подробно по организации БД можно посмотреть здесь и здесь .
Далее везде в документе подразумевается что все места, содержащие переменную $node
, могут принять одно из двух значений: sgRules
, sgSgIcmpRules
.
Входные параметры
$node.rules[]
- Структура, содержащая описание создаваемых правил.$node.rules[].sgFrom
- Security Group, с которой устанавливаются правила взаимодействия.$node.rules[].sgTo
- Security Group, с которой устанавливаются правила взаимодействия.$node.rules[].logs
- Включить/отключить логирование.$node.rules[].trace
- Включить/отключить трассировку.$node.rules[].ports
- Блок описывающий набор пар портов (src-dst).$node.rules[].ports[].d
- Набор открытых портов получателя$node.rules[].ports[].s
- Набо р открытых портов отправителя.$node.rules[].transport
- Протокол L3/L4 уровня модели OSI.$node.rules[].ICMP
- Структура, содержащая описание создаваемых правил типа ICMP.$node.rules[].ICMP.IPv
- Версия IP для ICMP (IPv4 или IPv6).$node.rules[].ICMP.Types
- Список, определяющий допустимые типы ICMP запросов.$node.rules[].action
- Действие для пакетов в сформированных правил в цепочке.$node.rules[].priority
- Структура, содержащая описание порядка применения правил в цепочке.$node.rules[].priority.some
- Поле определяющее порядок применения правил в цепочке.syncOp
- Поле определяющее действие с данными из запроса.
название | обязательность | тип данных | значение по умолчанию | transport* | ||
---|---|---|---|---|---|---|
TCP | UDP | ICMP | ||||
$node.rules[] | да | Object[] | null | ✔ | ✔ | ✔ |
$node.rules[].sgFrom | да | String | ✔ | ✔ | ✔ | |
$node.rules[].sgTo | да | String | ✔ | ✔ | ✔ | |
$node.rules[].logs | нет | Boolean | false | ✔ | ✔ | ✔ |
$node.rules[].trace | нет | Boolean | false | ✔ | ✔ | ✔ |
$node.rules[].ports | нет | Object[] | null | ✔ | ✔ | |
$node.rules[].ports[].d | нет | String | null | ✔ | ✔ | |
$node.rules[].ports[].s | нет | String | null | ✔ | ✔ | |
$node.rules[].transport | нет | Enum("TCP", "UDP") | TCP | ✔ | ✔ | |
$node.rules[].ICMP | да | Object | ✔ | |||
$node.rules[].ICMP.IPv | да | Enum("IPv4", "IPv6") | ✔ | |||
$node.rules[].ICMP.Types | нет | String[] | [] | ✔ | ||
$node.rules[].action | да | ✔ | ✔ | ✔ | ||
$node.rules[].priority | нет | Object | ✔ | ✔ | ✔ | |
$node.rules[].priority.some | нет | Integer | ✔ | ✔ | ✔ | |
syncOp | да | ✔ | ✔ | ✔ |
Ограничения
sgSgRules.rules[].sgFrom
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
sgSgRules.rules[].sgTo
:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
sgSgRules.rules[].ports[].d
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
sgSgRules.rules[].ports[].s
:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
sgSgRules.rules[].ICMP.Types[]
:- Значение должно быть числом в диапазоне от 0 до 255.
- Повторения значений в списке не допускаются.
Пример использования
- TCP
- UDP
- ICMP4
- ICMP6
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"sgRules": {
"rules": [{
"sgFrom": "sg-local-example",
"sgTo": "sg-example",
"logs": true,
"trace": true,
"ports": [{
"d": "443,80",
"s": "64231"
}],
"transport": "TCP",
"action": "ACCEPT",
"priority": {
"some": -200
}
}]
},
"syncOp": "Upsert"
}'
Выходные параметры
название | тип данных | описание |
---|---|---|
- | Object | в случае успеха возвращается пустое тело |
Возможные ошибки API
Пользователь указал некорректные значения агрументов
- HTTP code: 400
- gRPC code: INVALID_ARGUMENT
- gRPC number: 3
Не найден метод
- HTTP code: 404
- gRPC code: NOT_FOUND
- gRPC number: 5
Диаграмма последовательности
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"sgRules": {
"rules": [{
"sgFrom": "sg-local-example",
"sgTo": "sg-example",
"logs": true,
"trace": true,
"ports": [{
"d": "443,80",
"s": "64231"
}],
"transport": "UDP",
"action": "ACCEPT",
"priority": {
"some": -200
}
}]
},
"syncOp": "Upsert"
}'
Выходные параметры
название | тип данных | описание |
---|---|---|
- | Object | в случае успеха возвращается пустое тело |
Возможные ошибки API
Пользователь указал некорректные значения агрументов
- HTTP code: 400
- gRPC code: INVALID_ARGUMENT
- gRPC number: 3
Не найден метод
- HTTP code: 404
- gRPC code: NOT_FOUND
- gRPC number: 5
Диаграмма последовательности
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"sgSgIcmpRules": {
"rules": [{
"sgFrom": "sg-local-example",
"sgTo": "sg-example",
"logs": true,
"trace": true
"ICMP": {
"IPv": "IPv4",
"Types": [0,8]
},
"action": "ACCEPT",
"priority": {
"some": -300
}
}]
},
"syncOp": "Upsert"
}'
Выходные параметры
название | тип данных | описание |
---|---|---|
- | Object | в случае успеха возвращается пустое тело |
Возможные ошибки API
Пользователь указал некорректные значения агрументов
- HTTP code: 400
- gRPC code: INVALID_ARGUMENT
- gRPC number: 3
Не найден метод
- HTTP code: 404
- gRPC code: NOT_FOUND
- gRPC number: 5
Диаграмма последовательности
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"sgSgIcmpRules": {
"rules": [{
"sgFrom": "sg-local-example",
"sgTo": "sg-example",
"logs": true,
"trace": true
"ICMP": {
"IPv": "IPv6",
"Types": [0,8]
},
"action": "ACCEPT",
"priority": {
"some": -300
}
}]
},
"syncOp": "Upsert"
}'
Выходные параметры
название | тип данных | описание |
---|---|---|
- | Object | в случае успеха возвращается пустое тело |
Возможные ошибки API
Пользователь указал некорректные значения агрументов
- HTTP code: 400
- gRPC code: INVALID_ARGUMENT
- gRPC number: 3
Не найден метод
- HTTP code: 404
- gRPC code: NOT_FOUND
- gRPC number: 5
Диаграмма последовательности
В этом разделе мы покажем, как правила фильтрации трафика, созданные с помощью Terraform и API, внедряются в настройки nftables. Это позволяет легко интегрировать сложные правила безопасности прямо в вашу систему фильтрации трафика.
$Trace
- Включить/отключить трассировку.$SrcSgroup
- Security Group, с которой устанавливаются правила взаимодействия.$DstGroup
- Security Group, с которой устанавливаются правила взаимодействия.$Transport
- Протокол L3/L4 уровня модели OSI.$NftRuleType
- Характеристика описывающая, что принимается трафик типа ip.$IcmpTypeList
- Список, определяющий допустимые типы ICMP запросов.$SrcPorts
- Набор открытых портов отправителя.$DstPorts
- Набор открытых портов получателя$NftCounter
- Счетчик количества байтов и пакетов.$Log
- Включить/отключить логирование.$NftRuleVerdict
- Результат применения правила, опреде ляющий действие, которое будет применено к пакету.
шаблон параметра | структура параметра | значения | transport* | ||
---|---|---|---|---|---|
TCP | UDP | ICMP | |||
$Trace | nftrace set |
| ✔ | ✔ | ✔ |
$SrcSgroup | saddr | @${IPSet(sgName)} | ✔ | ✔ | ✔ |
$DstSgroup | daddr | @${IPSet(sgName)} | ✔ | ✔ | ✔ |
$Transport | tcp | udp | icmp | ✔ | ✔ | ✔ | |
$NftRuleType | ip | ✔ | ✔ | ✔ | |
$IcmpTypeList | type {} | Набор целочисленных значений от 0 до 255 | ✔ | ||
$SrcPorts | sport {} | Набор целочисленных значений от 0 до 65535 | ✔ | ✔ | |
$DstPorts | dport {} | Набор целочисленных значений от 0 до 65535 | ✔ | ✔ | |
$NftCounter | counter | packets 0 bytes 0 | ✔ | ✔ | ✔ |
$Log | log | level debug flags ip options | ✔ | ✔ | ✔ |
$NftRuleVerdict | accept | $NftRuleVerdict определяет действие, которое будет применено к пакету в соответсвии с правилом. Это поле может принимать значение | ✔ | ✔ | ✔ |
Пример использования
- TCP
- UDP
- ICMP
Шаблон
chain INGRESS-INPUT-sgName {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
chain INGRESS-INPUT-sg-example-to {
# **********
nftrace set 1 ip saddr NetIPv4-sg-example-from tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip saddr NetIPv6-sg-example-from tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
chain EGRESS-POSTROUTING-sg-example-from {
# **********
nftrace set 1 ip daddr NetIPv4-sg-example-to tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr NetIPv6-sg-example-to tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
Шаблон
chain INGRESS-INPUT-sgName {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
chain INGRESS-INPUT-sg-example-to {
# **********
nftrace set 1 ip saddr NetIPv4-sg-example-from udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip saddr NetIPv6-sg-example-from udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
chain EGRESS-POSTROUTING-sg-example-from {
# **********
nftrace set 1 ip daddr NetIPv4-sg-example-to udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr NetIPv6-sg-example-to udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
Шаблон
chain INGRESS-INPUT-sgName {
# **********
${Trace} ${RuleType} ${SrcSgroup} ${Transport} ${TypeList} ${Counter} ${Log} ${Verdict}
# **********
}
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstSgroup} ${Transport} ${TypeList} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
chain INGRESS-INPUT-sg-example-to {
# **********
nftrace set 1 ip saddr NetIPv4-v4-sg-example-from icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip saddr NetIPv6-v6-sg-example-from icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}
chain EGRESS-POSTROUTING-sg-example-from {
# **********
nftrace set 1 ip daddr NetIPv4-sg-example-to icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr NetIPv6-sg-example-to icmp type { 0, 8 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}