הגדרה וניהול Azure Lock
מה קורה כאשר אובייקט מסוים נמחק בשירות Azure? ואיך ניתן למנוע מחיקה לאובייקטים חשובים? בדיפולט אובייקטים בשירות Azure ניתנים למחיקה, וזאת במידה וישנה הרשאה מתאימה, ולכן בתרחישים שונים אנו יכולים (ואף מומלץ) לנעול אובייקטים בשירות Azure בכדי שיהיו מוגנים מפני שינויים כלשהם.
המאמר הנוכחי מתמקד באפשרויות השונות של Azure Resource Locks ופקודות PowerShell שדרכן ניתן לנהל Resource Locks.
מהו Azure Lock
כאדמינים אנו רוצים למנוע מצב שבו אובייקטים מסוימים או הגדרות שונות בתוך אובייקטים נמחקים או משתנים בצורה כלשהיא.
Locks בשירות Azure הוא רכיב שמטרתו למנוע מחיקות או שינויים מסוימים ברמת האובייקט, ומדובר על רכיב שאינו חלק מתוך היררכיה או דלגציה מבוססת RBAC או Azure AD PIM.
כאשר Locks מוגדר הוא מבצע אכיפה ומגביל את הפעולות על האובייקט באופן מסוים, ובמידה ונעילה מוגדרת על אובייקט ספציפי המגבלה יכולה להיות ברמת אדמינים, ולכן מדובר על נעילות שבאות לסייע במצבים שבהם ישנו אובייקט בעל חשיבות רבה, או במצבים של מניעת פעולה זדונית ברמת האובייקט.
ניתן להגדיר נעילות בשני מצבים ספציפיים:
CanNotDelete הוא מצב שבו אדמינים (ואפילו משתמשים בעלי הרשאות) מורשים לקרוא ולשנות אובייקט, אך הם אינם יכולים למחוק את האובייקט
ReadOnly הוא מצב שבו אדמינים (או משתמשים בעלי הרשאות) יכולים לקרוא אובייקט מסוים, אך אינם יכולים למחוק או לעדכן את האובייקט. אכיפת הנעילה דומה מעט להרשות אשר ניתנות ומבוססת על הרשאת Reader.
כמו שהוזכר קודם לכן ניתן לבצע נעילה על אובייקט אחד או יותר, ובנוסף לכך ניתן לאכוף נעילה ברמת חשבון ואפילו Scope וליתר דיוק Parent Scope.
במידה ומבצעים נעילה ברמת חשבון (Subscriptio) אז האכיפה היא לכלל האובייקטים (inherit) אשר שייכים לאותו חשבון, בין אם מדובר על לאובייקטים קיימים או במידה ומדובר על אובייקטים חדשים (כאלה שנוצרו גם לאחר הגדרת האכיפה).
ניתן להגדיר Locks באמצעות Azure Blueprint על גבי Resources לכלל האובייקטים הקיימים ולפי מספר מצבים ושני מצבים נוספים על המצב הקיים, ובמידה ומבצעים assignment על אובייקט שמוגדר עם עילה עלול להיווצר קונפליקט.
נקודות ביישום Azure Locks
ישנם דגשים רבים לגבי יישום וניהול של Azure Locks, בין היתר הדגשים הבאים:
- נעילה יכולה להיעשות ברמת האובייקט
- נעילה יכולה להיעשות ברמת חשבון (Subscription)
- ישנם שני מצבי נעילה CanNotDelete + ReadOnly
- Locks הינו חלק מתוך מנגנון Management Locks
- Locks אינו חלק מתוך מנגנון הרשאות מבוסס Azure AD (למשל RBAC)
- ניתן להגדיר נעילות באמצעות ממשק Azure, דרך PowerShell ודרך Rest API
- האפשרויות ניהול ברמת PowerShell או Rest API הן רבות יותר מאשר בבמשק Azure
- האכיפה המחמירה היא זאת שתופסת במידה ומוגדרים שתי אפשרויות או יותר
- Locks יכול להתאים למצבי שבהם צריך Governance
- ניתן לנהל Locks באמצעות Azure Blueprint
- Azure Blueprint מכיל מספר מצבים: (שניים נוספים על הקיימים)
Not Locked, Read Only, Cannot Edit / Delete, or Cannot Delete - הרשאת subscription owner אינה יכולה לבצע מחיקה על אובייקט נעול (בהתאם להרשאה)
- מומלץ לנהל ולהגדיר נעילות מתוך מקום אחד בלבד, פוליסי או ידני
הגדרת Locks באמצעות PowerShell
ישנם מספר דרכים שונות להגדרת Locks, החל מהגדרה באמצעות Azure Portal או דרך ניהול והגדרה מעט מתקדמת יותר באמצעות Rest API, או באמצעות ARM או PowerShell וכמובן עם האפשרות המועדפת של Azure Blueprint.
הגדרה ברמת פורטל Azure היא פשוטה ומכילה את האפשרויות הבסיסיות, למשל הגדרה לפי הדוגמה הבאה של נעילת אובייקט למחיקה עם אפשרות CanNotDelete על מכונה
טיפ: אין דרך יעילה ברמת פורטל Azure לראות את כל הנעילות שבוצעו עד כה כל כל האובייקטים הקיימים
ניהול באמצעות PowerShell או באמצעות Rest API הוא פשוט יותר ונותן אינדיקציה מהירה יותר לגבי המצב, כמו גם אפשרויות נוספות של ניהול Azure Lock וזאת באמצעות כלל האפשרויות הקיימות של PowerShell.
ניהול Azure Locks באמצעות PowerShell
הפקודות המרכזיות לניהול Azure Locks באמצעות PowerShell הם הפקודות שמתמקדות סביב AzResourceLock וישנם מספר פקודות של Get או Set או Remove או New.
הצגת אובייקטים נעולים נעשית ע”י Getים בכדי לבדוק מה הסטטוס של האובייקטים הנעולים בחשבון Azure, בין אם מדובר על אובייקט ספציפי או על כלל האובייקטים הקיימים בחשבון Azure.
הפקודה הראשונה היא כללית ותוציא פלט של כלל האובייקטים הנעולים בלבד עם הפרטים לגבי רמת הנעילה ומאפיינים נוספים (ללא אובייקטים שאינם נעולים)
Get-AzResourceLock #List all Azure Locks in specific subscription
פקודה נוספת תציג את האובייקטים הנעולים לפי Resource Group Name וגם שם תציג רק את האובייקטים הנעולים בלבד
Get-AzResourceLock -ResourceGroupName “LAB” #List Azure Lock by Resource Group Name
פקודה נוספת תציג את האובייקטים לפי Level של CanNotDelete
Get-AzResourceLock | Where-Object LockName -Contains “CanNotDelete” #list Azure Lock with setting CanNotDelete
פקודה נוספת ופחות פשוטה תציג את כל האובייקטים שאינם נעולים לאותו חשבון עם תצוגה ברמת האובייקט
# Find the resource with no resourcelock on it and list by object
Get-AzResource | foreach { $resourceLock = Get-AzResourceLock -ResourceGroupName $_.ResourceGroupName -ResourceName $_.ResourceName -ResourceType $_.ResourceType;
if (!($resourceLock)) { “No resourcelock found on $($_.ResourceName)” } }
יצירת נעילות חדשות נעשות ע”י הפקודה New וישנם מספר ואריאציות שאיתן ניתן ליצור נעילות על אובייקט ספציפי או על סט של אובייקטים
New-AzResourceLock -LockName Lock-VM `
-LockLevel CanNotDelete `
-ResourceGroupName LAB `
-Force
סט פקודות נוספות כולל פונקציה ספציפית מאפשרת לנעול אובייקט חדש ולאחר מכן להציג את כלל האובייקטים הנעולים. בדוגמה הפקודות נועלות אובייקט מסוג Storage עם פרמטרים ספציפיים של סוג האובייקט, סוג הנעילה, תיאור להגדרה הספציפית ולאחר מכן תצוגה של כלל האובייקטים שהוגדרו עם Lock
# Input$resourceGroupName = “LAB”$resourceName = “labtestforlock”$lockName = “LockStorageAccount”$lockNotes = “Prevent delete storage account”# Function for Azure LockFunction LockResource {Write-Host -ForegroundColor Red “Locking the resource”# Lock the resourceNew-AzResourceLock -LockLevel CanNotDelete -LockName $lockName -LockNotes $lockNotes -ResourceName $resourceName -ResourceType Microsoft.Storage/storageAccounts -ResourceGroupName $resourceGroupName -ForceWrite-Host -ForegroundColor Green “List all locks for a resource group…”# List all locks for a resource groupGet-AzResourceLock -ResourceGroupName $resourceGroupName}LockResource
שינוי נעילות קיימות נעשה ע”י פקודות Setים למינהם
Set-AzResourceLock -LockName LockStorageAccount `
-LockLevel ReadOnly `
-ResourceGroupName LAB `
-ResourceName labtestforlock `
-ResourceType “Microsoft.Storage/storageAccounts” `
-Force
פקודות נוספות שיכולות לסייע בניהול Azure Locks הם פקודות Remove, וזאת במידה ואנו רוצים לבצע מחיקה של אובייקט נעול.
במצב של הסרת נעילה ניתן להריץ את הפקודה הבאה
$lockId = (Get-AzResourceLock -LockName LockStorageAccount `
-ResourceGroupName LAB `
-ResourceName labtestforlock `
-ResourceType Microsoft.Storage/storageAccounts).lockidRemove-AzResourceLock -LockId $lockId -Force
מאמרים נוספים בנושא Azure