Azure服务主体是什么?如何创建它实现脚本非交互式登录Azure?
关于Azure服务主体的解释与创建指南
什么是Azure服务主体?
简单说,Azure服务主体就是Azure AD里专门给自动化工具、脚本、应用程序用的「专用账号」——它不是给真人用户用的,而是用来让你的Shell脚本、CI/CD流水线这类程序能安全地访问和操作Azure资源。
和用个人账号登录相比,它的优势很明显:
- 权限可控:你可以精准设置它能操作哪些资源(比如只能管理某个资源组里的应用网关),避免权限过大导致误操作或安全风险
- 无MFA限制:个人账号通常会启用多因素认证,没法在非交互脚本里直接登录,但服务主体就是为这种场景设计的,不会有这个问题
- 独立身份:就算你的个人账号权限变更或离职,服务主体的权限不受影响,不会中断自动化流程
如何创建服务主体并用于Shell脚本?
下面是一步步的操作指南,前提是你得有Azure账号的管理员权限(比如全局管理员、订阅所有者这类):
1. 先交互式登录Azure CLI(用于创建服务主体)
首先在本地终端执行这个命令,完成浏览器登录:
az login
这一步是临时操作,只是为了让你能有权限创建服务主体,之后脚本里就不需要这一步了。
2. 创建服务主体并分配权限
执行下面的命令,把占位符换成你自己的信息:
az ad sp create-for-rbac --name <你的服务主体名称> --role Contributor --scopes /subscriptions/<你的订阅ID>
参数说明:
--name:给你的服务主体起个好记的名字,比如script-app-gateway-sp--role:这里用的是Contributor(参与者),能管理大部分资源;如果需要更严格的权限,可以换成Reader(只读)或者自定义角色--scopes:指定权限生效的范围,这里是整个订阅,你也可以缩小到某个资源组,比如/subscriptions/<订阅ID>/resourceGroups/<资源组名称>
执行成功后,会返回类似这样的JSON结果,一定要保存好这几个字段:
{ "appId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx", "displayName": "你的服务主体名称", "password": "xxxxxx~xxxxxx~xxxxxx", "tenant": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx" }
3. 在Shell脚本中用服务主体非交互登录
把刚才拿到的appId、password、tenant代入下面的命令,就能在脚本里完成非交互登录了:
az login --service-principal -u <appId> -p <password> --tenant <tenantId>
登录成功后,你就可以正常执行各种Azure CLI命令了,比如创建应用网关:
az network application-gateway create --name my-app-gateway --resource-group my-rg --location eastus ...
重要安全提醒
千万不要把服务主体的密码硬编码在脚本里!推荐用环境变量来传递:
# 先设置环境变量 export AZURE_CLIENT_ID=<你的appId> export AZURE_CLIENT_SECRET=<你的password> export AZURE_TENANT_ID=<你的tenantId> # 再登录 az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID
如果是生产环境,更推荐用Azure Key Vault来存储密码,通过CLI读取,进一步提升安全性。
内容的提问来源于stack exchange,提问作者BlindSniper
相关产品推荐
相关产品推荐

