Executar um serviço como uma conta de usuário local ou conta de sistema local

Usando o Azure Service Fabric, você pode proteger aplicativos que estão sendo executados no cluster em diferentes contas de usuário. Por padrão, os aplicativos do Service Fabric são executados na conta na qual o processo de Fabric.exe é executado. O Service Fabric também fornece a capacidade de executar aplicativos em uma conta de usuário ou sistema local. Os tipos de conta do sistema local suportados são LocalUser, NetworkService, LocalService e LocalSystem. Se você estiver executando o Service Fabric em um cluster autônomo do Windows, poderá executar um serviço em contas de domínio do Ative Directory ou contas de serviço gerenciado de grupo.

No manifesto do aplicativo, você define as contas de usuário necessárias para executar serviços ou proteger recursos na seção Principais. Você também pode definir e criar grupos de usuários para que um ou mais usuários possam ser gerenciados juntos. Isso é útil quando há vários usuários para diferentes pontos de entrada de serviço e eles precisam de privilégios comuns disponíveis no nível do grupo. Os usuários são então referenciados em uma política RunAs, que é aplicada a um serviço específico ou a todos os serviços no aplicativo.

Por padrão, a política RunAs é aplicada ao ponto de entrada principal. Você também pode aplicar uma política RunAs ao ponto de entrada da instalação, se precisar executar determinadas operações de instalação de alto privilégio em uma conta do sistema ou em ambos os pontos de entrada principal e de configuração.

Nota

Se você aplicar uma política RunAs a um serviço e o manifesto do serviço declarar recursos de ponto de extremidade com o protocolo HTTP, deverá especificar uma SecurityAccessPolicy. Para obter mais informações, consulte Atribuir uma política de acesso de segurança para pontos de extremidade HTTP e HTTPS.

Executar um serviço como um usuário local

Você pode criar um usuário local que pode ser usado para ajudar a proteger um serviço dentro do aplicativo. Quando um tipo de conta LocalUser é especificado na seção principais do manifesto do aplicativo, o Service Fabric cria contas de usuário locais em computadores onde o aplicativo é implantado. Por padrão, essas contas não têm os mesmos nomes especificados no manifesto do aplicativo (por exemplo, Customer3 no seguinte exemplo de manifesto do aplicativo). Em vez disso, eles são gerados dinamicamente e têm senhas aleatórias.

Na seção RunAsPolicy para um ServiceManifestImport, especifique a conta de usuário na seção Principals para executar o pacote de código de serviço. O exemplo a seguir mostra como criar um usuário 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 usuários local

Você pode criar grupos de usuários e adicionar um ou mais usuários ao grupo. Isso é útil se houver vários usuários para diferentes pontos de entrada de serviço e eles precisarem ter certos privilégios comuns disponíveis no nível do grupo. O exemplo de manifesto do aplicativo a seguir mostra um grupo local chamado LocalAdminGroup que tem privilégios de administrador. Dois utilizadores, Customer1 e Customer2, tornam-se membros deste grupo local. Na seção ServiceManifestImport, uma política RunAs é aplicada para executar o pacote de código Stateful1Pkg como Customer2. Outra política RunAs é aplicada 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 padrão a todos os pacotes de código de serviço

Use a seção DefaultRunAsPolicy para especificar uma conta de usuário padrão para todos os pacotes de código que não têm um RunAsPolicy específico definido. Se a maioria dos pacotes de código especificados no manifesto de serviço usado por um aplicativo precisar ser executada sob o mesmo usuário, o aplicativo poderá apenas definir uma política RunAs padrão com essa conta de usuário. O exemplo a seguir especifica que, se um pacote de código não tiver um RunAsPolicy especificado, o pacote de código deverá ser executado no usuário MyDefaultAccount especificado na seção principals. Os tipos de conta suportados são LocalUser, NetworkService, LocalSystem e LocalService. Se estiver usando um usuário ou serviço local, especifique também o nome da conta e a senha.

<?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 usando o redirecionamento de console

Ocasionalmente, é útil para fins de depuração ver a saída do console de um serviço em execução. Você pode definir uma política de redirecionamento de console no ponto de entrada no manifesto do serviço, que grava a saída em um arquivo. A saída do arquivo é gravada na pasta do aplicativo chamada log no nó do cluster onde o aplicativo é implantado e executado.

Aviso

Nunca use a política de redirecionamento de console em um aplicativo implantado em produção, pois isso pode afetar o failover do aplicativo. Use isso apenas para fins de desenvolvimento local e depuração.

O exemplo de manifesto de serviço a seguir mostra a habilitação do redirecionamento de console 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>

Próximos passos