如何 运行 具有不同安全权限的 Service Fabric 应用程序?
How to run a Service Fabric application with different security permissions?
Service Fabric RunAs 功能
默认情况下,Service Fabric 应用程序将 运行 使用网络服务帐户。 Microsoft 有(部分)文档说明如何 运行 它具有其他权限:RunAs: Run a Service Fabric application with different security permissions.
基于此,这是我正在尝试做的事情:
- 我的 Service Fabric 应用程序调用了一个正在其他存储库中开发的库。
- 当部署在云中时,服务将从存储下载库的二进制文件,将它们解压缩到 Service Fabric 群集的工作目录中并从那里加载它。
- 在开发时,当我在本地集群中测试或调试应用程序时,我希望从我刚刚编译它们的本地硬盘驱动器上的某个文件夹中加载库的二进制文件,即就在源代码旁边。
棘手的部分是我公司的安全政策要求只有授权用户才能访问所述库的源代码,这意味着包含此代码的文件夹被读取保护。因此,我的 运行 作为网络服务的 Service Fabric 应用程序无法访问我的二进制文件。无法更改安全策略,也无法授予网络服务访问该文件夹的权限。
如何配置我的应用程序,使其 运行 作为具有正确访问权限的用户?
这是我已经尝试过的方法:
使用域用户
最简单的解决方案是能够 运行 使用我自己的登录名访问 Service Fabric 应用程序。我通过将以下内容添加到我的 ApplicationManifest.xml:
中进行了尝试
<Principals>
<Users>
<User Name="SfUser" AccountName="Domain\UserName" AccountType="DomainUser" Password="pass" />
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="SfUser" />
</Policies>
这有效:应用程序 运行s 作为 Domain\UserName 并且可以访问我需要的所有文件夹。但是这需要我把我的密码放在配置文件中,这并不令人满意。
使用本地用户
然后我尝试使用本地用户,认为我可以使用本地用户组正确配置访问权限。我能想到的最简单的版本是:
<Principals>
<Users>
<User Name="SfUser" AccountName="LocalSfUser" AccountType="LocalUser">
<MemberOf>
<SystemGroup Name="MyLocalGroup"/>
</MemberOf>
</User>
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="SfUser" />
</Policies>
我认为此配置是正确的,因为当我部署我的应用程序时,我可以在 Windows 用户管理器中看到几个 "technical" 用户由 Service Fabric 创建并且他们属于 MyLocalGroup。但是我的应用程序从未启动。
我注意到 Windows 事件查看器中的几条消息似乎与问题有关:
Logon Type: 8
Failure Information:
Failure Reason: The user has not been granted the requested logon type at this machine.
Process Information:
Caller Process Name: C:\Program Files\Microsoft Service Fabric\bin\FabricHost.exe
显然,"Logon Type 8" 表示 "Network clear text logon"。我怀疑我公司的本地政策阻止了这种登录。
当您 运行 作为本地用户时,这会在计算机上创建一个随机的本地用户帐户。在上面的示例中,这很可能失败的原因是 <SystemGroup Name="MyLocalGroup"/>
需要是一个有效的 Windows 系统组,例如 "Administrators"。你也不是真的需要上面的 AccountName
属性,但它没有坏处。
要解决您从远程目录获取文件的问题,您需要像您尝试的那样使用域用户,因为本地用户没有可以通过 AD 验证的共享机密。不同之处在于,您可以使用部署到计算机的证书对应用程序清单中的密码进行加密。我在下面放了一个示例 ApplicationManifest.xml 片段,展示了域用户的密码是如何使用名为 "MyCert".
的证书加密的
<Principals>
<Users>
<User Name="TestUser" AccountType="DomainUser" AccountName="Domain\User" Password="[Put Encrypted Password Here" PasswordEncrypted="true" />
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="TestUser" />
<SecurityAccessPolicies>
<SecurityAccessPolicy ResourceRef="MyCert" PrincipalRef="TestUser" GrantRights="Full" ResourceType="Certificate" />
</SecurityAccessPolicies>
</Policies>
作为旁注,此处的文章 https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-secret-management 展示了如何在 settings.xml 中创建加密密码,这也经常有用。
Service Fabric RunAs 功能
默认情况下,Service Fabric 应用程序将 运行 使用网络服务帐户。 Microsoft 有(部分)文档说明如何 运行 它具有其他权限:RunAs: Run a Service Fabric application with different security permissions.
基于此,这是我正在尝试做的事情:
- 我的 Service Fabric 应用程序调用了一个正在其他存储库中开发的库。
- 当部署在云中时,服务将从存储下载库的二进制文件,将它们解压缩到 Service Fabric 群集的工作目录中并从那里加载它。
- 在开发时,当我在本地集群中测试或调试应用程序时,我希望从我刚刚编译它们的本地硬盘驱动器上的某个文件夹中加载库的二进制文件,即就在源代码旁边。
棘手的部分是我公司的安全政策要求只有授权用户才能访问所述库的源代码,这意味着包含此代码的文件夹被读取保护。因此,我的 运行 作为网络服务的 Service Fabric 应用程序无法访问我的二进制文件。无法更改安全策略,也无法授予网络服务访问该文件夹的权限。
如何配置我的应用程序,使其 运行 作为具有正确访问权限的用户?
这是我已经尝试过的方法:
使用域用户
最简单的解决方案是能够 运行 使用我自己的登录名访问 Service Fabric 应用程序。我通过将以下内容添加到我的 ApplicationManifest.xml:
中进行了尝试<Principals>
<Users>
<User Name="SfUser" AccountName="Domain\UserName" AccountType="DomainUser" Password="pass" />
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="SfUser" />
</Policies>
这有效:应用程序 运行s 作为 Domain\UserName 并且可以访问我需要的所有文件夹。但是这需要我把我的密码放在配置文件中,这并不令人满意。
使用本地用户
然后我尝试使用本地用户,认为我可以使用本地用户组正确配置访问权限。我能想到的最简单的版本是:
<Principals>
<Users>
<User Name="SfUser" AccountName="LocalSfUser" AccountType="LocalUser">
<MemberOf>
<SystemGroup Name="MyLocalGroup"/>
</MemberOf>
</User>
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="SfUser" />
</Policies>
我认为此配置是正确的,因为当我部署我的应用程序时,我可以在 Windows 用户管理器中看到几个 "technical" 用户由 Service Fabric 创建并且他们属于 MyLocalGroup。但是我的应用程序从未启动。
我注意到 Windows 事件查看器中的几条消息似乎与问题有关:
Logon Type: 8
Failure Information:
Failure Reason: The user has not been granted the requested logon type at this machine.
Process Information:
Caller Process Name: C:\Program Files\Microsoft Service Fabric\bin\FabricHost.exe
显然,"Logon Type 8" 表示 "Network clear text logon"。我怀疑我公司的本地政策阻止了这种登录。
当您 运行 作为本地用户时,这会在计算机上创建一个随机的本地用户帐户。在上面的示例中,这很可能失败的原因是 <SystemGroup Name="MyLocalGroup"/>
需要是一个有效的 Windows 系统组,例如 "Administrators"。你也不是真的需要上面的 AccountName
属性,但它没有坏处。
要解决您从远程目录获取文件的问题,您需要像您尝试的那样使用域用户,因为本地用户没有可以通过 AD 验证的共享机密。不同之处在于,您可以使用部署到计算机的证书对应用程序清单中的密码进行加密。我在下面放了一个示例 ApplicationManifest.xml 片段,展示了域用户的密码是如何使用名为 "MyCert".
的证书加密的<Principals>
<Users>
<User Name="TestUser" AccountType="DomainUser" AccountName="Domain\User" Password="[Put Encrypted Password Here" PasswordEncrypted="true" />
</Users>
</Principals>
<Policies>
<DefaultRunAsPolicy UserRef="TestUser" />
<SecurityAccessPolicies>
<SecurityAccessPolicy ResourceRef="MyCert" PrincipalRef="TestUser" GrantRights="Full" ResourceType="Certificate" />
</SecurityAccessPolicies>
</Policies>
作为旁注,此处的文章 https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-secret-management 展示了如何在 settings.xml 中创建加密密码,这也经常有用。