SuperAPI AI 工具集

entra-id-auth

安全与审计

查看项目

更新于 10-16 00:31

技能介绍

用途:把应用程序身份从普通凭据改为到 Azure SQL Database 的无密码 Entra ID 连接,并在失败时诊断。此技能负责服务端身份配置、数据库用户、授权、认证关键字以及“调用者是谁”相关错误;重试、加密、池化交给 connect-to-azure-sql,驱动语法交给 connect-from-dotnet/python/typescript-and-node,服务器、数据库与防火墙交给 provision-azure-sql-db,传输、预登录、证书、超时和 40xxx 网关族交给 diagnose-connection-errors。

主要能力:设定逻辑服务器的 Microsoft Entra 管理员;为应用创建身份并创建数据库用户;授予角色;写出各驱动的无密码连接字符串;区分并解释在各阶段出现的认证错误。

使用方式(按顺序):先设 Entra 管理员,CLI 取 object id 而非名称:az ad user list --display-name "<display name>" --query "[].{id:id, upn:userPrincipalName}" -o table;az sql server ad-admin create -g <resource-group> -s <server> --display-name "<display name>" --object-id <object-id>。再判断逻辑服务器是否需要自身身份(仅当由服务主体而非登录用户执行 CREATE USER 时需要)。为应用取得身份,client id 取自部署:azd env get-values -e <environment>;az ad sp show --id <application-client-id> --query "{appId:appId, objectId:id}"。用 Entra 认证连到用户数据库而非 master:sqlcmd -S <server>.database.windows.net -d <database> -U <admin-upn> -G -l 30。创建数据库用户:CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;。授权:ALTER ROLE db_datareader ADD MEMBER [<identity-name>]; ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];(应用需建架构时才加 db_ddladmin;授权在应用首次连接后才生效需等待令牌缓存刷新)。最后按驱动表写连接串并验证。

错误要点:18456 表示凭据被评估后拒绝,报 <token-identified principal> 时说明令牌被接受但库中无匹配主体;4060 表示登录有效但该库无用户;40532 是网关在到达数据库前拒绝,归 diagnose-connection-errors。33134 的“Principal 无法解析”实际是逻辑服务器身份未配置或无法读 Graph,需用 -i(长形式 --assign_identity,带下划线)为服务器赋身份并授予 Graph 读权限(三种应用权限或 Directory Readers 角色,或放入持有 Directory Readers 的可分配角色组),或改用第三种 CREATE USER 形式跳过查找。33131 是显示名重复,用 WITH OBJECT_ID = '<object-id>'(注意是 FROM EXTERNAL PROVIDER 的修饰符,且要用企业应用 objectId);对象 id 不在租户内会报 37545。CREATE USER [<alias>] WITH SID = <id-as-binary>, TYPE = E; 不做外部查找,但要求引擎已配置 Entra,否则裸容器报 40530;该错误文本说批次问题,实测并非批次问题,而是服务器未配置 Entra。SQL 认证管理员(含服务器管理员)无法创建 Entra 用户,必须使用 Entra 认证连接,只有 WITH SID 形式例外。名称写错报 33130。部署槽的系统分配身份名为 <app-name>/slots/<slot-name>。

连接关键字:各驱动默认值与托管身份写法不同,.NET 用 Authentication=Active Directory Default;Python mssql-python 用 ActiveDirectoryMSI、pyodbc 无默认值;Node 用 type: 'azure-active-directory-default'、clientId 位于 authentication.options.clientId;Java 用 authentication=ActiveDirectoryDefault。生产环境应显式指定托管身份模式。Microsoft.Data.SqlClient 7.0 需 Microsoft.Data.SqlClient.Extensions.Azure 包:dotnet add package Microsoft.Data.SqlClient.Extensions.Azure。

仅 Entra 认证:启用后禁用服务器级 SQL 认证,须先设管理员;命令为 az sql server ad-only-auth enable -g <resource-group> -n <server>,查询用 ad-only-auth get。启用会静默禁用弹性作业、SQL Data Sync、SQL Insights 等。

验证:在用户数据库执行 SELECT name, type, type_desc, CAST(sid), DATALENGTH(sid) FROM sys.database_principals WHERE type IN ('E','X'); 期望 type_desc 为 EXTERNAL_USER 或 EXTERNAL_GROUP,entra_id 等于工作负载使用的 client id,sid_bytes 为 16(包含用户)或 18(来自服务器登录)。容器形态为登录加用户:CREATE LOGIN [<upn>] FROM EXTERNAL PROVIDER; CREATE USER [<upn>] FROM LOGIN [<upn>];。

限制:服务器身份及其 Graph 权限、仅 Entra 认证与 Azure Policy 强制在本地无对应,本地通过不代表这两项通过;具体收费、平台与完整长代码未提供,细节应以 Microsoft Learn 与仓库 references/ 为准。