วิธีค้นหาสิทธิ์ Microsoft Graph ที่คุณต้องการ
เมื่อทำงานกับ Microsoft Graph PowerShell SDK
ถึงตอนนี้ คุณควรทราบว่า Microsoft วางแผนที่จะเลิกใช้โมดูล Azure AD และ MSOL PowerShell ในปลายปี 2022 หรือหลังจากนั้นไม่นาน cmdlet ในโมดูลที่เลิกใช้แล้วจะยังคงทำงานต่อไปในภายหลัง แต่จะไม่มีการรองรับใดๆ Microsoft แนะนำให้คุณอัปเกรดสคริปต์เพื่อใช้ cmdlets จาก Microsoft Graph PowerShell SDK การแปลงจริงมักเป็นเรื่องของการค้นหา cmdlet ที่ตรงกันในแผนที่ cmdlet ของ Microsoft และเปลี่ยนไปใช้ อย่างไรก็ตาม ความซับซ้อนอื่นๆ ขัดขวางก่อนที่ cmdlet จะทำงานได้อย่างราบรื่น การค้นหาสิทธิ์ Microsoft Graph API ที่ถูกต้องเพื่อใช้ในการเข้าถึงข้อมูลเป็นเพียงหนึ่งในความซับซ้อนเหล่านั้น
รูปแบบการอนุญาตน้อยที่สุด
การจัดการสิทธิ์แตกต่างกันอย่างมากระหว่างโมดูล Azure AD PowerShell และ Microsoft Graph PowerShell SDK เมื่อคุณลงชื่อเข้าใช้โดยใช้ Connect-AzureAD cmdlet คุณสามารถใช้สิทธิ์ผู้ดูแลระบบทั้งหมดที่เป็นของบัญชีที่คุณลงชื่อเข้าใช้ได้ อย่างไรก็ตาม Graph SDK ทำงานในรูปแบบสิทธิ์อนุญาตขั้นต่ำ ซึ่งหมายความว่าคุณต้องขอสิทธิ์เพื่อดำเนินการต่างๆ แม้ว่าจะเชื่อมต่อกับบัญชีที่ได้รับอนุญาตสูงก็ตาม
ขั้นตอนแรกในการอัปเดตสคริปต์จาก Azure AD cmdlets เป็น SDK cmdlets คือการพิจารณาสิทธิ์ที่สคริปต์จำเป็นต้องใช้ในการประมวลผล กฎนี้นำไปใช้ไม่ว่าคุณจะใช้ SDK cmdlets อย่างไร แบบโต้ตอบ ผ่านงานพื้นหลังซึ่งใช้การรับรองความถูกต้องตามใบรับรอง หรือใน Azure Automation runbook ต่างจากสิทธิ์ที่สืบทอดมาจากบัญชีที่ลงชื่อเข้าใช้ สิทธิ์ที่ใช้โดย SDK จะมอบให้กับบริการหลักที่ใช้ในการเรียกใช้ SDK cmdlets สำหรับเซสชันแบบโต้ตอบ หลักการของบริการคือ Microsoft Graph
คำถามเกิดขึ้นว่าจะค้นหาสิทธิ์ Microsoft Graph API ที่จำเป็นในการดำเนินการได้อย่างไร คุณสามารถบรรลุเป้าหมายได้สี่วิธี:
เดาและการอนุญาตมากเกินไป
วิธีแรกคือวิธีเดาและหวัง กล่าวอีกนัยหนึ่ง ให้อนุญาตสิทธิ์ทั้งหมดที่สคริปต์อาจใช้หรือเพิ่มสิทธิ์ต่อไปจนกว่าโค้ดจะทำงาน อันตรายที่นี่คือคุณจะพบกับบริการหลักที่ได้รับอนุญาตอย่างเข้มงวดซึ่งกลายเป็นเป้าหมายที่น่าดึงดูดสำหรับผู้โจมตี หากคุณใช้เซสชันแบบโต้ตอบเพื่อเรียกใช้ SDK cmdlets มีโอกาสพอสมควรที่บริการหลักของ Microsoft Graph PowerShell จะได้รับสิทธิ์มากมายเมื่อเวลาผ่านไป และจบลงด้วยสถานะที่ได้รับอนุญาตอย่างหนาแน่น (รูปที่ 1) เราจะกลับมาที่ปัญหานี้ในภายหลัง
ใช้ Graph Explorer เพื่อเน้นการอนุญาตกราฟ
ถัดไป หากคุณเรียกใช้การค้นหาใน Graph Explorer ตัวสำรวจจะแสดงสิทธิ์ที่จำเป็นในการเรียกใช้การค้นหาในแท็บ แก้ไขสิทธิ์ (รูปที่ 2) ชุดสิทธิ์ที่แสดงประกอบด้วยสิทธิ์ที่ถูกต้องทุกรายการที่คุณสามารถใช้ได้ ดังนั้นคุณจึงต้องเลือกสิทธิ์ที่เหมาะสมที่สุด ในกรณีนี้ แบบสอบถามคือการดึงชุดบัญชีผู้ใช้ในผู้เช่า (หนึ่งในชุดพื้นฐานของการดำเนินการบัญชีผู้ใช้) ดังนั้นสิทธิ์ User.Read.All จึงเป็นตัวเลือกที่ดี
การจัดการความเสี่ยงด้านความปลอดภัยทางไซเบอร์สำหรับ Active Directory
ค้นพบวิธีการป้องกันและกู้คืนจากการโจมตี AD ผ่านโซลูชันการจัดการความเสี่ยงด้านความปลอดภัยทางไซเบอร์เหล่านี้
อ่านเอกสารประกอบกราฟ
SDK cmdlet ทั้งหมดมาจากการสืบค้นแบบกราฟ Microsoft ใช้กระบวนการที่เรียกว่า AutoRest เพื่อประมวลผลคำค้นหากราฟที่มีอยู่และสร้าง SDK cmdlets กระบวนการนี้เกิดขึ้นทุกเดือนเพื่อสร้าง SDK เวอร์ชันใหม่ กระบวนการนี้ยังสร้างเอกสารประกอบอัตโนมัติ แต่ข้อความที่สร้างโดยเครื่องมักจะไม่ชัดเจนและยากต่อการติดตาม ซึ่งเป็นสาเหตุที่ฉันมักจะเปลี่ยนกลับไปใช้เอกสารประกอบกราฟที่เกี่ยวข้อง ยกตัวอย่างรายการบัญชีผู้ใช้ การค้นหาอย่างรวดเร็วจะนำเราไปยังหน้ารายการผู้ใช้ ซึ่งแสดงรายการสิทธิ์ที่จำเป็นสำหรับทั้งที่ได้รับมอบสิทธิ์ (ใช้เพื่อเข้าถึงข้อมูลในฐานะผู้ใช้ที่ลงชื่อเข้าใช้) และแอปพลิเคชัน (ใช้สำหรับกระบวนการเบื้องหลัง) ในกรณีนี้ หน้านี้ยืนยันว่า User.Read.All เป็นตัวเลือกที่ดี
ใช้วิธีใช้ SDK เพื่อระบุสิทธิ์ของกราฟ
SDK ประกอบด้วย cmdlets สองรายการเพื่อช่วยให้นักพัฒนาทราบว่าต้องมีสิทธิ์ใดบ้างในการดำเนินการ
- Find-MgGraphPermission: แสดงรายการสิทธิ์ที่ได้รับมอบหมายและสิทธิ์ของแอปพลิเคชันสำหรับการดำเนินการต่างๆ
- Find-MgGraphCommand: แสดงรายการ cmdlet ที่พร้อมใช้งานเพื่อโต้ตอบกับออบเจ็กต์ประเภทต่างๆ รวมถึงการอนุญาตที่จำเป็น cmdlet ทำงานโดยใช้ URI สำหรับวัตถุเพื่อค้นหาคำสั่งที่มีอยู่
ตัวอย่างเช่น สมมติว่าฉันต้องการโต้ตอบกับข้อมูลองค์กรที่จัดเก็บไว้ใน Azure AD ฉันสามารถเริ่มต้นด้วยการเรียกใช้ Find-MgGraphPermission cmdlet:
Find-MgGraphPermission organization | ? {$_.PermissionType -eq "Application"} | Format-List Name, Description
Name : Organization.Read.All
Description : Allows the app to read the organization and related resources, on behalf of the signed-in user. Related resources include things like subscribed skus and tenant branding information.
Name : Organization.ReadWrite.All
Description : Allows the app to read and write the organization and related resources, on behalf of the signed-in user. Related resources include things like subscribed skus and tenant branding information.
คำสั่งไพพ์เอาท์พุตเพื่อกรองและแสดงสิทธิ์ของแอปพลิเคชัน (มีสิทธิ์ที่ได้รับมอบหมายเหมือนกัน) จากผลลัพธ์ เห็นได้ชัดว่าเราควรใช้สิทธิ์ Organization.Read.All เพื่ออ่านข้อมูลองค์กร (เช่น ชื่อผู้เช่าและตัวระบุ) และ Organization.ReadWrite.All เราควรจะต้องอัปเดตการตั้งค่าที่เขียนได้หรือไม่
เพื่อความกระชับ ฉันจะแสดงเฉพาะชื่อสิทธิ์และคำอธิบายด้านบนเท่านั้น นี่คือผลลัพธ์ทั้งหมดสำหรับสิทธิ์ Group.ReadWrite.All ที่จำเป็นในการอัปเดตคุณสมบัติของกลุ่ม Azure AD รวมถึงกลุ่ม Microsoft 365
Id : 62a82d76-70ea-41e2-9197-370581804d09
PermissionType : Application
Consent : Admin
Name : Group.ReadWrite.All
Description : Allows the app to create groups, read all group properties and memberships, update group properties and memberships, and delete groups. Also allows the app to read and write group calendar and conversations. All of these operations can be performed by the app without a signed-in user.
คุณสามารถลองใช้คำสั่งเวอร์ชันที่ปรับเปลี่ยนเพื่อดูว่าสิทธิ์ใดบ้างที่จำเป็นในการโต้ตอบกับผู้ใช้ กลุ่ม Azure AD (ไดเรกทอรี) แอป (แอปพลิเคชัน) และอื่นๆ
Find-MgGraphCommand cmdlet จะส่งผ่านส่วนหนึ่งของ URL กราฟเพื่อดูว่า SDK cmdlet ใดบ้างที่พร้อมใช้งานสำหรับ URL นั้น URL เป็นสิ่งที่เหมือนกับผู้ใช้หรือกลุ่มเพื่อแสดงรายการ cmdlets ที่พร้อมใช้งานสำหรับจัดการกับชุดของวัตถุ หากคุณเพิ่ม {id} หมายความว่าคุณต้องการดู cmdlets ที่พร้อมใช้งานในการประมวลผลแต่ละออบเจ็กต์
ตัวอย่างเช่น มาดูกันว่า cmdlet ใดบ้างที่พร้อมใช้งานในการประมวลผลแต่ละกลุ่ม คำสั่งและเอาต์พุตแสดงไว้ด้านล่าง:
Find-MgGraphCommand -uri "/groups/{id}" | ? {$_.APIVersion -eq "v1.0"} | Fl Command, Method, Permissions
Command : Get-MgGroup
Method : GET
Permissions : {Directory.AccessAsUser.All, Directory.Read.All, Directory.ReadWrite.All, Group.Read.All...}
Command : Remove-MgGroup
Method : DELETE
Permissions : {Directory.AccessAsUser.All, Group.ReadWrite.All}
Command : Update-MgGroup
Method : PATCH
Permissions : {Directory.AccessAsUser.All, Directory.ReadWrite.All, Group.ReadWrite.All}
กราฟมีสองจุดสิ้นสุด V1.0 และเบต้า ตำแหน่งข้อมูล V1.0 เป็นเวอร์ชันที่ใช้งานจริง ในขณะที่ตำแหน่งข้อมูลเบต้าอยู่ระหว่างการพัฒนา ในหลายกรณี คุณจะใช้ cmdlet กับตำแหน่งข้อมูลรุ่นเบต้าเนื่องจากมีฟังก์ชันการทำงานเพิ่มเติม ตัวอย่างเช่น หากคุณเรียกใช้ Get-MgUser cmdlet กับปลายทาง V1.0 จะไม่ส่งคืนข้อมูลใบอนุญาตใดๆ สำหรับบัญชี แต่จะส่งกลับเมื่อรันบนปลายทางรุ่นเบต้า
ในกรณีนี้ ฉันได้กรองเอาต์พุตเพื่อแสดงเฉพาะคำสั่งที่มีอยู่ในตำแหน่งข้อมูล V1.0 และเราจะเห็นว่ามี cmdlet สามรายการสำหรับแสดงรายการกลุ่ม ลบกลุ่ม และอัปเดตคุณสมบัติของกลุ่ม นอกจากนี้เรายังเห็นว่าสิทธิ์ Group.Read.All เพียงพอที่จะอ่านข้อมูลกลุ่ม แต่เราต้องการ Group.ReadWriteAll เพื่อลบหรืออัปเดตกลุ่ม
การกำหนดขอบเขต
เมื่อคุณพบว่าสิทธิ์ Microsoft Graph API ใดที่จำเป็นสำหรับสคริปต์ในการดำเนินการใดๆ ก็ตามที่สคริปต์ดูแล คุณจะระบุชุดสิทธิ์ที่จำเป็นเมื่อเชื่อมต่อกับกราฟในพารามิเตอร์ขอบเขตสำหรับ Connect-MgGraph cmdlet ตัวอย่างเช่น:
$RequiredScopes = ("Organization.ReadWrite.All”, "Directory.Read.All")
Connect-MgGraph -Scope $RequiredScopes
สำหรับเซสชันแบบโต้ตอบ หากบริการหลักของ Microsoft Graph PowerShell ไม่มีความยินยอมให้ใช้สิทธิ์ที่ร้องขอ คุณจะได้รับพร้อมท์ให้ขอความยินยอม (รูปที่ 3)
หากคุณอนุญาตให้แอปใช้สิทธิ์ดังกล่าว เซสชันจะสามารถใช้สิทธิ์ที่ได้รับมอบหมายตลอดระยะเวลาของเซสชันได้ โดยพื้นฐานแล้ว สิทธิ์ที่ได้รับมอบหมายหมายความว่าผู้ใช้สามารถเข้าถึงข้อมูลที่พวกเขาเป็นเจ้าของ แต่ไม่สามารถเข้าถึงข้อมูลที่เป็นของผู้ใช้รายอื่นได้ อย่างไรก็ตาม อาจเป็นไปได้ด้วยว่าการเข้าถึงข้อมูลสามารถทำได้ผ่านบทบาทผู้ดูแลระบบที่มอบหมายให้กับบัญชี ตามที่ Microsoft อธิบายไว้ในเอกสารประกอบ “สิทธิ์ที่มีประสิทธิผลของแอปของคุณเป็นจุดตัดที่มีสิทธิพิเศษน้อยที่สุดของสิทธิ์ที่ได้รับมอบหมายที่แอปได้รับ (โดยความยินยอม) และสิทธิ์ของผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบัน ” กล่าวอีกนัยหนึ่ง หากบัญชีของคุณมีบทบาทผู้ดูแลระบบ คุณจะสามารถเข้าถึงข้อมูลได้มากกว่าที่บัญชีของคุณไม่มี
หากคุณให้ความยินยอมในนามขององค์กร Entra ID จะเพิ่มการอนุญาตให้กับบริการหลัก และจะพร้อมใช้งานสำหรับทุกเซสชันหลังจากนั้น การยินยอมที่มอบให้กับบริการหลักนั้นมีไว้สำหรับการอนุญาตแอปพลิเคชัน ซึ่งหมายความว่าผู้ใช้สามารถเข้าถึงข้อมูลจากทั่วทั้งองค์กร
หลังจากเชื่อมต่อแล้ว คุณสามารถตรวจสอบได้ว่ามีการอนุญาตอะไรบ้างโดยเรียกใช้:
(Get-MgContext).Scopesสิทธิ์กราฟสะสม
การสะสมสิทธิ์อย่างต่อเนื่องโดยบริการหลักของ Microsoft Graph PowerShell เป็นสิ่งที่ต้องป้องกัน หากคุณต้องการลบสิทธิ์ทั้งหมดออกจากบริการหลัก คุณสามารถทำได้ผ่านศูนย์การจัดการ Azure AD (ดังรูปที่ 1) หรือคุณสามารถลบบริการหลักได้ เมื่อสิ่งนี้เกิดขึ้น SDK จะตรวจพบว่าบริการหลักหายไปในครั้งถัดไปที่มีคนพยายามลงชื่อเข้าใช้และสร้างใหม่ (AppId สำหรับบริการหลักจะเป็น 14d82eec-204b-4c2f-b7e8-296a70dab67e เสมอ) .
หากต้องการสร้างบริการหลัก ให้เชื่อมต่อกับกราฟด้วยสิทธิ์ Application.ReadWrite.All แล้วเรียกใช้คำสั่งเหล่านี้:
cmdlet Remove-MgServicePrincipal จะไม่แจ้งให้ยืนยัน โชคดีที่ในไม่ช้า Azure AD จะพิสูจน์ความสามารถในการกู้คืนออบเจ็กต์หลักของบริการที่ถูกลบแบบซอฟต์ ในกรณีที่คุณทำผิดพลาด
$SDKServicePrincipalId = (Get-MgServicePrincipal -all | ? {$_.DisplayName -eq "Microsoft Graph PowerShell"}).Id
Remove-MgServicePrincipal -ServicePrincipalId $SDKServicePrincipalID
ซับซ้อนยิ่งขึ้น ควบคุมได้มากขึ้น
การทำงานกับ Microsoft Graph PowerShell SDK ต้องการความเอาใจใส่ในการอนุญาตมากกว่าปกติ (จนถึงตอนนี้) กับโมดูล PowerShell แทนที่จะรับสิทธิ์ผู้ดูแลระบบ คุณต้องขอสิทธิ์และใช้เฉพาะชุดที่จำเป็น ใช้เวลาทำความคุ้นเคยเล็กน้อยและเป็นส่วนหนึ่งของรายการตรวจสอบสำหรับการแปลงสคริปต์ตามโมดูล Azure AD และ MSOL เช่นเดียวกับสิ่งอื่นๆ ในชีวิต เราจะคุ้นเคยกับการจัดการสิทธิ์สำหรับการเชื่อมต่อได้ทันเวลา


