Lab 02: CLI/PowerShell Solutions
Prerequisites
powershell
# Login to Azure
az login
az account set --subscription "Your-Subscription-Name"
# Get your subscription ID
$subId = az account show --query id -o tsvPre-Lab Setup
powershell
# Create resource groups
az group create --name rg-project-dev --location eastus
az group create --name rg-project-prod --location eastus
# Create storage account (name must be globally unique)
$storageName = "stprojectdev$(Get-Random -Maximum 99999)"
az storage account create `
--name $storageName `
--resource-group rg-project-dev `
--location eastus `
--sku Standard_LRS
# Create container
az storage container create `
--name documents `
--account-name $storageName
# Upload test file
echo "test content" > testfile.txt
az storage blob upload `
--account-name $storageName `
--container-name documents `
--file testfile.txt `
--name testfile.txt
# Create Key Vault
$kvName = "kv-project-dev-$(Get-Random -Maximum 99999)"
az keyvault create `
--name $kvName `
--resource-group rg-project-dev `
--location eastus `
--enable-rbac-authorization true
# Create secret
az keyvault secret set `
--vault-name $kvName `
--name ApiKey `
--value "test-secret-123"Task 1: View Role Definitions
powershell
# List all role assignments at subscription level
az role assignment list --scope "/subscriptions/$subId" -o table
# View Contributor role definition
az role definition list --name "Contributor" --output json
# Compare roles
az role definition list --name "Reader" --query "[0].permissions[0]"
az role definition list --name "Contributor" --query "[0].permissions[0]"
az role definition list --name "Owner" --query "[0].permissions[0]"Task 2: Assign Reader Role
powershell
# Get user's object ID
$userUpn = "devuser@yourdomain.onmicrosoft.com"
$userId = az ad user show --id $userUpn --query id -o tsv
# Get resource group ID
$rgId = az group show --name rg-project-dev --query id -o tsv
# Assign Reader role
az role assignment create `
--assignee $userId `
--role "Reader" `
--scope $rgId
# Verify assignment
az role assignment list --assignee $userId -o table
# Check if user has access to prod (should return empty)
az role assignment list `
--assignee $userId `
--scope $(az group show --name rg-project-prod --query id -o tsv)Task 3: Assign Data Plane Role
powershell
# Get storage account resource ID
$storageId = az storage account show `
--name $storageName `
--resource-group rg-project-dev `
--query id -o tsv
# Assign Storage Blob Data Reader
az role assignment create `
--assignee $userId `
--role "Storage Blob Data Reader" `
--scope $storageId
# List user's roles (should show both Reader and Blob Data Reader)
az role assignment list --assignee $userId -o tableTask 4: Assign Contributor Role
powershell
# Create developer user
$devUserUpn = "developer@yourdomain.onmicrosoft.com"
az ad user create `
--display-name "Developer User" `
--user-principal-name $devUserUpn `
--password "DevP@ss123!"
$devUserId = az ad user show --id $devUserUpn --query id -o tsv
# Assign Contributor to dev resource group
az role assignment create `
--assignee $devUserId `
--role "Contributor" `
--scope $rgIdTask 5: Key Vault RBAC
powershell
# Get Key Vault resource ID
$kvId = az keyvault show --name $kvName --query id -o tsv
# Assign Key Vault Secrets User
az role assignment create `
--assignee $userId `
--role "Key Vault Secrets User" `
--scope $kvId
# Verify by listing secrets (as the assigned user)
# Note: This requires signing in as that user
az keyvault secret show --vault-name $kvName --name ApiKeyTask 6: Create Custom Role
powershell
# Create custom role JSON definition
$customRole = @"
{
"Name": "Virtual Machine Operator",
"Description": "Can start, stop, and restart VMs. Cannot create or delete.",
"Actions": [
"Microsoft.Compute/virtualMachines/read",
"Microsoft.Compute/virtualMachines/start/action",
"Microsoft.Compute/virtualMachines/restart/action",
"Microsoft.Compute/virtualMachines/powerOff/action",
"Microsoft.Compute/virtualMachines/deallocate/action",
"Microsoft.Network/*/read",
"Microsoft.Resources/subscriptions/resourceGroups/read"
],
"NotActions": [],
"AssignableScopes": [
"/subscriptions/$subId"
]
}
"@
# Save to file
$customRole | Out-File -FilePath "vm-operator-role.json" -Encoding utf8
# Create the role
az role definition create --role-definition vm-operator-role.json
# Verify creation
az role definition list --name "Virtual Machine Operator"
# Assign custom role
az role assignment create `
--assignee $userId `
--role "Virtual Machine Operator" `
--scope $rgIdTask 9: Audit and Cleanup
powershell
# View activity log for role operations (last 7 days)
az monitor activity-log list `
--start-time (Get-Date).AddDays(-7).ToString("yyyy-MM-dd") `
--query "[?contains(operationName.value, 'roleAssignment')]" `
-o table
# Export role assignments to CSV
az role assignment list --all -o tsv > role-assignments.csv
# Remove specific role assignment
az role assignment delete `
--assignee $userId `
--role "Reader" `
--scope $rgId
# Remove all assignments for a user
$assignments = az role assignment list --assignee $userId -o json | ConvertFrom-Json
foreach ($assignment in $assignments) {
az role assignment delete --ids $assignment.id
}
# Delete custom role
az role definition delete --name "Virtual Machine Operator"Full Cleanup Script
powershell
# Remove all test users
$testUsers = @(
"devuser@yourdomain.onmicrosoft.com",
"developer@yourdomain.onmicrosoft.com"
)
foreach ($user in $testUsers) {
Write-Host "Removing assignments for: $user"
$id = az ad user show --id $user --query id -o tsv 2>$null
if ($id) {
# Remove all role assignments
az role assignment delete --assignee $id --yes 2>$null
# Delete user
az ad user delete --id $user 2>$null
}
}
# Delete custom role
az role definition delete --name "Virtual Machine Operator" 2>$null
# Delete resource groups (this deletes all contained resources)
az group delete --name rg-project-dev --yes --no-wait
az group delete --name rg-project-prod --yes --no-wait
# Clean up local files
Remove-Item vm-operator-role.json -ErrorAction SilentlyContinue
Remove-Item testfile.txt -ErrorAction SilentlyContinue
Remove-Item role-assignments.csv -ErrorAction SilentlyContinue
Write-Host "Cleanup complete!"Useful Commands Reference
powershell
# List all built-in roles
az role definition list --query "[?roleType=='BuiltInRole'].roleName" -o tsv
# Find roles with specific permission
az role definition list --query "[?contains(permissions[0].actions, 'Microsoft.Storage')]" -o table
# Check effective permissions for a user at a scope
az role assignment list --assignee $userId --scope $rgId --include-inherited -o table
# List all custom roles
az role definition list --custom-role-only true -o table