Compilare tutti i campi necessari nel modulo di creazione dell'automazione e fare clic su Crea
d. Importare il AzureAD e attendere che il processo si concluda con successo.
2. Creare Libri di corsa
a. Accedere al proprio account di automazione, selezionare Libri di corsae fare clic su Creare un Runbook.
b. Una volta creata la Runbook, fare clic su Modifica e incollare lo script PowerShell, quindi fare clic su Risparmiare e Pubblicare.
3. Lo script seguente può essere utilizzato per elevare l'accesso di un Utente al ruolo di Collaboratore e invia messaggi di posta elettronica in caso di errori. Lo script verifica innanzitutto se l'utente ha un ruolo di lettore già assegnato all'abbonamento a cui desidera ottenere l'accesso elevato. In caso contrario, viene dato un errore. Se l'utente ha già un ruolo di Collaboratore sulla risorsa richiesta, anche questo darà errore.
Le aree evidenziate devono essere adattate ai dettagli del vostro ambiente.
param ( [Parametro(Obbligatorio = $true)] [stringa] $subscriptionId, [Parametro(Obbligatorio = $true)] [stringa] $resourceGroupName, [Parametro(Obbligatorio = $true)] [stringa] $resourceName, [Parametro(Obbligatorio = $true)] [stringa] $resourceType, [Parametro(Obbligatorio = $true)] [$userPrincipalName, [Parametro(Obbligatorio = $false)] [stringa] $linkUrl )
$ErrorActionPreference = "Continuare" $errors = @() function Send-Email($subject, $body, $to, $cc = $null, $isBodyHtml = $false) { $credential = Get-AutomationPSCredential -Name 'SMTP Relay' $smtpServer = 'smtp.example.com' $smtpPort = <Int32> $da = 'example@examplecompany.com' $mailParams = @{ A = $to Oggetto = $subject Corpo = $body SmtpServer = $smtpServer Credenziale = $credenziale Porta = $smtpPort UseSsl = $true Da = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity } catch { $errors += "Fallita autenticazione con Azure utilizzando Managed Identity:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } catch { $errors += "Impossibile impostare il contesto di sottoscrizione di Azure:$_" } $roleDefinitionName = 'Collaboratore' $readerRoleDefinitionName = 'Lettore' try { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } catch { $errors += "Impossibile recuperare l'oggetto utente per UPN '$userPrincipalName': $_" } # Verifica se l'utente ha il ruolo di lettore a livello di abbonamento $readerRoleAssignment = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $readerRoleDefinitionName -Scope "/subscriptions/$subscriptionId" -ErrorAction SilentlyContinue if (-not $readerRoleAssignment) { $noReaderRoleHtml = @" <h2>Non nel ruolo di lettore</h2>
<p>Utente <strong>1TP57NomePrincipaleUtente</strong> non ha il <strong>$readerRoleDefinitionName</strong> a livello di abbonamento e non possono essere aggiunti al ruolo di <strong>1TP57NomeDefinizioneRuolo</strong> ruolo per la risorsa.</p> "@ $noReaderRoleHtml += $signature Inviare un'e-mail -soggetto "Ruolo di lettore mancante" -corpo $noReaderRoleHtml -a $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true restituire } # Controllare se il gruppo di risorse esiste $resourceGroupExists = $true $resourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue if (-not $resourceGroup) { $errors += "Il gruppo di risorse '$resourceGroupName' non esiste". $resourceGroupExists = $false } # Verificare se la risorsa esiste all'interno del gruppo di risorse $domain = "yourdomain.onmicrosoft.com"# sostituirlo con l'effettivo dominio dell'inquilino AAD # Verificare se la risorsa esiste all'interno del gruppo di risorse utilizzando sia il nome che il tipo $resourceExists = $false $resourceUrl = "" if ($resourceGroupExists) { $resources = Get-AzResource -ResourceGroupName $resourceGroupName -ResourceType $resourceType -Name $resourceName -ErrorAction SilentlyContinue $resource = $resources | Where-Object { $_.ResourceType -eq $resourceType -e $_.Name -eq $resourceName } if ($resource) { $resourceExists = $true # Costruire l'URL usando il dominio, il gruppo di risorse, il tipo di risorsa e il nome della risorsa $resourceUrl = "https://portal.azure.com/#@$domain/resourcegroups/$resourceGroupName/providers/$($resource.ResourceType)/$resourceName". } else { $errors += "La risorsa di tipo '$resourceType' con nome '$resourceName' non esiste nel gruppo di risorse '$resourceGroupName'". } } # Tentare l'assegnazione del ruolo solo se il gruppo di risorse e la risorsa esistono if ($resourceGroupExists -e $resourceExists) { try { $roleAssignment = New-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction Stop } catch { if ($_.Exception -match 'Conflict') { # L'utente ha già il ruolo di Collaboratore, inviare un'e-mail specifica $alreadyContributorHtml = @" <h2>Utente già collaboratore</h2> <p>Utente<strong>1TP57NomePrincipaleUtente</strong>ha già il<strong>1TP57NomeDefinizioneRuolo</strong>ruolo per la risorsa<strong>1TP57NomeRisorsa</strong>.</p> <p>URL della risorsa:<a href='$linkUrl'>$linkUrl</a></p> "@ $alreadyContributorHtml += $signature Inviare e-mail -soggetto "L'utente ha già il ruolo di collaboratore" -corpo $alreadyContributorHtml -a $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true } else { $errors += "Impossibile assegnare il ruolo '$roleDefinitionName' all'utente '$userPrincipalName': $_" } } } $signature = @" <p>Cordiali saluti,</p> <p><strong>Il vostro team IT</strong></p> <p><em>Questo è un messaggio automatico, si prega di non rispondere direttamente a questa e-mail.</em></p> "@ if ($errors) { $errorMessageHtml = "<h2>Problemi rilevati nell'assegnazione dei ruoli di 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) { # L'assegnazione del ruolo è avvenuta con successo, inviare un'e-mail di successo $successMessageHtml = @"<h2>Successo nell'assegnazione dei ruoli</h2> <p>Utente<strong>1TP57NomePrincipaleUtente</strong>è stato assegnato con successo il<strong>1TP57NomeDefinizioneRuolo</strong>ruolo per la risorsa<strong>1TP57NomeRisorsa</strong>.</p> <p>URL della risorsa:<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 }
Si noti che gli script PowerShell di cui sopra e di seguito richiedono in genere circa 5 minuti prima di essere completati, poiché i moduli AzureAD richiedono tempo per essere caricati.
Si noti inoltre che quando si aggiunge un nuovo ruolo, come quello di Collaboratore, l'utente deve uscire e rientrare in Azure o utilizzare una finestra in incognito/privata affinché il nuovo ruolo abbia effetto.
4. È necessario creare un secondo Runbook per rimuovere il ruolo di Collaboratore una volta trascorso un determinato periodo di tempo.
Un esempio di script PowerShell per questo scopo è:
param ( [Parametro(Obbligatorio = $true)] [stringa] $subscriptionId, [Parametro(Obbligatorio = $true)] [stringa] $resourceGroupName, [Parametro(Obbligatorio = $true)] [stringa] $resourceName, [Parametro(Obbligatorio = $true)] [stringa] $resourceType, [Parametro(Obbligatorio = $true)] [$userPrincipalName, [Parametro(Obbligatorio = $false)] [stringa] $linkUrl ) $ErrorActionPreference = "Continuare" $errori = @() $signature = @"
<p>Cordiali saluti,</p> <p><strong>Il vostro team IT</strong></p> <p><em>Questo è un messaggio automatico, si prega di non rispondere direttamente a questa 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 = @{ A = $to Oggetto = $subject Corpo = $body SmtpServer = $smtpServer Credenziale = $credenziale Porta = $smtpPort UseSsl = $true Da = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity } catch { $errors += "Fallita autenticazione con Azure utilizzando Managed Identity:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } catch { $errors += "Impossibile impostare il contesto di sottoscrizione Azure:$_" } $roleDefinitionName = 'Collaboratore' try { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } catch { $errors += "Impossibile recuperare l'oggetto utente per UPN '$userPrincipalName': $_" }
Non nel ruolo di lettore
# Verificare se il gruppo di risorse esiste e ottenere la risorsa $resourceGroupExists = $resourceExists = $false if ((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 -e $_.Name -eq $resourceName } if ($resource) { $resourceExists = $true } else { $errors += "La risorsa di tipo '$resourceType' con nome '$resourceName' non esiste nel gruppo di risorse '$resourceGroupName'". } } else { $errors += "Il gruppo di risorse '$resourceGroupName' non esiste". } # Tentativo di rimuovere l'assegnazione del ruolo se il gruppo di risorse e la risorsa esistono if ($resourceGroupExists -e $resourceExists) { try { $roleAssignments = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue foreach ($roleAssignment in $roleAssignments) { # Nota: la soppressione della conferma funziona se il cmdlet la supporta. Remove-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -Confirm:$false } # Verifica se le assegnazioni di ruolo sono state rimosse con successo if (-not (Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue)) { # Se la rimozione ha esito positivo, inviare un'e-mail di successo $successMessageHtml = @"<h2>Successo della rimozione del ruolo</h2> <p>Utente<strong>1TP57NomePrincipaleUtente</strong>è stato rimosso con successo dal file<strong>1TP57NomeDefinizioneRuolo</strong>ruolo per la risorsa<strong>1TP57NomeRisorsa</strong>.</p> <p>URL della risorsa:<a href='$linkUrl'>$linkUrl</a></p> "@ $successMessageHtml += $signature Inviare un'e-mail -soggetto "Rimozione del ruolo Azure riuscita" -corpo $successMessageHtml -a $userPrincipalName -cc "itadministrator@examplecompany.com " -isBodyHtml $true } else { $errors += "Il ruolo '$roleDefinitionName' esiste ancora per l'utente '$userPrincipalName' dopo il tentativo di rimozione". } } catch { $errors += "Fallita la rimozione del ruolo '$roleDefinitionName' dall'utente '$userPrincipalName': $_" } } if ($errors) { $errorMessageHtml = "<h2>Problemi rilevati nella rimozione del ruolo di 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. Assegnare all'account di automazione il ruolo di amministratore dell'accesso utente per abbonamento.
a. Affinché lo script PowerShell possa essere eseguito, l'account di automazione deve avere il ruolo di amministratore dell'accesso utente.
b. Aggiungere un ruolo in ogni abbonamento per il quale si vuole consentire la richiesta di accesso elevato.
c. Nella sezione Ruolo, selezionare Accesso utente Amministratore quindi fare clic su Avanti.

d. Nella sezione Membri, selezionare Identità gestita allora + Selezionare i membri, selezionare la voce Abbonamento dove è in esecuzione l'account di automazione, selezionare l'identità gestita e il membro nel campo Seleziona.
e. Il membro selezionato verrà visualizzato nella parte inferiore dello schermo e quindi fare clic su Selezionare e Revisione + assegnazione.

f. L'applicazione Automation Account Enterprise sarà ora visibile negli abbonamenti con il ruolo di amministratore di accesso dell'utente sotto la voce Controllo degli accessi (IAM)

6. Creare un modulo Microsoft che richieda l'URL della risorsa e qualsiasi altra informazione necessaria in base alle esigenze aziendali. Nell'esempio che segue, chiederemo il motivo aziendale e il numero di ore di accesso elevato alla risorsa, con un massimo di 8 ore selezionabili dall'elenco a discesa.

7. Impostare un Gruppo Sicurezza in Amministrazione dell'ufficio
a. Assegnare i membri che possono effettuare la richiesta di accesso elevato. (Facoltativo, ma altamente consigliato: se non si desidera eseguire questo controllo di sicurezza, procedere alla creazione del flusso di seguito - Fase 9).

b. Una volta creato il gruppo di sicurezza, prendere nota dell'ID del gruppo di sicurezza situato nell'URL. Ad esempio, l'ID del gruppo di sicurezza è il GUID che si trova qui:
https://admin.microsoft.com/Adminportal/Home#/groups/:/GroupDetails/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx/1
8. Registrazione di un'applicazione in portal.azure.com
a. Concessione del consenso amministrativo al seguente Grafico Microsoft Permessi API con tipo Applicazione:
-
-
- Elenco.Leggi.Tutti
- Gruppo. Leggi.Tutti
- Utente.Leggi.Tutti
-

b. Creare un Segreto del cliente per l'Applicazione e prendere nota del ID inquilino, il ID applicazione (client) e il segreto Valore per il flusso.

8. Ora impostate un flusso per elaborare i dati del modulo ed eseguire gli script PowerShell:
a. Attivazione di Microsoft Forms - Quando viene inviata una nuova risposta
b. Azione Microsoft Forms - Ottenere i dettagli della risposta dal trigger responseId
c. Se si è saltata la raccomandazione del gruppo di sicurezza, passare al punto 10 seguente
I. Ottenere il profilo utente (v2) utilizzando il risponditore di attivazione come utente (UPN)
II. Per convalidare che l'utente faccia parte del gruppo di sicurezza, creare una richiesta HTTP GET all'URI: https://graph.microsoft.com/v1.0/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxx/transitiveMembers?$filter=id eq 'outputs('Get_user_profile_(V2) ')?['body/id']'&$select=id

III. Nella richiesta HTTP GET, espandere Autenticazione e assicurarsi che Tipo di autenticazione sia Active Directory OAuth, il pubblico è https://graph.microsoft.com/e che i valori annotati al momento della registrazione dell'applicazione in Azure siano aggiunti ai rispettivi campi:

IV. Invia un'e-mail all'amministratore IT se la richiesta viene rifiutata è impostato per essere eseguito se la convalida del gruppo di sicurezza non riesce a ottenere un record. Viene quindi inviata un'e-mail al richiedente per informarlo che non fa parte del gruppo di sicurezza per poter effettuare tale richiesta.

V. Vale la pena notare che il controllo di sicurezza di cui sopra può essere gestito anche direttamente nell'accesso di Microsoft Form, ma il gruppo di sicurezza è la soluzione più sicura che richiede meno manutenzione:

10. Creare una condizione per verificare se gli URL forniti per ottenere l'accesso elevato sono presenti nell'elenco delle sottoscrizioni a cui si permetterà di richiedere l'accesso elevato.

a. Per analizzare l'abbonamento dall'URL fornito, utilizzare la seguente espressione, sostituendo il valore evidenziato Get_response_details che punta al campo URL del modulo:
first(split(last(split(body('Get_response_details')?['URLfieldID'],'/risorse/sottoscrizioni/'),'/risorseGruppi/')
b. Se l'URL è relativo a un abbonamento non presente nell'elenco, inviare un'e-mail di rifiuto all'autore dell'invio.
c. Se l'URL contiene un abbonamento nell'elenco, procedere alla creazione di un lavoro di Azure Automation.
11. Nell'azione Azure Automation, assicuratevi di compilare tutti i valori evidenziati, puntando al Runbook che concede l'accesso elevato di Contributor.
a. Sottoscrizione = La sottoscrizione in cui si trova la cartella di esecuzione.
b. Gruppo di risorse = Gruppo di risorse in cui si trova la cartella di esecuzione.
c. Conto di automazione = Il conto di automazione che è stato impostato in precedenza b
d. Nome Runbook = Nome della Runbook a cui assegnare il ruolo di Collaboratore.
e. Una volta selezionato il Runbook, i Parametri dello script PowerShell verranno visualizzati per aggiungere i dettagli richiesti. Per analizzare queste informazioni dall'URL fornito al momento dell'invio del modulo:
I. AbbonamentoId
first(split(last(split(body('Get_response_details')?['URLfieldID'],'/risorse/sottoscrizioni/'),'/risorseGruppi/')
II. Nome del gruppo di risorse
first(split(last(split(body('Get_response_details')?['URLfieldID'],'/resourceGroups/'),'/providers/'))
III. Nome del gruppo di risorse
first(split(first(split(last(split(body('Get_response_details')?['URLfieldID'],'/providers/')),concat('/', last(split(body('Get_response_details')?['URLfieldID'],'/'))))),concat('/', last(split(first(split(last(split(body('Get_response_details')?['URLfieldID'],'/providers/')),concat('/', last(split(body('Get_response_details')?['URLfieldID'],'/'))))),'/')))))
IV. NomePrincipaleUtente
body('Get_response_details')?['responder']
V. Nome della risorsa
last(split(first(split(last(split(body('Get_response_details')?['URLfieldID'],'/providers/')),concat('/', last(split(body('Get_response_details')?['URLfieldID'],'/'))))),'/'))
VI. LinkUrl
body('Get_response_details')?['URLfieldID']

12. In questo esempio, consentiamo all'utente di definire la durata dell'accesso elevato. In Ritardo il conteggio è definito dal numero fornito nel campo del modulo per le ore, mentre l'unità è l'ora.
13. Dopo il ritardo, creiamo una nuova azione di Azure Automation, che questa volta punta al Runbook che rimuove il ruolo di Collaboratore per l'utente su quella particolare risorsa.
a. I campi sono identici a quelli per l'assegnazione del ruolo di Collaboratore, così come il parsing dei rispettivi parametri.
Diverse idee che possono essere adattate o aggiunte a questo Flusso e che non verranno approfondite sono:
- Utilizzate il vostro sistema di ticketing interno come trigger, invece di Microsoft Forms.
- Consentire all'utente di selezionare l'accesso al gruppo di risorse e/o al livello di sottoscrizione, in base alle proprie esigenze. Si noti che alcune espressioni di parsing cambieranno quando si esegue questa operazione.
- Aggiungere un flusso di approvazione inviato a una persona o a un gruppo di persone che hanno la possibilità di approvare o rifiutare la richiesta.

COO al Connecting Software
Autore:
Sono il direttore operativo della Connecting Software, gestendo le operazioni quotidiane nelle nostre varie sedi. Sono appassionato del miglioramento continuo e dell'aumento dell'efficienza. Se vuoi unirti al nostro fantastico team in Slovacchia o a Madeira, contattami.
Ci sono altre informazioni online?
Consultate gli altri articoli del nostro blog sulla sincronizzazione del server Exchange: