Saltar a contenido

Automate your Steampipe AWS configuration with AWS Organizations

Esta vez os traemos nuestra primera tool pública!

Si utilizáis Steampipe con vuestra organización de AWS esto os interesa. Hemos creado esta tool para automatizar la creación y el mantenimiento de los archivos de configuración necesarios para trabajar con todas las cuentas de una organización de AWS.

architecture architecture

Steampipe es una herramienta que nos permite hacer queries a APIs, entre otras cosas, usando SQL. Uno de los grandes usos que tiene es usarlo con AWS, de esta forma podremos obtener información de nuestros recursos usando SQL.

En caso de querer utilizarlo con varias cuentas de AWS deberemos modificar el fichero ~/.steampipe/config/aws.spc, añadiendo cada una de las cuentas, y el fichero ~/.aws/credentials, añadiendo los perfiles necesarios para cada cuenta. Podéis encontrar todo el detalle en su documentación.

Si vuestra organización de AWS cambia frecuentemente, mantener estos archivos actualizados puede ser algo engorroso. Steampipe tiene unos scripts para automatizar esto en repo steampipe-samples, pero nosotros hemos decidido llevarlo esta automatización al siguiente nivel y añadir algunas features más.

Requisitos

Para poder usar la tool, necesitaréis:

  1. Credenciales de AWS con los siguientes permisos de IAM:

    "organizations:ListAccounts",
    "organizations:ListParents",
    "organizations:ListTagsForResource"
    

  2. Un IAM Role creado en todas las cuentas de tu organización con los permisos requeridos para las queries de Steampipe, por ejemplo la managed policy arn:aws:iam::aws:policy/SecurityAudit. Para más detalle de cómo hacer esto podéis echar un ojo a nuestro post Deploy IAM Roles across an AWS Organization as code.

Features

  • Automatiza la generación de los ficheros ~/.steampipe/config/aws.spc y ~/.aws/credentials.
  • Obtiene todas las cuentas de tu AWS Organization.
  • Posibilidad de ignorar Organizational Units (OUs).
  • Soporta IMDSv2 en EC2 y ECS, y entorno local.
  • Template para añadir agregators personalizados.
  • Crear agregators en base a los tags de las cuentas.
  • Habilitar/Deshabilitar Steampipe import schema.

Cómo funciona?

  1. Obtiene una lista completa de todos los nombres y IDs de las cuentas de la organización que estén activas.
  2. En caso de haber especificado alguna OU a evitar, comprueba las cuentas que se encuentren en ella para no generar sus connections.
  3. Obtiene los tags asociados a cada cuenta.
  4. Normaliza los nombres de cuenta a minúscula, sustituyendo espacios y guiones por _.
  5. Genera los archivos de configuración en base a un template.

flow flow

Cómo usarlo?

./steampipe_config_generator -role my-org-role-name

Si necesitáis ejecutarlo en EC2 se debe usar la flag -credential Ec2InstanceMetadata. En caso de ejecutarlo en ECS se debe usar -credential EcsContainer.

Important

Revisa el repositorio steampipe-config-generator para ver todas las opciones disponibles. Allí siempre tendrás toda la info actualizada.

Tip

Podéis ejecutar el script antes de iniciar Steampipe para tener siempre vuestras connections actualizadas.

docker-entrypoint.sh
#!/usr/bin/env bash

./config_generator -role my-org-role-name -credential EcsContainer

exec "$@"

Dockerfile
...
ENTRYPOINT [ "/bin/bash", "docker-entrypoint.sh" ]
CMD [ "steampipe", "service", "start", "--foreground"]

Custom Aggregators

El fichero aws_connections.tmpl se usa como template para generar las connections. Puedes editarlo para añadir los aggregators deseados, como por ejemplo:

  • Aggregator en base a tus nombres de cuentas de AWS. Este ejemplo creará un aggregator con todas tus cuentas de AWS cuyos nombres empiecen por Sandbox:

    connection "aws_sandbox" {
      plugin      = "aws"
      type        = "aggregator"
      connections = ["aws_sandbox_*"]
    }
    

    Recuerda que todos los nombres de cuenta a minúscula, sustituyendo espacios y guiones por _.

  • Aggregator en base a tus Account tags. Este ejemplo creará un aggregator con todas tus cuentas de AWS que tengan el tag team:engineering.

    {{ $teamEng := index .Tags "team,engineering" }}
    connection "aws_engineering_team" {
      plugin      = "aws"
      type        = "aggregator"
      connections = [{{- range $index, $name := $teamEng -}}{{ if $index }}, {{ end }}"aws_{{ $name }}"{{- end }}]
    }
    


Y esto es todo amigos! Si os queda alguna duda o tenéis algún comentario no dudéis en escribirnos.

Saludos, y que la fuerza os acompañe.