保护Azure功能

时间:2018-11-22 16:15:27

标签: azure azure-active-directory azure-functions

我正在尝试将最小特权原则应用于Azure函数。我想要使​​FunctionApp仅具有对例如存储队列的读取权限。到目前为止,我尝试过的是:

  • 在FunctionApp中启用托管身份
  • 创建一个仅允许对队列进行读取访问的角色(下面的角色定义)
  • 转到存储队列IAM权限,并使用新角色和Function App添加新角色分配。

但是没有用。如果我尝试从我的函数(使用输出绑定)写入该队列,那么当我预期失败时,将写入该项目。我尝试使用内置角色“存储队列数据读取器(预览)”,结果相同。

添加/删除功能应用程序权限的正确方法是什么?

角色定义:

{
  "Name": "Reader WorkingSA TestQueue Queue",
  "IsCustom": true,
  "Description": "Read TestQueue queue on WorkingSA storage accoung.",
  "actions": ["Microsoft.Storage/storageAccounts/queueServices/queues/read"],
  "dataActions": [
    "Microsoft.Storage/storageAccounts/queueServices/queues/messages/read"
  ],
  "notActions": [],
  "notDataActions": [],
  "AssignableScopes": [
    "/subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourceGroups/TestAuth-dev-rg"
  ]
}

1 个答案:

答案 0 :(得分:1)

@anirudhgarg指出了正确的方法。

仅当您使用managed identity access token进入Function应用程序中的存储服务时,您设置的托管身份和RBAC才有所不同。这意味着这些设置对函数绑定没有影响,因为它在内部使用connection string连接到Storage。如果尚未为输出绑定设置connection property,则默认情况下它将利用AzureWebJobsStorage应用设置。

更具体地说,连接字符串与Azure Active Directory身份验证过程无关,因此它不受AAD配置的影响。因此,如果某个函数利用了存储帐户连接字符串(例如,使用与存储相关的绑定),则我们不能使用其他设置来限制其访问权限。同样,没有使用连接字符串就意味着没有访问权限。

更新为使用SAS令牌

如果在队列触发器/输入绑定中使用了提到的队列,我们​​可以通过读取和处理(先获取消息然后删除)访问来限制功能,这是SAS token

先决条件:

  1. 队列位于与AzureWebJobsStorage应用程序设置指定的存储帐户不同的存储帐户。 AzureWebJobsStorage需要连接字符串,以提供具有帐户密钥的完全访问权限。

  2. 功能应用程序为2.0。在功能应用程序设置>运行时版本上进行检查:2.xx(〜2)。在1.x中,它需要更多权限,例如AzureWebJobsStorage。

然后按如下所示在门户上获取SAS令牌,并将其放入应用设置中。

enter image description here