Sgroup to FQDN (Egress)
Ресурс Security Group to FQDN представляет собой введенную нами абстракцию, которая обеспечивает гибкое управление и контроль за сетевым
трафиком между различными группами безопасности и IP адресами стоящие за FQDN записями, используя TCP, UDP протоколы. Этот ресурс дает
возможность детально настроить, какой трафик разрешен к передаче между группами безопасности и IP адресами стоящие за определенными FQDN
записями, тем самым гарантируя высокий уровень защиты и управления сетевой инфраструктурой.
- Terraform module
- Terraform resource
- API
- nftables
Terraform module представляет собой высокоуровневую абстракцию над terraform resources, которая упрощает работу с ресурсами Terraform, скрывая сложность их непосредственного использования. Он предлагает простой и понятный интерфейс для взаимодействия, позволяя пользователям легко интегрироваться и управлять компонентами инфраструктуры без необходимости глубоко погружаться в детали каждого ресурса.
Далее везде в документе подразумевается что все места, содержащие переменную $traffic, могут принять значениe:
Egress. Аналогчично для $transport подразумевается одно из двух значений: tcp, udp.
rules- Структура, содержащая описание создаваемых правил.rules.$traffic[]- Поле описывающий направление трафика.rules.$traffic[].fqdnSet[]- Список, содержащий FQDN записи.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[]- Набор открытых портов отправителя.
| название параметра | тип данных | значение по умолчанию | transport* | ||
|---|---|---|---|---|---|
| TCP | UDP | ||||
| rules | Object[] | [] | ✔ | ✔ | |
| rules.$traffic[] | Object[] | ✔ | ✔ | ||
| rules.$traffic[].fqdnSet[] | 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 | ✔ | ✔ | |
Ограничения
name:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
rules.$traffic[].fqdnSet: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>
Пример использования
- TCP
- UDP
name: sg-local-example
rules:
egress:
- fqdnSet:
- example.com
access:
tcp:
action: ACCEPT
priority: 100
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
name: sg-local-example
rules:
egress:
- fqdnSet:
- example.com
access:
udp:
action: ACCEPT
priority: 100
logs: true
trace: true
ports:
- description: "example"
ports_from:
- 64231
ports_to:
- 443
- 80
Terraform resource является ключевым элементом в Terraform, предназначенным для управления различными аспектами инфраструктуры через код. Он позволяет задавать, настраивать и управлять инфраструктурными компонентами без привязки к их конкретным типам, обеспечивая автоматизацию развертывания и поддержки инфраструктуры согласно подходу Infrastructure as Code (IaC).
items- список ресурсов создаваемые terraform ресурсом.items.$ruleName- уникальное имя создаваемого ресурса.items.$ruleName.transport- Протокол L3/L4 уровня модели OSI.items.$ruleName.protocols[]- Список протоколов L7 уровня модели OSI.items.$ruleName.logs- Включить/отключить логирование.items.$ruleName.trace- Включить/отключить трассировку.items.$ruleName.sg_from- Security Group относительно которой рассматриваются правила.items.$ruleName.fqdn- Полное до менное имя (FQDN), для которого применяется данное правило.items.$ruleName.ports[]- Блок описывающий набор пар портов (src-dst).items.$ruleName.ports[].s- Набор открытых портов отправителя.items.$ruleName.ports[].d- Набор открытых портов получателяitems.$ruleName.action- Действие для пакетов в сформированных правил в цепочке.items.$ruleName.priority- Поле определяющее порядок применения правил в цепочке.
| название | обязательность | тип данных | значение по умолчанию | transport* | |
|---|---|---|---|---|---|
| TCP | UDP | ||||
| items | да | Object | ✔ | ✔ | |
| items.$ruleName | да | Object | ✔ | ✔ | |
| items.$ruleName.transport | да | Enum("TCP", "UDP") | ✔ | ✔ | |
| items.$ruleName.logs | нет | Boolean | false | ✔ | ✔ |
| items.$ruleName.trace | нет | Boolean | false | ✔ | ✔ |
| items.$ruleName.sg_from | да | String | ✔ | ✔ | |
| items.$ruleName.fqdn | да | String | ✔ | ✔ | |
| items.$ruleName.ports[] | нет | Object[] | null | ✔ | ✔ |
| items.$ruleName.ports[].s | нет | String | "" | ✔ | ✔ |
| items.$ruleName.ports[].d | нет | String | "" | ✔ | ✔ |
| items.$ruleName.action | да | ✔ | ✔ | ||
| items.$ruleName.priority | нет | Integer | ✔ | ✔ | |
Ограничения
items:- Каждое правило должно обладать уникальным ключом для предотвращения конфликтов.
items.$ruleName:- Форма ruleName должна быть организована в соответствии с определенной последовательностью, которую нужно соблюдать
"${transport}:sg(${sg_from})fqdn(${fqdn})".
- Форма ruleName должна быть организована в соответствии с определенной последовательностью, которую нужно соблюдать
items.$ruleName.protocols[]:- Не допускаю тся дубликация протоколов в списке.
- Значения должны соответствовать поддерживаемым протоколам.
items.$ruleName.sg_from:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
items.$ruleName.fqdn:items.$ruleName.ports[].s:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
items.$ruleName.ports[].d:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
items.$ruleName.priority:- Значения должны находиться в интервале от -32768 до 32767
Пример использования
- TCP
- UDP
resource "sgroups_fqdn_rules" "rules" {
items = {
"tcp:sg(sg-local-example)fqdn(example.com)" = {
transport = "tcp"
sg_from = "sg-local-example"
fqdn = "example.com"
ports = [{
d = "443,80"
s = "64231"
}]
logs = true
trace = true
action = "ACCEPT"
priority = 100
}
}
}
resource "sgroups_fqdn_rules" "rules" {
items = {
"udp:sg(sg-local-example)fqdn(example.com)" = {
transport = "udp"
sg_from = "sg-local-example"
fqdn = "example.com"
ports = [{
d = "443,80"
s = "64231"
}]
logs = true
trace = true
action = "ACCEPT"
priority = 100
}
}
}
Более подробную документацию по API можно посмотреть здесь.
Более подробно по организации БД можно посмотреть здесь.
Входные параметры
fqdnRules.rules- Структура, содержащая описание создаваемых правил.fqdnRules.rules[].FQDN- Полное доменное имя (FQDN), для которого применяется данное правило.fqdnRules.rules[].logs- Включить/отключить логирование.fqdnRules.rules[].ports- Включить/отключить трассировку.fqdnRules.rules[].ports[].d- Набор открытых портов получателяfqdnRules.rules[].ports[].s- Набор открытых портов отправителя.fqdnRules.rules[].sgFrom- Security Group относительно которой рассматриваются правила.fqdnRules.rules[].transport- Протокол L3/L4 уровня модели OSI.fqdnRules.rules[].action- Действие для пакетов в сформированных правил в цепочке.fqdnRules.rules[].priority- Структура, содержащая описание порядка применения правил в цепочке.fqdnRules.rules[].priority.some- Поле определяющее порядок применения правил в цепочке.syncOp- Поле определяющее действие с данными из запроса.
| название | обязательность | тип данных | значение по умолчанию | transport* | |
|---|---|---|---|---|---|
| TCP | UDP | ||||
| fqdnRules.rules | да | Object | ✔ | ✔ | |
| fqdnRules.rules[].FQDN | да | String | ✔ | ✔ | |
| fqdnRules.rules[].logs | нет | Boolean | false | ✔ | ✔ |
| fqdnRules.rules[].ports | нет | Object[] | null | ✔ | ✔ |
| fqdnRules.rules[].ports[].d | нет | String | null | ✔ | ✔ |
| fqdnRules.rules[].ports[].s | нет | String | null | ✔ | ✔ |
| fqdnRules.rules[].sgFrom | да | String | ✔ | ✔ | |
| fqdnRules.rules[].transport | да | Enum("TCP", "UDP") | ✔ | ✔ | |
| fqdnRules.rules[].action | да | Enum("UNDEF", "ACCEPT", "DROP") | ✔ | ✔ | |
| fqdnRules.rules[].priority | нет | Object | ✔ | ✔ | |
| fqdnRules.rules[].priority.some | нет | Integer | ✔ | ✔ | |
| syncOp | да | ✔ | ✔ | ||
Ограничения
fqdnRules.rules[].FQDN:fqdnRules.rules[].sgFrom:- Длина значения поля не должна превышать 256 символов.
- Значение поля должно начинаться и заканчиваться символами без пробелов.
- Значение должно быть уникальным в рамках типа ресурса.
fqdnRules.rules[].protocols[]:- Не допускаются дубликация протоколов в списке.
- Значения должны соответствовать поддерживаемым протоколам.
fqdnRules.rules[].ports[].ports_to[]:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
- Не допускаются пересечения портов в правилах в рамках одной пары Security Group.</li>
fqdnRules.rules[].ports[].ports_from[]:- Значения портов должно находиться в интервале от 1 до 65535.
- Если значение не будет указано то будет использоваться весь диапазон портов.
- Значения портов прописываются по одному или интервально используя '-'.
Пример использования
- TCP
- UDP
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"fqdnRules": {
"rules": [{
"FQDN": "example.com",
"logs": true,
"ports": [{
"d": "443,80",
"s": "64231"
}],
"sgFrom": "sg-local-example",
"transport": "TCP",
"action": "ACCEPT",
"priority": {
"some": 100
}
}]
},
"syncOp": "Upsert"
}'
curl '127.0.0.1:9007/v2/sync' \
--header 'Content-Type: application/json' \
--data '{
"fqdnRules": {
"rules": [{
"FQDN": "example.com",
"logs": true,
"ports": [{
"d": "443,80",
"s": "64231"
}],
"sgFrom": "sg-local-example",
"transport": "UDP",
"action": "ACCEPT",
"priority": {
"some": 100
}
}]
},
"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} | nftrace set |
| Трассировка указанного правила (опциональна, можно включить/выключить) |
| ${DstFQDN} | saddr @${IPSet(sgName)} | Наименование IPSet в котором описаны сети в FQDN | Значение типа string, не должно содержать в себе пробелов |
| ${Transport} | tcp | udp | протокол передачи данных в цепочке правил. | Одно из двух значений tcp | udp |
| ${RuleType} | ip | Описывает, что принимает трафик типа ip | |
| ${SrcPorts} | sport {} | Набор целочисленных значений от 0 до 65535З | Значения sport (source port). Может быть как одно значение, как и множество значений портов. В случае если одно значение у порта то передается значение либо как целочисленное значение либо как название порта. Если передается массив значений портов то они должны быть внутри {} перечислены через запятую. |
| ${DstPorts} | dport {} | Набор целочисленных значений от 0 до 65535З | Значения dport (destination port). Может быть как одно значение, как и множество значений портов. В случае если одно значение у порта то передается значение либо как целочисленное значение либо как название порта. Если передается массив значений портов то они должны быть внутри {} перечислены через запятую. |
| ${Counter} | counter packets 0 bytes 0 | Не параметризированный | Счетчик, учитывает количество пройденных пакетов с количеством байтов переданной информации в рамках указанной цепочки правил |
| ${Log} | log level debug flags ip options | Не параметризированный | Логирование указанного правила (опциональна, можно включить/выключить) |
| ${Verdict} | accept | Не параметризированный $Verdict определяет действие, которое будет применено к пакету в соответсвии с правилом. Это поле может принимать значение Подробнее: Verdict statementaccept или drop в зависимости от указанного в правиле. | Вердикт политики по пакетам данных |
Шаблон
chain EGRESS-POSTROUTING-sgName {
# **********
${Trace} ${RuleType} ${DstFQDN} ${Transport} ${SrcPorts} ${DstPorts} ${Counter} ${Log} ${Verdict}
# **********
}
Пример использования
chain EGRESS-POSTROUTING-sg-local-example {
# **********
nftrace set 1 ip daddr @NetIPv4-fqdn-example.com tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr @NetIPv6-fqdn-example.com tcp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr @NetIPv4-fqdn-example.com udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
nftrace set 1 ip daddr @NetIPv6-fqdn-example.com udp dport { 80, 443 } sport { 64231 } counter packets 0 bytes 0 log level debug flags ip options accept
# **********
}