Como posso usar as funções do Lambda em uma Amazon VPC para recuperar segredos do Secrets Manager?

5 minuto de leitura
0

Minha função do AWS Lambda em uma Amazon Virtual Private Cloud (Amazon VPC) não pode acessar o AWS Secrets Manager.

Breve descrição

As funções do Lambda são executadas em uma Amazon VPC segura com acesso aos serviços da AWS e à Internet. O serviço do Lambda é proprietário dessa Amazon VPC e não está conectado à sua Amazon VPC padrão.

As funções do Lambda que estão conectadas à sua Amazon VPC podem acessar a Internet somente quando você configura sua Amazon VPC para fornecer acesso. As interfaces de rede que o Lambda cria na sua Amazon VPC usam endereços IP privados e não podem se conectar à Internet usando um gateway da internet.

Para obter mais informações, consulte Acesso aos serviços e à Internet para funções conectadas à VPC.

Observação: é uma prática recomendada não colocar funções do Lambda em uma Amazon VPC, a menos que a função precise acessar outros recursos na Amazon VPC.

Resolução

Configuração de rede do Lambda

Para permitir que uma função do Lambda conectada a uma Amazon VPC acesse o Secrets Manager, execute uma das seguintes ações:

**Anexe um gateway NAT a uma sub-rede privada **

Dê à sua função acesso à Internet. Coloque a função em sub-redes privadas e direcione o tráfego de saída para um gateway NAT em uma sub-rede pública. O gateway NAT tem um endereço IP público e se conecta à Internet por meio do gateway da internet da VPC.

Use um endpoint de interface da Amazon VPC

Configure um endpoint de interface da Amazon VPC para o Secrets Manager. Em seguida, seu Amazon VPC conecta o Secrets Manager a partir da sua função do Lambda sem acesso à Internet. Certifique-se de que o grupo de segurança do endpoint da Amazon VPC permita o tráfego de entrada da porta 443 do grupo de segurança ou do intervalo de endereços IP do Lambda. Além disso, verifique se o grupo de segurança do Lambda permite o tráfego de saída da porta 443 para o grupo de segurança ou intervalo de endereços IP do endpoint da Amazon VPC.

Observação: se você usa endpoints da VPC do AWS PrivateLink, certifique-se de configurar as opções de DHCP com sua Amazon VPC para Sistema de Nomes de Domínio (DNS). Para obter mais informações, consulte Atributos de DNS para sua VPC.

Por exemplo, o seguinte modelo do AWS CloudFormation estabelece uma função do Lambda dentro da sub-rede privada de uma VPC. Isso permite acesso privado ao AWS Secrets Manager por meio de endpoints da VPC:

AWSTemplateFormatVersion: "2010-09-09"
Description: "Lambda Secrets Manager"
Resources:
    EC2SecurityGroup:
        Type: "AWS::EC2::SecurityGroup"
        Properties:
            GroupDescription: "launch-wizard-19 created 2022-03-23T11:10:16.721+05:30"
            GroupName: "launch-wizard-19"
            VpcId: !Ref EC2VPC
            SecurityGroupIngress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443
            SecurityGroupEgress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443


    LambdaFunction:
        Type: "AWS::Lambda::Function"
        Properties:
            Description: "AWS Lambda to AWS Secrets Manager"
            FunctionName: "SecretsManagerLambda"
            Handler: "index.lambda_handler"
            Architectures:
              - "x86_64"
            Code:
              ZipFile: |
                import json
                import boto3
                client = boto3.client('secretsmanager')

                def lambda_handler(event, context):
                    response = client.get_secret_value(
                    SecretId='string',
                    VersionId='string',
                    VersionStage='string'
                    )
                    print(response)
                    # TODO implement
                    return {
                        'statusCode': 200,
                        'body': json.dumps('Hello from Lambda!')
                    }



            MemorySize: 128
            Role: !GetAtt IAMRole.Arn
            Runtime: "python3.11"
            Timeout: 30
            TracingConfig:
                Mode: "PassThrough"
            EphemeralStorage:
                Size: 512
            VpcConfig:
              SecurityGroupIds:
                - !Ref EC2SecurityGroup
              SubnetIds:
                - !Ref EC2Subnet

    EC2VPC:
        Type: "AWS::EC2::VPC"
        Properties:
            CidrBlock: "10.0.0.0/16"
            EnableDnsSupport: true
            EnableDnsHostnames: true
            InstanceTenancy: "default"

    EC2Subnet:
        Type: "AWS::EC2::Subnet"
        Properties:
            AvailabilityZone: !Sub "${AWS::Region}b"
            CidrBlock: "10.0.7.0/24"
            VpcId: !Ref EC2VPC
            MapPublicIpOnLaunch: false
            Tags:
              -
                Key: "Name"
                Value: "Private-new-availability"

    EC2VPCEndpoint:
        Type: "AWS::EC2::VPCEndpoint"
        Properties:
            VpcEndpointType: "Interface"
            VpcId: !GetAtt EC2Subnet.VpcId
            ServiceName: !Sub "com.amazonaws.${AWS::Region}.secretsmanager"
            PolicyDocument: |
                {
                  "Statement": [
                    {
                      "Action": "*",
                      "Effect": "Allow",
                      "Principal": "*",
                      "Resource": "*"
                    }
                  ]
                }
            SubnetIds:
              - !Ref EC2Subnet
            PrivateDnsEnabled: true
            SecurityGroupIds:
              - !Ref EC2SecurityGroup

    IAMRole:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            RoleName: "Lambdapermissions"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            ManagedPolicyArns:
              - !Ref IAMManagedPolicy


            Description: "Allows Lambda functions to call AWS services on your behalf."

    IAMManagedPolicy:
        Type: "AWS::IAM::ManagedPolicy"
        Properties:
            ManagedPolicyName: "LambdaSecretsPolicy"
            Path: "/"
            PolicyDocument: |
                {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Sid": "Statement1",
                            "Effect": "Allow",
                            "Action": [
                                "secretsmanager:GetSecretValue",
                                "ec2:CreateNetworkInterface",
                                "ec2:DescribeNetworkInterfaces",
                                "ec2:DeleteNetworkInterface"
                            ],
                            "Resource": "*"
                        }
                    ]
                }

Permissões de perfil de execução do Lambda

Conceda permissões ao perfil de execução do Lambda para acessar os segredos do Secrets Manager. Use a chamada da API GetSecretValue para obter o segredo do Secrets Manager. Para obter mais informações, consulte Exemplo: permissão para recuperar valores de segredos.

(Opcional) Permissões do AWS Key Management Service (AWS KMS)

Se o segredo do Secrets Manager for criptografado com uma chave gerenciada pelo cliente do AWS KMS em vez da chave gerenciada aws/secretsmanager, será necessária uma configuração adicional. Certifique-se de autorizar a permissão de ação da API Decrypt como perfil de execução do Lambda ou política de chaves do AWS KMS.

Informações relacionadas

Como soluciono problemas de permissões com o Lambda?