הגדרה וניהול 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 Lock
Function LockResource {  
    Write-Host -ForegroundColor Red "Locking the resource"  
   # Lock the resource  
    New-AzResourceLock -LockLevel CanNotDelete -LockName $lockName -LockNotes $lockNotes -ResourceName $resourceName -ResourceType Microsoft.Storage/storageAccounts -ResourceGroupName $resourceGroupName -Force  
    Write-Host -ForegroundColor Green "List all locks for a resource group…"  
   # List all locks for a resource group  
    Get-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).lockid

Remove-AzResourceLock -LockId $lockId -Force

מאמרים נוספים בנושא Azure

מה דעתך?

אתר זה עושה שימוש באקיזמט למניעת הודעות זבל. לחצו כאן כדי ללמוד איך נתוני התגובה שלכם מעובדים.