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

时间:2016-08-24 14:50:18

标签: security azure-service-fabric

Service Fabric RunAs功能

默认情况下,Service Fabric应用程序将与Network Service帐户一起运行。 Microsoft提供了有关如何使用其他权限运行它的(部分)文档:RunAs: Run a Service Fabric application with different security permissions

基于此,这就是我要做的事情:

  • 我的Service Fabric应用程序调用正在其他存储库中开发的库。
  • 当部署在云中时,服务将从存储中下载库的二进制文件,将它们解压缩到Service Fabric集群的工作目录中并从那里加载。
  • 在开发时,当我在本地群集中测试或调试应用程序时,我希望从我刚刚编译它们的本地硬盘驱动器上的某个文件夹加载库的二进制文件,这就是下一个到源代码。

棘手的部分是我公司的安全策略要求所有库的源代码只能由授权用户访问,这转换为包含此代码被读保护的文件夹。因此,我的Service Fabric应用程序(作为网络服务运行)无法访问我的二进制文件。无法更改安全策略,也无法让Network Service访问该文件夹。

如何配置我的应用程序,使其以具有正确访问权限的用户身份运行?

这是我已经尝试过的:

使用域用户

最简单的解决方案是能够使用我自己的登录名运行Service Fabric应用程序。我通过在ApplicationManifest.xml中添加以下内容来尝试此操作:

<Principals>
  <Users>
    <User Name="SfUser" AccountName="Domain\UserName" AccountType="DomainUser" Password="pass" />
  </Users>
</Principals>
<Policies>
  <DefaultRunAsPolicy UserRef="SfUser" />
</Policies>

这有效:应用程序以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用户管理器中看到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

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

1 个答案:

答案 0 :(得分:5)

以本地用户身份运行时,会在计算机上创建一个随机本地用户帐户。上述示例中最有可能失败的原因是<SystemGroup Name="MyLocalGroup"/>需要是有效的Windows系统组,例如&#34;管理员&#34;。你也不需要上面的AccountName属性,但它没有任何害处。

要解决从远程目录获取文件的问题,您需要在尝试时使用域用户,因为本地用户没有可以使用AD验证的共享密钥。不同之处在于,您可以使用部署到计算机的证书加密应用程序清单中的密码。我在下面放了一个示例ApplicationManifest.xml片段,显示了如何使用名为&#34; MyCert&#34;的证书加密域用户的密码。

<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中创建加密密码,这通常也很有用。