Mulai menggunakan grafik kustom di Microsoft Azure Sentinel (pratinjau)

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:

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:

  1. Memodelkan grafik kustom
  2. Mempertahankan grafik kustom dengan menjadwalkan pekerjaan grafik
  3. 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.

  1. Di Visual Studio Code dengan ekstensi Microsoft Azure Sentinel terinstal, pilih ikon Microsoft Azure Sentinel di menu sebelah kiri.

  2. Pilih Masuk untuk melihat grafik

  3. Kotak dialog muncul dengan teks Ekstensi 'Microsoft Sentinel' ingin masuk menggunakan Microsoft. Pilih Izinkan untuk masuk.

  4. Masuk dengan kredensial Anda.

  5. Setelah masuk, pilih + lalu pilih Buat buku catatan baru.

  6. Beri nama file buku catatan dan simpan di lokasi yang sesuai di ruang kerja Anda.

    Cuplikan layar halaman masuk untuk grafik di Visual Studio Code.

  7. Pilih Pilih kernel di kanan atas jendela buku catatan untuk memilih kumpulan komputasi spark.

  8. Pilih Microsoft Sentinel, lalu pilih salah satu kumpulan spark yang tersedia.

    Cuplikan layar halaman pilih kernel di Visual Studio Code.

    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.

  9. 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.

    Cuplikan layar memperlihatkan berjalannya sel pertama di Visual Studio Code.

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.

  1. 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")
    
  2. 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")))
    )
    
  3. 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()
    
  4. Memvalidasi skema grafik

    # Check the schema of the graph spec to ensure it's correct
    entra_group_graph_spec.show_schema()
    
  5. 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.

Cuplikan layar memperlihatkan visualisasi grafik di Visual Studio Code.

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.

  1. Dari buku catatan grafik Anda, pilih Buat Pekerjaan Terjadwal, lalu pilih Buat pekerjaan grafik.

    Cuplikan layar memperlihatkan tombol buat pekerjaan terjadwal di buku catatan grafik.

  2. Dalam formulir Buat tugas grafik, masukkan Nama grafik dan Deskripsi, dan pastikan buku catatan grafik yang benar sudah termasuk dalam Jalur.

  3. 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.

  4. Untuk membangun grafik tempat data grafik di-refresh secara teratur, pilih Terjadwal di bagian Jadwal .

    1. Pilih Frekuensi pengulangan untuk pekerjaan tersebut. Anda dapat memilih dari Per menit, Per Jam, Mingguan, Harian, atau Bulanan.

    2. Opsi lainnya ditampilkan untuk mengonfigurasi jadwal, tergantung pada frekuensi yang Anda pilih. Misalnya hari dalam seminggu, waktu hari, atau hari dalam sebulan.

    3. Pilih Mulai tepat waktu agar jadwal mulai berjalan.

    4. 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.

    5. 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.

    Cuplikan layar halaman pembuatan tugas grafik.

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.

  1. Dari daftar grafik, pilih grafik terwujud Anda untuk melihat detailnya.

  2. Pilih tab Detail Pekerjaan untuk melihat status pekerjaan grafik, termasuk durasi terakhir, waktu proses berikutnya, dan kesalahan apa pun yang ditemui selama proses build.

  3. 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.

    Cuplikan layar memperlihatkan tab detail pekerjaan grafik di Visual Studio Code.

  4. Saat build grafik selesai, Status diperbarui menjadi Siap. Pilih tab Detail Grafik untuk melihat informasi tentang grafik.

    Cuplikan layar tab detail grafik.

  5. 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.

  1. 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.

  2. 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.

Cuplikan layar memperlihatkan alur kerja Edit pekerjaan grafik di panel grafik Microsoft Sentinel di Visual Studio Code.

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.

  1. Buka buku catatan yang diperbarui.

  2. Pilih Buat Pekerjaan Terjadwal di pengalaman buku catatan Sentinel, lalu pilih Buat pekerjaan grafik.

  3. 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.
  4. Pastikan Path mengacu ke notebook Anda yang telah diperbarui.

  5. Perbarui Deskripsi untuk grafik.

  6. Pilih Konfigurasi kluster dan Frekuensi pekerjaan, mirip dengan membuat grafik baru.

  7. Perbarui informasi Jadwal , jika diperlukan.

  8. Perbarui bidang Deskripsi lagi sesuai kebutuhan.

  9. Pilih Submit untuk membuat ulang graf di tenant Anda.

Cuplikan layar memperlihatkan formulir Buat grafik yang digunakan untuk menimpa grafik kustom yang ada di Visual Studio Code.