Executar um serviço como uma conta de utilizador local ou uma conta de sistema local

Ao utilizar o Azure Service Fabric, pode proteger as aplicações que estão em execução no cluster em contas de utilizador diferentes. Por predefinição, as aplicações do Service Fabric são executadas na conta em que o processo de Fabric.exe é executado. O Service Fabric também fornece a capacidade de executar aplicações numa conta de utilizador ou sistema local. Os tipos de conta de sistema local suportados são LocalUser, NetworkService, LocalService e LocalSystem. Se estiver a executar o Service Fabric num cluster autónomo do Windows, pode executar um serviço em contas de domínio do Active Directory ou contas de serviço geridas por grupos.

No manifesto da aplicação, define as contas de utilizador necessárias para executar serviços ou proteger recursos na secção Principais . Também pode definir e criar grupos de utilizadores para que um ou mais utilizadores possam ser geridos em conjunto. Isto é útil quando existem vários utilizadores para diferentes pontos de entrada de serviço e precisam de privilégios comuns disponíveis ao nível do grupo. Em seguida, os utilizadores são referenciados numa política RunAs, que é aplicada a um serviço específico ou a todos os serviços na aplicação.

Por predefinição, a política RunAs é aplicada ao ponto de entrada principal. Também pode aplicar uma política RunAs ao ponto de entrada de configuração, se precisar de executar determinadas operações de configuração de privilégios elevados numa conta de sistema ou pontos de entrada principais e de configuração.

Nota

Se aplicar uma política RunAs a um serviço e o manifesto de serviço declarar recursos de ponto final com o protocolo HTTP, tem de especificar um SecurityAccessPolicy. Para obter mais informações, veja Atribuir uma política de acesso de segurança para pontos finais HTTP e HTTPS.

Executar um serviço como um utilizador local

Pode criar um utilizador local que possa ser utilizado para ajudar a proteger um serviço na aplicação. Quando um tipo de conta LocalUser é especificado na secção principais do manifesto da aplicação, o Service Fabric cria contas de utilizador locais em computadores onde a aplicação é implementada. Por predefinição, estas contas não têm os mesmos nomes que os especificados no manifesto da aplicação (por exemplo, Cliente3 no exemplo de manifesto da aplicação seguinte). Em vez disso, são geradas dinamicamente e têm palavras-passe aleatórias.

Na secção RunAsPolicy de um ServiceManifestImport, especifique a conta de utilizador da secção Principais para executar o pacote de código de serviço. O exemplo seguinte mostra como criar um utilizador local e aplicar uma política RunAs ao ponto de entrada principal:

<?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>

Criar um grupo de utilizadores local

Pode criar grupos de utilizadores e adicionar um ou mais utilizadores ao grupo. Isto é útil se existirem vários utilizadores para diferentes pontos de entrada de serviço e precisarem de ter determinados privilégios comuns disponíveis ao nível do grupo. O exemplo de manifesto da aplicação seguinte mostra um grupo local com o nome LocalAdminGroup que tem privilégios de administrador. Dois utilizadores, Customer1 e Customer2, são membros deste grupo local. Na secção ServiceManifestImport , é aplicada uma política RunAs para executar o pacote de código Stateful1Pkg como Customer2. É aplicada outra política RunAs para executar o pacote de código Web1Pkg como 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>

Aplicar uma política predefinida a todos os pacotes de código de serviço

Utilize a secção DefaultRunAsPolicy para especificar uma conta de utilizador predefinida para todos os pacotes de código que não tenham um RunAsPolicy específico definido. Se a maioria dos pacotes de código especificados no manifesto de serviço utilizado por uma aplicação precisar de ser executado sob o mesmo utilizador, a aplicação pode apenas definir uma política RunAs predefinida com essa conta de utilizador. O exemplo seguinte especifica que, se um pacote de código não tiver um RunAsPolicy especificado, o pacote de código deve ser executado no utilizador MyDefaultAccount especificado na secção principais. Os tipos de conta suportados são LocalUser, NetworkService, LocalSystem e LocalService. Se utilizar um utilizador ou serviço local, especifique também o nome da conta e a palavra-passe.

<?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>

Depurar um pacote de código localmente com o redirecionamento da consola

Ocasionalmente, é útil para fins de depuração ver a saída da consola de um serviço em execução. Pode definir uma política de redirecionamento da consola no ponto de entrada no manifesto do serviço, que escreve o resultado num ficheiro. A saída do ficheiro é escrita na pasta da aplicação denominada log no nó de cluster onde a aplicação é implementada e executada.

Aviso

Nunca utilize a política de redirecionamento da consola numa aplicação implementada em produção, uma vez que esta ação pode afetar a ativação pós-falha da aplicação. Utilize-o apenas para fins locais de desenvolvimento e depuração.

O exemplo de manifesto de serviço seguinte mostra a ativação do redirecionamento da consola com um valor FileRetentionCount:

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

Passos seguintes