Группы безопасности

Один из наиболее распространенных вопросов начинающих работу с OpenStack пользователей является сбой установки соответствующей группы безопасности при запуске экземпляра. В результате пользователи не могут взаимодействовать с экземпляром по сети.

Группы безопасности являются наборами правил фильтрации IP, которые применяются к сетевым средствам экземпляра. Они являются специфическими для проектов и, следовательно, члены проекта могут редактировать установленные по умолчанию правила для своей группы, а также добавлять новые множества правил. Все проекты имеют "установленную по умолчанию" группу безопасности, которая применяется к экземплярам, для которых не определена никакая другая группа безопасности. Пока она не изменена, эта группы безопасности отклоняет весь входящий трафик.

 Настройка общих групп безопасности

Параметр nova.conf allow_same_net_traffic (по умолчанию имеющий значение true) глобально управляет тем, применяются ли правила к совместно использующим сеть хостам. Будучи установленным в значение true (истинно), хосты из той же подсети не фильтруются и разрешены все типы обмена данными между ними. В однородной сети это разрешает нефильтруемое взаимодействие всем экземплярам всех проектов. При использовании сетевого окружения с виртуальными сетями это делает возможным взаимодействие между экземплярами в пределах одного проекта. Когда значение allow_same_net_traffic установлено в false, ко всем соединениям применяются группы безопасности. В данном случае проекты могут имитировать allow_same_net_traffic путем настройки своих групп безопасности по умолчанию, разрешая весь трафик в своей подсети.

[Совет]Совет

Как отмечено в предыдущей главе,число правил в группе безопасности управляется quota_security_group_rules, а число доступных для проекта групп управляется квотой quota_security_groups.

 Настройка групп безопасности конечного пользователя

Группы безопасности для данного конкретного проекта могут быть найдены в инструментальной панели OpenStack в разделе Access & Security. Для просмотра деталей существующей группы выберите действие edit (редактирование) для данной группы безопасности. Понятно, что изменение существующих групп может быть выполнено из этого интерфейса edit. Существует на главной странице Access & Security для создания новых групп кнопка Create Security Group. Мы обсудим используемые в этих полях термины по мере объяснения эквивалентов командной строки.

Вы можете получить список групп безопасности для определенного проекта, с которым вы работаете в настоящее время, выполнением команды nova в командной строке:

$ nova secgroup-list
+---------+-------------+
| Name    | Description |
+---------+-------------+
| default | default     |
| open    | all ports   |
+---------+-------------+

Для просмотра деталей группы безопасности "open":

$ nova secgroup-list-rules open
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp        | -1        | 255     | 0.0.0.0/0 |              |
| tcp         | 1         | 65535   | 0.0.0.0/0 |              |
| udp         | 1         | 65535   | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+

Все приводимые правила являются правилами "разрешающего" (allow) типа, хотя по умолчанию установлены запрещающие (deny). Первый столбец является типом протокола IP (один из icmp, tcp или udp), а второй и третий столбцы описывают подвергаемый действию диапазон портов. Четвертый столбец определяет диапазон IP в формате CIDR. Данный пример демонстрирует полный диапазон портов для всех протоколов, разрешаемых всем IP адресам.

При добавлении новой группы безопасности вы должны выбрать описательное, но краткое имя. Это имя появляется в кратких описаниях экземпляров, которые используют его там, где большие поля описания часто не доступны. Видя, что экземпляр использует группу безопасности http, будет гораздо легче понять ее назначение, чем в случае ее именования bobs_group или secgrp1.

В качестве примера, давайте создадим группу безопасности, которая позволяет веб-трафик повсеместно в интернете. Мы будем называть ее global_http, что ясно и разумно кратко и при этом содержит информацию о том, что разрешено и откуда. В командной строке выполните:

$ nova secgroup-create \
 global_http "allow web traffic from the Internet"
+-------------+-------------------------------------+
| Name        | Description                         |
+-------------+-------------------------------------+
| global_http | allow web traffic from the Internet |
+-------------+-------------------------------------+

Это создает пустую группу безопасности. Чтобы заставить ее выполнять то, что нужно нам, мы должны добавить некоторые правила:

$ nova secgroup-add-rule <secgroup> <ip-proto> <from-port> <to-port> <cidr>
$ nova secgroup-add-rule global_http tcp 80 80 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 80        | 80      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+

Обратите внимание, что все аргументы являются позиционными, а аргумент from-port и аргумент to-port определяют диапазон разрешенных соединений локальных портов. Эти аргументы не обозначают порты источника и получателя в соединении. Более сложные наборы правил могут быть построены посредством множественных вызовов nova secgroup-add-rule. Например, если вы хотите обмениваться и http, и https трафиком, выполните следующее:

$ nova secgroup-add-rule global_http tcp 443 443 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 443       | 443     | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+

Несмотря на вывод только вновь добавленного правила последняя операция аддитивная:

$ nova secgroup-list-rules global_http
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 80        | 80      | 0.0.0.0/0 |              |
| tcp         | 443       | 443     | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+

Обратная операция называется secgroup-delete-rule и использует тот же формат. C помощью secgroup-delete могут быть удалены группы безопасности целиком.

Чтобы создать правила группы безопасности для кластера экземпляров вы захотите воспользоваться SourceGroups.

SourceGroup представляют собой особый динамический способ определения в формате CIDR разрешенных источников. Пользователь описывает SourceGroup (имя группы безопасности) и все другие использующие определенную SourceGroup экземпляры пользователя выбираются динамически. Такой динамический выбор избавляет от необходимости в индивидуальных правилах для каждого нового члена cluster.

Код коструируется подобно такому: nova secgroup-add-group-rule <secgroup> <source-group> <ip-proto> <from-port> <to-port>. Ниже приводится пример использования:

$ nova secgroup-add-group-rule cluster global-http tcp 22 22

Правило "cluster" делает возможным SSH доступ из любого другого экземпляра, который использует группу global-http.