Preencha todos os campos necessários no formulário de criação de automatização e clique em Criar
d. Importar o AzureAD e aguardar até que o processo seja concluído com êxito.
2. Criar Livros de execução
a. Navegue até à sua conta de automatização, seleccione Livros de execuçãoe clique em Criar um livro de execução.
b. Quando o livro de execução for criado, clique em Editar e cole o seu script do PowerShell e, em seguida, clique em Guardar e Publicar.
3. O script abaixo pode ser utilizado para elevar o acesso de um utilizador à função de colaborador e dispara mensagens de correio eletrónico caso ocorram erros. O script começa por validar se o utilizador já tem uma função de leitor atribuída à subscrição à qual pretende obter acesso elevado. Se não tiver, o script apresentará um erro. Se o utilizador já tiver uma função de Colaborador no recurso solicitado, também será apresentada uma mensagem de erro.
As áreas destacadas devem ser adaptadas para se adequarem aos pormenores do seu ambiente.
param ( [Parameter(Mandatory = $true)] [string] $subscriptionId, [Parameter(Obrigatório = $true)] [string] $resourceGroupName, [Parâmetro(Obrigatório = $true)] [string] $resourceName, [Parâmetro(Obrigatório = $true)] [string] $resourceName, [Parâmetro(Obrigatório = $true)] [string] $resourceType, [Parâmetro(Obrigatório = $true)] [string] $resourceType, [Parameter(Obrigatório = $true)] [string] $userPrincipalName, [Parâmetro(Obrigatório = $false)] [string] $linkUrl )
$ErrorActionPreference = "Continuar" $errors = @() function Send-Email($subject, $body, $to, $cc = $null, $isBodyHtml = $false) { $credential = Get-AutomationPSCredential -Name 'SMTP Relay' $smtpServer = 'smtp.example.com' $smtpPort = <Int32> $de = 'example@examplecompany.com' $mailParams = @{ Para = $to Assunto = $subject Corpo = 1TP57Corpo SmtpServer = $smtpServer Credencial = $credencial Porta = $smtpPort UseSsl = $true From = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity } catch { $errors += "Falha ao autenticar com o Azure utilizando a Identidade Gerida:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } catch { $errors += "Falha ao definir o contexto de subscrição do Azure:$_" } $roleDefinitionName = 'Contributor' $readerRoleDefinitionName = 'Leitor' try { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } catch { $errors += "Falha ao recuperar o objeto do utilizador para o UPN '$userPrincipalName': $_" } # Verificar se o utilizador tem a função de Leitor ao nível da subscrição $readerRoleAssignment = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $readerRoleDefinitionName -Scope "/subscriptions/$subscriptionId" -ErrorAction SilentlyContinue se (-not $readerRoleAssignment) { $noReaderRoleHtml = @" <h2>Não no papel de leitor</h2>
<p>Utilizador <strong>$userPrincipalName</strong> não tem o <strong>$readerRoleDefinitionName</strong> ao nível da subscrição e não pode ser adicionado à função <strong>$roleDefinitionName</strong> função para o recurso.</p> "@ $noReaderRoleHtml += $signature Send-Email -subject "Missing Reader Role" -body $noReaderRoleHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true retornar } # Verificar se o grupo de recursos existe $resourceGroupExists = $true $resourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue se (-not $resourceGroup) { $errors += "O grupo de recursos '$resourceGroupName' não existe." $resourceGroupExists = $false } # Verificar se o recurso existe dentro do grupo de recursos $domain = "yourdomain.onmicrosoft.com"# substitua-o pelo seu domínio de inquilino AAD real # Verifique se o recurso existe no grupo de recursos usando o nome e o tipo $resourceExists = $false $resourceUrl = "" se ($resourceGroupExists) { $resources = Get-AzResource -ResourceGroupName $resourceGroupName -ResourceType $resourceType -Name $resourceName -ErrorAction SilentlyContinue $resource = $resources | Where-Object { $_.ResourceType -eq $resourceType -and $_.Name -eq $resourceName } se ($resource) { $resourceExists = $true # Construa a URL usando o domínio, o grupo de recursos, o tipo de recurso e o nome do recurso $resourceUrl = "https://portal.azure.com/#@$domain/resourcegroups/$resourceGroupName/providers/$($resource.ResourceType)/$resourceName" } else { $errors += "O recurso do tipo '$resourceType' com o nome '$resourceName' não existe no grupo de recursos '$resourceGroupName'." } } # Tentar a atribuição de funções apenas se o grupo de recursos e o recurso existirem if ($resourceGroupExists -and $resourceExists) { try { $roleAssignment = New-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction Stop } catch { if ($_.Exception -match 'Conflict') { # O utilizador já tem a função de Colaborador, envie uma mensagem de correio eletrónico específica $alreadyContributorHtml = @" <h2>O utilizador já é um colaborador</h2> <p>Utilizador<strong>$userPrincipalName</strong>já tem o<strong>$roleDefinitionName</strong>função para recurso<strong>$resourceName</strong>.</p> <p>URL do recurso:<a href='$linkUrl'>$linkUrl</a></p> "@ $alreadyContributorHtml += $signature Send-Email -subject "O utilizador já tem a função de contribuinte" -body $alreadyContributorHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true } else { $errors += "Falha ao atribuir a função '$roleDefinitionName' ao utilizador '$userPrincipalName': $_" } } } $signature = @" <p>Com os melhores cumprimentos,</p> <p><strong>A sua equipa de TI</strong></p> <p><em>Esta é uma mensagem automática, por favor não responda diretamente a este e-mail.</em></p> "@ se ($errors) { $errorMessageHtml = "<h2>Problemas detectados na atribuição de funções do Azure</h2><ul>" foreach ($errorItem in $errors) { $errorMessageHtml += "<li>$errorItem</li>" } $errorMessageHtml += "</ul>$signature" Send-Email -subject "Azure Role Assignment Issues" -body $errorMessageHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true } elseif ($roleAssignment) { # A atribuição de funções foi bem sucedida, enviar uma mensagem de correio eletrónico de sucesso $successMessageHtml = @"<h2>Sucesso na atribuição de funções</h2> <p>Utilizador<strong>$userPrincipalName</strong>foi atribuído com sucesso o<strong>$roleDefinitionName</strong>função para recurso<strong>$resourceName</strong>.</p> <p>URL do recurso:<a href='$linkUrl'>$linkUrl</a></p> "@ $successMessageHtml += $signature Send-Email -subject "Azure Role Assignment Success" -body $successMessageHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true }
Tenha em atenção que os scripts do PowerShell acima e abaixo demoram normalmente cerca de 5 minutos a serem concluídos, uma vez que os módulos do AzureAD demoram algum tempo a carregar.
Tenha também em atenção que, ao adicionar uma nova função, como Colaborador, o utilizador deve terminar a sessão e voltar a entrar no Azure ou utilizar uma janela de navegação anónima/privada para que a nova função tenha efeito.
4. Deve ser criado um segundo livro de execução para remover a função de colaborador quando tiver decorrido um período de tempo definido.
Um exemplo de um script do PowerShell para isso é:
param ( [Parameter(Mandatory = $true)] [string] $subscriptionId, [Parameter(Obrigatório = $true)] [string] $resourceGroupName, [Parâmetro(Obrigatório = $true)] [string] $resourceName, [Parâmetro(Obrigatório = $true)] [string] $resourceName, [Parâmetro(Obrigatório = $true)] [string] $resourceType, [Parâmetro(Obrigatório = $true)] [string] $resourceType, [Parameter(Obrigatório = $true)] [string] $userPrincipalName, [Parâmetro(Obrigatório = $false)] [string] $linkUrl ) $ErrorActionPreference = "Continuar" $errors = @() $signature = @"
<p>Com os melhores cumprimentos,</p> <p><strong>A sua equipa de TI</strong></p> <p><em>Esta é uma mensagem automática, por favor não responda diretamente a este e-mail.</em></p> "@ function Send-Email($subject, $body, $to, $cc = $null, $isBodyHtml = $false) { $credential = Get-AutomationPSCredential -Name 'SMTP Relay' $smtpServer = 'smtp.example.com' $smtpPort =<int 32> $from = 'example@examplecompany.com' $mailParams = @{ To = $to Assunto = $subject Corpo = 1TP57Corpo SmtpServer = $smtpServer Credencial = $credencial Porta = $smtpPort UseSsl = $true From = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity } catch { $errors += "Falha ao autenticar com o Azure utilizando a Identidade Gerida:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } catch { $errors += "Falha ao definir o contexto de subscrição do Azure:$_" } $roleDefinitionName = 'Contributor' try { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } catch { $errors += "Falha ao recuperar o objeto do utilizador para o UPN '$userPrincipalName': $_" }
Não no papel de leitor
# Verificar se o grupo de recursos existe e obter o recurso $resourceGroupExists = $resourceExists = $false se ((Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue)) { $resourceGroupExists = $true $resources = Get-AzResource -ResourceGroupName $resourceGroupName -ResourceType $resourceType -Name $resourceName -ErrorAction SilentlyContinue $resource = $resources | Where-Object { $_.ResourceType -eq $resourceType -and $_.Name -eq $resourceName } if ($resource) { $resourceExists = $true } else { $errors += "O recurso do tipo '$resourceType' com o nome '$resourceName' não existe no grupo de recursos '$resourceGroupName'." } } else { $errors += "O grupo de recursos '$resourceGroupName' não existe." } # Tentativa de remover a atribuição de função se o grupo de recursos e o recurso existirem if ($resourceGroupExists -and $resourceExists) { try { $roleAssignments = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue foreach ($roleAssignment in $roleAssignments) { # Nota: A supressão de confirmação funcionará se o cmdlet a suportar. Remove-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -Confirm:$false } # Verificar se as atribuições de funções foram removidas com êxito if (-not (Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue)) { # Se a remoção for bem-sucedida, enviar um e-mail de sucesso $successMessageHtml = @"<h2>Sucesso na remoção de papéis</h2> <p>Utilizador<strong>$userPrincipalName</strong>foi removido com sucesso do<strong>$roleDefinitionName</strong>função para recurso<strong>$resourceName</strong>.</p> <p>URL do recurso:<a href='$linkUrl'>$linkUrl</a></p> "@ $successMessageHtml += $signature Send-Email -subject "Azure Role Removal Success" -body $successMessageHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com " -isBodyHtml $true } else { $errors += "A função '$roleDefinitionName' ainda existe para o utilizador '$userPrincipalName' após tentativa de remoção." } } catch { $errors += "Falha ao remover a função '$roleDefinitionName' do utilizador '$userPrincipalName': $_" } } if ($errors) { $errorMessageHtml = "<h2>Problemas detectados na remoção de funções do Azure</h2><ul>" foreach ($errorItem in $errors) { $errorMessageHtml += "<li>$errorItem</li>" } $errorMessageHtml += "</ul>$signature" Send-Email -subject "Azure Role Removal Issues" -body $errorMessageHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true }
5. Atribua à conta de automatização a função de Administrador de acesso do utilizador por subscrição
a. Para que o script do PowerShell possa ser executado, a Conta de Automatização deve ter a função Administrador de Acesso do Utilizador.
b. Adicionar uma função em cada assinatura para o qual pretende permitir que seja solicitado um acesso elevado.
c. Na secção Função, seleccione Acesso do utilizador Administrador depois clique em Próximo.

d. Na secção Membros, seleccione Identidade gerida depois + Selecionar membros, selecionar o Assinatura onde a conta de automatização está a ser executada, seleccione a identidade gerida e o membro no campo Selecionar.
e. O membro selecionado será preenchido na parte inferior do ecrã e, em seguida, clique em Selecionar e Rever + atribuir.

f. A aplicação empresarial Conta de Automatização será agora visível na(s) subscrição(ões) como tendo a função de Administrador de Acesso do utilizador em Controlo de acesso (IAM)

6. Crie um formulário Microsoft que solicite o URL do recurso e quaisquer outras informações necessárias de acordo com as suas necessidades comerciais. No exemplo abaixo, pediremos o motivo comercial e o número de horas de que a pessoa necessita para ter acesso elevado ao recurso, com um máximo de 8 horas possíveis para selecionar na lista pendente.

7. Configurar um Grupo de Segurança em Administração de escritórios
a. Atribua os membros que estão autorizados a efetuar o pedido de acesso elevado. (Opcional mas altamente recomendado - Se não quiser efetuar esta verificação de segurança, avance para a criação do fluxo abaixo - Passo 9)

b.Quando o grupo de segurança for criado, tome nota do ID do grupo de segurança localizado no URL. Por exemplo, o ID do grupo de segurança é o GUID localizado aqui:
https://admin.microsoft.com/Adminportal/Home#/groups/:/GroupDetails/xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/1
8. Registar uma aplicação em portal.azure.com
a. Autorização do administrador da concessão para o seguinte Gráfico da Microsoft Permissões de API com tipo Aplicação:
-
-
- Diretório.Ler.Tudo
- Grupo. Ler.Tudo
- Utilizador.Ler.Tudo
-

b. Criar um Segredo do cliente para a Aplicação e tomar nota da ID do inquilinoo ID da aplicação (cliente) e o Segredo Valor para o Fluxo.

8. Agora, configure um fluxo para processar os dados do formulário e executar os scripts do PowerShell:
a. Acionador do Microsoft Forms - Quando é apresentada uma nova resposta
b. Ação Microsoft Forms - Obter detalhes da resposta a partir do acionador responseId
c. Se não tiver efectuado a recomendação do grupo de segurança, avance para o passo 10 abaixo
I. Obter o perfil do utilizador (v2) utilizando o respondedor de disparo como utilizador (UPN)
II. Para validar que o utilizador faz parte do grupo de segurança, crie um pedido HTTP GET para o URI: https://graph.microsoft.com/v1.0/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/transitiveMembers?$filter=id eq 'outputs('Get_user_profile_(V2) ')?['body/id']'&$select=id

III. No pedido HTTP GET, expanda a opção Authentication (Autenticação) e certifique-se de que Authentication Type (Tipo de autenticação) é OAuth do Active Directory, O público é https://graph.microsoft.com/e que os valores anotados quando registou a aplicação no Azure são adicionados aos respectivos campos:

IV. Enviar uma mensagem de correio eletrónico ao administrador informático se o pedido for rejeitado está definido para ser executado se a validação do grupo de segurança não conseguir obter um registo. É então enviada uma mensagem de correio eletrónico ao requerente, notificando-o de que não faz parte do grupo de segurança para poder efetuar esse pedido.

V. É de salientar que a verificação de segurança acima referida também pode ser gerida diretamente no acesso ao Formulário Microsoft, mas o grupo de segurança é a solução mais segura e que requer menos manutenção:

10. Crie uma condição para verificar se os URLs fornecidos para obter acesso elevado estão na lista de subscrições que lhes permitirá pedir acesso elevado.

a. Para analisar a assinatura do URL fornecido, use a seguinte expressão, substituindo o valor destacado de Get_response_details que aponta para o campo URL do seu formulário:
primeiro(split(último(split(corpo('Get_response_details')?['ID do campo URL'],'/resource/subscriptions/')),'/resourceGroups/'))
b. Se o URL for de uma subscrição não listada, enviar um e-mail de rejeição ao remetente
c. Se o URL contiver uma subscrição na lista, avance para Criar uma tarefa de Automação do Azure
11. Na ação Automação do Azure, certifique-se de que preenche todos os valores destacados, apontando para o Runbook que concede o acesso elevado de Colaborador.
a. Assinatura = A assinatura em que o Runbook está
b. Grupo de recursos = Grupo de recursos onde se encontra o livro de execução
c. Conta de automatização = A conta de automatização que foi configurada anteriormente b
d. Nome do livro de execução = Nome do livro de execução para conceder a função de colaborador
e. Uma vez selecionado o livro de execução, os parâmetros do script do PowerShell serão preenchidos para que possa adicionar os detalhes necessários. Para analisar esta informação a partir do URL que foi fornecido na submissão do formulário:
I. AssinaturaId
primeiro(split(último(split(corpo('Get_response_details')?['ID do campo URL'],'/resource/subscriptions/')),'/resourceGroups/'))
II. ResourceGroupName
primeiro(split(último(split(corpo('Get_response_details')?['ID do campo URL'],'/resourceGroups/')),'/providers/'))
III. ResourceGroupName
primeiro(split(primeiro(split(último(split(corpo('Get_response_details')?['ID do campo URL'],'/providers/')),concat('/',last(split(body('Get_response_details')?['ID do campo URL'],'/'))))),concat('/',last(split(first(split(last(split(body('Get_response_details')?['ID do campo URL'],'/providers/')),concat('/',last(split(body('Get_response_details')?['ID do campo URL'],'/'))))),'/')))))
IV. UserPrincipalName
body('Get_response_details')?['responder']
V. Nome do recurso
last(split(first(split(last(split(body('Get_response_details')?['ID do campo URL'],'/providers/')),concat('/',last(split(body('Get_response_details')?['ID do campo URL'],'/'))))),'/'))
VI. LinkUrl
body('Get_response_details')?['ID do campo URL']

12. Neste exemplo, permitimos que o utilizador defina durante quanto tempo necessita de acesso elevado. No Atraso, a Contagem é definida pelo número fornecido no campo de formulário para horas, enquanto a Unidade é Hora.
13. Após o atraso, criamos uma nova ação de automatização do Azure, desta vez apontando para o livro de execução que remove a função de colaborador do utilizador nesse recurso específico.
a. Os campos são idênticos aos campos para conceder a função de Contribuinte, bem como a análise dos respectivos parâmetros.
Algumas ideias que podem ser adaptadas ou acrescentadas a este fluxo e que não iremos abordar são
- Utilize o seu sistema interno de emissão de bilhetes como acionador, em vez do Microsoft Forms
- Permitir que o utilizador seleccione o acesso ao nível do Grupo de Recursos e/ou da Subscrição, com base nas suas necessidades. Compreenda que algumas expressões de análise serão alteradas ao fazer isso.
- Adicione um fluxo de aprovação enviado a uma pessoa ou grupo de pessoas que têm a capacidade de aprovar ou recusar o pedido.

COO no Connecting Software
Autor:
Sou o Chefe de Operações do Connecting Software, gerindo as operações do dia-a-dia nas nossas várias localizações. Sou apaixonado pela melhoria contínua e pelo aumento da eficiência. Se quiser juntar-se à nossa incrível equipa, quer na Eslováquia ou na Madeira, por favor contacte-nos.
Existem mais informações em linha?
Consulte outros artigos no nosso blogue sobre a sincronização do servidor Exchange: