Configurar AWS Signer en lambda con terraform

Configurar AWS Signer en lambda con terraform

Son amplias las funcionalidades que ofrece AWS para mantener nuestro código de manera segura y protegida, AWS signer es un servicio que permite firmar el código de algunos servicios de AWS entre los que se encuentra AWS Lambda.

Existe una amplia variedad de herramientas de infraestructura como código (IaC) para gestionar nuestra infraestructura, terraform es una de las herramientas más difundidas para gestionar infraestructura.

A continuación veremos como configurar AWS signer con terraform para firmar el código de una lambda y veremos su funcionamiento asegurando nuestro código.

Repositorio:

Todo el código está en el siguiente repositorio que pueden descargar y seguir para desplegar la POC en su entorno de prueba:

https://github.com/olcortesb/terraform-lambda-signer/tree/main

Configurar terraform:

La versión de terraform que utilizaremos es la 1.5.5

terrafom --version
# is 1.7.5. You can update by downloading from 
# https://www.terraform.io/downloads.html

Configuramos el bucket de s3 que hemos creado para esta prueba, en el archivo preferences.tf el parámetro backend.bucket

    // file terraform-lambda-signer/preferences.tf
    terraform {
    required_version = ">=1.5.0"
    required_providers {
        aws = {
        source  = "hashicorp/aws"
        version = ">= 4.9"
        }
    }
    backend "s3" {
        key    = "terraform.tfstate"
        bucket = "terraform-lambda-signer" // change the name of bucket
        region = "us-east-1"
        }
    }

Tener configurado AWS CLI

Tener configurada cuenta de AWS, aquí un pequeño gist de como se configura Link

Configurando AWS signer

Para configurar AWS signer necesitamos

  1. Definir el signing_profile:

    Agregamos un nuevo resource definiendo el tipo de plataforma, las opciones disponibles hasta hoy son:

     AWSIoTDeviceManagement-SHA256-ECDSA
     AWSLambda-SHA384-ECDSA
     AmazonFreeRTOS-TI-CC3220SF
     AmazonFreeRTOS-Default
    

    Elegimos la que corresponde a Lambda y creamos el recurso:

     // File lambda.tf
     resource "aws_signer_signing_profile" "tfsigner" {
       name_prefix = "tfsigner"
       platform_id = "AWSLambda-SHA384-ECDSA"
     }
    
  2. Configurar el signing_job:

    Para definir el signig job necesitamos el origen del bucket y el objeto s3 y agregarle un destino donde tendremos el código firmado.

     // File lambda.tf
     resource "aws_signer_signing_job" "this" {
       profile_name = aws_signer_signing_profile.tfsigner.name
    
       source {
         s3 {
           bucket  = aws_s3_bucket.lambda_code_bucket.id
           key     = aws_s3_object.lambda_code.id
           version = aws_s3_object.lambda_code.version_id
         }
       }
    
       destination {
         s3 {
           bucket = aws_s3_bucket.lambda_code_bucket.id
           prefix = "signed/"
         }
       }
    
       ignore_signing_job_failure = true
     }
    
  3. Definir la configuración del signer para Lambda:

     // File lambda.tf
     resource "aws_lambda_code_signing_config" "tfsigner_code" {
       allowed_publishers {
         signing_profile_version_arns = [aws_signer_signing_profile.tfsigner.version_arn]
       }
       policies {
         untrusted_artifact_on_deployment = "Enforce"
       }
     }
    
  4. Agregar al resource de lambda la configuración del signer

     // file lambda.tf
     // Lambda
     resource "aws_lambda_function" "lambda" {
         // ...
         // Signer
         code_signing_config_arn = aws_lambda_code_signing_config.tfsigner_code.arn
         // S3 for signer configurations
         s3_bucket = aws_signer_signing_job.this.signed_object[0].s3[0].bucket
         s3_key    = aws_signer_signing_job.this.signed_object[0].s3[0].key
         // ...
     }
    

    Para verificar que el código ha sido firmado podemos revisar la consola, no nos permitirá acceder al código independiente si el tamaño del .zip lo permite o no. Aparecer un mensaje indicando que este código no puede ser editado de manera directa.

Conclusiones

Con AWS signer tenemos la posibilidad de garantizar la integridad del código de nuestra lambda, teniendo un lugar único donde definir el entorno de firma como sus roles y propiedades que no abordamos en esta POC, pero que se pueden configurar.

El código queda completamente trazado y la integridad del mismo permite tener un control sobre los cambios que se realizan sobre él.

La configuración desde terraform es simple y puede automatizarse de manera eficiente para los distintos entornos de desarrollo que tengamos

Respecto al coste, AWS Signer no tiene cargo adicionar como se puede revisar en la documentación oficial Link

Referencias