Assinatura de código do Lambda com AWS Signer - AWS Lambda

Assinatura de código do Lambda com AWS Signer

O AWS Signer é um serviço de assinatura de código totalmente gerenciado que permite que você valide o código em uma assinatura digital para confirmar que o código está inalterado e é de um publicador confiável. O AWS Signer pode ser usado com o AWS Lambda para verificar se as funções e as camadas permanecem inalteradas antes da implantação nos ambientes da AWS. Isso protege sua organização contra agentes mal-intencionados que possam ter obtido credenciais para criar novas funções ou atualizar as existentes.

Para configurar a assinatura de código para suas funções do Lambda, comece criando um bucket do S3 com versionamento habilitado. Depois disso, crie um perfil de assinatura com AWS Signer, especifique Lambda como plataforma e, em seguida, especifique um período em dias em que o perfil de assinatura será válido. Exemplo:

Signer: Type: AWS::Signer::SigningProfile Properties: PlatformId: AWSLambda-SHA384-ECDSA SignatureValidityPeriod: Type: DAYS Value: !Ref pValidDays

Em seguida, use o perfil de assinatura e crie uma configuração de assinatura com o Lambda. Você precisa especificar o que fazer quando a configuração de assinatura vir um artefato que não corresponda à assinatura digital esperada: avisar (mas permitir a implantação) ou aplicar (e bloquear a implantação). O exemplo abaixo está configurado para aplicar e bloquear implantações.

SigningConfig: Type: AWS::Lambda::CodeSigningConfig Properties: AllowedPublishers: SigningProfileVersionArns: - !GetAtt Signer.ProfileVersionArn CodeSigningPolicies: UntrustedArtifactOnDeployment: Enforce

Agora, o AWS Signer está configurado com o Lambda para bloquear implantações não confiáveis. Suponhamos que você tenha concluído a codificação de uma solicitação de atributo e agora esteja prestes a implantar a função. A primeira etapa é compactar o código com as dependências apropriadas e depois assinar o artefato usando o perfil de assinatura que você criou. Você pode fazer isso carregando o artefato zip no bucket do S3 e iniciando um trabalho de assinatura.

aws signer start-signing-job \ --source 's3={bucketName=your-versioned-bucket,key=your-prefix/your-zip-artifact.zip,version=QyaJ3c4qa50LXV.9VaZgXHlsGbvCXxpT}' \ --destination 's3={bucketName=your-versioned-bucket,prefix=your-prefix/}' \ --profile-name your-signer-id

Você obtém uma saída como mostrado a seguir, em que o jobId é o objeto criado no bucket e no prefixo de destino e jobOwner é a Conta da AWS ID de 12 dígitos em que o trabalho foi executado.

{ "jobId": "87a3522b-5c0b-4d7d-b4e0-4255a8e05388", "jobOwner": "111122223333" }

E, agora, você pode implantar a função usando o objeto S3 assinado e a configuração de assinatura de código que você criou.

Fn: Type: AWS::Serverless::Function Properties: CodeUri: s3://your-versioned-bucket/your-prefix/87a3522b-5c0b-4d7d-b4e0-4255a8e05388.zip Handler: fn.handler Role: !GetAtt FnRole.Arn CodeSigningConfigArn: !Ref pSigningConfigArn

Como alternativa, você pode testar a implantação de uma função com o artefato zip original não assinado. A implantação deverá apresenta falha com a seguinte mensagem de erro:

Lambda cannot deploy the function. The function or layer might be signed using a signature that the client is not configured to accept. Check the provided signature for unsigned.

Se você estiver criando e implantando funções usando o AWS Serverless Application Model (AWS SAM), o comando de pacote manipulará o upload do artefato zip no S3, também iniciará o trabalho de assinatura e o artefato será assinado. Você pode fazer isso usando os seguintes parâmetros e comando:

sam package -t your-template.yaml \ --output-template-file your-output.yaml \ --s3-bucket your-versioned-bucket \ --s3-prefix your-prefix \ --signing-profiles your-signer-id

O AWS Signer ajuda você a verificar se os artefatos zip implantados nas contas são confiáveis para implantação. Você pode incluir o processo acima em pipelines de CI/CD e exigir que todas as funções tenham uma configuração de assinatura de código anexada usando as técnicas descritas nos tópicos anteriores. Ao usar a assinatura de código com implantações de funções do Lambda, você evita que agentes mal-intencionados, que possam ter obtido credenciais para criar ou atualizar funções, injetem código malicioso nas funções.