DEV Community

Marlo Henrique
Marlo Henrique

Posted on

Utilizando AWS Secret Manager com K6šŸ”

Ao escrever scripts de teste, Ć© crucial que mantenhamos um alto nĆ­vel de preocupaĆ§Ć£o com a exposiĆ§Ć£o de dados sensĆ­veis, assim como terĆ­amos ao desenvolver um software.

Isso se deve ao fato de que um vazamento de credenciais ou informaƧƵes confidenciais da aplicaĆ§Ć£o testada pode ter consequĆŖncias graves, comprometendo a seguranƧa e atĆ© mesmo resultando em incidentes de seguranƧa. Portanto, Ć© imprescindĆ­vel tomar medidas adequadas para garantir a proteĆ§Ć£o desses dados durante todo o processo de teste.

Em um post anterior, discutimos como podemos utilizar variƔveis de ambiente com K6. Essa abordagem nos permite passar valores para o script por meio de definiƧƵes na linha de comando (CLI).

Neste artigo, exploraremos o uso do AWS Secret Manager para o gerenciamento e recuperaĆ§Ć£o de credenciais e segredos.

Image description

O que Ć© o AWS Secret ManageršŸ”

O AWS Secret Manager Ʃ um serviƧo que permite armazenar e gerenciar de forma segura as informaƧƵes sensƭveis, como credenciais de acesso, chaves de API, senhas e outros segredos.

Pense no AWS Secret Manager como uma espƩcie de cofre virtual. Em vez de armazenar senhas e informaƧƵes confidenciais em arquivos, o Secret Manager oferece um local seguro e centralizado para guardar esses segredos.

O Secret Manager tambƩm permite gerenciar o acesso aos segredos, concedendo permissƵes granulares aos usuƔrios ou serviƧos que precisam utilizƔ-los. Isso garante que apenas as pessoas autorizadas possam acessar essas informaƧƵes.

AlĆ©m disso, o Secret Manager facilita a rotaĆ§Ć£o de segredos, ou seja, a atualizaĆ§Ć£o periĆ³dica de senhas e chaves. Com isso, Ć© possĆ­vel garantir a seguranƧa contĆ­nua dos sistemas, mesmo se algum segredo for comprometido.

PrĆ©-requisitosšŸ“‘

Criando nosso segredošŸ”§

Ao acessar o console da AWS, pesquise pelo serviƧo Secret Manager:

Image description

Para comeƧar a configurar seu segredo no Secret Manager, escolha a opĆ§Ć£o Armazenar um novo segredo.

Image description

O processo de criaĆ§Ć£o de um segredo no Secret Manager consiste em quatro fases: seleĆ§Ć£o do tipo de segredo, configuraĆ§Ć£o do segredo, configuraĆ§Ć£o de alternĆ¢ncia do segredo e anĆ”lise do segredo.

SeleĆ§Ć£o do tipo de segredošŸŽ²

A primeira informaĆ§Ć£o que precisamos fornecer Ć© o tipo do segredo. Neste caso, estaremos armazenando uma credencial de acesso, portanto, selecionaremos a opĆ§Ć£o Outro tipo de segredo:

Image description

Quando selecionamos a opĆ§Ć£o Outro tipo de segredo, os segredos sĆ£o definidos como pares de chave e valor. Neste exemplo, vamos preencher o campo chave com token_acesso e o campo valor com um token JWT de sessĆ£o de um usuĆ”rio na API auth/token/login do K6.

Image description

No campo de chave de criptografia, permitiremos que o Secret Manager utilize uma chave criada por ele, utilizando KMS.

Image description

ApĆ³s fornecer essas informaƧƵes podemos clicar em prĆ³ximo.

ConfiguraĆ§Ć£o do segredošŸ”—

Na opĆ§Ć£o de configuraĆ§Ć£o do segredo, Ć© necessĆ”rio fornecer o nome do segredo e uma descriĆ§Ć£o. AlĆ©m disso, existem outras informaƧƵes opcionais que podem ser fornecidas, como tags, permissƵes de recursos e a opĆ§Ć£o de replicar o segredo.

No campo nome do segredo daremos o nome de curso_k6. E na descriĆ§Ć£o informaremos que esse Ć© um segredo de credencial de acesso a API.

Image description

Ɖ importante ressaltar que, embora sejam opcionais, as "PermissƵes de Recursos" sĆ£o extremamente importantes quando precisamos definir polĆ­ticas de acesso a recursos da AWS.

ConfiguraĆ§Ć£o de alternĆ¢ncia do segredošŸ‘„

Na opĆ§Ć£o de configuraĆ§Ć£o de alternĆ¢ncia vamos deixar todas as opƧƵes defaults sem realizar modificaƧƵes.

Ɖ essencial ressaltar que, com essa configuraĆ§Ć£o, terĆ­amos a capacidade de atualizar automaticamente as informaƧƵes do nosso segredo em intervalos de tempo prĆ©-determinados.

AnĆ”lise do segredošŸ”

Na opĆ§Ć£o de anĆ”lise, oferecemos a oportunidade de revisar as informaƧƵes do segredo a ser criado no Secret Manager, juntamente com algumas implementaƧƵes de acesso em vĆ”rias linguagens.

Ao selecionar Armazenar, vocĆŖ serĆ” redirecionado para a tela de listagem de segredos, onde poderĆ” verificar que o nosso segredo foi criado com ĆŖxito.

Image description

MĆ£o na massašŸ‘©ā€šŸ’»

Nesta etapa prƔtica, faremos modificaƧƵes em um script de teste de performance que requer um token de usuƔrio. Utilizaremos o Secret Manager para recuperar esse token do nosso segredo.

O exemplo de script que serĆ” utilizado Ć© o seguinte:

import http from 'k6/http';
import { check, sleep } from 'k6';

const BASE_URL = 'https://test-api.k6.io';

export default function(){

    const params = {
        headers: {
            Authorization: `Bearer ${token}` ,
            'Content-Type': 'application/json'
        }
    }
    const res = http.get(`${BASE_URL}/my/crocodiles`, params);

    check(res, {
        'status code 200': (r) => r.status === 200
    });
}
Enter fullscreen mode Exit fullscreen mode

Utilizando o nosso segredošŸ˜ƒ

Para comeƧar, vamos importar os mĆ³dulos que concedem acesso aos recursos da AWS. O K6 oferece um mĆ³dulo na biblioteca K6 js lib. Adicione o seguinte mĆ³dulo Ć  fase de inicializaĆ§Ć£o:

import { AWSConfig, SecretsManagerClient } from 'https://jslib.k6.io/aws/0.4.0/secrets-manager.js'
Enter fullscreen mode Exit fullscreen mode

Precisamos configurar o acesso remoto a AWS, e para isso precisamos das seguintes informaƧƵes: region, accessKeyId e secretAccessKey.

A regiĆ£o Ć© o local onde seus recursos da AWS foram criados. Nosso segredo foi criado na regiĆ£o us-east-1. Quanto ao accessKeyId e secretAccessKey, sĆ£o informaƧƵes altamente confidenciais necessĆ”rias para o acesso remoto.

InstruƧƵes sobre como gerar o accessKeyId e secretAccessKey podem ser encontradas no seguinte link: intruƧƵes

Defina na fase de configuraĆ§Ć£o uma variĆ”vel que implemente o AWSConfig, como mostrado abaixo:

const awsConfig = new AWSConfig({
    region: 'us-east-1',
    accessKeyId: __ENV.AWS_ACCESS_KEY_ID,
    secretAccessKey: __ENV.AWS_SECRET_ACCESS_KEY,
});
Enter fullscreen mode Exit fullscreen mode

Vamos definir duas variƔveis de ambiente com os nomes AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY. Para obter instruƧƵes sobre como definir variƔveis de ambiente com K6, recomendo a leitura do artigo: Utilizando variƔveis de ambiente com K6.

Com o objeto AWSConfig criado, vamos adicionar outra variĆ”vel na fase de inicializaĆ§Ć£o para implementar o objeto SecretsManagerClient. Adicione a seguinte linha ao seu cĆ³digo:

const secretsManager = new SecretsManagerClient(awsConfig);
Enter fullscreen mode Exit fullscreen mode

Para buscar o nosso segredo, vamos definir uma funĆ§Ć£o na fase de configuraĆ§Ć£o com o nome setup. Essa funĆ§Ć£o realizarĆ” um Ćŗnico acesso ao Secret Manager para obter a credencial necessĆ”ria, em seguida, passarĆ” essa credencial para a funĆ§Ć£o padrĆ£o na fase de execuĆ§Ć£o.

export function setup(){
    const segredo = secretsManager.getSecret('curso_k6');
    return JSON.parse(segredo.secret);
}
Enter fullscreen mode Exit fullscreen mode

Observe que estamos utilizando uma das funƧƵes disponĆ­veis no objeto secretsManager que criamos, mais especificamente a funĆ§Ć£o getSecret, que nos permite buscar os valores de um segredo. No nosso exemplo, o segredo que estamos buscando Ć© chamado curso_k6.

Por fim, na fase de execuĆ§Ć£o precisamos apenas adicionar o parĆ¢metro que serĆ” passado para a funĆ§Ć£o default, no caso token:

export default function(token)
Enter fullscreen mode Exit fullscreen mode

Nosso script apĆ³s ajustes ficara da seguinte forma:

import http from 'k6/http';
import { check } from 'k6';
import { AWSConfig, SecretsManagerClient } from 'https://jslib.k6.io/aws/0.7.2/secrets-manager.js';

const awsConfig = new AWSConfig({
    region: "us-east-1",
    accessKeyId: __ENV.AWS_ACCESS_KEY_ID,
    secretAccessKey: __ENV.AWS_SECRET_ACCESS_KEY,
});

const secretsManager = new SecretsManagerClient(awsConfig);

export function setup(){
    const segredo = secretsManager.getSecret('curso_k6');
    return JSON.parse(segredo.secret);
}

const BASE_URL = 'https://test-api.k6.io';

export default function(token){

    const params = {
        headers: {
            Authorization: `Bearer ${token.token_acesso}` ,
            'Content-Type': 'application/json'
        }
    }
    const res = http.get(`${BASE_URL}/my/crocodiles`, params);

    check(res, {
        'status code 200': (r) => r.status === 200
    });
}
Enter fullscreen mode Exit fullscreen mode

Ponto importante a ser observado: o nosso token Ć© na verdade, um objeto JSON. Portanto, precisamos acessar a chave desse objeto, que no caso Ć© token_acesso. Ɖ importante ressaltar que um mesmo segredo pode ter vĆ”rios pares chave-valor associados a ele.

Por fim, para executarmos o nosso script podemos utilizar o seguinte comando:

 k6 run -e AWS_ACCESS_KEY_ID='',AWS_SECRET_ACCESS_KEY='' secret_manager.js        
Enter fullscreen mode Exit fullscreen mode

Substitua as aspas simples por seu AWS_ACESS_KEY_ID e AWS_SECRET_ACESS_KEY

Podemos observar que o token do usuƔrio foi buscado corretamente no Secret Manager:

Image description

Executando via AWSā˜ļø

Caso vocĆŖ deseje executar o script via AWS, ele ficarĆ” ainda mais simplificado. As informaƧƵes AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY sĆ£o necessĆ”rias apenas localmente, dentro do ambiente da AWS vocĆŖ jĆ” terĆ” acesso ao Secret Manager, desde que as polĆ­ticas de acesso estejam configuradas corretamente para o seu usuĆ”rio.

Nosso script ficaria da seguinte forma para execuĆ§Ć£o via AWS:

import http from 'k6/http';
import { check } from 'k6';
import { AWSConfig, SecretsManagerClient } from 'https://jslib.k6.io/aws/0.7.2/secrets-manager.js';

const awsConfig = new AWSConfig({
    region: "us-east-1",
});

const secretsManager = new SecretsManagerClient(awsConfig);

export function setup(){
    const segredo = secretsManager.getSecret('curso_k6');
    return JSON.parse(segredo.secret);
}

const BASE_URL = 'https://test-api.k6.io';

export default function(token){

    const params = {
        headers: {
            Authorization: `Bearer ${token.token_acesso}` ,
            'Content-Type': 'application/json'
        }
    }
    const res = http.get(`${BASE_URL}/my/crocodiles`, params);

    check(res, {
        'status code 200': (r) => r.status === 200
    });
}
Enter fullscreen mode Exit fullscreen mode

ConclusĆ£ošŸ’–

Podemos observar que com poucas modificaƧƵes, foi possĆ­vel utilizar uma ferramenta altamente confiĆ”vel de gerenciamento de segredos, evitando que informaƧƵes sensĆ­veis fossem incorporadas diretamente nos nossos scripts. šŸ¤—

O mĆ³dulo SecretsManagerClient oferece uma ampla variedade de recursos, como criaĆ§Ć£o de segredos, listagem, remoĆ§Ć£o, recuperaĆ§Ć£o, alteraĆ§Ć£o de valores e muito mais. Possivelmente, este artigo se transformarĆ” em uma sĆ©rie que abordarĆ” outros mĆ³dulos da lib AWS.šŸ˜€

Gostou do conteĆŗdo e quer saber mais sobre testes de performance com K6? EntĆ£o nĆ£o deixe de conferir meu curso na Udemy:

Top comments (0)