Nova 보안 그룹

1 개요[ | ]

Security Groups
보안 그룹

https://docs.openstack.org/nova/2024.1/user/security-groups.html


보안 그룹은 서버에 적용되는 IP 필터 규칙 집합으로, 서버에 대한 네트워킹 접근을 정의합니다. 그룹 규칙은 프로젝트별로 특정되며, 프로젝트 멤버는 기본 규칙을 수정하고 새로운 규칙 세트를 추가할 수 있습니다.

모든 프로젝트에는 default 보안 그룹이 있으며, 다른 보안 그룹이 정의되지 않은 포트에 적용됩니다. 기본 설정을 변경하지 않으면 이 보안 그룹은 모든 들어오는 트래픽을 차단하고 인스턴스에서 나가는 트래픽만 허용합니다.

초기에 알아두어야 할 중요한 점은 보안 그룹과 그 할당량은 네트워킹 서비스인 Neutron의 리소스라는 것입니다. 이는 서버가 아닌 포트의 속성으로 모델링됩니다. 이와 관련하여 Nova는 사용자가 서버에 연결된 모든 포트에서 보안 그룹을 추가 및 제거할 수 있는 유틸리티 API를 제공합니다. 또한, 새로운 서버를 생성할 때 새로 생성된 포트에 설정할 보안 그룹을 지정하고, 서버에 연결된 모든 포트의 결합된 보안 그룹 세트를 조회하는 것도 가능합니다.

Note

Nova는 이전에 자체 보안 그룹 API를 제공했습니다. 이러한 API는 Neutron API의 프록시 API였으며, 마이크로버전 2.36부터 지원중단되었습니다.

2 사용법[ | ]

보안 그룹 관련 작업은 크게 세 가지 범주로 나눌 수 있습니다: 보안 그룹과 보안 그룹 규칙 자체에 대한 작업, 포트에 대한 작업, 서버에 대한 작업.

보안 그룹과 보안 그룹 규칙 작업

기본적으로 프로젝트 멤버라면 누구나 보안 그룹을 생성할 수 있습니다. 예시:

$ openstack security group create --description <description> ... <name>

Tip

새 보안 그룹을 추가할 때, 설명적이면서도 간결한 이름을 선택하는 것이 좋습니다. 이 이름은 서버에 사용될 때 짧은 설명에서 표시되며, 긴 설명 필드는 종종 표시되지 않습니다. 예를 들어, 서버가 http라는 보안 그룹을 사용하는 것이 bobs_group이나 secgrp1보다 이해하기 쉽습니다.

보안 그룹은 실제로 규칙을 담는 컨테이너에 불과합니다. 보안 그룹 규칙은 실제로 적용될 IP 필터 규칙을 정의합니다. 보안 그룹은 기본적으로 모든 것을 차단하며, 규칙은 허용할 항목을 지정합니다. 일반적으로 보안 그룹 규칙은 다음 속성으로 구성됩니다: IP 프로토콜 (ICMP, TCP, UDP 중 하나), 대상 포트 또는 포트 범위, 원격 IP 범위 (CIDR 형식). 이러한 속성과 규칙을 추가할 보안 그룹을 지정하여 보안 그룹 규칙을 생성합니다. 예시:

$ openstack security group rule create \
    --protocol <protocol> --dst-port <port-range> \
    --remote-ip <ip-address> \
    <group>

Note

<port-range> 인수는 port 또는 from-port:to-port 형식을 취합니다. 이는 연결이 접근할 수 있는 로컬 포트 범위를 지정하며, 연결의 소스 및 대상 포트를 지정하는 것이 아닙니다.

대신 원격 IP 범위를 지정하는 대신 원격 보안 그룹을 지정할 수 있습니다. 원격 그룹은 지정된 프로토콜 및 포트로부터 해당 포트를 사용하는 모든 서버의 요청을 허용합니다. 보안 그룹 규칙을 원격 그룹 foo로 생성하고 해당 보안 그룹을 서버 bar에 적용하면, bar는 보안 그룹 foo가 있는 다른 서버로부터 매치하는 트래픽을 수신할 수 있습니다. 원격 보안 그룹이 있는 보안 그룹 규칙은 원격 IP가 있는 보안 그룹 규칙과 거의 동일한 방식으로 생성됩니다. 예시:

$ openstack security group rule create \
    --protocol <protocol> --dst-port <port-range> \
    --remote-group <remote-group> \
    <group>

생성된 후, 보안 그룹과 보안 그룹 규칙을 나열할 수 있습니다. 예시:

$ openstack security group list
$ openstack security group rule list <group>

마찬가지로 개별 보안 그룹 또는 보안 그룹 규칙을 확인할 수 있습니다. 예시:

$ openstack security group show <group>
$ openstack security group rule show <group> <rule>

마지막으로 보안 그룹을 삭제할 수 있습니다. 이 경우 보안 그룹과 관련된 보안 그룹 규칙도 삭제됩니다. 예시:

$ openstack security group delete <group>

또는 기존 그룹에서 개별 규칙을 삭제할 수 있습니다. 예시:

$ openstack security group rule delete <rule>
포트 작업

보안 그룹은 포트의 속성입니다. 기본적으로 Neutron은 모든 새로 생성된 포트에 default 보안 그룹을 할당합니다. 이 동작은 비활성화할 수 있습니다. 예시:

$ openstack port create --no-security-group ... <name>

새 포트를 생성할 때 다른 보안 그룹을 지정할 수도 있습니다. 예시:

$ openstack port create --security-group <group> ... <name>

Note

포트를 생성할 때 보안 그룹을 지정하면 default 보안 그룹은 포트에 추가되지 않습니다. default 보안 그룹을 추가하려면 이를 별도로 지정해야 합니다.

기존 포트에서 추가 보안 그룹을 추가하거나 제거할 수도 있습니다. 예시:

$ openstack port set --security-group <group> ... <port>
$ openstack port unset --security-group <group> ... <port>

포트에서 모든 보안 그룹을 제거하는 것도 가능합니다. 예시:

$ openstack port set --no-security-group <port>
서버 작업

서버 전체에서 보안 그룹을 조작하고 설정할 수 있습니다. 새 서버를 생성할 때 네트워크는 자동으로 할당되거나(“네트워크 얻기” 기능) 수동으로 설정될 수 있습니다. 두 경우 모두 네트워크를 서버에 연결하면 포트가 생성됩니다. 이러한 포트에 할당할 보안 그룹을 하나 이상 지정할 수 있습니다. 예시:

$ openstack server create --security-group <group> ... <name>

Important

이러한 보안 그룹은 자동으로 생성된 포트에만 적용됩니다. 부팅 시 서버에 연결된 사전 생성된 포트에는 적용되지 않습니다. 보안 그룹이 지정되지 않은 경우, 현재 프로젝트의 default 보안 그룹이 사용됩니다. 자동으로 생성된 포트에 보안 그룹을 적용하지 않도록 지정할 수 없습니다. 서버의 포트에서 default 보안 그룹을 제거하려면 사전 생성된 포트를 사용하거나 서버가 생성된 후 보안 그룹을 제거해야 합니다.

서버가 생성된 후, 서버에 연결된 모든 포트에서 보안 그룹을 추가하거나 제거할 수 있습니다. 예를 들어:

$ openstack server add security group <server> <group>
$ openstack server remove security group <server> <group>

Note

커스터마이즈되지 않았다면, default 보안 그룹은 서버에서의 이그레스 트래픽을 허용합니다. 이 그룹을 제거하고 다른 보안 그룹을 통해 이그레스 트래픽을 허용하지 않으면, 서버는 메타데이터 서비스와 통신할 수 없습니다.

서버와 연관된 보안 그룹을 확인하는 것도 가능합니다. 예시:

$ openstack server show -f value -c security_groups

Important

보안 그룹은 서버가 아닌 포트의 속성이므로 이 값은 모든 포트에 할당된 보안 그룹의 결합된 집합입니다. 다른 포트는 서로 다른 보안 그룹 세트를 가질 수 있습니다. 개별 포트에 할당된 정확한 보안 그룹을 확인하려면 openstack port show를 사용하여 포트를 검사할 수 있습니다.

3 예제[ | ]

3개의 웹 서버 호스트와 2개의 데이터베이스 호스트로 구성된 배포를 위해 보안 그룹을 생성하는 예제를 살펴보겠습니다. 먼저, 웹 서버 호스트에 HTTP 트래픽을 허용할 보안 그룹을 구성합니다.

$ openstack security group create \
    --description "Allows Web traffic anywhere on the Internet." \
    web
+-----------------+--------------------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                                    |
+-----------------+--------------------------------------------------------------------------------------------------------------------------+
| created_at      | 2016-11-03T13:50:53Z                                                                                                     |
| description     | Allows Web traffic anywhere on the Internet.                                                                             |
| headers         |                                                                                                                          |
| id              | c0b92b20-4575-432a-b4a9-eaf2ad53f696                                                                                     |
| name            | web                                                                                                              |
| project_id      | 5669caad86a04256994cdf755df4d3c1                                                                                         |
| project_id      | 5669caad86a04256994cdf755df4d3c1                                                                                         |
| revision_number | 1                                                                                                                        |
| rules           | created_at='2016-11-03T13:50:53Z', direction='egress', ethertype='IPv4', id='4d8cec94-e0ee-4c20-9f56-8fb67c21e4df',      |
|                 | project_id='5669caad86a04256994cdf755df4d3c1', revision_number='1', updated_at='2016-11-03T13:50:53Z'                    |
|                 | created_at='2016-11-03T13:50:53Z', direction='egress', ethertype='IPv6', id='31be2ad1-be14-4aef-9492-ecebede2cf12',      |
|                 | project_id='5669caad86a04256994cdf755df4d3c1', revision_number='1', updated_at='2016-11-03T13:50:53Z'                    |
| updated_at      | 2016-11-03T13:50:53Z                                                                                                     |
+-----------------+--------------------------------------------------------------------------------------------------------------------------+

생성된 후, 포트 80에서 들어오는 HTTP 트래픽을 허용하는 새 그룹 규칙을 추가할 수 있습니다:

$ openstack security group rule create \
    --protocol tcp --dst-port 80:80 --remote-ip 0.0.0.0/0 \
    web
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2016-11-06T14:02:00Z                 |
| description       |                                      |
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| headers           |                                      |
| id                | 2ba06233-d5c8-43eb-93a9-8eaa94bc9eb5 |
| port_range_max    | 80                                   |
| port_range_min    | 80                                   |
| project_id        | 5669caad86a04256994cdf755df4d3c1     |
| project_id        | 5669caad86a04256994cdf755df4d3c1     |
| protocol          | tcp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 1                                    |
| security_group_id | c0b92b20-4575-432a-b4a9-eaf2ad53f696 |
| updated_at        | 2016-11-06T14:02:00Z                 |
+-------------------+--------------------------------------+

복잡한 규칙 세트를 만들기 위해 추가 규칙을 만들 수 있습니다. 이 경우 HTTP와 HTTPS 트래픽을 모두 허용하려면 추가 규칙을 추가합니다:

$ openstack security group rule create \
    --protocol tcp --dst-port 443:443 --remote-ip 0.0.0.0/0 \
    web
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2016-11-06T14:09:20Z                 |
| description       |                                      |
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| headers           |                                      |
| id                | 821c3ef6-9b21-426b-be5b-c8a94c2a839c |
| port_range_max    | 443                                  |
| port_range_min    | 443                                  |
| project_id        | 5669caad86a04256994cdf755df4d3c1     |
| project_id        | 5669caad86a04256994cdf755df4d3c1     |
| protocol          | tcp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 1                                    |
| security_group_id | c0b92b20-4575-432a-b4a9-eaf2ad53f696 |
| updated_at        | 2016-11-06T14:09:20Z                 |
+-------------------+--------------------------------------+

Note

새로 추가된 규칙만 출력되지만, 이 작업은 추가적입니다(두 규칙이 모두 생성되고 적용됨).

보안 그룹을 하나 완료했습니다. 이제 데이터베이스 호스트를 설정해 보겠습니다. 이들은 MySQL을 실행하고 있으며 관련 포트(이 경우 3306)로의 트래픽을 제한하고 웹 서버 호스트로부터의 요청에 대한 인그레스 트래픽을 제한하고 싶습니다. 웹 서버의 IP 주소에 대해 CIDR을 지정할 수 있지만, 권장 솔루션은 소스 그룹을 구성하는 것입니다. 이렇게 하면 web 보안 그룹이 적용된 웹 서버 호스트를 동적으로 추가 및 제거할 수 있으며, 데이터베이스 호스트의 보안 그룹을 수정할 필요가 없습니다. 보안 그룹과 필요한 규칙을 생성해 보겠습니다:

$ openstack security group create database
$ openstack security group rule create \
    --protocol tcp --dst-port 3306 --remote-group web \
    database

이제 database 규칙은 웹 그룹을 사용하는 모든 서버로부터 MySQL의 기본 포트에 대한 액세스를 허용합니다.

보안 그룹과 규칙을 생성한 후, 이를 나열하여 모든 것을 확인합니다:

$ openstack security group list
+--------------------------------------+----------+-------------+
| Id                                   | Name     | Description |
+--------------------------------------+----------+-------------+
| 73580272-d8fa-4927-bd55-c85e43bc4877 | default  | default     |
| c0b92b20-4575-432a-b4a9-eaf2ad53f696 | web      | web server  |
| 40e1e336-e207-494f-a3ec-a3c222336b22 | database | database    |
+--------------------------------------+----------+-------------+

보안 그룹의 규칙을 검사할 수도 있습니다. web 보안 그룹을 살펴보겠습니다:

$ openstack security group rule list web
+--------------------------------------+-------------+-----------+-----------------+-----------------------+
| ID                                   | IP Protocol | IP Range  | Port Range      | Remote Security Group |
+--------------------------------------+-------------+-----------+-----------------+-----------------------+
| 2ba06233-d5c8-43eb-93a9-8eaa94bc9eb5 | tcp         | 0.0.0.0/0 | 80:80           | None                  |
| 821c3ef6-9b21-426b-be5b-c8a94c2a839c | tcp         | 0.0.0.0/0 | 443:443         | None                  |
+--------------------------------------+-------------+-----------+-----------------+-----------------------+

모든 것이 올바른 것으로 보인다면, 이제 이러한 보안 그룹을 사용하여 새 서버를 생성할 수 있습니다.

4 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}