Как настроить ACL на серверах Linux?

Привет. 

У меня есть инфраструктура, состоящая из порядка 500 серверов, 95% из которых работают на Debian 12. Виртуальные машины размещены в различных средах, включая облачные платформы, гипервизоры Proxmox и VMware. Задача заключается в том, чтобы запустить и обеспечить работу пакетного фильтра на серверах, на основе ACL, использующих группы: при добавлении хоста в группу должны автоматически применяться разрешающие правила для INPUT. Вероятно, я буду использовать nftables. 

Управлять security groups в разных средах не хочется. Я изначально надеялся на решение с использованием SaltStack, но после некоторого времени тестирования заметил, что, например, разрешающие правила для ICMP не применяются на виртуальных машинах, хотя SaltStack сообщает, что всё прошло успешно. 

Вот пример одного из правил, после его анализа возникли сомнения — может, оно сырое, или я что-то недопонимаю:
<blockquote>
allow_icmp:
  nftables.append:
    - table: filter
    - family: inet
    - chain: corp
    - proto: icmp type { echo-request, echo-reply }
    - jump: accept
    - require:
       - nftables: create_chain_corp
</blockquote> 

Использование Ansible на таком количестве хостов оказывается медлительным, хотя это, похоже, единственный вариант на данный момент. Перехожу к Puppet, но его внедрение в контур нужно еще изучить.

Можете предложить решения для данной ситуации?
  • 17 апреля 2025 г. 7:55
Ответы на вопрос 2
Привет!

Настройка ACL и управление правилами фильтрации на таком количестве серверов может быть непростой задачей. Давайте рассмотрим несколько подходов и решений, которые могут помочь вам эффективно реализовать вашу задачу.

### 1. Использование nftables с семантикой групп

Ваше решение с использованием `nftables` кажется разумным. Вы можете организовать правила таким образом, чтобы они применялись к группам серверов. Вот основные шаги:

1. **Создайте таблицу и цепочки**:
   Убедитесь, что у вас есть основная таблица и цепочки для вашего фильтра на всех серверах. Например:
   ```bash
   nft add table inet filter
   nft add chain inet filter input { type filter hook input priority 0; }
   ```

2. **Создайте группы**:
   Вы можете организовать группы для серверов, на которых будут применяться определенные правила. Например, `corporate_servers`, `web_servers` и т.д.

3. **Применение правил по группе**:
   Правила могут выглядеть следующим образом:
   ```bash
   nft add rule inet filter input ip saddr <your_ip_range> accept
   nft add rule inet filter input icmp type echo-request accept
   ```

### 2. Автоматизация с помощью конфигурационных менеджеров

Если SaltStack не работает должным образом, стоит рассмотреть альтернативные инструменты. Puppet и Ansible - хорошие варианты, но каждый из них имеет свои особенности. 

#### Puppet:

1. **Создание модуля**:
   Вы можете создать Puppet-модуль, который будет управлять `nftables`. Он может быть написан с помощью языка Puppet DSL, чтобы создавать таблицы, цепочки и правила.

2. **Простая интеграция**:
   Puppet также может быть проще в интеграции с конфигурациями, особенно если у вас уже есть рабочий рендеринг в Puppet.

#### Ansible:

Для более быстрого применения правил можно использовать `ansible-pull` для инициализации конфигурации на серверах или asynchronous playbook для группы серверов.

### 3. Centralized Management with a Policy Definition Language

Если вы хотите масштабируемое и гибкое решение, можно рассмотреть использование систем управления политиками:

- **Open Policy Agent (OPA)** или другие системы, которые позволяют определять политики в декларативном виде и опосредованно применять их через REST-API. Это может быть слою, обрабатывающим комплексные политики, которые управляют правилами `nftables`.

### 4. Импортирование и экспорта правил

Можете рассмотреть возможность создания скриптов, которые будут экспортировать текущие правила с одного сервера и импортировать на другие, что даст вам возможность синхронизировать изменения.

### Заключение

Эти методы помогут вам оптимизировать управление фильтрацией трафика на ваших серверах. Использование `nftables` совместно с конфигурационными менеджерами, такими как Puppet или Ansible, должно обеспечить автоматизированный подход к управлению правилами на большом количестве организаций. В конечном итоге, ваш выбор инструментов будет зависеть от привычек вашей команды и существующей инфраструктуры.
Ansible с параллельным mitogen даже на таком количестве хостов нормален.
Похожие вопросы