Поделиться через


Запуск службы как локальной учетной записи пользователя или локальной системной учетной записи

Платформа Azure Service Fabric помогает защищать приложения, работающие в кластере под разными учетными записями. По умолчанию приложения Service Fabric выполняются под учетной записью, используемой процессом Fabric.exe. Service Fabric также предоставляет возможность запуска приложений в локальной учетной записи пользователя или системы. Поддерживаемые типы учетных записей локальной системы: LocalUser, NetworkService, LocalService и LocalSystem. Если вы используете Service Fabric в автономном кластере Windows, вы можете запустить службу под учетными записями домена Active Directory или групповыми управляемыми учетными записями служб.

В манифесте приложения вы определяете учетные записи пользователей, необходимые для запуска служб или безопасных ресурсов в разделе "Субъекты ". Вы также можете определить и создать группы пользователей, чтобы один или несколько пользователей могли управляться вместе. Это полезно при наличии нескольких пользователей для разных точек входа службы, и они нуждаются в общих привилегиях, доступных на уровне группы. Затем пользователи упоминаются в политике "RunAs", которая применяется к определенной службе или ко всем службам в приложении.

По умолчанию политика RunAs применяется к главной точке входа. Вы также можете применить политику RunAs к точке входа установки, если необходимо выполнить определенные операции установки с высоким уровнем привилегий в системной учетной записи, или к обеим точкам входа — основной и установки.

Примечание.

Если вы применяете политику RunAs к службе, а манифест службы объявляет ресурсы конечных точек с протоколом HTTP, необходимо указать SecurityAccessPolicy. Дополнительные сведения см. в статье "Назначение политики доступа к безопасности для конечных точек HTTP и HTTPS".

Запуск службы как локального пользователя

Вы можете создать локального пользователя, который можно использовать для защиты службы в приложении. Если тип учетной записи LocalUser указан в разделе субъектов манифеста приложения, Service Fabric создает локальные учетные записи пользователей на компьютерах, где развертывается приложение. По умолчанию эти учетные записи не имеют тех же имен, что и в манифесте приложения (например, Customer3 в следующем примере манифеста приложения). Вместо этого они динамически создаются и имеют случайные пароли.

В разделе RunAsPolicy для ServiceManifestImport укажите учетную запись пользователя из раздела «Принципы», чтобы запустить пакет кода службы. В следующем примере показано, как создать локального пользователя и применить политику RunAs к главной точке входа:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application7Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Web1_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="Customer3" EntryPointType="Main" />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>    
    <Service Name="Web1" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Web1Type" InstanceCount="[Web1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="Customer3" />
    </Users>
  </Principals>
</ApplicationManifest>

Создание локальной группы пользователей

Вы можете создать группы пользователей и добавить одного или нескольких пользователей в группу. Это полезно, если для разных точек входа службы существует несколько пользователей, и им необходимо иметь определенные общие привилегии, доступные на уровне группы. В следующем примере манифеста приложения показана локальная группа с именем LocalAdminGroup с правами администратора. Два пользователя, Customer1 и Customer2, являются членами этой локальной группы. В разделе ServiceManifestImport политика RunAs применяется для запуска пакета кода Stateful1Pkg как Customer2. Другая политика runAs применяется для запуска пакета кода Web1Pkg в качестве Customer1.

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application7Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Stateful1_MinReplicaSetSize" DefaultValue="3" />
    <Parameter Name="Stateful1_PartitionCount" DefaultValue="1" />
    <Parameter Name="Stateful1_TargetReplicaSetSize" DefaultValue="3" />
    <Parameter Name="Web1_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Stateful1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="Customer2" EntryPointType="Main"/>
    </Policies>
  </ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="Customer1" EntryPointType="Main"/>
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="Stateful1" ServicePackageActivationMode="ExclusiveProcess">
      <StatefulService ServiceTypeName="Stateful1Type" TargetReplicaSetSize="[Stateful1_TargetReplicaSetSize]" MinReplicaSetSize="[Stateful1_MinReplicaSetSize]">
        <UniformInt64Partition PartitionCount="[Stateful1_PartitionCount]" LowKey="-9223372036854775808" HighKey="9223372036854775807" />
      </StatefulService>
    </Service>
    <Service Name="Web1" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Web1Type" InstanceCount="[Web1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Groups>
      <Group Name="LocalAdminGroup">
        <Membership>
          <SystemGroup Name="Administrators" />
        </Membership>
      </Group>
    </Groups>
    <Users>
      <User Name="Customer1">
        <MemberOf>
          <Group NameRef="LocalAdminGroup" />
        </MemberOf>
      </User>
      <User Name="Customer2">
        <MemberOf>
          <Group NameRef="LocalAdminGroup" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

Применение политики по умолчанию ко всем пакетам кода службы

Вы используете раздел DefaultRunAsPolicy , чтобы указать учетную запись пользователя по умолчанию для всех пакетов кода, которые не имеют определенного определения RunAsPolicy . Если большинство пакетов кода, указанных в манифесте службы, используемых приложением, должны выполняться под одним пользователем, приложение может просто определить политику запуска по умолчанию с этой учетной записью пользователя. В следующем примере указывается, что если пакет кода не указан в RunAsPolicy , пакет кода должен выполняться под пользователем MyDefaultAccount , указанным в разделе субъектов. Поддерживаемые типы учетных записей: LocalUser, NetworkService, LocalSystem и LocalService. При использовании локального пользователя или службы также укажите имя учетной записи и пароль.

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="Application7Type" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Web1_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Web1Pkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    
  </ServiceManifestImport>
  <DefaultServices>    
    <Service Name="Web1" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Web1Type" InstanceCount="[Web1_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="MyDefaultAccount" AccountType="NetworkService" />      
    </Users>
  </Principals>
  <Policies>
    <DefaultRunAsPolicy UserRef="MyDefaultAccount" />
  </Policies>
</ApplicationManifest>

Отладка пакета кода локально с помощью перенаправления консоли

Иногда это полезно для отладки, чтобы просмотреть выходные данные консоли из работающей службы. Политику перенаправления консоли можно задать в точке входа в манифесте службы, которая записывает выходные данные в файл. Выходные данные файла записываются в папку приложения, называемую журналом на узле кластера, где развертывается и выполняется приложение.

Предупреждение

Никогда не используйте политику перенаправления консоли в приложении, развернутом в рабочей среде, так как это может повлиять на отработку отказа приложения. Это используется только для локальных целей разработки и отладки.

В следующем примере манифеста службы показано включение перенаправления консоли со значением FileRetentionCount:

<CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>VotingWeb.exe</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
        <ConsoleRedirection FileRetentionCount="10"/>
      </ExeHost>
    </EntryPoint>
</CodePackage>

Дальнейшие действия