Azure Resource Elevated Role Requests automatiseren met Power Automate en Azure Automation

Azure Resource Elevated Role Requests automatiseren met Power Automate en Azure Automation

Adam MaurerTechnical Leave a Comment

Image
1. Maak binnen een Azure-abonnement van je keuze een Automation Account resource aan door naar portal.azure.com te gaan, selecteer Alle bronnen en klik op Voeg toe.

a. Zoek naar "Automatisering" en klik op Maak.

Automatisering

Vul alle benodigde velden in op het formulier Automatisering maken en klik op Maak

Image

b. De AzureAD modules importeren
c. Open hiervoor de Automation Account die we zojuist hebben gemaakt en selecteer Modules onder Gedeelde bronnen, selecteer Blader door de galerijen zoek naar AzureAD.

Modules

d. Importeer de AzureAD module en wacht tot het proces met succes is voltooid.

2. Maak Hardloopboeken

a. Navigeer naar je Automatiseringsaccount, selecteer Hardloopboekenen klik op Een runbook maken.

Rubooks

b. Wanneer het runbook is aangemaakt, klikt u op Bewerk en plak je PowerShell-script en klik vervolgens op Sla en Publiceer.


3. Het onderstaande script kan worden gebruikt om de toegang van een gebruiker verhogen naar de rol Contributor en verstuurt e-mails als er fouten optreden. Het script controleert eerst of de gebruiker al een Reader rol heeft toegewezen aan het abonnement waartoe ze verhoogde toegang willen krijgen. Als dat niet het geval is, wordt er een foutmelding gegeven. Als de gebruiker al een Contributor-rol heeft voor de gevraagde bron, zal ook deze foutmelding verschijnen.

De gemarkeerde gebieden moeten worden aangepast aan de details van uw omgeving.

param (
[Parameter(Verplicht = $true)]
[string] $subscriptionId,
[Parameter(Verplicht = $true)]
[string] $resourceGroupName,
[Parameter(Verplicht = $true)]
[string] $resourceName,
[Parameter(Verplicht = $true)]
[string] $resourceType,
[Parameter(Verplicht = $true)]
[string] $userPrincipalName,
[Parameter(Verplicht = $false)]
[string] $linkUrl
)
$ErrorActionPreference = "Doorgaan". $errors = @() functie Send-Email($subject, $body, $to, $cc = $null, $isBodyHtml = $false) { $credential = Get-AutomationPSCredential -Name 'SMTP Relay'. $smtpServer = smtp.example.com $smtpPort = <Int32> $van = "example@examplecompany.com $mailParams = @{ Naar = $to Onderwerp = $subject Lichaam = $body SmtpServer = $smtpServer Wachtwoord = $cijfer Poort = $smtpPort UseSsl = $true Van = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity vangen { $errors += "Verificatie met Azure via Managed Identity mislukt:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } vangst { $errors += "Faalde om Azure abonnement context in te stellen:$_" } $roleDefinitionName = 'Contributor'. $readerRoleDefinitionName = 'Lezer'. probeer { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } vangst { $errors += "Mislukt bij het ophalen van gebruikersobject voor UPN '$userPrincipalName': $_" } # Controleer of de gebruiker de rol Lezer heeft op abonnementsniveau $readerRoleAssignment = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $readerRoleDefinitionName -Scope "/subscriptions/$subscriptionId" -ErrorAction SilentlyContinue if (-not $readerRoleAssignment) { $noReaderRoleHtml = @" <h2>Niet in rol van lezer</h2>
<p>Gebruiker <strong>$userPrincipalName</strong> heeft niet de <strong>$readerRoleDefinitionName</strong> rol op abonnementsniveau en kan niet worden toegevoegd aan de <strong>$roleDefinitionName</strong> rol voor de bron.</p> "@ $noReaderRoleHtml += $signature Send-Email -subject "Ontbrekende lezersrol" -body $noReaderRoleHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $true terugkeren } # Controleer of de resource groep bestaat $resourceGroupExists = $true $resourceGroup = Get-AzResourceGroup -Name $resourceGroupName -ErrorAction SilentlyContinue if (-not $resourceGroup) { $errors += "Resourcegroep '$resourceGroupName' bestaat niet." $resourceGroupExists = $false } # Controleer of de resource bestaat binnen de resource groep $domain = "uwdomein.onmicrosoft.com" # vervang dit door uw werkelijke AAD-huurdomein # Controleer of de resource bestaat binnen de resource groep door zowel de naam als het type te gebruiken $resourceExists = $false $resourceUrl = "" Als ($resourceGroupExists) { $resources = Get-AzResource -ResourceGroupName $resourceGroupName -ResourceType $resourceType -Name $resourceName -ErrorAction SilentlyContinue $resource = $resources | Where-Object { $_.ResourceType -eq $resourceType -en $_.Name -eq $resourceName } if ($resource) { $resourceExists = $true # Construeer de URL met behulp van het domein, de resourcegroep, het resource-type en de resourcenaam $resourceUrl = "https://portal.azure.com/#@$domain/resourcegroups/$resourceGroupName/providers/$($resource.ResourceType)/$resourceName". } else { $errors += "Resource van het type '$resourceType' met naam '$resourceName' bestaat niet in resourcegroep '$resourceGroupName'." } } # Toekenning rol alleen proberen als resourcegroep en resource bestaan if ($resourceGroupExists -en $resourceExists) { probeer { $roleAssignment = New-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction Stop } vangst { if ($_.Exception -match 'Conflict') { # Gebruiker heeft al de rol Contributor, stuur een specifieke e-mail $alreadyContributorHtml = @". <h2>Gebruiker die al bijdraagt</h2>             <p>Gebruiker<strong>$userPrincipalName</strong>heeft al de<strong>$roleDefinitionName</strong>rol voor bron<strong>1TP57BronNaam</strong>.</p>             <p>URL bron:<a href='$linkUrl'>$linkUrl</a></p> "@ $alreadyContributorHtml += $signature Send-Email -subject "Gebruiker heeft al Contributor rol" -body $alreadyContributorHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $rue } else { $errors += "Kan rol '$roleDefinitionName' niet toewijzen aan gebruiker '$userPrincipalName': $_" } } } $signature = @" <p>Vriendelijke groeten,</p> <p><strong>Je IT-team</strong></p> <p><em>Dit is een automatisch bericht. Beantwoord deze e-mail niet rechtstreeks.</em></p> "@ if ($errors) { $errorMessageHtml = "<h2>Problemen ontdekt bij Azure Role Assignment</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 $rue } elseif ($roleAssignment) { # Toekenning rol is gelukt, stuur een succesmail $successMessageHtml = @".<h2>Succesvolle rolverdeling</h2>     <p>Gebruiker<strong>$userPrincipalName</strong>werd met succes de<strong>$roleDefinitionName</strong>rol voor bron<strong>1TP57BronNaam</strong>.</p>     <p>URL bron:<a href='$linkUrl'>$linkUrl</a></p> "@ $successMessageHtml += $signature Send-Email -subject "Azure Role Assignment Success" -body $successMessageHtml -to $userPrincipalName -cc "itadministrator@examplecompany.com" -isBodyHtml $rue }

Houd er rekening mee dat het normaal gesproken ongeveer 5 minuten duurt voordat de bovenstaande en onderstaande PowerShell scripts zijn voltooid, omdat het laden van de AzureAD modules tijd kost.

Merk ook op dat bij het toevoegen van een nieuwe rol zoals Contributor, de gebruiker moet uitloggen en terug inloggen in Azure of anders een Incognito/Privé venster moet gebruiken om de nieuwe rol te laten gelden.

4. Een tweede Runbook moet worden aangemaakt om de rol Contributor te verwijderen wanneer een bepaalde periode is verstreken.

Een voorbeeld van een PowerShell-script hiervoor is:

  param (
[Parameter(Verplicht = $true)]
[string] $subscriptionId,
[Parameter(Verplicht = $true)]
[string] $resourceGroupName,
[Parameter(Verplicht = $true)]
[string] $resourceName,
[Parameter(Verplicht = $true)]
[string] $resourceType,
[Parameter(Verplicht = $true)]
[string] $userPrincipalName,
[Parameter(Verplicht = $false)]
[string] $linkUrl
)

$ErrorActionPreference = "Doorgaan".
1TP57Fouten = @()
$signature = @" 

<p>Vriendelijke groeten,</p> <p><strong>Je IT-team</strong></p> <p><em>Dit is een automatisch bericht. Beantwoord deze e-mail niet rechtstreeks.</em></p> "@ functie 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 = @{ Naar = $to Onderwerp = $subject Lichaam = $body SmtpServer = $smtpServer Wachtwoord = $cijfer Poort = $smtpPort UseSsl = $true Van = $from BodyAsHtml = $isBodyHtml } if ($cc) { $mailParams['Cc'] = $cc } Send-MailMessage @mailParams -ErrorAction Stop } try { $connection = Connect-AzAccount -Identity } vangst { $errors += "Mislukt bij authenticatie met Azure met Managed Identity:$_" } try { Set-AzContext -SubscriptionId $subscriptionId } vangst { $errors += "Faalde om Azure abonnement context in te stellen:$_" } $roleDefinitionName = 'Contributor'. probeer { $user = Get-AzADUser -UserPrincipalName $userPrincipalName -ErrorAction Stop } vangst { $errors += "Mislukt bij het ophalen van gebruikersobject voor UPN '$userPrincipalName': $_" }

Niet in rol van lezer

# Controleer of de resourcegroep bestaat en haal de resource op
$resourceGroupExists = $resourceExists = $false
Als ((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 += "Resource van het type '$resourceType' met naam '$resourceName' bestaat niet in resource groep '$resourceGroupName'."
}
} } anders {

$errors += "Hulpbrongroep '$resourceGroupName' bestaat niet."
}

# Proberen de roltoewijzing te verwijderen als resourcegroep en resource bestaan

if ($resourceGroupExists -en $resourceExists) {
try {

$roleAssignments = Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue

foreach ($roleAssignment in $roleAssignments) {

# Opmerking: Bevestigingsonderdrukking werkt als het cmdlet dit ondersteunt.
Remove-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -Confirm:$false

}

# Controleer of roltoewijzingen succesvol zijn verwijderd
if (-not (Get-AzRoleAssignment -ObjectId $user.Id -RoleDefinitionName $roleDefinitionName -Scope $resource.ResourceId -ErrorAction SilentlyContinue)) {

# Als het verwijderen succesvol is, stuur dan een succes e-mail
$successMessageHtml = @".<h2>Succes met rolverwijdering</h2> 
            <p>Gebruiker<strong>$userPrincipalName</strong>is met succes verwijderd uit de<strong>$roleDefinitionName</strong>rol voor bron<strong>1TP57BronNaam</strong>.</p>
            <p>URL bron:<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 += "Rol '$roleDefinitionName' bestaat nog steeds voor gebruiker '$userPrincipalName' na verwijderpoging."
}

} vangst {
$errors += "Faalde om rol '$roleDefinitionName' te verwijderen van gebruiker '$userPrincipalName': $_"
}

}

if ($errors) {
$errorMessageHtml = "<h2>Problemen ontdekt bij het verwijderen van Azure rollen</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 $rue

} 

5. Geef de automatiseringsaccount de rol Beheerder Gebruikerstoegang per abonnement

a. Om het PowerShell-script te kunnen uitvoeren, moet de Automation-account de rol User Access Administrator hebben.
b. Een rol toevoegen in elk abonnement waar je verhoogde toegang voor wilt aanvragen.
c. Selecteer in het gedeelte Rol Administrator Gebruikerstoegang klik dan op Volgende.

roltoewijzing toevoegen

d. Selecteer in de sectie Leden Beheerde identiteit dan + Selecteer ledenSelecteer de Abonnement waar de automatiseringsaccount wordt uitgevoerd, selecteer de beheerde identiteit en het lid in het veld Selecteren.

e. Het geselecteerde lid wordt onderaan het scherm weergegeven en klik vervolgens op Selecteer en Beoordelen + toewijzen.

Image

f. De Automation Account Enterprise Application is nu zichtbaar in de abonnementen met de rol Toegangsbeheerder onder Toegangsbeheer (IAM)

Image

6. Maak een Microsoft-formulier met de URL van de bron en eventuele andere informatie die u nodig hebt volgens uw bedrijfsbehoeften. In het onderstaande voorbeeld vragen we naar de zakelijke reden en het aantal uren dat iemand verheven toegang tot de bron nodig heeft, met een maximum van 8 uur dat ze kunnen selecteren uit de vervolgkeuzelijst.

azure-abonnement-toegang-verzoek

7. Stel een Beveiligingsgroep in Kantooradministratie

a. Wijs de leden toe die het verhoogde toegangsverzoek mogen indienen. (Optioneel maar ten zeerste aanbevolen - Als je deze beveiligingscontrole niet wilt uitvoeren, ga dan verder met het maken van de Flow hieronder - Stap 9)

actieve-teams-en-groepen

b.Zodra de Beveiligingsgroep is gemaakt, noteer je de Beveiligingsgroep-ID in de URL. De beveiligingsgroep-ID is bijvoorbeeld de GUID die hier staat:

https://admin.microsoft.com/Adminportal/Home#/groups/:/GroupDetails/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/1

8. Een toepassing registreren in portal.azure.com

a. Toestemming verlenen naar de volgende Microsoft grafiek API rechten met type Toepassing:

      • Directory.lezen.alle
      • Groep. Lees.alle
      • Gebruiker.lezen.alle
config-machtigingen

b. Een Geheim van de klant voor de Applicatie en noteer de Huurder ID, de Applicatie (client) ID en het geheim Waarde voor de Flow.

klantgeheimen

8. Stel nu een Flow in om de formuliergegevens te verwerken en de PowerShell scripts uit te voeren:

a. Microsoft Forms trigger - Wanneer een nieuw antwoord wordt ingediend

b. Microsoft Forms actie - Krijg responsgegevens van de trigger responseId

c. Als u de aanbeveling voor de beveiligingsgroep hebt overgeslagen, ga dan verder met stap 10 hieronder

I. Gebruikersprofiel ophalen (v2) met de triggerresponder als gebruiker (UPN)

II. Om te valideren dat de gebruiker deel uitmaakt van de beveiligingsgroep, maak je een HTTP GET-verzoek naar URI: https://graph.microsoft.com/v1.0/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx-xxxxxxxx/transitiveMembers?$filter=id eq 'outputs('Get_user_profile_(V2) ')?['body/id']'&$select=id

grafisch deel01

III. Vouw in het HTTP GET-verzoek Authenticatie uit en zorg ervoor dat Authenticatietype is Active Directory OAuthHet publiek is https://graph.microsoft.com/en dat de genoteerde waarden bij het registreren van de Applicatie in Azure zijn toegevoegd aan de respectievelijke velden:

formulier

IV. Stuur een e-mail naar IT-beheerder als verzoek wordt afgewezen is ingesteld om te worden uitgevoerd als de validatie van de beveiligingsgroep er niet in slaagt een record te verkrijgen. Er wordt dan een e-mail gestuurd naar de aanvrager met de melding dat hij geen deel uitmaakt van de beveiligingsgroep om een dergelijk verzoek in te dienen.

Image

V. Het is vermeldenswaard dat de bovenstaande beveiligingscontrole ook rechtstreeks in de toegang van het Microsoft-formulier kan worden beheerd, maar de beveiligingsgroep is de veiligere oplossing die minder onderhoud vereist:

instellingen

10. Maak een voorwaarde aan om te controleren of de URL's die zijn opgegeven om verhoogde toegang te krijgen, in de lijst met abonnementen staan waarvoor ze verhoogde toegang mogen aanvragen.

Image

a. Om het abonnement van de opgegeven URL te parseren, gebruik je de volgende expressie, ter vervanging van de gemarkeerde Get_response_details waarde die naar het URL-veld van je formulier wijst:

eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/bron/aanmeldingen/')),'/bronGroepen/')

b. Als de URL voor een abonnement is dat niet in de lijst staat, stuur dan een afwijzingsmail naar de indiener

c. Als de URL een abonnement in de lijst bevat, ga dan verder naar Een Azure Automation-job maken

11. Zorg ervoor dat je in de Azure Automation-actie alle gemarkeerde waarden invult, waarbij je wijst naar het Runbook dat de verhoogde toegang van Contributor verleent.

a. Abonnement = het abonnement waar het runbook zich bevindt.

b. Hulpmiddelengroep = Hulpmiddelengroep waar het runbook is

c. Automatiseringsaccount = de automatiseringsaccount die eerder is ingesteld b

d. Runbooknaam = Naam van het runbook om de rol Medewerker toe te kennen

e. Zodra het runbook is geselecteerd, worden de parameters uit het PowerShell-script ingevuld zodat je de vereiste details kunt toevoegen. Om deze informatie te parseren van de URL die is opgegeven bij het indienen van het formulier:

I. AbonnementsId

eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/bron/aanmeldingen/')),'/bronGroepen/')

II. ResourceGroupName

eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/resourceGroups/')),'/providers/')

III. ResourceGroupName

eerste(split(eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/providers/')),concat('/',last(split(body('Get_response_details')?['URLveldID'],'/'))))),concat('/',laatste(split(eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/providers/')),concat('/',last(split(body('Get_response_details')?['URLveldID'],'/'))))),'/')))))

IV. UserPrincipalName

body('Get_response_details')?['responder']

V. ResourceName

laatste(split(eerste(split(laatste(split(body('Get_response_details')?['URLveldID'],'/providers/')),concat('/',last(split(body('Get_response_details')?['URLveldID'],'/'))))),'/'))

VI. LinkUrl

body('Get_response_details')?['URLveldID']

formulier02
Merk op dat ResourceType technisch niet vereist is om het script uit te voeren alleen als je een naamgevingsconventie hebt die ervoor zorgt dat elke resource naam binnen een resource groep uniek is. Om fouten bij het toekennen van de Contributor rol te voorkomen, is het aan te raden om deze in het script te houden.

12. In dit voorbeeld laten we de gebruiker definiëren hoe lang hij verhoogde toegang nodig heeft. In de optie Vertraging wordt de telling gedefinieerd door het aantal uren dat in het formulierveld is ingevuld, terwijl de Eenheid Uur is.

13. Na de vertraging maken we een nieuwe Azure Automation actie aan, dit keer wijzend naar het Runbook dat de Contributor rol voor de gebruiker op die specifieke resource verwijdert.

a. De velden zijn identiek aan de velden om de rol Contributor toe te kennen, evenals de parsing voor de respectieve parameters.

Er zijn verschillende ideeën die kunnen worden aangepast of toegevoegd aan deze Flow waar we niet verder op in zullen gaan:

  1. Gebruik uw interne ticketsysteem als trigger in plaats van Microsoft Forms
  2. Sta de gebruiker toe om toegang op Resource Group en/of Subscription niveau te selecteren, gebaseerd op hun behoeften. Begrijp dat sommige parsinguitdrukkingen zullen veranderen als je dit doet.
  3. Voeg een goedkeuringsstroom toe die wordt verzonden naar een persoon of groep personen die het verzoek kunnen goedkeuren of afwijzen.
Adam

Adam Maurer

COO bij Connecting Software

Auteur:

Ik ben de Chief Operating Officer van Connecting Software en beheer de dagelijkse operaties op onze verschillende locaties. Ik ben gepassioneerd door voortdurende verbetering en verhoging van de efficiëntie. Als je ons geweldige team in Slowakije of Madeira wilt komen versterken, neem dan contact met me op.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.