Ponta a Ponta - Active DirectoryEnd to End - Active Directory

Imagine que o escopo do seu programa aumentou.Imagine the scope of your program has increased. Agora você é responsável por adicionar JEA a Controladores de Domínio para executar ações do Active Directory.You are now responsible for adding JEA to Domain Controllers to perform Active Directory actions. As pessoas do suporte técnico pretendem usar JEA para desbloquear contas, redefinir senhas e executar outras ações semelhantes.The help desk people are going to use JEA to unlock accounts, reset passwords, and do other similar actions.

Você precisa expor um conjunto totalmente novo de comandos para um grupo diferente de pessoas.You need to expose a completely new set of commands to a different group of people. Além disso, você tem um monte de scripts do Active Directory existentes que precisa expor.On top of that, you have a bunch of existing Active Directory scripts you need to expose. Esta seção guiará você pela criação de uma Configuração de Sessão e a Capacidade de Função para esta tarefa.This section will walk through authoring a Session Configuration and Role Capability for this task.

Pré-requisitosPrerequisites

Para seguir esta seção passo a passo, você precisará estar operando em um controlador de domínio.To follow this section step-by-step, you'll need to be operating on a domain controller. Se não tiver acesso ao controlador de domínio, não se preocupe.If you don't have access to your domain controller, don't worry. Tente acompanhar trabalhando em outro cenário ou função com a qual você está familiarizado.Try to follow along with by working against some other scenario or role with which you are familiar. Se você quiser configurar rapidamente um novo controlador de domínio, confira o apêndice Criar um Controlador de Domínio.If you want to quickly set up a new domain controller, check out the Creating a Domain Controller appendix.

Etapas para criar uma nova Capacidade de Função e Configuração de SessãoSteps to Make a new Role Capability and Session Configuration

Criar uma nova capacidade de função pode parecer intimidador num primeiro momento, mas pode ser dividido em etapas bem simples:Making a new role capability can seem daunting at first, but it can be broken into fairly simple steps:

  1. Identificar as tarefas que você precisa habilitarIdentify the tasks you need to enable
  2. Restringir as tarefas conforme necessárioRestrict those tasks as necessary
  3. Confirmar se elas funcionam com JEAConfirm they work with JEA
  4. Colocá-las em um arquivo de Capacidade de FunçãoPut them in a Role Capability file
  5. Registrar uma Configuração de Sessão que expõe essa Capacidade de FunçãoRegister a Session Configuration that exposes that Role Capability

Etapa 1: Identificar o que precisa ser expostoStep 1: Identify What Needs to Be Exposed

Antes de criar uma nova Capacidade de Função ou Configuração de Sessão, você precisará identificar todas as coisas que os usuários precisarão fazer por meio do ponto de extremidade JEA, bem como realizá-las por meio do PowerShell.Before you make a new Role Capability or Session Configuration, you need to identify all of the things users will need to do through the JEA endpoint, as well as how to do them through PowerShell. Isso envolverá uma quantidade razoável de requisito de coleta e pesquisa.This will involve a fair amount of requirement gathering and research. Como você efetuará esse processo dependerá das suas metas e da organização.How you go about this process will depend on your organization and goals. É importante destacar o requisito de coleta e de pesquisa como uma parte essencial do processo do mundo real.It is important to call out requirement gathering and research as a critical part of the real world process. Essa pode ser a etapa mais difícil no processo de adoção de JEA.This may be the most difficult step in the process of adopting JEA.

Encontrar RecursosFind Resources

Veja este conjunto de recursos online que podem surgir na sua pesquisa sobre a criação de um ponto de extremidade de gerenciamento do Active Directory:Here is a set of online resources that might have come up in your research on creating an Active Directory management endpoint:

Faça uma listaMake a List

Veja este conjunto das dez ações das quais você estará trabalhando pelo restante desta seção.Here is a set of ten actions that you will be working from in the remainder of this section. Tenha em mente que este é apenas um exemplo, os requisitos das suas organizações podem ser diferentes:Keep in mind this is simply an example, your organizations requirements may be different:

AçãoAction Comando do PowerShellPowerShell Command
Desbloquear ContaAccount Unlock Unlock-ADAccount
Redefinir SenhaPassword Reset Set-ADAccountPassword e Set-ADUser -ChangePasswordAtLogonSet-ADAccountPassword and Set-ADUser -ChangePasswordAtLogon
Alterar o título do usuárioChange a User's Title Set-ADUser -Title
Localizar contas do AD que estão bloqueadas, desabilitadas, inativa, etc.Find AD Accounts that are locked out, disabled, inactive, etc. Search-ADAccount
Adicionar o usuário ao grupoAdd User to Group Add-ADGroupMember -Identity (with whitelist) -Members
Remover usuário de grupoRemove User from Group Remove-ADGroupMember -Identity (with whitelist) -Members
Habilitar uma conta de usuárioEnable a user account Enable-ADAccount
Desabilitar uma conta de usuárioDisable a user account Disable-ADAccount

Etapa 2: Restringir as tarefas conforme necessárioStep 2: Restrict Tasks as Necessary

Agora que você tem sua lista de ações, precisará considerar os recursos de cada comando.Now that you have your list of actions, you need to think through the capabilities of each command. Há dois motivos importantes para fazer isso:There are two important reasons to do this:

  1. É fácil dar aos usuários mais recursos do que você pretendia.It is easy to give users more capabilities than you intend. Por exemplo, Set-ADUser é um comando incrivelmente poderoso e flexível.For example, Set-ADUser is an incredibly powerful and flexible command. É recomendável não expor tudo o que ele pode fazer para ajudar os usuários do suporte técnico.You may not want to expose everything it can do to help desk users.

  2. Pior ainda, é possível expor comandos que permitem aos usuários fugir das restrições do JEA.Even worse, it's possible to expose commands that allow users to escape JEA's restrictions. Se isso acontecer, o JEA deixará de funcionar como um limite de segurança.If this happens, JEA ceases to function as a security boundary. Tenha cuidado ao selecionar comandos.Please be careful when selecting commands. Por exemplo, Invoke-Expression permitirá que os usuários executem código irrestrito.For example, Invoke-Expression will allow users to run unrestricted code. Para ver mais discussões sobre esse tópico, consulte a seção Considerações ao restringir comandos.For more discussion on this topic, check out the Considerations When Restricting Commands section.

Depois de revisar cada comando, você decide restringir o seguinte:After reviewing each command, you decide to restrict the following:

  1. Set-ADUser deve ter permissão apenas para executar o parâmetro -TitleSet-ADUser should only be allowed to run with the -Title parameter

  2. Add-ADGroupMember e Remove-ADGroupMember devem funcionar apenas com determinados gruposAdd-ADGroupMember and Remove-ADGroupMember should only work with certain groups

Etapa 3: Confirmar o trabalho de tarefas com JEAStep 3: Confirm the Tasks Work with JEA

De fato suar esses cmdlets pode não ser simples no ambiente JEA restrito.Actually using those cmdlets may not be straightforward in the restricted JEA environment. O JEA é executado no modo NoLanguage que, entre outras coisas, impede os usuários de usar variáveis.JEA runs in NoLanguage mode which, among other things, prevents users from using variables. Para garantir que os usuários finais tenham uma experiência positiva, é importante verificar algumas coisas.In order to ensure that end users have a smooth experience, it's important to check for a few things.

Por exemplo, considere Set-ADAccountPassword.As an example, consider Set-ADAccountPassword. O parâmetro -NewPassword requer uma cadeia de caracteres segura.The -NewPassword parameter requires a secure string. Muitas vezes, os usuários criam uma cadeia de caracteres e passam-na como uma variável (como abaixo):Often, users create a secure string and pass it in as a variable (as below):

$newPassword = Read-Host -Prompt "Specify a new password" -AsSecureString
Set-ADAccountPassword -Identity mollyd -NewPassword $newPassword -Reset

No entanto, o modo NoLanguage impede o uso de variáveis.However, NoLanguage mode prevents the usage of variables. Você pode contornar essa restrição de duas maneiras:You can get around this restriction in two ways:

  1. Você pode exigir que os usuários executem o comando sem atribuir variáveis.You can require users run the command without assigning variables. Ele é fácil de configurar, mas pode ser penoso para os operadores usando o ponto de extremidade.This is easy to configure, but can be painful for the operators using the endpoint. Quem deseja digitar essa saída sempre que você redefinir uma senha?Who wants to type this out every time you reset a password?

    Set-ADAccountPassword -Identity mollyd -NewPassword (Read-Host -Prompt "Specify a new password" -AsSecureString) -Reset
    
  2. Você pode encapsular a complexidade em um script ou uma função que você expõe para os usuários finais.You can wrap the complexity in a script or a function that you expose to end users. Scripts e funções que você expõe são executados em um contexto irrestrito; você pode escrever funções que usam variáveis e chamar outros comandos sem nenhum problema.Scripts and functions that you expose run in an unrestricted context; you can write functions that use variables and call other commands without any issue. Essa abordagem simplifica a experiência do usuário final, evita erros, reduz o conhecimento necessário do PowerShell e reduz a exposição de funcionalidade em excesso.This approach simplifies the end user experience, prevents errors, reduces required PowerShell knowledge, and reduces unintentionally exposing excess functionality. A única desvantagem é o custo de criação e manutenção da função.The only downside is the cost of authoring and maintaining the function.

Ao lado: adicionar uma função ao seu MóduloAside: Adding a Function to your Module

Adotando a abordagem nº 2, você vai escrever uma função do PowerShell chamada Reset-ContosoUserPassword.Taking approach #2, you are going to write a PowerShell function called Reset-ContosoUserPassword. Essa função está prestes a fazer tudo o que deve acontecer quando você redefinir a senha do usuário.This function is going to do everything that needs to happen when you reset a user's password. Na sua organização, isso pode envolver fazer coisas sofisticadas e complicadas.In your organization, this may involve doing fancy and complicated things. Como esse é apenas um exemplo, o comando apenas redefinirá a senha e exigirá a alteração da senha pelo usuário no momento de logon.Because this is just an example, your command will just reset the password and require the user change the password at logon. Nós o colocaremos no módulo Contoso_AD_Module criado na última seção.We will put it in the Contoso_AD_Module module you made in the last section.

  1. No ISE do PowerShell, abra "Contoso_AD_Module.psm1"In PowerShell ISE, open "Contoso_AD_Module.psm1"

    ise 'C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\Contoso_AD_Module.psm1'
    
  2. Pressione CTRL + J para abrir o menu de trechos de código.Press Crtl+J to open the snippets menu.

  3. Pressione a seta para baixo até localizar "função" e pressione enter.Key down until you find "function" and press enter. Isso prepara um esqueleto muito básico de uma função.This puts up a super basic skeleton of a function.

  4. Renomeie a função "Reset-ContosoUserPassword".Rename the function "Reset-ContosoUserPassword".

  5. Renomeie um dos parâmetros "Identity" e exclua o segundo.Rename one of the parameters "Identity" and delete the second.

  6. Copie o seguinte no corpo da função.Copy the following into the body of the function.

    # Get the new password
    $NewPassword = Read-Host -Prompt "Enter a new password" -AsSecureString
    # Reset the password
    Set-ADAccountPassword -Identity $Identity -NewPassword $NewPassword -Reset
    # Require the user to reset at next logon
    Set-ADUser -Identity $Identity -ChangePasswordAtLogon
    
  7. Salve o arquivo.Save the file. Você deve terminar com algo parecido com isso:You should end up with something that looks like this:

    function Reset-ContosoUserPassword ($Identity)
    {
    # Get the new password
    $NewPassword = Read-Host -Prompt "Enter a new password" -AsSecureString
    # Reset the password
    Set-ADAccountPassword -Identity $Identity -NewPassword $NewPassword -Reset
    # Require the user to reset at next logon
    Set-ADUser -Identity $Identity -ChangePasswordAtLogon
    }
    

    Agora, os usuários podem simplesmente chamar Reset-ContosoUserPassword e não precisam se lembrar a sintaxe para criar um cadeia de caracteres segura embutida.Now, your users can simply call Reset-ContosoUserPassword and not have to remember the syntax to create a secure string inline.

Etapa 4: Editar o arquivo de Capacidade de FunçãoStep 4: Edit the Role Capability File

Na seção Criação de Capacidade de Função, você criou um arquivo de Capacidade de Função em branco.In the Role Capability Creation section, you created a blank Role Capability file. Nesta seção, você preencherá os valores nesse arquivo.In this section, you will fill in the values in that file.

Comece abrindo o arquivo de capacidade de função no ISE do PowerShell.Start by opening the role capability file in PowerShell ISE.

ise 'C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\RoleCapabilities\ADHelpDesk.psrc'

Atualize o arquivo com as seguintes alterações:Update the file with the following changes:

# OLD: VisibleCmdlets = 'Invoke-Cmdlet1', @{ Name = 'Invoke-Cmdlet2'; Parameters = @{ Name = 'Parameter1'; ValidateSet = 'Item1', 'Item2' }, @{ Name = 'Parameter2'; ValidatePattern = 'L*' } }
VisibleCmdlets =
    'Unlock-ADAccount',
    'Search-ADAccount',
    'Enable-ADAccount',
    'Disable-ADAccount',
    @{ Name = 'Set-ADUser'; Parameters = @{ Name = 'Title'; ValidateSet = 'Manager', 'Engineer' }},
    @{ Name = 'Add-ADGroupMember'; Parameters =
        @{Name = 'Identity'; ValidateSet = 'TestGroup'},
        @{Name = 'Members'}},
    @{ Name = 'Remove-ADGroupMember'; Parameters =
        @{Name = 'Identity'; ValidateSet = 'TestGroup'},
        @{Name = 'Members'}}

# OLD: VisibleFunctions = 'Invoke-Function1', @{ Name = 'Invoke-Function2'; Parameters = @{ Name = 'Parameter1'; ValidateSet = 'Item1', 'Item2' }, @{ Name = 'Parameter2'; ValidatePattern = 'L*' } }
VisibleFunctions = 'Reset-ContosoUserPassword'

Há algumas coisas a observar sobre o que foi indicado acima:There are a few things to note about the above:

  1. O PowerShell tentará carregar automaticamente os módulos necessários para a sua Capacidade de Função.PowerShell will attempt to auto-load the modules needed for your Role Capability. Você precisará listar explicitamente nomes de módulo no campo "ModulesToImport" se você encontrar problemas com um módulo que não está sendo carregado automaticamente.You may need to explicitly list module names in the "ModulesToImport" field if you notice problems with a module not being autoloaded.

  2. Se você não tiver certeza se um comando é uma função ou um cmdlet, execute Get-Command e examine a propriedade "CommandType"If you aren't sure if a command is a cmdlet or a function, run Get-Command and look at the "CommandType" property

  3. O ValidatePattern permite que você use uma expressão regular para restringir os argumentos do parâmetro se não for fácil de definir um conjunto de valores permitidos.The ValidatePattern allows you to use a regular expression to restrict parameter arguments if it is not easy to define a set of allowable values. Você não pode definir um ValidatePattern e ValidateSet para um único parâmetro.You cannot define both a ValidatePattern and ValidateSet for a single parameter.

Etapa 5: Registrar uma nova Configuração de SessãoStep 5: Register a new Session Configuration

Em seguida, você criará um novo arquivo de configuração de sessão que irá expor sua Capacidade de Função para os membros do grupo de AD "JEA_NonAdmin_HelpDesk".Next, you will create a new session configuration file that will expose your Role Capability to members of the "JEA_NonAdmin_HelpDesk" AD group.

Comece criando e abrindo um novo arquivo de Configuração de Sessão em branco no ISE do PowerShell.Start by creating and opening a new blank Session Configuration file in PowerShell ISE.

New-PSSessionConfigurationFile -Path "$env:ProgramData\JEAConfiguration\HelpDeskDemo.pssc"
ise "$env:ProgramData\JEAConfiguration\HelpDeskDemo.pssc"

Modifique os campos a seguir no arquivo PSSC.Modify the following fields in the PSSC file. Se você estiver trabalhando em seu próprio ambiente, substitua "CONTOSO\JEA_NonAdmins_Helpdesk" por seu próprio usuário ou grupo não administrador.If you are working in your own environment, you should replace "CONTOSO\JEA_NonAdmins_Helpdesk" with your own non-administrator user or group.

# OLD: Description = ''
Description = 'An endpoint for Active Directory tasks.'

# OLD: SessionType = 'Default'
SessionType = 'RestrictedRemoteServer'

# OLD: TranscriptDirectory = 'C:\Transcripts\'
TranscriptDirectory = "C:\ProgramData\JEAConfiguration\Transcripts"

# OLD: RunAsVirtualAccount = $true
RunAsVirtualAccount = $true

# OLD: RoleDefinitions = @{ 'CONTOSO\SqlAdmins' = @{ RoleCapabilities = 'SqlAdministration' }; 'CONTOSO\ServerMonitors' = @{ VisibleCmdlets = 'Get-Process' } }
RoleDefinitions = @{ 'CONTOSO\JEA_NonAdmin_HelpDesk' = @{ RoleCapabilities =  'ADHelpDesk' }}

Salve e registrar a Configuração de SessãoSave and register the Session Configuration

Register-PSSessionConfiguration -Name ADHelpDesk -Path "$env:ProgramData\JEAConfiguration\HelpDeskDemo.pssc"

Experimente!Test It Out!

Obtenha suas credenciais de usuário não administrador:Get your non-administrator user credentials:

$HelpDeskCred = Get-Credential

Se você acompanhou a seção Configurar usuários e grupos, as credenciais serão:If you followed the Set Up Users and Groups section, the credentials will be:

  • Nome de usuário = "HelpDeskUser"Username = "HelpDeskUser"
  • Senha = "pa$$w0rd"Password = "pa$$w0rd"

Conexão remota para o ponto de extremidade do Suporte Técnico de AD usando a credencial não administrativa:Remote into the ADHelpdesk endpoint using the non-admin credential:

Enter-PSSession -ComputerName . -ConfigurationName ADHelpDesk -Credential $HelpDeskCred

Use Set-ADUser para redefinir o título do usuário.Use Set-ADUser to reset a user's title.

Set-ADUser -Identity OperatorUser -Title Engineer

Verifique se que o título foi alterado.Verify that the title has changed.

Get-ADUser -Identity OperatorUser -Property Title

Agora, use Add-ADGroupMember para adicionar um usuário ao TestGroup.Now, use Add-ADGroupMember to add a user to the TestGroup. Observação: verifique se você criou o TestGroup com antecedência.Note: make sure you've created the TestGroup beforehand.

Add-ADGroupMember TestGroup -Member OperatorUser -Verbose

Sair da sessão:Exit the session:

Exit-PSSession

Conceitos PrincipaisKey Concepts

Modo NoLanguage: quando o PowerShell está no modo "NoLanguage", os usuários somente podem executar comandos, mas não podem usar elementos de linguagem.NoLanguage Mode: When PowerShell is in "NoLanguage" mode, users may only run commands; they cannot use any language elements. Para obter mais informações, execute Get-Help about_Language_Modes.For more information, run Get-Help about_Language_Modes.

Funções do PowerShell: funções do PowerShell são partes do código do PowerShell que podem ser chamados por nome.PowerShell Functions: PowerShell functions are bits of PowerShell code that you can call by name. Para obter mais informações, execute Get-Help about_Functions.For more information, run Get-Help about_Functions.

ValidateSet/ValidatePattern: ao expor um comando, você pode restringir os argumentos válidos para os parâmetros específicos.ValidateSet/ValidatePattern: When exposing a command, you can restrict valid arguments for specific parameters. Um ValidateSet é uma lista específica de argumentos válidos.A ValidateSet is a specific list of valid arguments. Um ValidatePattern é uma expressão regular à qual os argumentos para esse parâmetro devem corresponder.A ValidatePattern is a regular expression that the arguments for that parameter must match.