daniel-rhoades.aws-security-groups
aws-security-group-role
Rol de Ansible para simplificar la provisión y desmantelamiento de Grupos de Seguridad de EC2 dentro de una cuenta de AWS.
Para obtener información más detallada sobre cómo crear Grupos de Seguridad de EC2 con Ansible, consulta la documentación oficial para ese módulo: http://docs.ansible.com/ansible/ec2_group_module.html.
Requisitos
Requiere los módulos de soporte de EC2 de Ansible más recientes junto con Boto.
También necesitarás configurar tu entorno de Ansible para usar con AWS, consulta http://docs.ansible.com/ansible/guide_aws.html.
Variables del Rol
Valores predeterminados:
- security_group_resource_tags: Se establece en el nombre del grupo de seguridad;
- ec2_inbound_group_state: Estado de la lista de grupos de seguridad como "inbound", predeterminado en
present
; - ec2_internal_inbound_group_state: Estado de la lista de grupos de seguridad como "internal inbound", predeterminado en
present
; - ec2_outbound_group_state: Estado de la lista de grupos de seguridad como "outbound", predeterminado en
present
.
Variables requeridas:
- vpc_region: Debes especificar la región en la que creaste la VPC, por ejemplo, eu-west-1;
- vpc_id: Debes especificar el ID de la VPC en la que deseas crear los grupos de seguridad, por ejemplo, vpc-xxxxxxxx;
- ec2_group_inbound_sg: Debes especificar una lista de grupos de seguridad de entrada a crear, consulta la sección de ejemplo de playbook a continuación para más información;
- ec2_group_internal_inbound_sg_file: Debes especificar una lista de grupos de seguridad internos de entrada a crear, consulta la sección de ejemplo de playbook a continuación para más información. Nota que debe ser un archivo, ya que se incluirá dinámicamente después de que se hayan creado los grupos de entrada;
- ec2_group_outbound_sg: Debes especificar una lista de grupos de seguridad de salida a crear, consulta la sección de ejemplo de playbook a continuación para más información.
Se espera que los grupos de seguridad de entrada sean aquellos que aplicarías a servicios expuestos al público, por ejemplo, un balanceador de carga. Los grupos de seguridad internos de entrada están destinados a instancias detrás de un balanceador de carga o internas a la VPC. Los grupos de seguridad de salida son los puertos a los que los servicios pueden acceder desde dentro de la red.
Salidas:
- ec2_group_inbound_sg: El objeto de Grupo EC2 de AWS creado como resultado de ejecutar el
ec2_group_module
con las variables de "inbound" proporcionadas; - ec2_group_internal_inbound_sg: El objeto de Grupo EC2 de AWS creado como resultado de ejecutar el
ec2_group_module
con las variables de "internal inbound" proporcionadas; - ec2_group_outbound_sg: El objeto de Grupo EC2 de AWS creado como resultado de ejecutar el
ec2_group_module
con las variables de "outbound" proporcionadas.
El rol procesa los grupos de seguridad en el siguiente orden:
- inbound;
- internal inbound;
- outbound.
Esto significa que puedes hacer referencia a los grupos de seguridad que se crearán dentro de la lista "inbound" en la lista "internal inbound", lo cual es útil cuando deseas enrutar el tráfico solo entre los grupos de entrada y los grupos de entrada internos, por ejemplo, como un balanceador de carga y un servidor web.
Dependencias
No hay dependencias de otros roles, pero una VPC debe existir o ser creada antes de aplicar este rol.
Ejemplo de Playbook
Antes de usar este rol, deberás instalarlo. La forma más sencilla de hacerlo es: ansible-galaxy install daniel-rhoades.aws-security-group-role
.
El ejemplo de playbook a continuación asegura que se provisiona un Grupo de Seguridad EC2 en AWS según lo especificado, es decir, si ya uno coincide, el rol no hace nada, de lo contrario, se crea. Para ser completo, los ejemplos también crean una VPC en la que residirán los Grupos de Seguridad de EC2 usando el rol: daniel-rhoades.aws-vpc
.
- name: Mi Sistema | Provisione toda la infraestructura requerida
hosts: localhost
connection: local
gather_facts: no
vars:
my_vpc_name: "mi_vpc_de_ejemplo"
my_vpc_region: "eu-west-1"
my_vpc_cidr: "172.40.0.0/16"
everywhere_cidr: "0.0.0.0/0"
# Subredes dentro de la 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"
# Permitir que las subredes se conecten al mundo exterior
my_public_subnet_routes:
- subnets:
- "{{ my_vpc_subnets[0].cidr }}"
- "{{ my_vpc_subnets[1].cidr }}"
routes:
- dest: "{{ everywhere_cidr }}"
gw: igw
# Grupos de seguridad de entrada, por ejemplo, servicios expuestos al público como un balanceador de carga
my_inbound_security_groups:
- sg_name: inbound-web
sg_description: permite acceso http y https (público)
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 }}"
# Solo permite acceso SSH desde dentro de la VPC. Para acceder a cualquier servicio dentro de la VPC, necesitarías crear un
# host bastión temporal
- sg_name: inbound-ssh
sg_description: permite acceso ssh
sg_rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: "{{ my_vpc_cidr }}"
# Grupos de seguridad internos de entrada, por ejemplo, servicios que no deben ser accesibles directamente desde fuera de la VPC, tales como
# los servidores web detrás del balanceador de carga.
#
# Esto tiene que ser un archivo, ya que debe incluirse dinámicamente después de que se hayan creado los grupos de seguridad de entrada
my_internal_inbound_security_groups_file: "internal-securitygroups.yml"
# Reglas de salida, por ejemplo, a qué servicios pueden acceder los servidores web por sí mismos
my_outbound_security_groups:
- sg_name: outbound-all
sg_description: permite tráfico de salida a cualquier dirección IP
sg_rules:
- proto: all
cidr_ip: "{{ everywhere_cidr }}"
roles:
# Provisión de redes
- {
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 }}"
}
# Provisión de grupos de seguridad
- {
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 }}"
}
El ejemplo internal-securitygroups.yml
se ve así:
ec2_group_internal_inbound_sg:
- sg_name: inbound-web-internal
sg_description: permite acceso http y https (solo desde el balanceador de carga)
sg_rules:
- proto: tcp
from_port: 80
to_port: 80
group_id: "{{ ec2_group_inbound_sg.results[0].group_id }}"
Para desmantelar los grupos:
- name: Mi Sistema | Desmantelar toda la infraestructura requerida
hosts: localhost
connection: local
gather_facts: no
vars:
my_vpc_name: "mi_vpc_de_ejemplo"
my_vpc_region: "eu-west-1"
my_vpc_cidr: "172.40.0.0/16"
everywhere_cidr: "0.0.0.0/0"
# Subredes dentro de la 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"
# Permitir que las subredes se conecten al mundo exterior
my_public_subnet_routes:
- subnets:
- "{{ my_vpc_subnets[0].cidr }}"
- "{{ my_vpc_subnets[1].cidr }}"
routes:
- dest: "{{ everywhere_cidr }}"
gw: igw
# Grupos de seguridad de entrada, por ejemplo, servicios expuestos al público como un balanceador de carga
my_inbound_security_groups:
- sg_name: inbound-web
sg_description: permite acceso http y https (público)
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 }}"
# Solo permite acceso SSH desde dentro de la VPC, para acceder a cualquier servicio dentro de la VPC necesitarías crear un
# host bastión temporal
- sg_name: inbound-ssh
sg_description: permite acceso ssh
sg_rules:
- proto: tcp
from_port: 22
to_port: 22
cidr_ip: "{{ my_vpc_cidr }}"
# Grupos de seguridad internos de entrada, por ejemplo, servicios que no deben ser accesibles directamente desde fuera de la VPC, tales como
# los servidores web detrás del balanceador de carga.
#
# Esto tiene que ser un archivo, ya que necesita incluirse dinámicamente después de que se hayan creado los grupos de seguridad de entrada
my_internal_inbound_security_groups_file: "internal-securitygroups.yml"
# Reglas de salida, por ejemplo, a qué servicios pueden acceder los servidores web por sí mismos
my_outbound_security_groups:
- sg_name: outbound-all
sg_description: permite tráfico de salida a cualquier dirección IP
sg_rules:
- proto: all
cidr_ip: "{{ everywhere_cidr }}"
roles:
# Provisión de redes
- {
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 }}"
}
# Desmantelamiento de grupos de seguridad
- {
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"
}
Licencia
MIT
Información del Autor
Daniel Rhoades (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