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
# **********
}