aws-security-groups
aws-security-group-role
Роль Ansible для упрощения создания и удаления групп безопасности EC2 в аккаунте AWS.
Для получения более подробной информации о создании групп безопасности EC2 с помощью Ansible смотрите официальную документацию к этому модулю: http://docs.ansible.com/ansible/ec2_group_module.html.
Требования
Требуются последние версии модулей поддержки EC2 для Ansible и Boto.
Вам также потребуется настроить ваше окружение Ansible для работы с AWS, смотрите http://docs.ansible.com/ansible/guide_aws.html.
Переменные роли
По умолчанию:
- security_group_resource_tags: По умолчанию — имя группы безопасности;
- ec2_inbound_group_state: Состояние списка групп безопасности как "входящие", по умолчанию
present
; - ec2_internal_inbound_group_state: Состояние списка групп безопасности как "внутренние входящие", по умолчанию
present
; - ec2_outbound_group_state: Состояние списка групп безопасности как "исходящие", по умолчанию
present
.
Обязательные переменные:
- vpc_region: Необходимо указать регион, в котором вы создали VPC, например, eu-west-1;
- vpc_id: Необходимо указать ID VPC, в рамках которого вы хотите создать группы безопасности, например, vpc-xxxxxxxx;
- ec2_group_inbound_sg: Необходимо указать список входящих групп безопасности для создания, смотрите раздел примеров сценария ниже для получения дополнительной информации;
- ec2_group_internal_inbound_sg_file: Необходимо указать файл со списком внутренних входящих групп безопасности для создания, смотрите раздел примеров сценария ниже для получения дополнительной информации. Обратите внимание, что это должен быть файл, так как он будет включен динамически после создания входящих групп;
- ec2_group_outbound_sg: Необходимо указать список исходящих групп безопасности для создания, смотрите раздел примеров сценария ниже для получения дополнительной информации.
Ожидается, что входящие группы безопасности будут применяться к общедоступным службам, например, к балансировщику нагрузки. Внутренние входящие группы безопасности предназначены для инстансов за балансировщиком нагрузки или внутренних служб VPC. Исходящие группы безопасности представляют собой порты, которые службы могут вызывать изнутри сети.
Выходные данные:
- ec2_group_inbound_sg: Объект группы AWS EC2, созданный в результате выполнения
ec2_group_module
с указанными переменными "входящие"; - ec2_group_internal_inbound_sg: Объект группы AWS EC2, созданный в результате выполнения
ec2_group_module
с указанными переменными "внутренние входящие"; - ec2_group_outbound_sg: Объект группы AWS EC2, созданный в результате выполнения
ec2_group_module
с указанными переменными "исходящие".
Роль обрабатывает группы безопасности в следующем порядке:
- входящие;
- внутренние входящие;
- исходящие.
Это означает, что вы можете ссылаться на группы безопасности, которые будут созданы в списке "входящие", в списке "внутренние входящие"; это особенно полезно, когда вы хотите направить трафик только между входящими и внутренними входящими группами, например, между балансировщиком нагрузки и веб-сервером.
Зависимости
Нет зависимостей от других ролей, но VPC должен уже существовать или быть созданным до применения этой роли.
Пример сценария
Перед использованием этой роли вам нужно установить ее, самый простой способ сделать это: ansible-galaxy install daniel-rhoades.aws-security-group-role
.
Пример сценария ниже гарантирует создание группы безопасности EC2 в AWS согласно спецификации. Если одна из групп уже существует, роль ничего не делает, иначе она создается. Для полноты примеров также создается VPC, в которой будут находиться группы безопасности EC2 с помощью роли: daniel-rhoades.aws-vpc
.
- name: Моя система | Проведение всей необходимой инфраструктуры
hosts: localhost
connection: local
gather_facts: no
vars:
my_vpc_name: "my_example_vpc"
my_vpc_region: "eu-west-1"
my_vpc_cidr: "172.40.0.0/16"
everywhere_cidr: "0.0.0.0/0"
# Подсети в VPC
my_vpc_subnets:
- cidr: "172.40.10.0/24"
az: "{{ my_vpc_region }}a"
- cidr: "172.40.20.0/24"
az: "{{ my_vpc_region }}b"
# Позволяем подсетям выходить в интернет
my_public_subnet_routes:
- subnets:
- "{{ my_vpc_subnets[0].cidr }}"
- "{{ my_vpc_subnets[1].cidr }}"
routes:
- dest: "{{ everywhere_cidr }}"
gw: igw
# Входящие группы безопасности, например, общедоступные службы, такие как балансировщик нагрузки
my_inbound_security_groups:
- sg_name: inbound-web
sg_description: разрешить доступ по http и https (публичный)
sg_rules:
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: "{{ everywhere_cidr }}"
- proto: tcp
from_port: 443
to_port: 443
cidr_ip: "{{ everywhere_cidr }}"
# Разрешить доступ по SSH только изнутри VPC, чтобы получить доступ к любой службе внутри VPC, вам нужно создать
# временный хост-посредник
- sg_name: inbound-ssh
sg_description: разрешить доступ по ssh
sg_rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: "{{ my_vpc_cidr }}"
# Внутренние входящие группы безопасности, например, службы, которые не должны быть доступны из вне VPC, такие как
# веб-серверы за балансировщиком нагрузки.
#
# Это должен быть файл, так как он должен быть динамически включен после создания входящих групп безопасности
my_internal_inbound_security_groups_file: "internal-securitygroups.yml"
# Исходные правила, например, к каким службам могут обращаться веб-серверы самостоятельно
my_outbound_security_groups:
- sg_name: outbound-all
sg_description: разрешает исходящий трафик к любому IP-адресу
sg_rules:
- proto: all
cidr_ip: "{{ everywhere_cidr }}"
roles:
# Создание сети
- {
role: daniel-rhoades.aws-vpc,
vpc_name: "{{ my_vpc_name }}",
vpc_region: "{{ my_vpc_region }}",
vpc_cidr_block: "{{ my_vpc_cidr }}",
vpc_subnets: "{{ my_vpc_subnets }}",
public_subnet_routes: "{{ my_public_subnet_routes }}"
}
# Создание групп безопасности
- {
role: daniel-rhoades.aws-security-groups,
vpc_region: "{{ my_vpc_region }}",
vpc_id: "{{ vpc.vpc_id }}",
ec2_group_inbound_sg: "{{ my_inbound_security_groups }}",
ec2_group_internal_inbound_sg_file: "{{ my_internal_inbound_security_groups_file }}",
ec2_group_outbound_sg: "{{ my_outbound_security_groups }}"
}
Пример файла internal-securitygroups.yml
выглядит так:
ec2_group_internal_inbound_sg:
- sg_name: inbound-web-internal
sg_description: разрешить доступ по http и https (только от балансировщика нагрузки)
sg_rules:
- proto: tcp
from_port: 80
to_port: 80
group_id: "{{ ec2_group_inbound_sg.results[0].group_id }}"
Для удаления групп:
- name: Моя система | Удаление всей необходимой инфраструктуры
hosts: localhost
connection: local
gather_facts: no
vars:
my_vpc_name: "my_example_vpc"
my_vpc_region: "eu-west-1"
my_vpc_cidr: "172.40.0.0/16"
everywhere_cidr: "0.0.0.0/0"
# Подсети в VPC
my_vpc_subnets:
- cidr: "172.40.10.0/24"
az: "{{ my_vpc_region }}a"
- cidr: "172.40.20.0/24"
az: "{{ my_vpc_region }}b"
# Позволяем подсетям выходить в интернет
my_public_subnet_routes:
- subnets:
- "{{ my_vpc_subnets[0].cidr }}"
- "{{ my_vpc_subnets[1].cidr }}"
routes:
- dest: "{{ everywhere_cidr }}"
gw: igw
# Входящие группы безопасности, например, общедоступные службы, такие как балансировщик нагрузки
my_inbound_security_groups:
- sg_name: inbound-web
sg_description: разрешить доступ по http и https (публичный)
sg_rules:
- proto: tcp
from_port: 80
to_port: 80
cidr_ip: "{{ everywhere_cidr }}"
- proto: tcp
from_port: 443
to_port: 443
cidr_ip: "{{ everywhere_cidr }}"
# Разрешить доступ по SSH только изнутри VPC, чтобы получить доступ к любой службе внутри VPC, вам нужно создать
# временный хост-посредник
- sg_name: inbound-ssh
sg_description: разрешить доступ по ssh
sg_rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: "{{ my_vpc_cidr }}"
# Внутренние входящие группы безопасности, например, службы, которые не должны быть доступны из вне VPC, такие как
# веб-серверы за балансировщиком нагрузки.
#
# Это должен быть файл, так как он должен быть динамически включен после создания входящих групп безопасности
my_internal_inbound_security_groups_file: "internal-securitygroups.yml"
# Исходные правила, например, к каким службам могут обращаться веб-серверы самостоятельно
my_outbound_security_groups:
- sg_name: outbound-all
sg_description: разрешает исходящий трафик к любому IP-адресу
sg_rules:
- proto: all
cidr_ip: "{{ everywhere_cidr }}"
roles:
# Создание сети
- {
role: daniel-rhoades.aws-vpc,
vpc_name: "{{ my_vpc_name }}",
vpc_region: "{{ my_vpc_region }}",
vpc_cidr_block: "{{ my_vpc_cidr }}",
vpc_subnets: "{{ my_vpc_subnets }}",
public_subnet_routes: "{{ my_public_subnet_routes }}"
}
# Удаление групп безопасности
- {
role: daniel-rhoades.aws-security-groups,
vpc_region: "{{ my_vpc_region }}",
vpc_id: "{{ vpc.vpc_id }}",
ec2_group_inbound_sg: "{{ my_inbound_security_groups }}",
ec2_group_internal_inbound_sg_file: "{{ my_internal_inbound_security_groups_file }}",
ec2_group_outbound_sg: "{{ my_outbound_security_groups }}",
ec2_inbound_group_state: "absent",
ec2_internal_inbound_group_state: "absent",
ec2_outbound_group_state: "absent"
}
Лицензия
MIT
Информация об авторе
Даниэль Роудс (https://github.com/daniel-rhoades)
Ansible role for simplifying the provisioning and decommissioning of a EC2 Security Groups within an AWS account
ansible-galaxy install daniel-rhoades/aws-security-groups-role