使用NGINX和Azure Active Directory保护API访问

NGINX | 2022年10月06日

API在应用连接中发挥着关键作用,但也容易受到攻击。过去,单体应用只有一个需要保护的入口点。在微服务架构中,单个应用通常由许多通过API连接的微服务组成,而每个API都可能有数百个端点。因此,API的潜在攻击面非常大,每新增一个API,都会在安全边界上增加一个入口点。

保护API安全有多种策略,其中最基本的策略之一是访问控制。简单来说,必须验证用户身份(身份验证,即AuthN),并确认用户可以访问特定资源(授权,即AuthZ)。实施OpenID Connect(OIDC)是API最常用的访问控制方法之一。借助API Connectivity Manager,只需几分钟即可完成部署并开始运行。该产品是F5 NGINX Management Suite的一部分。

本教程将介绍如何使用API Connectivity Manager和Azure Active Directory(Azure AD)设置JSON Web令牌(JWT)验证,以完成OIDC工作流中的授权环节。

什么是OpenID Connect?

OpenID Connect(OIDC)是一种基于OAuth 2.0协议构建的身份协议。OIDC允许客户端验证最终用户或设备的身份。这是访问控制的一部分;访问控制包括身份验证和授权:

  • 身份验证用于验证用户或设备的身份是否与其声明一致
  • 授权用于确定经过验证的用户或设备可以访问哪些资源

OIDC有多种不同的实现方式,包括本教程中将使用的Azure AD。也可以将其他OIDC解决方案与API Connectivity Manager配合使用,例如F5 BIG-IP Access Policy Manager (APM)、Okta、Auth0、Ping Identity等。

开始前的准备

请确保满足以下先决条件:

如果需要访问API Connectivity Manager,可以注册NGINX Management Suite 30天免费试用。

创建Azure AD应用程序

打开浏览器并登录Azure Portal。

在左侧菜单中,点击“应用注册”。

Azure AD门户主页

图1:Azure AD门户主页

单击“新建注册”按钮。

Azure AD应用注册

图 2:Azure AD 应用注册

要创建新应用,请提供名称、重定向 URI,然后单击注册按钮。在此演示中,将使用Postman,因此需要使用Postman OIDC 重定向 URI。

创建新的 Azure AD 应用

图 3:创建新的 Azure AD 应用

应用创建完成后,需要创建OAuth作用域以提供API访问权限。点击左侧菜单中的“公开API”链接。

公开 API

图 4:公开 API

单击“添加范围”。

添加范围

图 5:添加作用域

接受默认的应用程序 ID URI,或自行创建一个,然后单击“保存并继续”按钮。如果要自行创建应用程序 ID URI,必须先在 Azure AD 中注册所需的域。

应用程序 ID URL

图 6:应用 ID URL

在本演示中,作用域基于Microsoft提供的示例。请填写以下信息,然后单击“添加作用域”按钮:

范围名称: Employees.Read.All
谁可以同意?: 管理员和用户
管理员同意显示名称: 对员工记录的只读访问权限
管理员同意说明: 允许以只读方式访问所有员工数据。
用户同意显示名称: 对您的员工记录的只读访问权限
用户同意说明: 允许以只读方式访问您的员工数据。

添加范围

图 7:添加作用域

接下来,需要授权客户端应用程序。为此,请获取客户端ID。单击左侧菜单中的“概述”链接,然后复制“应用程序(客户端)ID”。

应用程序(客户端)ID

图8:应用程序客户端ID

再次点击“公开 API”链接,然后点击“添加客户端应用程序”按钮。

添加客户端应用程序

图 9:添加客户端应用程序

将应用程序客户端ID粘贴到客户端ID字段中,并选中应用程序ID URI旁边的复选框。然后,单击“添加应用程序”按钮。

添加客户端应用程序

图 10:添加客户端应用程序

接下来,在本演示中,将通过授权代码流使用授权代码,因此Postman需要客户端密码。单击左侧菜单中的证书和密码链接,然后单击新建客户端密码按钮。

新建客户端密码

图 11:新建客户端密钥

为密钥命名,并保留默认过期时间。

密钥名称

图 12:密钥名称

接下来,复制客户端密钥并将其存储在密码保管库中,以便日后使用。

客户端密钥

图 13:客户端密钥

在 API Connectivity Manager 中配置 JWT 断言

配置好Azure AD应用程序后,即可在API Connectivity Manager中设置API网关集群,为已定义的服务执行JSON Web Token Assertion。此步骤需要确定Azure AD租户的JSON Web密钥(JWK)集的URI。

可从Azure AD租户的知名端点获取JWKS URI:
https://login.microsoftonline.com/<tenant-id>/v2.0/.well-known/openid-configuration

此页面将提供一个包含 jwks_uri 键的 JSON 有效负载。需要复制该键的值。

Azure AD租户已知端点

图14:Azure AD租户的知名端点

获取JWKS URI后,打开API Connectivity Manager控制台并转到服务代理的配置。点击“添加策略”,为“JSON Web Token Assertion”策略添加配置。

网关服务代理策略

图 15:Gateway Service Proxy 策略

接下来,将Azure AD租户的JKWS URI粘贴到“URI位置”字段中,然后单击“添加”按钮。

JSON Web Token断言策略

图16:JSON Web Token断言策略

点击“保存并发布”按钮,将此策略推送到API网关集群。

服务网关策略

图 17:服务网关策略

配置完成!API Connectivity Manager实例现已配置为在指定的服务网关上执行JWT断言。

使用Postman进行测试

现在可以测试您的设置,确保其按预期运行。开始之前,需要从Azure AD应用程序中获取以下几项信息:

  • 应用程序客户端密钥(之前已保存)
  • OAuth范围
  • OAuth授权端点
  • OAuth令牌端点

要获取OAuth作用域,请打开Azure门户并返回应用注册页面。然后,点击左侧菜单中的“公开API”链接,再点击作用域对应的“复制”图标。保存此值,稍后将会用到。

API作用域

图18:API作用域

要获取OAuth授权端点和令牌端点,请单击左侧菜单中的“概述”链接,然后单击“端点”按钮。之后,复制授权端点和令牌端点的URI。

Azure AD应用程序终结点

图 19:Azure AD 应用程序终结点

Azure AD应用程序终结点URL

图20:Azure AD应用程序终结点URL

打开Postman,然后点击“Environments”菜单。接着,点击“Create Environment”链接。

Postman 创建环境

图21:Postman创建环境

为环境命名,并添加6个变量。将之前步骤中保存的值分别填入“初始值”列和“当前值”列,然后单击“保存”按钮。

  • client_id:Azure AD应用程序的客户端ID
  • client_secret:Azure AD应用程序的客户端密钥
  • auth_url:Azure AD租户的OAuth授权URL
  • token_url:Azure AD租户的OAuth令牌URL
  • tenant_id:Azure AD目录(租户)ID
  • scope:Azure AD应用的API作用域,包含应用程序ID URL

Postman环境变量

图22:Postman环境变量

在Postman中打开一个新选项卡,然后按照以下步骤操作:

  • 将右上角的环境更改为ACM in the top right
  • 在地址栏中添加API URL
  • 点击“Auth”选项卡
  • 将类型更改为OAuth 2.0
  • 在 Auth 配置中向下滚动,并设置以下变量:
  • 身份验证 URL:{{auth_url}}
  • 访问令牌 URL: {{token_url}}
  • 客户端 ID: {{client_id}}
  • 客户端密钥: {{client_secret}}
  • 点击“获取新访问令牌”按钮

Postman请求

图23:Postman请求

Postman身份验证配置

图 24:Postman 身份验证配置

浏览器窗口将打开,并提示使用Azure AD凭据登录。身份验证成功后,页面将重定向回Postman,并显示以下窗口。单击“Use Token”按钮。

Postman 使用令牌

图25:Postman使用令牌

现在,您已获得OAuth访问令牌,可以发起API调用了。点击“保存”按钮,然后点击“发送”按钮。

如果所有配置均正确,应会看到“200 OK”响应。

Postman请求成功

图 26:Postman 请求成功

结论

现在,API Connectivity Manager已使用Azure AD OAuth访问令牌保护您的API。接下来,可以添加更多OAuth作用域,并在API Connectivity Manager中配置API网关集群,将这些作用域传递给受保护的API。相关内容将在另一篇文章中介绍!

立即开始

开始免费试用NGINX Management Suite 30天,其中包括API Connectivity Manager和Instance Manager。

本文的一个版本最初发表于codygreen.com。经作者许可,本文经编辑后在此转载。


分享
标签: F5 NGINX, Tech

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。