Integrando AWS Secrets Manager e IAM com Laravel para gerenciamento seguro de credenciais

Aumente a segurança das suas aplicações com o uso de um moderno cofre de senhas.

Criando uma aplicação com área administrativa utilizando o Laravel

Quando estamos desenvolvendo uma aplicação, a segurança das credenciais é um dos aspectos mais importantes. A AWS (Amazon Web Services) oferece ferramentas poderosas para garantir que suas credenciais sejam armazenadas de forma segura e acessíveis apenas para quem tem permissão. Neste artigo, vamos explorar como integrar a AWS IAM (Identity and Access Management) e o AWS Secrets Manager com um projeto Laravel.

Ao final do artigo, você será capaz de configurar a AWS IAM para gerenciar as permissões de acesso, armazenar segredos no AWS Secrets Manager e integrar tudo isso com sua aplicação Laravel de maneira segura.

Criando um usuário no AWS IAM e concedendo permissões

O primeiro passo para integrar sua aplicação Laravel com a AWS é configurar o IAM (Identity and Access Management), que permite que você crie e gerencie usuários e permissões dentro da AWS.

O que é o IAM?

O AWS IAM é um serviço que permite gerenciar o acesso a serviços e recursos da AWS de maneira controlada. Usando o IAM, podemos criar usuários específicos, conceder permissões de acesso e garantir que apenas as pessoas ou sistemas autorizados possam acessar nossos recursos.

Criando um novo usuário IAM

  1. Acesse o painel do AWS IAM.
  2. No menu lateral, clique em Users e, em seguida, clique em Add user.
  3. Escolha a opção Programmatic access para criar um usuário com acesso via chave de acesso.
  4. Na tela de permissões, você pode adicionar permissões diretamente ou adicionar o usuário a um grupo com permissões predefinidas. Para o nosso caso, adicione a política SecretsManagerReadWrite, que permite acesso ao Secrets Manager.
  5. Conclua o processo e anote a Access Key ID e Secret Access Key geradas. Esses valores serão usados para configurar o acesso ao Secrets Manager na aplicação Laravel.

Criando um segredo no AWS Secrets Manager

Agora que o IAM está configurado e temos um usuário com permissões adequadas, vamos criar um segredo no AWS Secrets Manager. O Secrets Manager é um serviço da AWS que permite armazenar e gerenciar credenciais de forma segura.

O que é o Secrets Manager?

O AWS Secrets Manager é projetado para armazenar segredos, como senhas, chaves API e outras informações sensíveis, de forma segura. Ele permite que você recupere esses segredos de maneira programática, evitando a exposição de informações sensíveis no código-fonte da aplicação.

  1. Acesse o painel do AWS Secrets Manager.
  2. Clique em Store a new secret.
  3. Selecione o tipo de segredo que você deseja armazenar. Por exemplo, para armazenar credenciais de banco de dados, selecione Other type of secret e adicione chaves como DB_USERNAME e DB_PASSWORD.
  4. Escolha um nome para o segredo. Por exemplo: my-app-secret.
  5. Finalize a criação do segredo e anote o nome dele. Você precisará desse nome ao configurar o Laravel para acessar o segredo.

Criando um Novo Projeto Laravel

Agora que temos tudo configurado na AWS, vamos para o Laravel. O primeiro passo é criar um novo projeto Laravel.

Abra o terminal em uma pasta do seu sistema e execute o seguinte comando para criar um novo projeto Laravel:

composer create-project laravel/laravel nome-do-projeto

Esse comando criará um diretório com a estrutura básica do Laravel e todas as dependências necessárias.

Instalando o SDK da AWS no Laravel

Com o projeto Laravel criado, o próximo passo é instalar o SDK da AWS para que possamos interagir com o Secrets Manager.

No terminal, dentro da pasta do projeto Laravel, execute o comando:

composer require aws/aws-sdk-php

O SDK da AWS fornece uma maneira fácil de interagir com todos os serviços da AWS, incluindo o Secrets Manager, diretamente de dentro do seu projeto Laravel.

Configurando o .env

Antes de prosseguir para o código, precisamos definir as credenciais da AWS no arquivo .env do Laravel. Esse arquivo é onde armazenamos as variáveis de ambiente, como as chaves de acesso e o nome do segredo.

No arquivo .env, adicione as seguintes variáveis para configurar o acesso à AWS:

AWS_ACCESS_KEY_ID=seu_access_key_id
AWS_SECRET_ACCESS_KEY=seu_secret_access_key
AWS_DEFAULT_REGION=us-east-1
AWS_SECRET_MANAGER_SECRET=my-app-secret
  • AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY: As credenciais que você obteve ao criar o usuário IAM.
  • AWS_DEFAULT_REGION: A região onde seu segredo está armazenado (por exemplo, us-east-1).
  • AWS_SECRET_MANAGER_SECRET: O nome do segredo que você criou no Secrets Manager.

Criando o Provider no Laravel

Agora, vamos criar um provider no Laravel que será responsável por acessar o segredo armazenado no AWS Secrets Manager e configurar as variáveis de ambiente automaticamente.

No terminal, execute o seguinte comando para criar um novo provider:

php artisan make:provider SecretsServiceProvider

Abra o arquivo app/Providers/SecretsServiceProvider.php e insira o seguinte código:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Aws\SecretsManager\SecretsManagerClient;
use Aws\Exception\AwsException;
use Illuminate\Support\Facades\Log;

class SecretsServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Cliente do Secrets Manager
        $client = new SecretsManagerClient([
            'region' => env('AWS_DEFAULT_REGION'),
            'version' => 'latest',
        ]);

        // Recupera o nome do segredo do .env
        $secretName = env('AWS_SECRET_MANAGER_SECRET');

        try {
            // Obtém o segredo do Secrets Manager
            $result = $client->getSecretValue([
                'SecretId' => $secretName,
            ]);

            // O segredo será retornado em formato JSON
            $secret = json_decode($result['SecretString'], true);

            // Define os valores das variáveis de ambiente com base nas chaves do segredo
            foreach ($secret as $key => $value) {
                // Usa o método env() para configurar o valor no ambiente
                putenv("{$key}={$value}");
            }
        } catch (AwsException $e) {
            Log::error("Erro ao acessar o Secrets Manager: " . $e->getMessage());

            dd($e->getMessage());
        }
    }

    public function boot() {}
}

Esse código cria um cliente do AWS Secrets Manager, recupera o segredo e define as variáveis de ambiente com base nas chaves do segredo.

Registrando o Provider no Laravel

Agora que o provider está pronto, precisamos registrá-lo no Laravel para que ele seja carregado corretamente.

Abra o arquivo bootstrap/app.php e adicione o seguinte código ao array de providers:

<?php

return [
    App\Providers\AppServiceProvider::class,
    App\Providers\SecretsServiceProvider::class,
    App\Providers\SecretsServiceProvider::class //Adicione o seu provider
];

Limpando Cache e refazendo Autoload

Para garantir que o Laravel carregue corretamente o provider e as variáveis de ambiente, execute os seguintes comandos:

php artisan config:clear
php artisan cache:clear
php artisan config:cache


composer dump-autoload

Acessando as variáveis de ambiente no Laravel

Agora que tudo está configurado, você pode acessar suas variáveis de ambiente no Laravel de qualquer lugar. Por exemplo, para acessar o nome do segredo, basta usar o comando:

$secretName = env('AWS_SECRET_MANAGER_SECRET');

Conclusão

Você agora configurou com sucesso a integração entre a AWS e o Laravel usando o IAM e o Secrets Manager. Isso permitirá que sua aplicação Laravel acesse segredos de maneira segura, sem a necessidade de armazenar credenciais diretamente no código.

Quer aprender mais? Assista à nossa videoaula completa sobre como integrar o AWS IAM e o Secrets Manager com Laravel. No vídeo, mostramos o passo a passo de forma prática, com exemplos detalhados para que você consiga implementar tudo isso no seu projeto sem dificuldades.