Autenticação de API Gateway
Yong Qian
November 25, 2022
Importância da Autenticação e Autorização para Gateways de API
A função principal de um gateway de API pode ser resumida como conectar consumidores de API e provedores de API.
Na prática, exceto por algumas APIs que permitem acesso anônimo, os provedores frequentemente restringem os consumidores: apenas consumidores qualificados podem acessar a API. Além disso, os provedores podem não ter a mesma política de acesso para diferentes consumidores, por exemplo, os Consumidores A e B podem acessar a API /send_mail
, mas a frequência de chamadas por minuto precisa ser calculada de forma diferente.
A partir dos dois pontos acima, podemos ver que é crucial identificar e verificar a identidade dos Consumidores de API no nível do gateway de API. A seguir, apresentaremos como o gateway de API de código aberto Apache APISIX implementa a autenticação para consumidores e os métodos de autenticação amplamente adotados por empresas, e então introduziremos como o sistema de autenticação de usuários do APISIX pode ser usado em conjunto com outros recursos de segurança para aprimorar ainda mais a proteção de segurança dos gateways de API.
Autenticação e Autorização do Apache APISIX
Proxies HTTP tradicionais só podem identificar o solicitante com base em meios rudimentares, como domínio de solicitação e IP do cliente, o que não é suficiente para um gateway de API. Precisamos de métodos de autenticação mais refinados para atender a requisitos de negócios cada vez mais complexos. Uma das principais vantagens do APISIX em relação aos proxies tradicionais é sua capacidade flexível de extensão de plugins, incluindo uma coleção de plugins para autenticação de usuários que podem ser divididos em duas categorias, dependendo do método de implementação:
- Interface com Serviços de Autenticação Externos
- Autenticação Interna do Gateway pelo Objeto Consumer Projetado pelo APISIX
Esses dois métodos de autenticação serão apresentados a seguir.
Interface com Serviços de Autenticação Externos
Antes que uma empresa adote um gateway de API, muitas vezes há um serviço de autenticação separado implantado no sistema. Então, como podemos conectar o APISIX ao serviço de autenticação existente? O APISIX fornece uma série de plugins que funcionam ao se conectar com vários serviços de autenticação externos e delegar a eles a conclusão da autenticação.
Por exemplo, podemos usar o plugin openid-connect
para se conectar a qualquer serviço de autenticação que suporte o protocolo OIDC. A seguir está uma configuração de exemplo para se conectar ao serviço keycloak:
curl http://127.0.0.1:9180/apisix/admin/routes -H "X-Api-Key: your-API-key" -XPOST -d '
{
"uri":"/*",
"plugins":{
"openid-connect":{
"client_id":"apisix", // Gerado quando o keycloak cria um cliente
"client_secret":"d5c42c50-3e71-4bbe-aa9e-31083ab29da4",
"discovery":"http://keycloak:8080/auth/realms/apisix_test_realm/.well-known/openid-configuration", // Endpoint OpenID do keycloak
"scope":"openid profile",
"bearer_only":false,
"realm":"apisix_test_realm",
"introspection_endpoint_auth_method":"client_secret_post",
"redirect_uri":"http://127.0.0.1:9080/"
}
},
"upstream":{
...
}
}'
Autenticação Interna do Gateway
Consumer
Quando as solicitações de várias fontes chegam ao gateway de API, o gateway deve identificar esses chamadores. O Apache APISIX propõe o conceito de "Consumer" para representar os chamadores de um determinado tipo de serviço.
O objeto Consumer requer a configuração de um plugin de autenticação para uso. Tomemos o plugin mais simples key-auth
como exemplo:
$ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
"username": "jack",
"plugins": {
"key-auth": {
"key": "auth-jack"
}
}'
A configuração acima significa que, quando a solicitação carrega a chave especificada (auth-jack), a solicitação atual será associada ao Consumer - jack. Como você pode ver, o plugin de autenticação configurado no Consumer é, na verdade, uma credencial de identidade sob um mecanismo de autenticação especificado. No plugin key-auth
, a chave é a credencial que identifica um consumidor, semelhante ao nome de usuário e senha do plugin basic-auth
.
Configurar Plugin de Autenticação para Rota
Depois de associarmos as informações de credencial a um consumidor específico via Consumer, também precisamos habilitar o plugin de autenticação na rota correspondente:
$ curl http://127.0.0.1:9180/apisix/admin/routes/orders -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
"uri": "/orders",
"plugins": {
"key-auth": {
"header": "Authorization"
}
}
}'
A configuração acima significa que o plugin key-auth
está habilitado na rota /orders
, e o efeito de autenticação é o seguinte:
$ curl http://127.0.0.1:9080/orders -H 'Authorization: auth-jack' -i
HTTP/1.1 200 OK
...
$ curl http://127.0.0.1:9080/orders -H 'Authorization: wrong-key' -i
HTTP/1.1 401 Unauthorized
...
{"message":"Invalid API key in request"}
Quando uma solicitação de um usuário atinge essa rota, o APISIX tentará obter a chave fornecida pelo usuário através do cabeçalho Authorization
. Se não for obtida, ou se a chave obtida não for legítima, a solicitação será rejeitada diretamente pelo gateway, protegendo assim o serviço upstream.
Pode-se ver que, nos dois métodos de autenticação acima, o plugin de autenticação está no centro de todo o sistema, cuja riqueza afeta diretamente a escolha dos usuários para gateways de API alcançarem a autenticação. A seguir estão alguns dos métodos de autenticação principais e suas respectivas vantagens e desvantagens para sua referência.
Métodos de Autenticação Principais
Autenticação e autorização, um mecanismo básico que existe desde que entramos no mundo da computação, evoluiu para um campo muito diversificado após tantas iterações ao longo dos anos. O mecanismo de plugins do APISIX reduziu muito o custo de desenvolvimento para implementar vários métodos de autenticação. A seguir estão alguns dos métodos de autenticação principais já suportados pelo APISIX:
Key Auth
Key Auth é o mais simples de todos os plugins de autenticação, mas tem um conjunto rico de aplicações em cenários do mundo real, como licenças para software pago, tokens para identificar desenvolvedores em plataformas de API aberta, etc., que podem ser facilmente implementados com Key Auth. Além disso, com base na capacidade de configuração e alocação totalmente dinâmica do APISIX, as chaves podem ser criadas e revogadas rapidamente, entrando em vigor em tempo real.
Basic Auth
Basic Auth é um método de autenticação baseado em nome de usuário e senha, frequentemente usado em cenários de login na web. Por exemplo, o painel de administração de um site pode ser usado após o login do administrador, onde podemos usar o Basic Auth para autenticação.
LDAP
LDAP (Lightweight Directory Access Protocol) é um protocolo de acesso a diretórios leve baseado no padrão X.500, fornecendo controle de acesso e manutenção de diretórios de informações distribuídos via protocolo IP. Com o LDAP, os desenvolvedores de aplicativos e operações podem controlar o acesso dos usuários aos recursos em um nível granular. Com o plugin ldap-auth
do APISIX, você pode facilmente se conectar a plataformas que implementam o protocolo LDAP, como o Active Directory da Microsoft ou o OpenLDAP Server para plataformas Linux, para controlar finamente o acesso dos Consumers a rotas específicas.
OIDC
OpenID é um sistema de autenticação online descentralizado. Para sites que suportam OpenID, os usuários não precisam se lembrar de tokens de autenticação tradicionais, como nomes de usuário e senhas. Em vez disso, eles só precisam se registrar antecipadamente em um site que atua como provedor de identidade OpenID (IdP), e podem então usar essa conta para fazer login em todos os aplicativos que se conectam a esse provedor, por exemplo, para autenticar usuários do nosso próprio sistema através das contas dos serviços conhecidos do Google ou Facebook.
Para OIDC, o APISIX fornece o plugin openid-connect
, que pode ser usado para se conectar a serviços de autenticação que suportam o protocolo OIDC.
Forward Auth
Quando o plugin de autenticação padrão do APISIX não atende às suas necessidades atuais, ou se um serviço de autenticação dedicado e não padronizado já foi implantado em seu sistema, você pode considerar usar o plugin forward-auth
. Usando este plugin, você pode encaminhar as solicitações dos usuários para o serviço de autenticação via HTTP e retornar erros personalizados ou redirecionar os usuários para a página de autenticação se o serviço de autenticação responder com um status não normal (código de erro diferente de 20x).
Com o poder do plugin forward-auth
, a lógica de autenticação e autorização pode ser transferida de forma muito inteligente para um serviço externo dedicado e não padronizado.
Vinculação a Outros Plugins Após Autenticação
A autenticação de usuários é apenas o primeiro passo para proteger a API com o APISIX. Combinar as capacidades de autenticação com outros plugins de segurança ampliará ainda mais as capacidades de segurança do gateway.
ACL (consumer-restriction)
Em um sistema backend complexo, pode haver algumas APIs que têm restrições de segurança mais altas do que outras, que exigem não apenas bloquear usuários anônimos, mas também restringir usuários autenticados, por exemplo, permitindo apenas usuários na lista branca acessar a API de gerenciamento de usuários.
Nesse caso, podemos usar o plugin consumer-restriction
fornecido pelo APISIX para implementar o mecanismo de controle de acesso.
$ curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: your-API-key' -X POST -i -d '
{
"uri": "/api/v1/users/admin",
"plugins": {
"key-auth": {},
"consumer-restriction": {
"whitelist": [
"Rose",
"Peter
]
}
},
"upstream": {
...
},
}'
A rota acima restringe a rota /api/v1/users/admin
para exigir autenticação key auth através dos plugins key-auth
e consumer-restriction
, e apenas Rose e Peter podem acessá-la.
Limitação de Taxa (limit-count)
Descrevemos anteriormente que você pode associar credenciais de usuário a consumidores configurando plugins de autenticação no Consumer, mas o fato é que os objetos Consumer do APISIX podem montar não apenas plugins de autenticação, mas também qualquer plugin como Route e Service.
Por exemplo, na aplicação real, a política de limitação de taxa muitas vezes não é estática, mas personalizada. É comum exigir que diferentes chamadores de nível de serviço tenham políticas de limitação de taxa de API diferentes. No entanto, tal demanda não pode ser resolvida montando o plugin de limitação de taxa na rota. Portanto, precisamos montar o plugin de limitação de taxa no Consumer e especificar uma política de limitação de taxa direcionada para cada consumidor.
$ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
"username": "jack",
"plugins": {
"key-auth": {
"key": "jack"
},
"limit-count": {
"count": 200,
"time_window": 60,
"rejected_code": 503,
"key": "$consumer_name",
}
}'
$ curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: your-API-key' -X PUT -i -d '
{
"username": "rose",
"plugins": {
"key-auth": {
"key": "rose"
},
"limit-count": {
"count": 1000,
"time_window": 60,
"rejected_code": 503,
"key": "$consumer_name",
}
}'
Com a configuração acima, especificamos diferentes políticas de limitação de taxa para jack e rose, com rose tendo uma cota de contagem de solicitações maior de 1000 em 60 segundos, enquanto jack tem apenas 200.
Resumo
Como uma capacidade indispensável dos gateways de API, autenticação e autorização é um dos fatores importantes que os usuários consideram ao selecionar gateways de API.
Apache APISIX, o gateway de código aberto apresentado neste artigo, cobre todos os principais métodos de autenticação e pode atender às necessidades de autenticação e autorização dos usuários empresariais. O APISIX também tem as seguintes vantagens:
- Plugins de autenticação prontos para uso e ricos
- Suporta métodos de autenticação internos e externos, que os usuários podem escolher livremente
- Suporta desenvolvimento secundário, fácil de se conectar a centros de autenticação personalizados
Esses benefícios podem ajudar as empresas a implementar mais facilmente a autenticação e autorização no nível do gateway e fortalecer a segurança da API.
Bem-vindo a aprender mais sobre o Apache APISIX. Você pode entrar em contato conosco em https://api7.ai/contact.