Política de Autorização do Apache APISIX: Proteja Suas APIs
April 21, 2023
Introdução
Atualmente, as APIs tornaram-se a ponte que conecta diversos sistemas e aplicativos em termos de dados e funcionalidades. Enquanto desfrutamos da conveniência das APIs, garantir a segurança dos dados e evitar vazamentos de dados e outros problemas de segurança tornaram-se as principais preocupações dos usuários. Nesse contexto, o controle de acesso desempenha um papel crucial. Ao formular políticas de controle de acesso adequadas para APIs, você não apenas protege as APIs contra enormes ataques cibernéticos e garante a segurança dos dados, mas também ajuda as empresas a atenderem aos requisitos de conformidade e a aumentar a confiança dos clientes.
O Apache APISIX é um gateway de API nativo da nuvem dinâmico, em tempo real e de alto desempenho, que oferece um conjunto rico de recursos de gerenciamento de tráfego, como balanceamento de carga, upstream dinâmico, lançamento canário, interrupção de serviço, autenticação e observabilidade. Neste artigo, apresentaremos as políticas de controle de acesso do Apache APISIX e discutiremos quais estratégias comuns podem ser usadas para proteger a segurança da sua API e garantir a operação estável do seu sistema.
O que é uma Política de Controle de Acesso?
Políticas de controle de acesso são mecanismos de segurança projetados para proteger dados ou recursos sensíveis em sistemas de computador, redes ou aplicativos, garantindo que apenas usuários ou aplicativos autorizados possam acessá-los. Isso ajuda a reduzir o risco de vazamento de dados e vulnerabilidades de segurança. Em um gateway de API, as políticas de controle de acesso são um componente essencial. Como o ponto de entrada para todo o tráfego, o gateway de API é responsável por receber e encaminhar todas as solicitações de API. Portanto, as políticas de controle de acesso do gateway de API determinam diretamente a segurança e a estabilidade dos serviços upstream.
Políticas de Controle de Acesso Comuns no Apache APISIX
O Apache APISIX oferece um conjunto rico de políticas de controle de acesso, suportando o protocolo de autenticação OAuth 2.0 e integrando-se com vários serviços de autenticação externos, como Keycloak, Ory Hydra, Okta, Auth0 e outros. Além de suportar serviços de autenticação externos, o APISIX também fornece métodos de autenticação internos poderosos. Combinado com o objeto Consumer do APISIX, você pode misturar e combinar livremente autenticação, autorização, limitação de taxa, listas negras e listas brancas de IP para proteger suas APIs e evitar efetivamente que solicitações maliciosas prejudiquem seus serviços de API.
1. Controle de Acesso Baseado em IP
O controle de acesso baseado em IP é o método mais simples e direto, que pode restringir o acesso à sua API apenas a solicitações de endereços específicos.
Você pode usar o plugin ip-restriction do APISIX para habilitar essa funcionalidade, que oferece várias opções de configuração, como listas de endereços IP permitidos ou negados, intervalos de endereços IP e mensagens de erro retornadas ao negar solicitações. Você pode configurar essas opções de acordo com suas necessidades para alcançar um controle de acesso mais granular. Vale ressaltar que o controle de acesso baseado em IP pode ter algumas limitações, pois os endereços IP podem ser falsificados ou compartilhados. Portanto, ao usar o plugin ip-restriction, é melhor combiná-lo com outros plugins de controle de acesso para melhorar a segurança e a flexibilidade do seu sistema.
2. Controle de Acesso Baseado em API Key
Esse controle de acesso é uma estratégia muito comum para controle de acesso a APIs. Seu princípio básico é autenticar e autorizar solicitações por meio de uma API Key pré-gerada, o que pode adicionar rapidamente mecanismos de autenticação a APIs. No entanto, é importante proteger a API Key para evitar que ela vaze e sofra ataques maliciosos.
O plugin key-auth do APISIX pode facilmente adicionar mecanismos de autenticação às suas APIs, adicionando a chave à string de consulta ou ao cabeçalho para autenticação ao enviar solicitações. No APISIX versão 3.1 e posterior, ele também suporta criptografar e armazenar API Keys no etcd usando a configuração encrypted storage fields data_encryption
, aumentando ainda mais a segurança da sua API.
3. Controle de Acesso Baseado em Token
Esse método é implementado adicionando um campo de autenticação contendo um token no cabeçalho da solicitação. Um token é uma chave, geralmente uma string ou número, usada para verificar se o remetente de uma solicitação de API tem permissão para acessar a API. Normalmente, um token contém a identidade e as permissões do usuário, permitindo que o servidor determine se o usuário tem permissão de acesso ao iniciar uma solicitação de API e tomar decisões apropriadas de autorização ou negação.
O APISIX fornece o plugin jwt-auth para usar essa estratégia de controle de acesso, suportando opções de configuração como local de armazenamento do token, período de validade do token, algoritmo de assinatura JWT e chaves. Você pode configurar essas opções de acordo com suas necessidades para atender a diferentes requisitos de autenticação.
4. Controle de Acesso Baseado em Caminho da Solicitação
O controle de acesso baseado no caminho da solicitação é alcançado filtrando e correspondendo caminhos de solicitação para controlar o acesso a APIs, serviços ou recursos específicos. Essa estratégia é comumente usada em cenários que exigem controle de acesso granular sobre recursos, como proteger dados sensíveis ou controlar o acesso de usuários específicos a recursos específicos dentro do sistema.
O plugin uri-blocker do APISIX suporta a configuração de listas de regras regex para interceptar URIs de solicitação de usuários e configurar rejected_code
e rejected_msg
para especificar o código de status HTTP e o corpo da resposta retornados após a interceptação bem-sucedida. Isso permite que os administradores controlem finamente as permissões dos usuários e melhorem a segurança e a controlabilidade da API.
5. Política de Controle de Acesso Baseada em ACL
ACL (Access Control List) é uma política de controle de acesso baseada em lista usada para controlar as permissões de acesso de usuários ou grupos de usuários a recursos. Seu princípio básico é definir uma lista ACL para cada recurso, listando os usuários ou grupos de usuários permitidos a acessar o recurso. Quando um usuário solicita acesso ao recurso, seu acesso é determinado com base na lista ACL correspondente.
No APISIX, podemos usar o consumer-restriction para habilitar essa funcionalidade. Os administradores podem facilmente controlar quais usuários ou grupos de usuários podem acessar recursos específicos e evitar que usuários não autorizados enviem solicitações a áreas sensíveis, evitando vazamentos de dados sensíveis.
Introdução ao Cenário: Controle de Acesso Mais Granular
Em cenários de aplicação do mundo real, frequentemente implementamos controle de acesso mais granular para recursos que contêm dados sensíveis. Por exemplo, agora temos dois usuários, A e B, que usam os mesmos métodos internos de autenticação, como key-auth ou basic-auth. Também queremos aplicar controle de acesso mais granular ao usuário B, proibindo-o de acessar certas APIs.
Podemos usar o plugin consumer-restriction
do APISIX para algum controle mais granular. Esse plugin permite que você defina restrições de acesso com base em Route, Service ou Consumer, e suporta a configuração de quatro valores de atributo type
:
consumer_name
: Restringir o acesso do Consumer a Route ou Service listando ousername
do Consumer em uma lista branca ou negra.consumer_group_id
: Restringir o acesso do Consumer a Route ou Service listando oid
do Consumer Group em uma lista branca ou negra.service_id
: Restringir o acesso do Consumer a Service listando oid
do Service em uma lista branca ou negra. Isso deve ser usado em conjunto com um plugin de autorização.route_id
: Restringir o acesso do Consumer a Route listando oid
da Route em uma lista branca ou negra.
Nesse cenário, podemos usar dois métodos de configuração para impedir que o usuário B acesse um recurso de API específico.
Configuração da Política de Controle de Acesso na Route
- Primeiro, precisamos criar dois objetos Consumer no APISIX e habilitar o plugin
basic-auth
, com os nomes userA e userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userA",
"plugins": {
"basic-auth": {
"username":"userA",
"password": "123456"
}
}
}'
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userB",
"plugins": {
"basic-auth": {
"username":"userB",
"password": "123456"
}
}
}'
- Em seguida, habilitamos e configuramos a propriedade
whitelist
doconsumer-restriction
na rota onde precisamos aplicar a restrição e adicionamos ousername
do consumer userA criado anteriormente. Dessa forma, a rota só aceitará solicitações do userA.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d '
{
"uri": "/get",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"plugins": {
"basic-auth": {},
"consumer-restriction": {
"whitelist": [
"userA"
]
}
}
}'
- Envie solicitações de acesso separadamente usando userA e userB.
curl -u userA:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 403 Forbidden
...
{"message":"The consumer_name is forbidden."}
O resultado indica que o userB foi restringido de acessar o recurso da API.
Configuração de Políticas de Controle de Permissões no Consumer
- Primeiro, vamos configurar uma rota cujo ID é chamado
forbidden-userB
e habilitar o pluginbasic-auth
.
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d '
{
"id": "forbidden-userB",
"uri": "/get",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"plugins": {
"basic-auth": {}
}
}'
- Crie dois objetos Consumer e habilite o plugin
basic-auth
. Observe que precisamos configurar o pluginconsumer-restriction
para refinar as políticas de controle de permissões para o userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userA",
"plugins": {
"basic-auth": {
"username":"userA",
"password": "123456"
}
}
}'
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d '
{
"username": "userB",
"plugins": {
"basic-auth": {
"username":"userB",
"password": "123456"
},
"consumer-restriction": {
"type": "route_id",
"blacklist": [
"forbidden-userB"
],
"rejected_code": 403
}
}
}'
- Envie solicitações usando userA e userB separadamente.
curl -u userA:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i
HTTP/1.1 403 Forbidden
...
{"message":"The route_id is forbidden."}
Ao examinar os resultados dos testes, podemos verificar que as solicitações do userB foram efetivamente limitadas.
Conclusão
Este artigo introduz as políticas de controle de permissões comumente usadas no APISIX e ilustra como habilitá-las e configurá-las no APISIX usando um cenário clássico. O controle de permissões é uma estratégia prevalente em gateways de API. O APISIX não apenas oferece um conjunto completo de plugins prontos para uso para autenticação, mas também fornece suporte extenso em áreas como segurança, gerenciamento de tráfego e observabilidade. Ao selecionar e configurar suas regras de política de controle de permissões, você pode facilmente fortalecer a segurança das suas APIs.