如何运行具有不同安全权限的Service Fabric应用程序?

Sté*_*iez 9 security azure-service-fabric

Service Fabric RunAs功能

默认情况下,Service Fabric应用程序将与Network Service帐户一起运行.Microsoft提供了有关如何使用其他权限运行它的(部分)文档:RunAs:运行具有不同安全权限的Service Fabric应用程序.

基于此,这是我正在尝试做的事情:

  • 我的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>
Run Code Online (Sandbox Code Playgroud)

这工作:应用程序作为Domain\UserName运行,可以访问我需要的所有文件夹.但是这需要我将我的密码放在配置文件中,这是不能令人满意的.

使用本地用户

然后我尝试使用本地用户,以为我能够使用本地用户组正确配置访问权限.我能想到的最简单的版本是:

<Principals>
  <Users>
    <User Name="SfUser" AccountName="LocalSfUser" AccountType="LocalUser">
      <MemberOf>
        <SystemGroup Name="MyLocalGroup"/>
      </MemberOf>
    </User>
  </Users>
</Principals>
<Policies>
  <DefaultRunAsPolicy UserRef="SfUser" />
</Policies>
Run Code Online (Sandbox Code Playgroud)

我认为这种配置是正确的,因为当我部署我的应用程序时,我可以在Windows用户管理器中看到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
Run Code Online (Sandbox Code Playgroud)

显然,"登录类型8"表示"网络明文登录".我怀疑当地的政策阻止了我公司的这种登录.

小智 5

以本地用户身份运行时,会在计算机上创建一个随机本地用户帐户.在上面的示例中,这很可能失败的原因是<SystemGroup Name="MyLocalGroup"/>需要成为有效的Windows系统组,例如"管理员".你也不需要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>
Run Code Online (Sandbox Code Playgroud)

作为旁注,这篇文章https://azure.microsoft.com/en-us/documentation/articles/service-fabric-application-secret-management显示如何在settings.xml中创建加密密码,这通常也很有用.