daniel-rhoades.aws-security-groups

Circle CI

aws-security-group-role

Ansible-Rolle zur Vereinfachung der Bereitstellung und Außerbetriebnahme von EC2-Sicherheitsgruppen innerhalb eines AWS-Kontos.

Für detailliertere Informationen zur Erstellung von EC2-Sicherheitsgruppen mit Ansible siehe die offizielle Dokumentation zu diesem Modul: http://docs.ansible.com/ansible/ec2_group_module.html.

Anforderungen

Erfordert die neuesten Ansible-EC2-Unterstützungs-Module sowie Boto.

Sie müssen auch Ihre Ansible-Umgebung für die Verwendung mit AWS konfigurieren. Weitere Informationen finden Sie hier: http://docs.ansible.com/ansible/guide_aws.html.

Rollen-Variablen

Standardeinstellungen:

  • security_group_resource_tags: Standardmäßig der Name der Sicherheitsgruppe;
  • ec2_inbound_group_state: Status der Sicherheitsgruppenliste als "Inbound", standardmäßig present;
  • ec2_internal_inbound_group_state: Status der Sicherheitsgruppenliste als "intern inbound", standardmäßig present;
  • ec2_outbound_group_state: Status der Sicherheitsgruppenliste als "Outbound", standardmäßig present.

Erforderliche Variablen:

  • vpc_region: Sie müssen die Region angeben, in der Sie das VPC erstellt haben, z. B. eu-west-1;
  • vpc_id: Sie müssen die VPC-ID angeben, innerhalb derer Sie die Sicherheitsgruppen erstellen möchten, z. B. vpc-xxxxxxxx;
  • ec2_group_inbound_sg: Sie müssen eine Liste von Eingangs-Sicherheitsgruppen angeben, siehe Abschnitt mit Beispielen weiter unten für weitere Informationen;
  • ec2_group_internal_inbound_sg_file: Sie müssen eine Liste interner Eingangs-Sicherheitsgruppen angeben, siehe Abschnitt mit Beispielen weiter unten für weitere Informationen. Hinweis: Dies muss eine Datei sein, da sie dynamisch eingebunden wird, nachdem die Eingangsgruppen erstellt wurden;
  • ec2_group_outbound_sg: Sie müssen eine Liste von Ausgangs-Sicherheitsgruppen angeben, siehe Abschnitt mit Beispielen weiter unten für weitere Informationen.

Eingangssicherheitsgruppen sind diejenigen, die auf öffentliche Dienstleistungen angewendet werden, z. B. ein Load Balancer. Die internen Eingangssicherheitsgruppen sind für Instanzen vorgesehen, die hinter einem Load Balancer oder intern im VPC stehen. Ausgangssicherheitsgruppen sind die Ports, auf die Dienste innerhalb des Netzwerks zugreifen können.

Ausgaben:

  • ec2_group_inbound_sg: Das AWS EC2-Gruppenobjekt, das durch Ausführen des ec2_group_module mit den bereitgestellten "Inbound"-Variablen erstellt wurde;
  • ec2_group_internal_inbound_sg: Das AWS EC2-Gruppenobjekt, das durch Ausführen des ec2_group_module mit den bereitgestellten "internen Inbound"-Variablen erstellt wurde;
  • ec2_group_outbound_sg: Das AWS EC2-Gruppenobjekt, das durch Ausführen des ec2_group_module mit den bereitgestellten "Outbound"-Variablen erstellt wurde.

Die Rolle verarbeitet die Sicherheitsgruppen in der Reihenfolge:

  • inbound;
  • internal inbound;
  • outbound.

Das bedeutet, dass Sie Sicherheitsgruppen, die in der "Inbound"-Liste erstellt werden, in der "Internal Inbound"-Liste referenzieren können. Dies ist besonders nützlich, wenn Sie den Verkehr nur zwischen den "Inbound"- und "Internal Inbound"-Gruppen leiten möchten, z. B. zwischen einem Load Balancer und einem Webserver.

Abhängigkeiten

Keine Abhängigkeiten zu anderen Rollen, aber ein VPC muss bereits vorhanden sein oder erstellt werden, bevor Sie diese Rolle anwenden.

Beispiel-Playbook

Bevor Sie diese Rolle verwenden, müssen Sie die Rolle installieren. Der einfachste Weg, dies zu tun, ist: ansible-galaxy install daniel-rhoades.aws-security-group-role.

Das folgende Beispiel-Playbook stellt sicher, dass eine EC2-Sicherheitsgruppe in AWS bereitgestellt wird, wie angegeben. Wenn bereits eine Sicherheitsgruppe vorhanden ist, wird die Rolle nichts unternehmen; andernfalls wird sie erstellt. Der Vollständigkeit halber erstellt das Beispiel auch ein VPC, in dem die EC2-Sicherheitsgruppen wohnen, unter Verwendung der Rolle: daniel-rhoades.aws-vpc.

- name: Mein System | Bereitstellung der gesamten erforderlichen Infrastruktur
  hosts: localhost
  connection: local
  gather_facts: no
  vars:
    my_vpc_name: "mein_beispiel_vpc"
    my_vpc_region: "eu-west-1"
    my_vpc_cidr: "172.40.0.0/16"
    everywhere_cidr: "0.0.0.0/0"

    # Subnetz innerhalb des 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"

    # Ermöglichen Sie den Subnetzen, mit der Außenwelt zu kommunizieren
    my_public_subnet_routes:
      - subnets:
          - "{{ my_vpc_subnets[0].cidr }}"
          - "{{ my_vpc_subnets[1].cidr }}"
        routes:
          - dest: "{{ everywhere_cidr }}"
            gw: igw

    # Eingangs-Sicherheitsgruppen, z. B. öffentliche Dienstleistungen wie einen Load Balancer
    my_inbound_security_groups:
      - sg_name: inbound-web
        sg_description: http- und https-Zugriff erlauben (öffentlich)
        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-Zugriff nur innerhalb des VPC erlauben. Um auf Dienste innerhalb des VPC zuzugreifen, müssen Sie einen
      # temporären Bastion-Host erstellen
      - sg_name: inbound-ssh
        sg_description: ssh-Zugriff erlauben
        sg_rules:
         - proto: tcp
           from_port: 22
           to_port: 22
           cidr_ip: "{{ my_vpc_cidr }}"

    # Interne Eingangssicherheitsgruppen, z. B. Dienste, die nicht direkt von außerhalb des VPC, wie
    # die Webserver hinter dem Load Balancer, ausgeführt werden sollten.
    #
    # Dies muss eine Datei sein, da sie dynamisch eingebunden wird, nachdem die Eingangssicherheitsgruppen erstellt wurden
    my_internal_inbound_security_groups_file: "internal-securitygroups.yml"

    # Ausgangsregeln, z. B. welche Dienste die Webserver selbstständig zugreifen können
    my_outbound_security_groups:
      - sg_name: outbound-all
        sg_description: erlaubt ausgehenden Datenverkehr zu jeder IP-Adresse
        sg_rules:
          - proto: all
            cidr_ip: "{{ everywhere_cidr }}"
  roles:
    # Netzwerk bereitstellen
    - {
        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 }}"
      }

    # Sicherheitsgruppen bereitstellen
    - {
        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 }}"
      }

Das Beispiel internal-securitygroups.yml sieht wie folgt aus:

ec2_group_internal_inbound_sg:
  - sg_name: inbound-web-internal
    sg_description: http- und https-Zugriff erlauben (nur vom Load Balancer)
    sg_rules:
      - proto: tcp
        from_port: 80
        to_port: 80
        group_id: "{{ ec2_group_inbound_sg.results[0].group_id }}"

Um die Gruppen außer Betrieb zu nehmen:

- name: Mein System | Außerbetriebnahme aller erforderlichen Infrastruktur
  hosts: localhost
  connection: local
  gather_facts: no
  vars:
    my_vpc_name: "mein_beispiel_vpc"
    my_vpc_region: "eu-west-1"
    my_vpc_cidr: "172.40.0.0/16"
    everywhere_cidr: "0.0.0.0/0"

    # Subnetz innerhalb des 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"

    # Ermöglichen Sie den Subnetzen, mit der Außenwelt zu kommunizieren
    my_public_subnet_routes:
      - subnets:
          - "{{ my_vpc_subnets[0].cidr }}"
          - "{{ my_vpc_subnets[1].cidr }}"
        routes:
          - dest: "{{ everywhere_cidr }}"
            gw: igw

    # Eingangs-Sicherheitsgruppen, z. B. öffentliche Dienstleistungen wie einen Load Balancer
    my_inbound_security_groups:
      - sg_name: inbound-web
        sg_description: http- und https-Zugriff erlauben (öffentlich)
        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-Zugriff nur innerhalb des VPC erlauben. Um auf Dienste innerhalb des VPC zuzugreifen, müssen Sie einen
      # temporären Bastion-Host erstellen
      - sg_name: inbound-ssh
        sg_description: ssh-Zugriff erlauben
        sg_rules:
         - proto: tcp
           from_port: 22
           to_port: 22
           cidr_ip: "{{ my_vpc_cidr }}"

    # Interne Eingangssicherheitsgruppen, z. B. Dienste, die nicht direkt von außerhalb des VPC, wie
    # die Webserver hinter dem Load Balancer, ausgeführt werden sollten.
    #
    # Dies muss eine Datei sein, da sie dynamisch eingebunden wird, nachdem die Eingangssicherheitsgruppen erstellt wurden
    my_internal_inbound_security_groups_file: "internal-securitygroups.yml"

    # Ausgangsregeln, z. B. welche Dienste die Webserver selbstständig zugreifen können
    my_outbound_security_groups:
      - sg_name: outbound-all
        sg_description: erlaubt ausgehenden Datenverkehr zu jeder IP-Adresse
        sg_rules:
          - proto: all
            cidr_ip: "{{ everywhere_cidr }}"
  roles:
    # Netzwerk bereitstellen
    - {
        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 }}"
      }

    # Sicherheitsgruppen außer Betrieb nehmen
    - {
        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"
      }

Lizenz

MIT

Autoreninformation

Daniel Rhoades (https://github.com/daniel-rhoades)

Über das Projekt

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

Installieren
ansible-galaxy install daniel-rhoades.aws-security-groups
GitHub Repository
Lizenz
mit
Downloads
146
Besitzer
Strategist, Technologist and Engineer