Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Grafik kustom di Microsoft Azure Sentinel memungkinkan peneliti dan analis keamanan untuk membuat representasi grafik yang disesuaikan dari data keamanan mereka. Dengan membangun grafik kustom, Anda dapat memodelkan pola serangan tertentu, menyelidiki ancaman, dan menjalankan algoritma grafik tingkat lanjut untuk mengungkap hubungan tersembunyi dalam lingkungan digital Anda. Panduan ini memandu Anda melalui langkah-langkah untuk membuat dan mengelola grafik kustom dengan menggunakan notebook Jupyter di ekstensi Visual Studio Code Microsoft Sentinel.
Artikel ini berfokus pada penulisan grafik kustom secara manual menggunakan kode. Untuk pengalaman berbasis AI, lihat Penulisan grafik kustom yang dibantu AI di Microsoft Azure Sentinel.
Prasyarat
Berikut ini diperlukan untuk membuat grafik kustom di Microsoft Azure Sentinel:
- Ekstensi Microsoft Azure Sentinel untuk Visual Studio Code. Untuk informasi selengkapnya, lihat Menjalankan buku catatan di data lake Microsoft Sentinel.
- Ekstensi Jupyter untuk Visual Studio Code.
- Data lake Microsoft Sentinel dikonfigurasi dengan izin yang sesuai. Untuk informasi selengkapnya, lihat Mengonfigurasi data lake Microsoft Sentinel.
Aktifkan konektor ID Microsoft Entra untuk menyerap tabel aset Microsoft Entra yang digunakan dalam kode sampel artikel ini. Untuk informasi selengkapnya, lihat Penyerapan data aset di data lake Microsoft Sentinel.
Hak akses
Untuk berinteraksi dengan grafik kustom, Anda memerlukan izin XDR berikut di data lake Sentinel. Tabel berikut ini mencantumkan persyaratan izin untuk operasi grafik umum:
| Operasi grafik | Izin diperlukan |
|---|---|
| Memodelkan dan membuat grafik buku catatan | Gunakan peran RBAC terpadu Microsoft Defender XDR kustom dengan izin manajemen data atas pengumpulan data Microsoft Sentinel. |
| Menyimpan grafik di tenant | Gunakan salah satu peran ID Microsoft Entra berikut: Operator keamanan Administrator keamanan Administrator global |
| Melakukan kueri pada graf yang dipertahankan | Gunakan peran kustom terpadu RBAC Microsoft Defender XDR dengan izin dasar data keamanan (baca) atas pengumpulan data Microsoft Sentinel. |
Penting
Anda harus memiliki izin untuk membaca data yang digunakan dalam grafik. Jika Anda tidak memiliki akses ke himpunan data tertentu, data tersebut tidak akan disertakan dalam grafik. Untuk membuat grafik, Anda tidak boleh dibatasi oleh cakupan Sentinel. Pengguna dengan batasan tidak dapat membuat grafik kustom.
Peran Microsoft Entra ID menyediakan akses luas di semua ruang kerja di dalam data lake. Untuk informasi selengkapnya, lihat Peran dan Izin di Microsoft Sentinel.
Menginstal Visual Studio Code dan ekstensi Microsoft Sentinel
Buat grafik kustom dengan menggunakan notebook Jupyter di ekstensi Visual Studio Code Microsoft Sentinel. Untuk informasi selengkapnya, lihat Menginstal Visual Studio Code dan ekstensi Microsoft Azure Sentinel
Membuat grafik kustom
Untuk membuat dan bekerja dengan grafik kustom, selesaikan langkah-langkah berikut:
- Memodelkan grafik kustom
- Mempertahankan grafik kustom dengan menjadwalkan pekerjaan grafik
- Menampilkan dan mengelola grafik kustom
Memodelkan grafik kustom
Buat grafik kustom dengan menggunakan notebook Jupyter di ekstensi Visual Studio Code Microsoft Sentinel.
Berikut ini adalah langkah-langkah yang memandu Anda membuat grafik kustom pertama Anda dengan menggunakan notebook contoh.
Siapkan notebook Anda dan hubungkan ke data lake
Gunakan langkah-langkah berikut untuk membuat buku catatan dan menyambungkan ke data lake Microsoft Sentinel.
Di Visual Studio Code dengan ekstensi Microsoft Azure Sentinel terinstal, pilih ikon Microsoft Azure Sentinel di menu sebelah kiri.
Pilih Masuk untuk melihat grafik
Kotak dialog muncul dengan teks Ekstensi 'Microsoft Sentinel' ingin masuk menggunakan Microsoft. Pilih Izinkan untuk masuk.
Masuk dengan kredensial Anda.
Setelah masuk, pilih + lalu pilih Buat buku catatan baru.
Beri nama file buku catatan dan simpan di lokasi yang sesuai di ruang kerja Anda.
Pilih Pilih kernel di kanan atas jendela buku catatan untuk memilih kumpulan komputasi spark.
Pilih Microsoft Sentinel, lalu pilih salah satu kumpulan spark yang tersedia.
Tip
Anda bisa menggunakan perintah AI untuk membantu Anda membuat buku catatan grafik kustom. Untuk informasi selengkapnya, lihat Penulisan grafik kustom yang dibantu AI di Microsoft Azure Sentinel.
Jalankan sel dengan memilih ikon segitiga untuk menjalankan sel di sisi kiri sel. Saat pertama kali menjalankan sel, Anda mungkin diminta untuk memilih kernel jika Anda belum memilihnya.
Saat pertama kali Anda menjalankan sel, proses memulai sesi Spark memerlukan waktu sekitar lima menit.
Membuat grafik
Sampel berikut membuat grafik untuk melintasi keanggotaan grup Microsoft Entra dan memahami hubungan grup berlapis. Kode sampel membantu Anda memulai kasus penggunaan sederhana untuk mempelajari kemampuan grafik kustom dan memanfaatkan kekuatan traversal grafik untuk penyelidikan Anda. Anda dapat membuat grafik dari tabel apa pun yang tersedia di data lake Sentinel.
Sambungkan ke ruang kerja Anda dan baca tabel aset Entra untuk mulai membangun grafik.
from pyspark.sql import functions as F from sentinel_lake.providers import MicrosoftSentinelProvider lake_provider = MicrosoftSentinelProvider(spark=spark) # Use the "System tables" workspace which contains the Entra* Assets tables # If you are data is in a different workspace, update this variable accordingly and ensure the tables are present LOG_ANALYTICS_WORKSPACE = "System tables" # Dynamically get the latest snapshot time from EntraUsers snapshot_time = ( lake_provider.read_table("EntraUsers", LOG_ANALYTICS_WORKSPACE) .df.agg(F.max("_SnapshotTime").alias("max_snapshot")) .collect()[0]["max_snapshot"] .strftime("%Y-%m-%dT%H:%M:%SZ") ) print(f"Using snapshot_time: {snapshot_time}") snapshot_filter = (F.col("_SnapshotTime") == F.lit(snapshot_time).cast("timestamp")) # Load EntraMembers - edges: group contains user/group/servicePrincipal df_members = ( lake_provider.read_table("EntraMembers", LOG_ANALYTICS_WORKSPACE) .filter( snapshot_filter & (F.col("sourceType") == "group") & (F.col("targetType").isin("user", "group", "servicePrincipal")) ) ) # Load EntraGroups - nodes df_groups = ( lake_provider.read_table("EntraGroups", LOG_ANALYTICS_WORKSPACE) .filter(snapshot_filter) .select("id", "displayName", "mailEnabled") ) # Load EntraUsers - nodes df_users = ( lake_provider.read_table("EntraUsers", LOG_ANALYTICS_WORKSPACE) .filter(snapshot_filter) .select("id", "accountEnabled", "displayName", "department", "lastPasswordChangeDateTime", "userPrincipalName", "usageLocation") ) # Load EntraServicePrincipals - nodes df_service_principals = ( lake_provider.read_table("EntraServicePrincipals", LOG_ANALYTICS_WORKSPACE) .filter(snapshot_filter) .select("accountEnabled", "id", "displayName", "servicePrincipalType", "tenantId", "organizationId") ) # Fix for Spark 3.x Parquet datetime rebase issue. Required when reading Parquet files # written by Spark 2.x which used the Julian calendar, whereas Spark 3.x uses Proleptic # Gregorian. Without these settings, timestamp columns (e.g. lastPasswordChangeDateTime) # may throw errors or return incorrect values. Safe to remove if all data was written by # Spark 3.x (typical for current Fabric/Sentinel environments). spark.conf.set("spark.sql.parquet.datetimeRebaseModeInRead", "CORRECTED") spark.conf.set("spark.sql.parquet.datetimeRebaseModeInWrite", "CORRECTED") spark.conf.set("spark.sql.parquet.int96RebaseModeInRead", "CORRECTED") spark.conf.set("spark.sql.parquet.int96RebaseModeInWrite", "CORRECTED")Siapkan node dan edge DataFrames yang diperlukan untuk membangun grafik
# ============================================================ # NODE PREPARATION # ============================================================ # EntraUser nodes - keyed by user id user_nodes = ( df_users.df .select( F.col("id"), F.col("displayName"), F.col("accountEnabled"), F.col("department"), F.col("lastPasswordChangeDateTime"), F.col("userPrincipalName"), F.col("usageLocation") ) ) # EntraGroup nodes - keyed by group id group_nodes = ( df_groups.df .select( F.col("id"), F.col("displayName"), F.col("mailEnabled") ) ) # EntraServicePrincipal nodes - keyed by SP id sp_nodes = ( df_service_principals.df .select( F.col("id"), F.col("displayName"), F.col("accountEnabled"), F.col("servicePrincipalType"), F.col("tenantId"), F.col("organizationId") ) ) # ============================================================ # EDGE PREPARATION # ============================================================ # Edge: EntraGroup --Contains--> EntraUser edge_group_contains_user = ( df_members.df .filter(F.col("targetType") == "user") .select( F.col("sourceId").alias("SourceGroupId"), F.col("targetId").alias("TargetUserId") ) .distinct() .withColumn("EdgeKey", F.concat_ws("_", F.col("SourceGroupId"), F.col("TargetUserId"))) ) # Edge: EntraGroup --Contains--> EntraGroup (nested groups) edge_group_contains_group = ( df_members.df .filter(F.col("targetType") == "group") .select( F.col("sourceId").alias("SourceGroupId"), F.col("targetId").alias("TargetGroupId") ) .distinct() .withColumn("EdgeKey", F.concat_ws("_", F.col("SourceGroupId"), F.col("TargetGroupId"))) ) # Edge: EntraGroup --Contains--> EntraServicePrincipal edge_group_contains_sp = ( df_members.df .filter(F.col("targetType") == "servicePrincipal") .select( F.col("sourceId").alias("SourceGroupId"), F.col("targetId").alias("TargetSPId") ) .distinct() .withColumn("EdgeKey", F.concat_ws("_", F.col("SourceGroupId"), F.col("TargetSPId"))) )Tentukan skema grafik Anda dan ikat ke node dan edge DataFrames yang Anda siapkan sebelumnya dalam prosedur ini
from sentinel_graph import GraphSpecBuilder, Graph # Define the graph schema entra_group_graph_spec = ( GraphSpecBuilder.start() # === NODES === .add_node("EntraUser") .from_dataframe(user_nodes) # Native Spark DataFrame (from .df + .select + .distinct) .with_columns( "id", "displayName", "accountEnabled", "department", "lastPasswordChangeDateTime", "userPrincipalName", "usageLocation", key="id", display="displayName" ) .add_node("EntraGroup") .from_dataframe(group_nodes) # Native Spark DataFrame .with_columns( "id", "displayName", "mailEnabled", key="id", display="displayName" ) .add_node("EntraServicePrincipal") .from_dataframe(sp_nodes) # Native Spark DataFrame .with_columns( "id", "displayName", "accountEnabled", "servicePrincipalType", "tenantId", "organizationId", key="id", display="displayName" ) # === EDGES === # EntraGroup --ContainsUser--> EntraUser .add_edge("ContainsUser") .from_dataframe(edge_group_contains_user) # Native Spark DataFrame .source(id_column="SourceGroupId", node_type="EntraGroup") .target(id_column="TargetUserId", node_type="EntraUser") .with_columns("SourceGroupId", "TargetUserId", "EdgeKey", key="EdgeKey", display="EdgeKey") # EntraGroup --ContainsGroup--> EntraGroup (nested groups) .add_edge("ContainsGroup") .from_dataframe(edge_group_contains_group) # Native Spark DataFrame .source(id_column="SourceGroupId", node_type="EntraGroup") .target(id_column="TargetGroupId", node_type="EntraGroup") .with_columns("SourceGroupId", "TargetGroupId", "EdgeKey", key="EdgeKey", display="EdgeKey") # EntraGroup --ContainsServicePrincipal--> EntraServicePrincipal .add_edge("ContainsServicePrincipal") .from_dataframe(edge_group_contains_sp) # Native Spark DataFrame .source(id_column="SourceGroupId", node_type="EntraGroup") .target(id_column="TargetSPId", node_type="EntraServicePrincipal") .with_columns("SourceGroupId", "TargetSPId", "EdgeKey", key="EdgeKey", display="EdgeKey") ).done()Memvalidasi skema grafik
# Check the schema of the graph spec to ensure it's correct entra_group_graph_spec.show_schema()Buat grafik, termasuk menyiapkan data dan menerbitkan grafik
# Build the graph from the spec - this will validate the spec and prepare it for querying # Alter options is to use Graph.prepare() to prepare the graph nodes and edges in the lake # and then use Graph.publish() to create the graph. You would typically call prepare() and publish() # seperately to understand the cost of Graph API calls that are triggeterd by Graph.publish() # see https://learn.microsoft.com/azure/sentinel/billing?tabs=simplified%2Ccommitment-tiers intra_group_graph = Graph.build(entra_group_graph_spec)Note
Grafik yang dibuat selama sesi notebook interaktif dihapus saat sesi buku catatan ditutup. Untuk mempertahankan grafik untuk digunakan kembali dan dibagikan, lihat Mempertahankan grafik kustom Anda
Anda sekarang telah membuat grafik di buku catatan.
Contoh Python berikut menjalankan query Graph Query Language (GQL) terhadap grafik yang baru saja Anda buat untuk mengeksplorasi hubungan grup bersarang. Gunakan kueri seperti ini setelah pembuatan grafik untuk menelusuri hierarki keanggotaan dan menemukan jalur akses tidak langsung. Untuk mencobanya, tempelkan kode ke dalam sel notebook baru dan jalankan. Contoh kueri ini melintasi keanggotaan grup Microsoft Entra bertingkat hingga delapan tingkat dan menampilkan hubungan yang dihasilkan:
# Query 1: Find nested group relationships nexting up to 8 levels deep
# Update the Entra Group name that you want to traverse from
query_nested_groups = """
MATCH p=(g1:EntraGroup)-[cg]->{1,8}(g2)
WHERE g1.displayName = 'tmplevel3'
RETURN *
"""
intra_group_graph.query(query_nested_groups).show()
Kode ini menjalankan kueri sampel untuk Bahasa Query Grafis (GQL) guna mengambil semua keanggotaan grup bersarang hingga kedalaman 8 tingkat. Grafik yang dihasilkan akan divisualisasikan dalam output.
Mempertahankan grafik kustom Anda
Setelah Anda membuat kode grafik di buku catatan, Anda bisa menjalankan buku catatan dalam sesi interaktif atau menjadwalkan pekerjaan grafik. Grafik yang dibuat selama sesi notebook interaktif bersifat sementara dan hanya tersedia dalam konteks sesi buku catatan. Untuk menyimpan grafik dan berbagi dengan tim Anda, jadwalkan pekerjaan grafik untuk sering membangun ulang grafik Anda. Setelah grafik disimpan, grafik dapat diakses dari: pengalaman grafik di portal Pertahanan Microsoft di bawah Sentinel, Buku Catatan Visual Studio Code, dan API kueri Grafik.
Dari buku catatan grafik Anda, pilih Buat Pekerjaan Terjadwal, lalu pilih Buat pekerjaan grafik.
Dalam formulir Buat tugas grafik, masukkan Nama grafik dan Deskripsi, dan pastikan buku catatan grafik yang benar sudah termasuk dalam Jalur.
Untuk membuat grafik tanpa mengonfigurasi jadwal refresh, pilih Sesuai permintaan di bagian Jadwal , lalu pilih Kirim untuk membuat grafik.
Note
Grafik yang dibuat menggunakan jadwal sesuai permintaan memiliki retensi default 30 hari dan dihapus saat kedaluwarsa.
Untuk membangun grafik tempat data grafik di-refresh secara teratur, pilih Terjadwal di bagian Jadwal .
Pilih Frekuensi pengulangan untuk pekerjaan tersebut. Anda dapat memilih dari Per menit, Per Jam, Mingguan, Harian, atau Bulanan.
Opsi lainnya ditampilkan untuk mengonfigurasi jadwal, tergantung pada frekuensi yang Anda pilih. Misalnya hari dalam seminggu, waktu hari, atau hari dalam sebulan.
Pilih Mulai tepat waktu agar jadwal mulai berjalan.
Pilih Akhiri tepat waktu agar jadwal berhenti berjalan. Jika Anda tidak ingin mengatur waktu akhir untuk jadwal, pilih Atur pekerjaan untuk berjalan tanpa batas waktu. Tanggal dan waktu berada di zona waktu Anda.
Pilih Kirim untuk menyimpan konfigurasi pekerjaan dan menerbitkan pekerjaan. Proses pembuatan grafik dimulai di penyewa Anda. Lihat grafik yang baru dibuat dan status terbarunya di ekstensi Sentinel.
Menampilkan dan mengelola grafik kustom
Setelah membuat tugas graf, Anda dapat melihat dan mengelola graf di tenant Anda dari ekstensi Microsoft Sentinel di Visual Studio Code.
Dari daftar grafik, pilih grafik terwujud Anda untuk melihat detailnya.
Pilih tab Detail Pekerjaan untuk melihat status pekerjaan grafik, termasuk durasi terakhir, waktu proses berikutnya, dan kesalahan apa pun yang ditemui selama proses build.
Pilih Jalankan Sekarang untuk memicu build grafik secara manual di luar waktu yang dijadwalkan. Status berubah menjadi Antrean, lalu "Sedang Berlangsung" saat grafik sedang dibangun.
Saat build grafik selesai, Status diperbarui menjadi Siap. Pilih tab Detail Grafik untuk melihat informasi tentang grafik.
Sekarang Anda dapat mengkueri dan memvisualisasikan grafik Anda dari visualisasi grafik di Microsoft Sentinel dalam portal Defender. Untuk informasi selengkapnya, lihat Memvisualisasikan grafik di grafik Microsoft Sentinel (pratinjau).
Memperbarui grafik kustom
Setelah Anda memperbarui kode grafik buku catatan, jalankan buku catatan secara lokal untuk memvalidasi perubahan Anda sebelum Anda memperbarui pekerjaan grafik.
Mengedit detail grafik kustom yang sudah ada
Gunakan alur kerja ini untuk mengedit pekerjaan grafik yang sudah ada.
Di panel Graph Microsoft Sentinel di Visual Studio Code, pilih Edit graph job untuk grafik yang ingin Anda perbarui, lalu buka Graph name>Job details.
Perbarui bidang yang ingin Anda ubah:
- Nama grafik (opsional). Memperbarui nama graf akan membuat graf baru di tenant Anda. Grafik yang ada tetap tidak berubah.
- Deskripsi (opsional). Memperbarui deskripsi menggantikan deskripsi grafik saat ini dan membangun ulang grafik.
- Konfigurasi kluster (opsional). Memperbarui konfigurasi kluster mengubah ukuran komputasi dan membangun kembali grafik.
- Frekuensi pekerjaan (opsional). Memperbarui frekuensi pekerjaan mengubah jadwal berulang dan membangun kembali grafik.
Timpa grafik kustom yang sudah ada
Gunakan alur kerja ini saat Anda ingin membuat ulang grafik dan menimpa grafik yang sudah ada dengan nama yang sama.
Buka buku catatan yang diperbarui.
Pilih Buat Pekerjaan Terjadwal di pengalaman buku catatan Sentinel, lalu pilih Buat pekerjaan grafik.
Dalam formulir Buat grafik , berikan nama grafik.
- Jika Anda memberikan nama grafik baru, grafik baru dibuat di penyewa, dan grafik yang ada tetap tersedia.
- Jika Anda menggunakan kembali nama grafik yang sudah ada untuk tenant, grafik yang sudah ada akan ditimpa setelah dikonfirmasi. Nama grafik unik, nama grafik duplikat tidak didukung.
Pastikan Path mengacu ke notebook Anda yang telah diperbarui.
Perbarui Deskripsi untuk grafik.
Pilih Konfigurasi kluster dan Frekuensi pekerjaan, mirip dengan membuat grafik baru.
Perbarui informasi Jadwal , jika diperlukan.
Perbarui bidang Deskripsi lagi sesuai kebutuhan.
Pilih Submit untuk membuat ulang graf di tenant Anda.