Planejamos refatorar o sistema da empresa em um sistema baseado em microsserviço. Esses microsserviços serão usados por nossos próprios aplicativos internos da empresa e por parceiros de terceiros, se necessário. Um para reserva, outro para produtos etc.
Não temos certeza de como lidar com funções e escopos. A idéia é criar três funções básicas de usuário, como administradores, agentes e usuários finais, e permitir que os aplicativos do consumidor ajustem os escopos, se necessário.
- Os administradores podem criar, atualizar, ler e excluir todos os recursos por padrão (para a empresa).
- Os agentes podem criar, atualizar e ler dados para sua empresa.
- Os usuários finais podem criar, atualizar, excluir e ler dados, mas não podem acessar os mesmos terminais que agentes ou administradores. Eles também poderão criar ou modificar dados, mas não no mesmo nível que agentes ou administradores. Por exemplo, os usuários finais podem atualizar ou ler as informações da conta, assim como o agente poderá fazer isso por eles, mas não podem ver ou atualizar as notas do administrador.
Digamos que os agentes por padrão possam criar, ler e atualizar cada recurso para sua empresa e esse seja o escopo máximo que pode ser solicitado para seu token / sessão, mas os desenvolvedores do aplicativo cliente (consumidor da API) decidiram que um de seus agentes pode leia e crie apenas alguns recursos.
É uma prática melhor lidar com isso em nossa segurança interna e permitir que eles gravem esses dados em nosso banco de dados ou que os clientes manuseiem internamente solicitando um token com escopo menor e que escrevam qual agente terá qual escopo em seu banco de dados ? Dessa forma, teríamos que rastrear apenas escopos de token.
A desvantagem disso é que nossa equipe também precisará criar mecanismos de acesso aprimorados em nossos aplicativos internos.
Com esse pensamento, os microsserviços e seu sistema de autorização não devem ser incomodados com as necessidades dos clientes, porque eles são apenas consumidores e não fazem parte do sistema (mesmo que alguns desses consumidores sejam nossos próprios aplicativos internos)?
Esta delegação é uma boa abordagem?
payment:[read]
, vendedor tempayment: [create]
. Você agrega permissões nesse caso?(resource/action)
, deve mesclá-los. Se as permissões se sobrepuserem, você deverá agregá-las. A idéia é definir apenas os recursos e ações permitidos no token, deixando as funções como uma abstração usada para fornecer aos clientes uma maneira menos complicada de lidar com a autorização.user
propriedade em sua carga útil. A maneira como bloqueio um recurso de propriedade de um usuário é mapeando auser
reivindicação para o URL. Por exemplo:/users/coyote/back-account
seria acessível apenas por um token comuser
reivindicação igual acoyote
. Espero que ajude.Eu acho que não importa o quê, você desejará que seus serviços aceitem um token de autenticação fornecido por um serviço de autenticação que você escreve para validar usuários. Essa é a maneira mais direta / segura de evitar o uso indevido de seus microsserviços. Além disso, em geral, se você deseja que um cliente tenha uma boa experiência, implemente os recursos críticos e faça um teste completo para garantir que os recursos oferecidos sejam bem implementados.
Como todos os chamadores precisam fornecer aos seus microsserviços evidência de que foram autenticados, você também pode vincular permissões a essa autenticação. Se você fornecer a capacidade de vincular um usuário a um grupo de acesso arbitrário (ou grupos, se desejar, embora seja mais difícil lidar com permissões adicionar ou subtrair aqui.), Haverá menos perguntas dos seus clientes sobre por que o usuário x conseguiu executar uma operação indesejada. De qualquer forma, alguém precisa fazer a verificação da lista de acesso para cada serviço, para que também seja você. É algo que seria muito facilmente codificado no início de todos os serviços (
if ( !TokenAuthorized(this.ServiceName, this.token) { Raise error }
) Você também pode fazer isso e acompanhar os grupos de usuários. É verdade que você precisará ter um gerente de grupo de permissões e trabalhar com ele na interface do usuário de gerenciamento de usuários (usar existente / criar novo grupo para permissões de usuários) Liste definitivamente os usuários vinculados a um grupo quando editar a definição, para evitar confusão. . Mas, não é um trabalho difícil. Basta ter metadados para todos os serviços e vincular a pesquisa do mapeamento entre grupo e serviço ao tratamento de tokens de autenticação.Ok, existem alguns detalhes, mas cada um de seus clientes que deseja essa funcionalidade precisaria codificá-la em qualquer caso, e se você oferecer suporte às permissões de usuário de três níveis, poderá estendê-la apenas para acesso por usuário grupos. Provavelmente, uma interseção lógica entre as permissões do grupo de base e as permissões específicas do usuário seria a agregação correta, mas se você quiser adicionar e remover permissões de base, das permissões de administrador, agente e base de usuário final, será necessário o sinalizador tri-state usual nos grupos de permissões: Adicionar permissão, Negar permissão, Permissão padrão e combinar permissões adequadamente.
(Como uma observação, tudo isso deve acontecer em algo como SSL ou SSL bidirecional, se você estiver preocupado com a segurança dos dois lados da conversa. Se você "vazar" esses tokens para um invasor, ele estará como se ele estivesse " d quebrou uma senha.)
fonte
Minha opinião é que você tem duas opções aqui.
Se você só precisa ter acesso configurável a essencialmente o mesmo aplicativo, solicite aos serviços que verifique as permissões e forneça aos seus clientes uma interface que permita alterar as permissões concedidas a cada função. Isso permite que a maioria dos usuários use a configuração de função padrão, na qual os clientes 'problemáticos' podem ajustar as funções ou criar novas para atender às suas necessidades.
Se seus clientes estiverem desenvolvendo seus próprios aplicativos, eles deverão apresentar sua própria API intermediária. Que se conecta ao seu como administrador, mas verifica a solicitação recebida em relação aos seus próprios requisitos de autenticação personalizada antes de chamar seus serviços
fonte
Consideração de segurança
Se eu entendi bem o seu design, você pretende delegar alguns mecanismos de controle de acesso a recursos para o lado do cliente, ou seja, um aplicativo consumidor reduz os itens que um usuário pode ver. Sua suposição é:
Vejo aqui dois problemas sérios para negócios sérios:
É por isso que aconselho antecipar esses eventos e cuidar de solicitações de autorização. Você está em uma fase inicial de reengenharia e será muito mais fácil levar isso em conta na sua arquitetura (mesmo que você não os implemente todos) mais tarde.
Se você exercer sua posição atual, consulte pelo menos o seu oficial de segurança da informação.
Como implementá-lo
Você tem o truque:
Ok, você pretende usar alguns tokens gerais escolhidos pelo cliente. Novamente uma fraqueza em meus olhos, porque alguns clientes podem estar fora de seu controle.
Não sei se você já usa o JWT ou se usa outras técnicas. Mas se você usar o JWT, poderá ter um token de identidade que carrega a identidade do usuário (e até um segundo token que identifica com segurança o aplicativo de origem, o que pode permitir diferenciar o nível de confiança entre clientes internos e externos )
Como você pretende adotar uma arquitetura de microsserviço, gostaria de sugerir uma diferença entre o gerenciamento de usuários e o processo de autenticação (que deve ser executado como um serviço dedicado) e o controle de acesso (que é específico para cada microsserviço e deve sejam tratados localmente por cada um deles). É claro que algum cliente administrador deve fornecer uma visão geral abrangente de vários serviços, para facilitar o uso).
fonte
Aqui, há uma resposta curta também. Você deve implementar todos os principais recursos que deseja oferecer aos seus "clientes". Parece problemático fazer com que os clientes adicionem um comportamento fundamental como as próprias permissões de usuário, pois você já está fazendo autenticação do usuário; se você deixar para o cliente implementá-lo, poderá acabar "suportando" várias implementações do mesmo código de permissões. Mesmo que você não "seja o proprietário", haverá erros no código e você deseja que seus clientes tenham a funcionalidade que eles esperavam, dentro do razoável, para apoiar a resolução dos problemas que um cliente está enfrentando. Apoiar várias bases de código não é divertido.
fonte