Escale os seus testes de vulnerabilidade de segurança com o Amazon Inspector

setembro 2, 2016 5:00 pm Publicado por Deixe um comentário

Na AWS Re:Invent 2015, anunciamos o Amazon Inspector, o nosso serviço de avaliação de vulnerabilidade de segurança que ajuda os clientes a testar as vulnerabilidades de segurança cedo e com frequência. Usando o Amazon Inspector, os clientes podem automatizar testes de segurança em desenvolvimento, teste e ambientes de produção, identificando as vulnerabilidades de segurança como parte do desenvolvimento de software, implantação e ciclo de vida de operações inteira.

O feedback dos clientes sobre o método do Amazon Inspector para testes de segurança automatizados foi esmagadoramente positivo. Os clientes nos disseram que, com o Amazon Inspector, são capazes de executar avaliações de segurança com mais frequência e estão recuperando vulnerabilidades de segurança mais cedo do que no passado.

No entanto, a identificação das vulnerabilidades de segurança é apenas metade da batalha, as vulnerabilidades que são encontradas necessitam ser corrigidas. Muitos dos nossos clientes já começaram a integrar o Amazon Inspector com seus sistemas de workflow e de emissão de bilhetes, para automatizar e acelerar o fluxo de trabalho de remediação para conclusões do Amazon Inspector. Nós projetamos o Amazon Inspector com isso em mente e pensei que seria bom compartilhar mais detalhes sobre um método para integrar as conclusões do Amazon Inspector com os sistemas de e-mail, fluxo de trabalho, e de sistemas de bilheteira.

Usando o AWS Lambda para levar as conclusões do Amazon Inspector Findings aos sistemas de bilheteria

Neste exemplo, estamos usando uma função do AWS Lambda para conectar Amazon Inspector com sistemas que podem lidar com criação de incidentes via e-mail. Aqui está a cadeia de eventos:

  1. O Amazon Inspector é executado e realiza uma avaliação de segurança. Ele envia uma mensagem para um tópico Amazon Simple Notification Service (SNS) no final da execução;
  2. A função Lambda é chamada pela mensagem SNS;
  3. A função lê os resultados da avaliação de segurança;
  4. A função formata e envia por e-mail as conclusões usando outro tópico SNS.

Ao longo do caminho, a função cria o tópico de destino e a assinatura de e-mail, se necessário.

Configurando a função

Você precisará configurar a função na Região AWS em que você executa suas avaliações do Amazon Inspector. Se você executar o Amazon Inspector em mais de uma região, você precisará repetir as etapas para cada uma. Aqui estão os passos:

  1. Crie um tópico SNS para o Amazon Inspector;
  2. Configure o Amazon Inspector para enviar suas conclusões ao tópico recém-criado;
  3. Configurar a função Lambda para buscar, formatar e enviar por e-mail os resultados.

Configurando um tópico SNS

O primeiro grande passo é configurar um tópico do Amazon SNS que o Amazon Inspector irá notificar quando houver novas descobertas e um tópico Amazon SNS que irá formatar e enviar resultados por e-mail para outros sistemas.

Navegue até o Console do Amazon SNS e crie um novo tópico do Amazon SNS. Este será o tópico onde o Amazon Inspector entregará suas notificações. Não importa como você nomeará o tópico.

Em seguida, atribuir a seguinte política ao tópico. Você pode fazer isso no Console do Amazon SNS selecionando o tópico, clicando em Other topic actions, e selecionando Edit topic policy. Na exibição avançada, substitua o texto da política existente por esta política:

{
  "Version": "2008-10-17",
  "Id": "inspector-sns-publish-policy",
  "Statement": [
    {
      "Sid": "inspector-sns-publish-statement",
      "Effect": "Allow",
      "Principal": {
        "Service": "inspector.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:*"
    }
  ]
}

Se você estiver familiarizado com as políticas do AWS Identity and Access Management (IAM), então, uma prática recomendada de segurança é alterar o valor do campo de Resource da política para corresponder exatamente ao tópico ARN do Amazon SNS, a fim de restringir o Amazon Inspector, para que ele só possa publicar neste tópico.

Configurando o Amazon Inspector

Navegue até o Console do Amazon Inspector, visite a página Assessment templates e selecione o modelo de avaliação cujos resultados devem ser enviados para o sistema externo. Expanda a linha e você verá uma seção chamada SNS topics. Clique no ícone do lápis à esquerda da seção de tópicos do Amazon SNS e você será capaz de escolher o tópico do Amazon SNS que você acabou de criar a partir de uma lista drop-down. Depois de selecionar o tópico, clique em Save.

Configurando a função Lambda

Navegue até o Console do Lambda e crie uma nova função usando o modelo SNS-message-python:

insp_lambda_setup_sns_func_blue_1Selecione SNS como fonte de evento e, em seguida, selecione o tópico SNS que você criou na primeira etapa:

insp_lambda_config_event_sns_src_1

Para concluir a configuração da função, clique em Next. Digite um nome e descrição para a função, escolha o tempo de execução do Python 2.7 e substitua o código da função de exemplo, por este código:

from __future__ import print_function
import boto3
import json
import datetime
 
sns = boto3.client('sns')
inspector = boto3.client('inspector')
 
# SNS topic - will be created if it does not already exist
SNS_TOPIC = "Inspector-Finding-Delivery"
 
# Destination email - will be subscribed to the SNS topic if not already
DEST_EMAIL_ADDR = "eric@example.com"
 
# quick function to handle datetime serialization problems
enco = lambda obj: (
    obj.isoformat()
    if isinstance(obj, datetime.datetime)
    or isinstance(obj, datetime.date)
    else None
)
 
def lambda_handler(event, context):
 
    # extract the message that Inspector sent via SNS
    message = event['Records'][0]['Sns']['Message']
 
    # get inspector notification type
    notificationType = json.loads(message)['event']
 
    # skip everything except report_finding notifications
    if notificationType != "FINDING_REPORTED":
        print('Skipping notification that is not a new finding: ' + notificationType)
        return 1
     
    # extract finding ARN
    findingArn = json.loads(message)['finding']
 
    # get finding and extract detail
    response = inspector.describe_findings(findingArns = [ findingArn ], locale='EN_US')
    print(response)
    try:
        finding = response['findings'][0]
    except OSError as err:
        print("OS error: {0}".format(err))
    except:
        print("Unexpected error:", sys.exc_info()[0])
        raise
         
    # skip uninteresting findings
    title = finding['title']
    if title == "Unsupported Operating System or Version":
        print('Skipping finding: ', title)
        return 1
         
    if title == "No potential security issues found":
        print('Skipping finding: ', title)
        return 1
     
    # get the information to send via email
    subject = title[:100] # truncate @ 100 chars, SNS subject limit
    messageBody = "Title:n" + title + "nnDescription:n" + finding['description'] + "nnRecommendation:n" + finding['recommendation']
     
    # un-comment the following line to dump the entire finding as raw json
    # messageBody = json.dumps(finding, default=enco, indent=2)
 
    # create SNS topic if necessary
    response = sns.create_topic(Name = SNS_TOPIC)
    snsTopicArn = response['TopicArn']
 
    # check to see if the subscription already exists
    subscribed = False
    response = sns.list_subscriptions_by_topic( TopicArn = snsTopicArn )
 
    # iterate through subscriptions array in paginated list API call
    while True:
        for subscription in response['Subscriptions']:
            if ( subscription['Endpoint'] == DEST_EMAIL_ADDR ):
                subscribed = True
                break
         
        if 'NextToken' not in response:
            break
         
        response = sns.list_subscriptions_by_topic(
            TopicArn = snsTopicArn,
            NextToken = response['NextToken']
            )
         
    # create subscription if necessary
    if ( subscribed == False ):
        response = sns.subscribe(
            TopicArn = snsTopicArn,
            Protocol = 'email',
            Endpoint = DEST_EMAIL_ADDR
            )
 
    # publish notification to topic
    response = sns.publish(
        TopicArn = snsTopicArn,
        Message = messageBody,
        Subject = subject
        )
 
    return 0

Certifique-se de editar o valor DEST_EMAIL_ADDR e coloque o endereço de e-mail real que é usado para enviar incidentes no seu sistema de gerenciamento de incidentes. Opcionalmente, você pode alterar o nome do tópico SNS que a Amazon Inspector irá utilizar para enviar resultados.

Deixe o manipulador de função (lambda_function.lambda_handler) como está e nomeie a função:

insp_lambda_func_name_1

Escolha *basic execution role para o drop-down Role. Depois que o Lambda for para uma nova página, veja o documento de política, e use este no lugar:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "inspector:DescribeFindings",
                "SNS:CreateTopic",
                "SNS:Subscribe",
                "SNS:ListSubscriptionsByTopic",
                "SNS:Publish"
            ],
            "Resource": "*"
        }
    ]
}

Clique em Allow para criar a função e voltar ao AWS Lambda, em seguida, deixe as configurações avançadas como estão.

Certifique-se de clicar em Enable event source na página de revisão:

insp_lambda_enable_evt_src_1

Clique em Create function para salvar a função.

E é isso!

Pronto para rodar

Caso queira que as avaliações sejam enviadas para outro sistema, basta adicionar o primeiro tópico Amazon SNS (o que você criou com estas instruções) para o modelo de avaliação, e assegure que os novos relatórios são selecionados para publicação desse tópico.

A primeira vez que executar uma avaliação, o Amazon Inspector irá notificar o Lambda que você tem novas descobertas, e a função Lambda que acabou de criar, criará o tópico SNS (se ele ainda não existir), subscreverá o endereço de destino do e-mail para o tópico (se já não estiver inscrito), e enviará os resultados como e-mail para esse endereço. Se o Lambda teve de subscrever o endereço de e-mail para o tópico, então você receberá um e-mail em que você precisará clicar em um link para confirmar que você deseja se inscrever. Após a confirmação, o Amazon Inspector entregará resultados para esse endereço de e-mail.

Se você deseja se conectar Jira Service Desk da Atlassian, é super fácil a partir de agora em diante. Em Jira ServiceDesk, navegue até Canais de clientes. Isto irá exibir o endereço de e-mail que pode receber e-mail e criar novas questões. Coloque esse endereço de e-mail no script Python da função Lambda e é aí que o inspetor vai entregar as suas conclusões. O ServiceDesk irá automaticamente transformá-los em questões no ServiceDesk, e você pode gerenciar seu fluxo de trabalho lá.

***

Artigo escrito por Eric Fitzgerald. 

Este artigo faz parte do AWSHUB, rede de profissionais AWS gerenciado pelo iMasters.

Source: IMasters

Categorizados em:

Este artigo foi escrito pormajor

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *