📣读完这篇文章里你能收获到
- 🛠️ 了解APISIX身份认证的重要性和基本概念,以及如何在微服务架构中实施API安全。
- 🔑 学习如何使用APISIX的Key Authentication插件进行API密钥管理,包括创建消费者和路由。
- 🔄 掌握如何定期轮换API密钥,以及如何为不同消费者分配不同权限范围的密钥。
- 📊 探索如何通过日志记录和监控来增强APISIX的安全性和可审计性。
文章目录
- 一、引言
- 1.1 APISIX身份认证基础
- 1.2 APISIX支持的身份授权插件
- 二、APISIX身份认证核心组件
- 2.1 Consumer
- 2.2 Key Authentication
- 三、身份认证实战
- 3.1 启用 Key Authentication
- 3.1.1 创建消费者
- 3.1.2 创建Routes
- 3.1.3 验证
- 3.2 自定义请求头Header
- 3.3 禁用 Authentication
- 四、最佳实践
一、引言
在现代微服务架构中,API的安全性至关重要。随着业务系统之间的交互越来越频繁,API成为了核心数据和服务的交换通道。Apache APISIX作为一款高性能的云原生API网关,提供了丰富的插件生态以满足各种API治理需求,其中身份认证就是关键的一环。
1.1 APISIX身份认证基础
API 网关主要作用是连接 API 消费者
和提供者。出于安全考虑,在访问内部资源之前,应先对消费者
进行身份验证和授权。
1.2 APISIX支持的身份授权插件
APISIX 拥有灵活的插件扩展系统,目前有很多可用于用户身份验证和授权的插件。
- Key Authentication
- Basic Authentication
- JSON Web Token (JWT) Authentication
- Keycloak
- Casdoor
- Wolf RBAC
- OpenID Connect
- Central Authentication Service (CAS)
- HMAC
- Casbin
- LDAP
- Open Policy Agent (OPA)
- Forward Authentication
- Multiple Authentications
二、APISIX身份认证核心组件
本文将以Apache APISIX内置的Key-Auth
插件为例,详细介绍如何实现API的身份认证。
2.1 Consumer
Consumer(也称之为消费者)是指使用 API 的应用或开发人员。
在 APISIX 中,消费者需要一个全局唯一的 名称,并从上面的列表中选择一个身份验证 插件。
2.2 Key Authentication
Key Authentication(也称之为密钥验证)是一个相对比较简单但是应用广泛的身份验证方法,基于HTTP Header中的API密钥对请求进行验证。每个客户端都拥有一个唯一的API密钥,当客户端发起请求时,必须在请求头中包含此密钥,服务器端的APISIX将会检查并验证该密钥的有效性。
它的设计思路如下:
- 管理员为路由添加一个身份验证密钥(API 密钥)。
- API 消费者在发送请求时,在查询字符串或者请求头中添加密钥。
三、身份认证实战
3.1 启用 Key Authentication
3.1.1 创建消费者
创建一个名为 consumer-key 的消费者
,并启用 key-auth 插件,密钥设置为 secret-key。所有携带密钥 secret-key 的请求都会被识别为消费者 consumer-key。
curl -i "http://127.0.0.1:9180/apisix/admin/consumers" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"username": "consumerkey",
"plugins": {
"key-auth": {
"key": "secret-key"
}
}
}'
3.1.2 创建Routes
创建一个名为routes-key的路由,并启用 key-auth 插件
curl -i "http://127.0.0.1:9180/apisix/admin/routes" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"id": "routes-key",
"name": "routes-key",
"uri": "/ip",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
},
"plugins": {
"key-auth": {}
}
}'
3.1.3 验证
Key-Auth插件默认的Headers前缀为apikey
,如需修改,可继续往下看
我们可以在以下场景中进行验证:
- 发送不带任何密钥的请求
curl -i "http://127.0.0.1:9080/ip"
- 发送携带正确密钥的请求
curl -i "http://127.0.0.1:9080/ip" -H 'apikey: secret-key'
3.2 自定义请求头Header
如果你不想从默认的 apikey header 获取 key,可以自定义 header,如下所示:
{
"key-auth": {
"header": "Authorization"
}
}
接下来基于上面的Routes进行更改
curl -i "http://127.0.0.1:9180/apisix/admin/routes/routes-key" \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PATCH -d '
{
"plugins": {
"key-auth": {
"header": "Authorization"
}
}
}'
发送携带Header为Authorization
的请求进行验证
curl -i "http://127.0.0.1:9080/ip" -H 'Authorization: secret-key'
3.3 禁用 Authentication
将参数设置 _meta.disable 为 true,即可禁用密钥验证插件。
curl "http://127.0.0.1:9180/apisix/admin/routes/getting-started-ip" -X PATCH -d '
{
"plugins": {
"key-auth": {
"_meta": {
"disable": true
}
}
}
}'
四、最佳实践
- 定期轮换密钥:为了增加安全性,建议定期更换API密钥,避免长期使用同一密钥导致安全风险增大。
- 权限细分:可以为不同消费者分配不同权限范围的密钥,用于访问不同的API资源。
- 监控与日志记录:利用Apache APISIX的日志插件记录相关的认证事件,以便于审计和异常检测。