AWS S3: Automatize o Gerenciamento de Acesso em 3 Passos Simples

Foto do autor

By luis

Gerenciamento de Acesso a Dados no AWS S3: Uma Abordagem Automatizada

Há algum tempo, quando os servidores Unix com grandes sistemas de arquivos eram comuns, as empresas definiam regras complexas para gerenciar pastas e controlar o acesso a diferentes diretórios por diferentes usuários.

Normalmente, a infraestrutura de uma organização atende a vários grupos de usuários com necessidades, restrições de confidencialidade ou requisitos de conteúdo distintos. Em empresas globais, isso pode até significar a separação de conteúdo por localização geográfica, dividindo usuários por país.

Outros exemplos típicos incluem:

  • Isolamento de dados entre ambientes de desenvolvimento, teste e produção.
  • Restrição de conteúdo de vendas a um público específico.
  • Controle de acesso a conteúdo legislativo específico para cada país.
  • Limitação de acesso a dados de projetos a grupos selecionados.

A lista de exemplos é potencialmente infinita. A necessidade de gerenciar o acesso a arquivos e dados para todos os usuários da plataforma é universal.

Em soluções locais, essa tarefa era rotineira. O administrador configurava regras, usava ferramentas e mapeava usuários para grupos e, em seguida, grupos para pastas. O nível de acesso era definido como somente leitura ou leitura/gravação.

Com as plataformas de nuvem, como a AWS, espera-se que haja requisitos similares para restringir o acesso a conteúdo. No entanto, a solução deve ser diferente. Os arquivos não estão mais em servidores Unix, mas na nuvem (acessíveis a toda a organização ou até ao mundo), e o conteúdo está armazenado em *buckets* S3, não em pastas.

A seguir, apresento uma alternativa para abordar este problema, baseada em experiência prática.

Abordagem Simples, Mas Manual

Uma forma de resolver o problema sem automação é simples:

  • Criar um *bucket* S3 para cada grupo de usuários.
  • Definir permissões para que somente aquele grupo específico acesse o *bucket*.

Essa abordagem pode funcionar para soluções simples e rápidas. Contudo, há limitações.

Por padrão, uma conta AWS permite criar até 100 *buckets* S3. É possível aumentar esse limite para 1.000 solicitando um aumento através de um *ticket* à AWS. Se esses limites não forem um problema, você pode usar um *bucket* para cada grupo de usuários.

Problemas surgem quando grupos de usuários têm funções multifuncionais ou precisam acessar conteúdo de vários domínios simultaneamente. Por exemplo:

  • Analistas de dados que avaliam informações de diversas áreas e regiões.
  • Equipes de teste que compartilham serviços atendendo a várias equipes de desenvolvimento.
  • Usuários que geram relatórios com dados de diferentes países.

A complexidade da orquestração do acesso aumenta conforme as necessidades das organizações e os casos de uso se multiplicam. Ferramentas adicionais e até um administrador dedicado podem ser necessários para gerenciar e atualizar as listas de permissões.

Como podemos alcançar o mesmo de forma mais organizada e automatizada?

Se a abordagem de um *bucket* por domínio não funciona, a solução envolve o compartilhamento de *buckets* entre grupos de usuários. Nesses casos, a lógica de atribuição de acesso deve ser flexível e dinâmica.

Uma solução é usar *tags* nos *buckets* S3. As *tags* são recomendadas para qualquer cenário (no mínimo para facilitar a categorização de custos). Elas podem ser alteradas a qualquer momento.

Ao construir toda a lógica com base nas *tags* do *bucket* e configurar o restante de acordo, a propriedade dinâmica é garantida. A finalidade do *bucket* pode ser redefinida alterando os valores das *tags*.

Que Tipo de *Tags* Usar?

Isso depende do seu caso de uso específico. Por exemplo:

  • Separar *buckets* por tipo de ambiente (DEV, TEST, PROD). Usar uma *tag* como “ENV” com os respectivos valores.
  • Separar por país. Criar uma *tag* “PAÍS” e atribuir o nome do país.
  • Separar por departamento funcional (analistas, cientistas de dados). Usar uma *tag* “USER_TYPE”.
  • Definir uma estrutura de pastas fixa para grupos de usuários. Utilizar uma *tag* que especifique diretórios como “data/import”, “data/processed”.

O ideal é definir *tags* que possam ser combinadas logicamente para formar uma estrutura de pastas completa no *bucket*.

Por exemplo, combinar as seguintes *tags* pode criar uma estrutura para diferentes usuários, de vários países, com pastas de importação predefinidas:

  • ////

Ao alterar o valor de , você pode redefinir a finalidade da *tag* para um ambiente específico (teste, desenvolvimento, produção).

Isso permite que o mesmo *bucket* seja usado por muitos usuários diferentes. Os *buckets* não suportam pastas diretamente, mas suportam “rótulos” que funcionam como subpastas. Os usuários precisam percorrer uma série de rótulos para acessar seus dados.

Após definir as *tags*, o próximo passo é criar políticas de *bucket* S3 que as usem.

Se as políticas utilizarem os nomes das *tags*, você estará criando “políticas dinâmicas”. Isso significa que a política se comportará de forma diferente para *buckets* com diferentes valores de *tag*.

Essa etapa envolve alguma codificação personalizada de políticas dinâmicas, mas você pode usar o editor de políticas da AWS.

Na política, você deve codificar os direitos de acesso (leitura, gravação) para cada *bucket*. A lógica lerá as *tags* e criará a estrutura de pastas com base nelas. Subpastas serão criadas com permissões de acesso adequadas.

A vantagem da política dinâmica é que você cria apenas uma e atribui a vários *buckets*. Ela se comportará de maneira diferente para cada um, mas sempre de acordo com a expectativa.

Esta é uma forma eficaz de gerenciar atribuições de direitos de acesso de forma centralizada para muitos *buckets*, que seguem modelos previamente definidos pela organização.

Automatize a Integração de Novas Entidades

Após definir políticas dinâmicas e atribuí-las aos *buckets*, os usuários podem utilizar os mesmos *buckets* sem o risco de acessar conteúdos em pastas para as quais não têm permissão.

Grupos de usuários com acesso mais amplo também se beneficiarão, pois todos os dados estarão no mesmo *bucket*.

O último passo é tornar a integração de novos usuários, *buckets* e *tags* o mais simples possível. Isso requer mais codificação, que não precisa ser complexa se o processo de integração seguir regras claras e diretas.

Isso pode ser tão simples quanto criar um *script* executável pela AWS CLI com parâmetros para integrar uma nova entidade à plataforma. Ou pode ser uma série de *scripts* CLI executados em ordem específica:

  • create_new_bucket(,,,, ..)
  • create_new_tag(,,)
  • update_existing_tag(,,)
  • create_user_group(,,)
  • etc.

Espero que tenha entendido. 😃

Uma Dica Profissional 👨‍💻

Uma dica adicional pode ser facilmente aplicada.

As políticas dinâmicas podem ser usadas não apenas para gerenciar acesso a pastas, mas também para atribuir direitos de serviços para *buckets* e grupos de usuários automaticamente!

Basta estender a lista de *tags* nos *buckets* e adicionar direitos de acesso de política dinâmica para usar serviços específicos para grupos de usuários.

Por exemplo, um grupo pode precisar de acesso a um servidor de banco de dados. Isso pode ser feito com políticas dinâmicas que gerenciam tarefas de *bucket*, principalmente se o acesso aos serviços for baseado em função. Basta adicionar ao código da política dinâmica uma parte que processará *tags* relacionadas ao banco de dados e atribuirá os privilégios necessários.

Desta forma, a integração de um novo grupo de usuários é feita por uma única política dinâmica. Ela pode ser reutilizada para muitos grupos diferentes, desde que sigam o mesmo modelo, embora não necessariamente os mesmos serviços.

Você também pode consultar estes Comandos S3 da AWS para gerenciar *buckets* e dados.