重要
在部署或更新Azure 应用服务资源提供程序之前,如有必要,请将Azure Stack Hub更新到受支持的版本。 请务必阅读资源提供程序的发行说明,了解可能影响部署的新功能、修补程序和任何已知问题。
| 支持的最低 Azure Stack Hub 版本 | 应用服务资源提供程序版本 |
|---|---|
| 2311 及更高版本 | 25R1 安装程序,25R1 脱机包 (发行说明) |
在Azure Stack Hub上部署Azure 应用服务之前,请完成本文中的先决条件步骤。
Azure Stack Hub集成系统部署
资源提供程序先决条件
如果已安装资源提供程序,则可能已完成以下先决条件,并可以跳过本部分。 否则,请在继续之前完成这些步骤。
向 Azure 注册 Azure Stack Hub 实例(如果尚未这样做)。 你需要将Azure Stack Hub实例注册到 Azure,因为你将连接到Azure并从市场下载项。
如果不熟悉 Azure Stack Hub 管理员门户的“市场管理”功能,请参阅从 Azure 下载市场项并将其发布到 Azure Stack Hub。 此文逐步讲解如何将项目从 Azure 下载到 Azure Stack Hub 市场。 它涵盖了联网场景和离线场景。 如果Azure Stack Hub实例已断开连接或部分连接,则需要完成其他先决条件以准备安装。
更新 Microsoft Entra 主目录。 从版本 1910 开始,必须在主目录所在的租户中注册一个新的应用程序。 此应用使Azure Stack Hub能够成功创建和注册Microsoft Entra租户的新资源提供程序(如Azure 事件中心和其他资源提供程序)。
升级到内部版本 1910 或更高版本后,需要执行此操作。 如果未完成此步骤,则来自市场的资源提供程序安装会失败。
成功将 Azure Stack Hub 实例更新到 1910 或更高版本后,请按照 有关克隆/下载 Azure Stack Hub Tools 存储库的说明。
请按照更新 Azure Stack Hub Microsoft Entra 主目录的说明(在安装更新或新的资源提供程序后)。
安装程序和帮助器脚本
下载 helper 脚本,以便在 Azure Stack Hub 上部署应用服务。
部署帮助程序脚本要求使用 AzureRM PowerShell 模块。 有关安装的详细信息,请参阅 为 Azure Stack Hub 安装 PowerShell Az 和 Azure Stack 模块。
提取包含辅助脚本的 .zip 文件内容。 会提取以下文件和文件夹:
- Common.ps1
- Create-AADIdentityApp.ps1
- Create-ADFSIdentityApp.ps1
- Create-AppServiceCerts.ps1
- Get-AzureStackRootCert.ps1
- BCDR
- ReACL.cmd
- 模块文件夹
- GraphAPI.psm1
证书要求
若要在生产环境中运行资源提供程序,必须提供以下证书:
- 默认域证书
- API 证书
- 发布证书
- 标识证书
除了以下各节中列出的特定要求外,你稍后还使用一个工具来测试常规要求。 有关验证的完整列表,请参阅 Validate Azure Stack Hub PKI 证书。 验证包括:
- .pfx 的文件格式。
- 密钥用法设置为服务器和客户端身份验证。
- 其他一些。
默认域证书
资源提供程序将默认域证书置于前端角色上。 用户应用针对 Azure 应用服务 的通配符域名或默认域名请求时,会使用此证书。 该证书还保护源代码管理操作(Kudu)。
该证书必须采用 .pfx 格式,并且应该是包含三个使用者的通配符证书。 此要求允许一个证书同时涵盖默认域和源代码管理操作的 scm 终结点。
| 格式 | 示例 |
|---|---|
*.appservice.<region>.<DomainName>.<extension> |
*.appservice.redmond.azurestack.external |
*.scm.appservice.<region>.<DomainName>.<extension> |
*.scm.appservice.redmond.azurestack.external |
*.sso.appservice.<region>.<DomainName>.<extension> |
*.sso.appservice.redmond.azurestack.external |
API 证书
将 API 证书置于管理角色上。 资源提供程序使用它来帮助保护 API 调用。 用于发布的证书必须包含匹配 API DNS 条目的使用者。
| 格式 | 示例 |
|---|---|
api.appservice.<region>.<DomainName>.<extension> |
api.appservice.redmond.azurestack.external |
发布证书
发布者角色的证书有助于在上传内容时保护应用所有者的 FTPS 流量。 用于发布的证书必须包含匹配 FTPS DNS 条目的使用者。
| 格式 | 示例 |
|---|---|
ftp.appservice.<region>.<DomainName>.<extension> |
ftp.appservice.redmond.azurestack.external |
标识证书
标识应用的证书可以实现:
- Microsoft Entra或Active Directory 联合身份验证服务(AD FS)目录、Azure Stack Hub和应用服务之间的集成,以支持与计算资源提供程序的集成。
- Azure Stack Hub上Azure 应用服务高级开发人员工具的单一登录(SSO)方案。
标识证书必须包含与以下格式匹配的主题。
| 格式 | 示例 |
|---|---|
sso.appservice.<region>.<DomainName>.<extension> |
sso.appservice.redmond.azurestack.external |
证书验证
在部署应用服务资源提供程序之前,请使用 PowerShell 库 中提供的 Azure Stack Hub 就绪情况检查器来 验证证书。 Azure Stack Hub 准备情况检查器工具验证生成的 PKI 证书是否适用于应用服务部署。
使用任何必需的 Azure Stack Hub PKI 证书时,请计划足够的时间来测试并在必要时重新颁发证书。
文件服务器准备
Azure 应用服务需要文件服务器。 对于生产部署,必须将文件服务器配置为高度可用且能够处理故障。
为文件服务器和SQL Server使用快速入门模板
参考体系结构的 quickstart 模板可用于部署高度可用的文件服务器和SQL Server。 此模板支持虚拟网络中的Active Directory基础结构,该虚拟网络配置为支持Azure Stack Hub上高度可用的Azure 应用服务部署。
Azure Stack Hub操作员管理这些服务器,尤其是在生产环境中。 根据需要或按照贵组织的要求配置该模板。
注意
集成系统实例必须能够从GitHub下载资源才能完成部署。
部署自定义文件服务器
如果选择在现有虚拟网络中部署应用服务,请将文件服务器部署到与应用服务不同的子网中。
如果选择使用前面提到的任一快速入门模板部署文件服务器,则可以跳过本部分。 文件服务器配置为模板部署的一部分。
在 Active Directory 中预配组和帐户
创建以下 Active Directory 全局安全组:
- FileShareOwners
- FileShareUsers
创建以下 Active Directory 帐户作为服务帐户:
- FileShareOwner
- FileShareUser
作为安全最佳做法,请对这些帐户(以及所有 Web 角色)使用唯一用户。 还要使用强用户名和密码。 根据以下条件设置密码:
- 启用“密码永不过期”。
- 启用“用户不能更改密码”。
- 禁用“用户在下次登录时必须更改密码”。
如下所述将帐户添加到组成员身份:
- 将 FileShareOwner 添加到 FileShareOwners 组。
- 将 FileShareUser 添加到 FileShareUsers 组。
在工作组中预配组和帐户
配置文件服务器时,请从管理员命令提示符运行以下命令。 请勿使用 PowerShell。
使用 Azure 资源管理器模板时已创建用户。
运行以下命令以创建 FileShareOwner 和 FileShareUser 帐户。 将
<password>替换为自己的值。net user FileShareOwner <password> /add /expires:never /passwordchg:no net user FileShareUser <password> /add /expires:never /passwordchg:no运行以下命令
WMIC,将帐户的密码设置为永不过期:WMIC USERACCOUNT WHERE "Name='FileShareOwner'" SET PasswordExpires=FALSE WMIC USERACCOUNT WHERE "Name='FileShareUser'" SET PasswordExpires=FALSE创建本地组 FileShareUsers 和 FileShareOwners,并在第一步中添加帐户:
net localgroup FileShareUsers /add net localgroup FileShareUsers FileShareUser /add net localgroup FileShareOwners /add net localgroup FileShareOwners FileShareOwner /add
预配内容共享
内容共享包含租户网站内容。 在单个文件服务器上预配内容共享的过程与在 Active Directory 和工作组环境中相同。 对于 Active Directory 中的故障转移群集,情况则有所不同。
在Active Directory或工作组的单个文件服务器上,在提升的命令提示符下运行以下命令。 将 C:\WebSites 的值替换为环境中的相应路径。
set WEBSITES_SHARE=WebSites
set WEBSITES_FOLDER=C:\WebSites
md %WEBSITES_FOLDER%
net share %WEBSITES_SHARE% /delete
net share %WEBSITES_SHARE%=%WEBSITES_FOLDER% /grant:Everyone,full
配置对共享的访问控制
在文件服务器上,或在当前拥有群集资源的故障转移群集节点上的提升权限命令提示符中,运行以下命令。 将变量替换为特定于环境的值。
Active Directory
set DOMAIN=<DOMAIN>
set WEBSITES_FOLDER=C:\WebSites
icacls %WEBSITES_FOLDER% /reset
icacls %WEBSITES_FOLDER% /grant Administrators:(OI)(CI)(F)
icacls %WEBSITES_FOLDER% /grant %DOMAIN%\FileShareOwners:(OI)(CI)(M)
icacls %WEBSITES_FOLDER% /inheritance:r
icacls %WEBSITES_FOLDER% /grant %DOMAIN%\FileShareUsers:(CI)(S,X,RA)
icacls %WEBSITES_FOLDER% /grant *S-1-1-0:(OI)(CI)(IO)(RA,REA,RD)
工作组
set WEBSITES_FOLDER=C:\WebSites
icacls %WEBSITES_FOLDER% /reset
icacls %WEBSITES_FOLDER% /grant Administrators:(OI)(CI)(F)
icacls %WEBSITES_FOLDER% /grant FileShareOwners:(OI)(CI)(M)
icacls %WEBSITES_FOLDER% /inheritance:r
icacls %WEBSITES_FOLDER% /grant FileShareUsers:(CI)(S,X,RA)
icacls %WEBSITES_FOLDER% /grant *S-1-1-0:(OI)(CI)(IO)(RA,REA,RD)
SQL Server实例的准备
注意
如果您选择部署用于高可用文件服务器和 SQL Server 的快速入门模板,则可以跳过本节。 该模板在高可用性配置中部署和配置SQL Server。
对于Azure Stack Hub上Azure 应用服务的托管和计量数据库,必须准备一个SQL Server实例来保存应用服务数据库。
出于生产和高可用性目的,请使用完整版 SQL Server 2016 SP3 或更高版本,启用混合模式身份验证,并在 高可用性配置中部署。
所有应用服务角色都必须访问Azure Stack Hub上的Azure 应用服务 SQL Server实例。 可以在 Azure Stack Hub 中的默认提供程序订阅中部署SQL Server。 或者,只要连接到 Azure Stack Hub,就可以在组织中使用现有基础结构。 如果使用 Azure 市场映像,请记得相应地配置防火墙。
注意
虚拟机(VM)的 SQL 基础结构即服务(IaaS)映像可通过市场管理功能获得。 在使用市场项部署 VM 之前,请务必始终下载最新版本的 SQL IaaS 扩展。 SQL 映像与 Azure 中提供的 SQL VM 相同。 对于从这些映像创建的 SQL VM,IaaS 扩展和相应的门户增强功能可提供自动修补和备份等功能。
对于任何 SQL Server 角色,可以使用默认实例或命名实例。 如果使用命名实例,请务必手动启动SQL Server浏览器服务并打开端口 1434。
应用服务安装程序会检查并确保 SQL Server 已启用数据库包含功能。 若要在托管应用服务数据库的SQL Server实例上启用数据库包含,请运行以下 SQL 命令:
sp_configure 'contained database authentication', 1;
GO
RECONFIGURE;
GO
所需文件服务器和 SQL Server 的许可问题
Azure Stack Hub 上的 Azure 应用服务需要文件服务器和 SQL Server 才能运行。 可以使用位于Azure Stack Hub部署外部的预先存在的资源,或在Azure Stack Hub默认提供程序订阅中部署资源。
如果选择在Azure Stack Hub默认提供程序订阅中部署资源,Azure Stack Hub上的Azure 应用服务成本包括这些资源的许可证(Windows Server许可证和SQL Server许可证)。 许可证受以下约束的约束:
- 将基础结构部署到默认提供程序订阅中。
- Azure Stack Hub 上的 Azure 应用服务 资源提供程序仅使用基础架构。 不允许其他管理工作负载(例如其他资源提供程序,如 SQL-RP)或租户工作负载(例如需要数据库的租户应用)使用此基础结构。
文件服务器和SQL Server的操作责任
云操作员负责文件服务器的维护和操作,并SQL Server。 资源提供程序不管理这些资源。 云操作员负责备份应用服务数据库和租户的内容文件共享。
用于检索Azure Stack Hub Azure 资源管理器根证书的脚本
在能够访问 Azure Stack Hub 集成系统特权终结点的计算机上,打开提升权限的 PowerShell 会话。
在你解压辅助脚本的文件夹中运行 Get-AzureStackRootCert.ps1 脚本。 此脚本在应用服务所需的、用于创建证书的脚本所在的同一文件夹中创建一个根证书。
运行以下 PowerShell 命令时,请提供特权终结点和 AzureStack\CloudAdmin 的凭据:
Get-AzureStackRootCert.ps1
Get-AzureStackRootCert.ps1 脚本参数
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
PrivilegedEndpoint |
必需 | AzS-ERCS01 |
特权终结点 |
CloudAdminCredential |
必需 | AzureStack\CloudAdmin |
Azure Stack Hub 云管理员的域帐户凭据。 |
网络和标识配置
Azure Stack Hub上Azure 应用服务的网络和标识配置涉及设置必要的网络基础结构和标识管理来支持资源提供程序。
配置虚拟网络
借助 Azure Stack Hub 上的 Azure 应用服务,你可以将资源提供程序部署到现有虚拟网络中,也可以创建一个虚拟网络作为部署的一部分。 如果使用现有虚拟网络,则可以使用内部 IP 连接到 Azure Stack Hub 上的应用服务所需的文件服务器和 SQL Server 实例。
在 Azure Stack Hub 上安装应用服务之前,请使用以下地址范围和子网配置虚拟网络:
虚拟网络,/16
子网:
- ControllersSubnet、/24
- ManagementServersSubnet, /24
- FrontEndsSubnet、/24
- PublishersSubnet, /24
- WorkerSubnet,/21
提前创建自定义虚拟网络是可选的。 Azure Stack Hub上的Azure 应用服务可以创建所需的虚拟网络,但随后它必须通过公共 IP 地址与SQL Server和文件服务器通信。 如果您使用适用于 App Service 高可用文件服务器和 SQL Server 的快速入门模板来部署必需的服务器资源,该模板还会部署一个虚拟网络。
重要
如果选择在现有虚拟网络中部署应用服务,请将SQL Server部署到独立于应用服务和文件服务器的子网中。
创建标识应用程序以启用 SSO 方案
Azure 应用服务使用标识应用程序(服务主体)来支持以下操作:
- 工作器层级上的虚拟机规模集集成
- 用于 Azure Functions 门户和高级开发工具(Kudu)的 SSO
根据 Azure Stack Hub 所使用的标识提供程序(Microsoft Entra ID 或 AD FS),按照相应步骤创建供 Azure 应用服务 用于 Azure Stack Hub 资源提供程序的服务主体。
创建Microsoft Entra应用
请按照以下步骤在您的 Microsoft Entra 租户中创建服务主帐号:
以 azurestack\AzureStackAdmin 身份打开 PowerShell 实例。
转到您在本文前面下载并解压的脚本所在的位置。
运行 Create-AADIdentityApp.ps1 脚本。 根据提示输入部署 Azure Stack Hub 时使用的 Microsoft Entra 租户 ID。 例如,输入 myazurestack.partner.onmschina.cn。
在“凭据”窗口中,输入 Microsoft Entra 服务管理帐户和密码。 选择“确定”。
输入 前面创建的证书的证书文件路径和证书密码。 此步骤的证书默认为 sso.appservice.local.azurestack.external.pfx 。
记下 PowerShell 输出中的应用程序 ID。 使用以下步骤中的 ID 来为应用程序的权限提供许可,以及在安装过程中提供许可。
打开新的浏览器窗口,以 Microsoft Entra 服务管理员的身份登录到Azure 门户。
打开 Microsoft Entra 服务。
在左窗格中,选择 “应用注册”。
搜索在步骤 7 中记录的应用程序 ID。
从列表中选择“应用服务应用程序注册”。
在左窗格中,选择“ API 权限”。
选择为以下对象授予管理员同意:租户,其中 租户 是你的 Microsoft Entra 租户的名称。 选择 “是 ”以确认同意授予。
对于多租户场景,请运行以下 PowerShell 脚本,通过 Azure 资源管理器 管理员终结点向 App Service 的应用注册授予 Directory.Read.All 和 user_impersonation 权限。
# Build the admin endpoint by replacing the region and the FQDN with the values specific to your system $adminarmendpoint = https://adminmanagement.<region>.<FQDN>/ Add-AzEnvironment -Name "AzureStackAdmin" -ArmEndpoint $userarmendpoint # Home directory $AADTenantName = "xxx" $authEndpoint = (Get-AzEnvironment -Name "AzureStackAdmin").ActiveDirectoryAuthority.TrimEnd('/') $TenantId = (invoke-restmethod "$($AuthEndpoint)/$($AADTenantName)/.well-known/openid-configuration").issuer.TrimEnd('/').Split('/')[-1] Login-AzAccount -EnvironmentName "AzureStackAdmin" -TenantId $TenantID # Enter the region name of your Azure Stack Hub system $Location = '<region>' $AppServicesAppId = '' # The identity app's application ID; use the Azure portal to get it - Entra ID - App Registration - App Services - Application ID $AppServicesObjectId = '' # The identity app's object ID; use the Azure portal to get it - Entra ID - App Registration - App Services - Object ID # The applicationId property in the JSON returned from https://<AdminArmEndpoint>/metadata/identity?api-version=2015-01-01 $TenantArmAppId = (Invoke-WebRequest "$adminarmendpoint/metadata/identity?api-version=2015-01-01" -UseBasicParsing | select -ExpandProperty Content | ConvertFrom-Json | select applicationId).applicationId $params = @{ ResourceGroupName = "system.$Location" ResourceType = 'Microsoft.Subscriptions.Providers/applicationRegistrations' ResourceName = 'AppService' ApiVersion = '2018-05-01' Location = $Location Properties = @{ appId = $AppServicesAppId objectId = $AppServicesObjectId appRoleAssignments = @(@{ client = $AppServicesAppId roleId = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well-known value for the Directory.Read.All permission resource = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well-known value for Microsoft.Azure.ActiveDirectory }) oAuth2PermissionGrants = @(@{ client = $AppServicesAppId resource = ([guid]('00000002-0000-0000-c000-000000000000')).ToString() # Well-known value for Microsoft.Azure.ActiveDirectory scope = 'User.Read Directory.Read.All' }, @{ client = $AppServicesAppId resource = $tenantArmAppId scope = 'user_impersonation' }) } } New-AzResource @params -Verbose -Force运行此脚本后,需要使用应用服务的每个租户都必须重新运行注册脚本。 请参阅在 Azure Stack Hub 中配置多租户。
Create-AADIdentityApp PowerShell 脚本
Create-AADIdentityApp.ps1
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
DirectoryTenantName |
必需 | Null |
Microsoft Entra 租户 ID。 提供 GUID 或字符串。 示例为 myazureaaddirectory.partner.onmschina.cn。 |
AdminArmEndpoint |
必需 | Null |
Azure 资源管理器管理终结点。 示例为 adminmanagement.local.azurestack.external。 |
TenantARMEndpoint |
必需 | Null |
Azure 资源管理器租户终结点。 示例为 management.local.azurestack.external。 |
AzureStackAdminCredential |
必需 | Null |
Microsoft Entra 服务管理员凭据。 |
CertificateFilePath |
必需 | Null |
之前生成的身份应用程序证书文件的完整路径。 |
CertificatePassword |
必需 | Null |
帮助保护证书私钥的密码。 |
Environment |
可选 | AzureCloud |
目标Microsoft Graph服务可用的受支持云环境的名称。 允许的值: AzureChinaCloud. |
创建 AD FS 应用
以 azurestack\AzureStackAdmin 身份打开 PowerShell 实例。
转到您在本文前面下载并解压的脚本所在的位置。
运行 Create-ADFSIdentityApp.ps1 脚本。
在“凭据”窗口中,输入 AD FS 云管理帐户和密码。 选择“确定”。
为 之前创建的证书提供证书文件路径和证书密码。 此步骤的证书默认为 sso.appservice.local.azurestack.external.pfx 。
Create-ADFSIdentityApp.ps1
| 参数 | 必需还是可选 | 默认值 | 说明 |
|---|---|---|---|
AdminArmEndpoint |
必需 | Null |
Azure 资源管理器管理终结点。 示例为 adminmanagement.local.azurestack.external。 |
PrivilegedEndpoint |
必需 | Null |
特权终结点。 示例为 AzS-ERCS01。 |
CloudAdminCredential |
必需 | Null |
Azure Stack Hub 云管理员的域帐户凭据。 示例为 Azurestack\CloudAdmin。 |
CertificateFilePath |
必需 | Null |
标识应用程序的证书 PFX 文件的完整路径。 |
CertificatePassword |
必需 | Null |
帮助保护证书私钥的密码。 |
从 Microsoft 市场下载项目
Azure Stack Hub上的Azure 应用服务要求从市场下载项,使其在Azure Stack Hub市场中可用。 在Azure Stack Hub开始部署或升级Azure 应用服务之前,请下载以下项。
重要
Windows Server Core 不是可用于 Azure Stack Hub 上的 Azure 应用服务 的受支持平台映像。
请勿将评估映像用于生产部署。
- Windows Server 2022 Datacenter VM 映像的最新版本。
已启用 Microsoft .NET 3.5.1 SP1 的 Windows Server 2022 Datacenter 完整 VM 映像。 Azure Stack Hub上的Azure 应用服务要求在用于部署的映像上激活 Microsoft .NET 3.5.1 SP1。 通过 Azure 市场分发的 Windows Server 2022 映像未启用此功能。 在脱机环境中,映像无法连接到 Microsoft Update 来下载要通过 DISM 安装的软件包。 必须创建并使用一个已预先启用此功能的 Windows Server 2022 映像,用于断开连接的部署。
有关创建自定义映像并将其添加到市场的信息,请参阅 将自定义 VM 映像添加到 Azure Stack Hub。 将映像添加到市场时,请务必指定以下属性:
- Publisher:输入 MicrosoftWindowsServer。
- 产品/服务:输入 WindowsServer。
- SKU:输入 AppService。
- 版本:指定最新版本。
- 自定义脚本扩展 v1.9.1 或更高版本。 此项为 VM 扩展。