我正在尝试将最小特权原则应用于Azure函数。我想要使FunctionApp仅具有对例如存储队列的读取权限。到目前为止,我尝试过的是:
但是没有用。如果我尝试从我的函数(使用输出绑定)写入该队列,那么当我预期失败时,将写入该项目。我尝试使用内置角色“存储队列数据读取器(预览)”,结果相同。
添加/删除功能应用程序权限的正确方法是什么?
角色定义:
{
"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"
]
}
答案 0 :(得分:1)
@anirudhgarg指出了正确的方法。
仅当您使用managed identity access token进入Function应用程序中的存储服务时,您设置的托管身份和RBAC才有所不同。这意味着这些设置对函数绑定没有影响,因为它在内部使用connection string连接到Storage。如果尚未为输出绑定设置connection property,则默认情况下它将利用AzureWebJobsStorage应用设置。
更具体地说,连接字符串与Azure Active Directory身份验证过程无关,因此它不受AAD配置的影响。因此,如果某个函数利用了存储帐户连接字符串(例如,使用与存储相关的绑定),则我们不能使用其他设置来限制其访问权限。同样,没有使用连接字符串就意味着没有访问权限。
更新为使用SAS令牌
如果在队列触发器/输入绑定中使用了提到的队列,我们可以通过读取和处理(先获取消息然后删除)访问来限制功能,这是SAS token。
先决条件:
队列位于与AzureWebJobsStorage应用程序设置指定的存储帐户不同的存储帐户。 AzureWebJobsStorage需要连接字符串,以提供具有帐户密钥的完全访问权限。
功能应用程序为2.0。在功能应用程序设置>运行时版本上进行检查:2.xx(〜2)。在1.x中,它需要更多权限,例如AzureWebJobsStorage。
然后按如下所示在门户上获取SAS令牌,并将其放入应用设置中。