我正在尝试将最小权限原则应用于 Azure 函数。我想要的是使 FunctionApp 仅具有对存储队列等的读取访问权限。到目前为止我尝试过的是:
- 在 FunctionApp 中启用托管身份
- 创建一个仅允许对队列进行读取访问的角色(角色定义如下)
- 转到存储队列 IAM 权限,然后使用新角色和 Function App 添加新角色分配。
但是没有成功。如果我尝试从我的函数(使用输出绑定(bind))写入该队列,则当我预计会失败时,该项目就会被写入。我尝试使用内置角色“存储队列数据读取器(预览)”,但结果相同。
添加/删除 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"
]
}
最佳答案
@anirudhgarg 指出了正确的道路。
仅当您使用 managed identity access token 时,您设置的托管标识和 RBAC 才会产生影响。访问 Function 应用程序中的存储服务。这意味着这些设置对函数绑定(bind)没有影响,因为它使用 connection string 在内部连接到存储。 。如果您还没有设置connection property对于输出绑定(bind),它利用 AzureWebJobsStorage默认情况下的应用程序设置。
更具体地说,连接字符串与 Azure Active Directory 身份验证过程无关,因此它不会受到 AAD 配置的影响。因此,如果函数利用存储帐户连接字符串(例如使用存储相关绑定(bind)),我们无法使用其他设置限制其访问。同样,不使用连接字符串意味着无法访问。
使用 SAS token 的更新
如果提到的队列用于队列触发器/输入绑定(bind),我们可以通过读取和处理(获取消息然后删除)访问来限制功能,这里是SAS token .
先决条件:
队列位于 AzureWebJobsStorage 应用设置指定的存储帐户之外的存储帐户中。 AzureWebJobsStorage 需要连接字符串,通过帐户 key 提供完全访问权限。
功能应用程序是2.0。在功能应用程序设置>运行时版本:2.xx (~2) 中检查它。在 1.x 中,它需要更多权限,例如 AzureWebJobsStorage。
然后按照如下方式在门户上获取 SAS token 并将其放入应用程序设置中。
关于azure - 保护 Azure 函数的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53434852/