daniel-rhoades.aws-security-groups

Circle CI

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)

Acerca del proyecto

Ansible role for simplifying the provisioning and decommissioning of a EC2 Security Groups within an AWS account

Instalar
ansible-galaxy install daniel-rhoades.aws-security-groups
Licencia
mit
Descargas
146
Propietario
Strategist, Technologist and Engineer