如何检查我的应用是否使用最小权限调用 API

生成应用时,可能会与多个 API 和操作集成。 为确保应用是安全的且遵循最低权限原则,应检查应用在调用 API 时是否使用的是最低权限。 通过实施最低权限,可以降低对数据和资源未经授权的访问风险。

检查应用是否在使用最低权限调用 API 的困难在于每次集成新操作时都需要评估在应用中使用的权限集。 手动跟踪所有操作和权限非常耗时且容易出错。 通过使用开发代理和 Azure API 中心,可以自动检查应用是否在使用最低权限调用 API。

若要检查应用是否使用最小权限调用 API,可以使用 ApiCenterMinimalPermissionsPlugin 插件。 此插件将应用使用的权限与 Azure API 中心中定义的权限进行比较,并报告任何过度权限的权限。 它还建议使用最少的权限集。

命令提示符的屏幕截图,其中显示了开发代理检查记录的 API 请求是否使用最少的 API 权限令牌。

开始之前

若要检查应用是否使用最小权限调用 API,需要有一个 Azure API 中心 实例,其中包含有关你在组织中使用的 API 的信息。

提示

通过在命令提示符 devproxy preset get demo-apicenter-minimalpermissions 中运行来下载本操作方法文章的预设。

创建 Azure API 中心实例

在开始之前,请创建一个 Azure API 中心实例并注册组织中使用的 API。 为每个 API 上传介绍 API 操作和权限的 OpenAPI 规范文件。

Azure API 中心的屏幕截图,其中显示了一个 API 及其含安全信息的 OpenAPI 规范。

此信息 ApiCenterMinimalPermissionsPlugin 用于检查应用是否使用最小权限调用 API。

复制 API 中心信息

在 Azure API 中心实例概述页中,复制 API 中心实例名称、资源组名称以及订阅 ID。 需要此信息来配置 ApiCenterMinimalPermissionsPlugin,以便它可以连接到 Azure API 中心实例。

Azure API 中心概述页的屏幕截图,其中突出显示了多个属性。

配置 Dev Proxy

若要检查应用是否在使用最低权限调用 API,需要在开发代理配置文件中启用 ApiCenterMinimalPermissionsPlugin。 若要创建应用使用的权限的报告,请添加报告器。

启用 ApiCenterMinimalPermissionsPlugin

devproxyrc.json 文件中,添加以下配置:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/rc.schema.json",
  "plugins": [
    {
      "name": "ApiCenterMinimalPermissionsPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
      "configSection": "apiCenterMinimalPermissionsPlugin"
    }
  ],
  "urlsToWatch": [
    "https://api.northwind.com/*"
  ],
  "apiCenterMinimalPermissionsPlugin": {
    "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "resourceGroupName": "demo",
    "serviceName": "contoso-api-center",
    "workspaceName": "default"
  }
}

subscriptionIdresourceGroupNameserviceName 属性中,提供有关 Azure API 中心实例的信息。

urlsToWatch 属性中,指定应用使用的 URL。

提示

使用 Dev Proxy 工具包 Visual Studio Code 扩展轻松管理 Dev Proxy 配置。

添加报告器

ApiCenterMinimalPermissionsPlugin 会生成应用使用的 API 以及调用这些 API 所需的最低权限的相关报告。 若要查看此报告,请将报告器添加到 Dev Proxy 配置文件。 Dev Proxy 提供了多个报告器。 在此示例中,你使用的是纯文本报告器

通过对纯文本报告器的引用更新 devproxyrc.json 文件:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v0.24.0/rc.schema.json",
  "plugins": [
    {
      "name": "ApiCenterMinimalPermissionsPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll",
      "configSection": "apiCenterMinimalPermissionsPlugin"
    },
    {
      "name": "PlainTextReporter",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/dev-proxy-plugins.dll"
    }
  ],
  "urlsToWatch": [
    "https://api.northwind.com/*"
  ],
  "apiCenterMinimalPermissionsPlugin": {
    "subscriptionId": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e",
    "resourceGroupName": "demo",
    "serviceName": "contoso-api-center",
    "workspaceName": "default"
  }
}

检查应用是否在使用最低权限调用 API

若要检查应用是否在使用最低权限调用 API,需要连接到 Azure 订阅,运行 Dev Proxy,并允许其截获来自应用的 API 请求。 然后,Dev Proxy 会将 API 请求的相关信息与 Azure API 中心的信息进行比较,并报告最低权限。

连接到 Azure 订阅

开发代理使用 Azure API 中心的信息来确定应用是否在使用最低权限调用 API。 若要获取此信息,需要连接到 Azure 订阅。 可以通过多种方式连接到 Azure 订阅。

运行 Dev Proxy

连接到 Azure 订阅后,启动 Dev Proxy。 如果从 devproxyrc.json 文件所在的同一文件夹中启动 Dev Proxy,则会自动加载配置。 否则,请使用 --config-file 选项指定配置文件的路径。

Dev Proxy 启动后,它会检查是否可以连接到 Azure 订阅。 一旦连接成功,将会收到一条消息,内容如下:

 info    Plugin ApiCenterMinimalPermissionsPlugin connecting to Azure...
 info    Listening on 127.0.0.1:8000...

Hotkeys: issue (w)eb request, (r)ecord, (s)top recording, (c)lear screen
Press CTRL+C to stop Dev Proxy

按“r”开始记录来自应用的 API 请求。

使用应用

像平时一样使用应用。 在本教程中,可以将以下请求与具有 customer.readwrite 权限的模拟访问令牌配合使用:

@readwriteToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJzY3AiOlsiY3VzdG9tZXIucmVhZHdyaXRlIl19.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

GET https://api.northwind.com/customers/ALFKI
Authorization: Bearer {{readwriteToken}}

Dev Proxy 截获 API 请求,并将有关这些请求的信息存储在内存中。 在运行 Dev Proxy 的命令行中,应该会看到有关应用发出的 API 请求的信息。

 info    Plugin ApiCenterMinimalPermissionsPlugin connecting to Azure...
 info    Listening on 127.0.0.1:8000...

Hotkeys: issue (w)eb request, (r)ecord, (s)top recording, (c)lear screen
Press CTRL+C to stop Dev Proxy

◉ Recording... 

 req   ╭ GET https://api.northwind.com/customers/ALFKI
 mock  ╰ 200 /{customer-id}

检查权限

按“s”停止记录。 Dev Proxy 连接到 API 中心实例,并将请求相关信息与 API 中心的信息进行比较。

 info    Plugin ApiCenterMinimalPermissionsPlugin connecting to Azure...
 info    Listening on 127.0.0.1:8000...

Hotkeys: issue (w)eb request, (r)ecord, (s)top recording, (c)lear screen
Press CTRL+C to stop Dev Proxy

◉ Recording... 

 req   ╭ GET https://api.northwind.com/customers/ALFKI
 mock  ╰ 200 /{customer-id}
○ Stopped recording
 info    Checking if recorded API requests use minimal permissions as defined in API Center...
 info    Loading APIs from API Center...
 info    Loading API definitions from API Center...
 info    Checking minimal permissions for API https://api.northwind.com...
 info    Analyzing recorded requests...
 warn    Calling API Northwind with excessive permissions: customer.readwrite. Minimal permissions are: customer.read
 info    DONE

在 Dev Proxy 完成分析后,它会在名为 ApiCenterMinimalPermissionsPlugin_PlainTextReporter.txt 的文件中创建一个包含以下内容的报告:

Azure API Center minimal permissions report

APIS

Northwind

x Called using excessive permissions

Permissions

- Minimal permissions: customer.read
- Permissions on the token: customer.readwrite
- Excessive permissions: customer.readwrite

Requests

- GET https://api.northwind.com/customers/ALFKI

UNMATCHED REQUESTS

No unmatched requests found.

ERRORS

No errors occurred.

总结

使用 ApiCenterMinimalPermissionsPlugin,可以检查应用是否在使用最低权限调用 API。 该插件会将应用中有关 API 请求的信息与 Azure API 中心中的信息进行比较,并报告任何超出定义的权限的情况。 它还会建议调用应用中使用的 API 时所需的最低权限。 验证应用是否在使用最低权限调用 API,这有助于使应用更安全。 可以手动运行此检查或与 CI/CD 管道集成,以确保在将应用发布到生产环境之前它在使用最低权限调用 API。

详细信息