Mengumpulkan log Resource Microsoft Azure
Dokumen ini menjelaskan cara mengumpulkan log Microsoft Azure Resource dengan menyiapkan feed Google Security Operations menggunakan Microsoft Azure Blob Storage V2.
Log resource Azure memberikan insight tentang operasi yang dilakukan dalam resource Azure. Log ini mencatat informasi mendetail tentang operasi resource, status, dan metrik performa. Konten bervariasi menurut jenis resource dan mencakup data seperti peristiwa autentikasi, perubahan konfigurasi, upaya akses, dan metrik operasional.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
Akses istimewa ke portal Microsoft Azure dengan izin untuk:
- Membuat Akun Penyimpanan
- Mengonfigurasi Setelan Diagnostik untuk resource Azure
- Mengelola kunci akses
Mengonfigurasi Akun Azure Storage
Buat Akun Penyimpanan
- Di portal Azure, cari Storage accounts.
- Klik + Create.
Berikan detail konfigurasi berikut:
Setelan Nilai Langganan Pilih langganan Azure Anda Grup resource Pilih yang sudah ada atau buat yang baru Nama akun penyimpanan Masukkan nama unik (misalnya, azureresourcelogs)Region Pilih region (misalnya, East US)Performa Standar (direkomendasikan) Redundansi GRS (Geo-redundant storage) atau LRS (Locally redundant storage) Klik Review + create.
Tinjau ringkasan akun, lalu klik Buat.
Tunggu hingga deployment selesai.
Mendapatkan kredensial Akun Penyimpanan
- Buka Akun Penyimpanan yang baru saja Anda buat.
- Di navigasi kiri, pilih Kunci akses di bagian Keamanan + jaringan.
- Klik Tampilkan kunci.
Salin dan simpan hal berikut untuk digunakan nanti:
- Nama akun penyimpanan:
azureresourcelogs - Kunci 1 atau Kunci 2: Kunci akses bersama (string acak 512-bit dalam encoding base-64)
- Nama akun penyimpanan:
Mendapatkan endpoint Blob Service
- Di Akun Penyimpanan yang sama, pilih Endpoints dari navigasi kiri.
- Salin dan simpan URL endpoint Blob service.
- Contoh:
https://azureresourcelogs.blob.core.windows.net/
- Contoh:
Mengonfigurasi Setelan Diagnostik Resource Azure
Log resource Azure tidak dikumpulkan secara default. Anda harus membuat setelan diagnostik untuk setiap resource Azure guna merutekan log ke akun penyimpanan.
- Di portal Azure, buka resource Azure yang ingin Anda pantau.
- Di navigasi kiri, pilih Setelan diagnostik di bagian Monitoring.
- Klik + Tambahkan setelan diagnostik.
- Berikan detail konfigurasi berikut:
- Nama setelan diagnostik: Masukkan nama deskriptif (misalnya,
export-to-secops). - Di bagian Log, pilih kategori log yang ingin Anda kumpulkan. Kategori yang tersedia bervariasi menurut jenis resource. Kategori umum mencakup:
- Administratif (untuk Log Aktivitas)
- Keamanan (untuk Log Aktivitas)
- AuditEvent (untuk Key Vault)
- ApplicationGatewayAccessLog (untuk Application Gateway)
- ApplicationGatewayFirewallLog (untuk Application Gateway)
- NetworkSecurityGroupEvent (untuk Network Security Groups)
- Di bagian Metrics (opsional), pilih AllMetrics untuk mengirim metrik platform ke akun penyimpanan.
- Di bagian Destination details, centang kotak Archive to a storage account.
- Subscription: Pilih langganan yang berisi akun penyimpanan Anda.
- Akun penyimpanan: Pilih akun penyimpanan yang Anda buat (misalnya,
azureresourcelogs).
- Nama setelan diagnostik: Masukkan nama deskriptif (misalnya,
- Klik Simpan.
Setelah konfigurasi, log akan otomatis diekspor ke penampung di akun penyimpanan. Azure membuat container menggunakan pola penamaan insights-logs-<log-category-name>. Contoh:
- Log audit Key Vault:
insights-logs-auditevent - Log akses Application Gateway:
insights-logs-applicationgatewayaccesslog - Log firewall Application Gateway:
insights-logs-applicationgatewayfirewalllog Peristiwa Network Security Group:
insights-logs-networksecuritygroupevent
Mengonfigurasi feed di Google SecOps untuk menyerap log Azure Resource
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
Azure Resource Logs - Key Vault). - Pilih Microsoft Azure Blob Storage V2 sebagai Jenis sumber.
- Pilih Microsoft Azure Resource sebagai Log type.
- Klik Berikutnya.
Tentukan nilai untuk parameter input berikut:
- URI Azure: Masukkan URL endpoint Blob Service dengan jalur kontainer:
https://azureresourcelogs.blob.core.windows.net/insights-logs-auditevent/- Ganti kode berikut:
azureresourcelogs: Nama akun penyimpanan Azure Anda.insights-logs-auditevent: Nama container blob tempat log disimpan (berbeda menurut jenis resource dan kategori log).
Opsi penghapusan sumber: Pilih opsi penghapusan sesuai preferensi Anda:
- Jangan pernah: Tidak pernah menghapus file apa pun setelah transfer.
- Hapus file yang ditransfer: Menghapus file setelah transfer berhasil.
- Hapus file yang ditransfer dan direktori kosong: Menghapus file dan direktori kosong setelah transfer berhasil.
Usia File Maksimum: Menyertakan file yang diubah dalam beberapa hari terakhir. Defaultnya adalah 180 hari.
Shared key: Masukkan nilai kunci bersama (kunci akses) yang Anda ambil dari Akun Penyimpanan di langkah 3.
Namespace aset: Namespace aset.
Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
Klik Berikutnya.
Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Konfigurasi firewall Azure Storage (jika diaktifkan)
Jika Akun Azure Storage Anda menggunakan firewall, Anda harus menambahkan rentang IP Google SecOps.
- Di portal Azure, buka Akun Penyimpanan Anda (misalnya,
azureresourcelogs). - Pilih Networking di bagian Security + networking.
- Di bagian Firewalls and virtual networks, pilih Enabled from selected virtual networks and IP addresses.
- Di bagian Firewall, di bagian Rentang alamat, klik + Tambahkan rentang IP.
Tambahkan setiap rentang IP Google SecOps dalam notasi CIDR.
- Untuk mendapatkan rentang IP saat ini, pilih salah satu opsi berikut:
- Lihat dokumentasi Daftar IP yang Diizinkan
- Ambil secara terprogram menggunakan Feed Management API
- Untuk mendapatkan rentang IP saat ini, pilih salah satu opsi berikut:
Klik Simpan.
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| berbagai kolom _labelfield* tambahan | additional.fields | Digabungkan dari berbagai kolom tambahanfield*_label |
| authenticationMethod | extensions.auth.mechanism | Ditetapkan ke USERNAME_PASSWORD jika authenticationMethod adalah Password |
| category, event_type | extensions.auth.type | Disetel ke MACHINE untuk SQLSecurityAuditEvents; SSO untuk kategori tertentu; AUTHTYPE_UNSPECIFIED untuk kategori lainnya |
| properties.partialipaddress | intermediary.ip | Nilai dari properties.partialipaddress jika tidak kosong |
| properties.event_time, stage_time, risk_time, last_update_time, time | metadata.collected_timestamp | Dikonversi menggunakan ISO8601 dari properties.event_time, atau dari stage_time, atau dari risk_time, atau dari last_update_time, atau dari time dengan grok penggantian |
| properties.message, properties.activity, properties.log.stage | metadata.description | Nilai dari properties.message jika tidak kosong; jika tidak, dari properties.activity; jika tidak, dari properties.log.stage |
| event_type | metadata.event_type | Nilai dari event_type jika tidak kosong, atau GENERIC_EVENT |
| category, record.category | metadata.product_event_type | Nilai disalin langsung dari kategori atau record.category |
| properties.event_id, properties.log.auditID | metadata.product_log_id | Nilai dari properties.event_id jika tidak kosong; jika tidak, dari properties.log.auditID |
| properties.log.apiVersion | metadata.product_version | Nilai disalin langsung dari properties.log.apiVersion |
| protokol | network.application_protocol | Nilai disalin langsung dari protokol |
| properties.log.verb | network.dhcp.opcode | Nilai disalin langsung dari properties.log.verb (huruf besar) |
| properties.CsMethod, record.properties.CsMethod | network.http.method | Nilai disalin langsung dari properties.CsMethod atau record.properties.CsMethod |
| user_agent | network.http.parsed_user_agent | Dikonversi dari user_agent |
| properties.Referer, uri | network.http.referral_url | Nilai dari properties.Referer jika tidak kosong; jika tidak, dari uri |
| properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, responseStatus.code | network.http.response_code | Dikonversi menjadi bilangan bulat dari properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, atau responseStatus.code |
| user_agent | network.http.user_agent | Nilai disalin langsung dari user_agent |
| properties.ScBytes, record.properties.ScBytes, properties.responseLength | network.received_bytes | Dikonversi menjadi uinteger dari properties.ScBytes, record.properties.ScBytes, atau properties.responseLength |
| properties.CsBytes, record.properties.CsBytes, properties.requestLength | network.sent_bytes | Dikonversi menjadi uinteger dari properties.CsBytes, record.properties.CsBytes, atau properties.requestLength |
| properties.session_id | network.session_id | Nilai disalin langsung dari properties.session_id (dikonversi menjadi string) |
| properties.tlsVersion | network.tls.version | Nilai disalin langsung dari properties.tlsVersion |
| domain_name_value | principal.administrative_domain | Nilai disalin langsung dari domain_name_value |
| properties.clientAppUsed, target_application | principal.application | Nilai dari properties.clientAppUsed jika tidak kosong; jika tidak, dari target_application |
| prop_device_id | principal.asset.asset_id | Disetel ke ID Perangkat: diikuti dengan prop_device_id jika tidak null |
| hardware | principal.asset.hardware | Digabungkan dari hardware |
| properties.host_name, properties.CIp, record.properties.CIp, properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name, server_name | principal.asset.hostname | Nilai dari properties.host_name jika tidak kosong; jika tidak, dari properties.CIp (grok IP), record.properties.CIp (grok IP), properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name, atau server_name |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.asset.ip | Nilai dari src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress, atau ip |
| properties.host_name, properties.CsHost, record.properties.CsHost | principal.hostname | Nilai dari properties.host_name jika tidak kosong; jika tidak, nilai dari properties.CsHost atau record.properties.CsHost |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.ip | Nilai dari src_ip, src_ip1, properties.client_ip (grok IP), record.properties.clientIpAddress, properties.clientIpAddress (grok IP), record.properties.clientIpAddress, callerIpAddress (grok IP), properties.ipAddress, atau ip |
| properties.location.city, provisioning_steps_city | principal.location.city | Nilai dari properties.location.city jika tidak kosong; jika tidak, dari provisioning_steps_city |
| properties.location.countryOrRegion, provisioning_steps_country, location, Region | principal.location.country_or_region | Nilai dari properties.location.countryOrRegion jika tidak kosong; jika tidak, dari provisioning_steps_country; jika tidak, dari location; jika tidak, dari Region |
| properties.location.geoCoordinates.latitude | principal.location.region_latitude | Nilai disalin langsung dari properties.location.geoCoordinates.latitude |
| properties.location.geoCoordinates.longitude | principal.location.region_longitude | Nilai disalin langsung dari properties.location.geoCoordinates.longitude |
| properties.location.state | principal.location.state | Nilai disalin langsung dari properties.location.state |
| prop_os | principal.platform | Setel ke WINDOWS jika prop_os cocok dengan (?i)Win; LINUX jika (?i)Lin; MAC jika (?i)Mac |
| properties.deviceDetail.operatingSystem | principal.platform_version | Nilai disalin langsung dari properties.deviceDetail.operatingSystem |
| src_port | principal.port | Dikonversi menjadi bilangan bulat dari src_port |
| is_compliant_label, is_managed_label, serice_type_label, serice_credential_label | principal.resource.attribute.labels | Digabungkan dari is_compliant_label, is_managed_label, serice_type_label, serice_credential_label |
| properties.sourceSystem.Name | principal.resource.name | Nilai disalin langsung dari properties.sourceSystem.Name |
| properties.sourceSystem.Id | principal.resource.product_object_id | Nilai disalin langsung dari properti.sourceSystem.Id |
| properties.server_principal_name, source_user_principal_name, user_principal_name, local_account_username_value | principal.user.email_addresses | Digabungkan dari properties.server_principal_name (jika cocok dengan email), source_user_principal_name (jika cocok dengan email), user_principal_name (jika cocok dengan email), atau local_account_username_value (jika cocok dengan email) |
| properties.sequence_group_id, grpname, properties.log.user.groups | principal.user.group_identifiers | Digabungkan dari properties.sequence_group_id, grpname, atau properties.log.user.groups |
| properties.sourceIdentity.details.id, properties.userId, details_id_not_present | principal.user.product_object_id | Nilai dari properties.sourceIdentity.details.id jika tidak kosong; jika tidak, dari properties.userId; jika tidak, dari details_id_not_present |
| properties.ServicePrincipalDisplayName, properties.servicePrincipalName, properties.sourceIdentity.details.DisplayName, properties.userDisplayName, record.properties.log.user.username | principal.user.user_display_name | Nilai dari properties.ServicePrincipalDisplayName jika tidak kosong; jika tidak, dari properties.servicePrincipalName; jika tidak, dari properties.sourceIdentity.details.DisplayName; jika tidak, dari properties.userDisplayName; jika tidak, dari record.properties.log.user.username |
| properties.servicePrincipalId, user_userPrincipalName, source_user_principal_name, details_user_principal_name, user_principal_name, properties.accountName, record.properties.log.user.uid | principal.user.userid | Nilai dari properties.servicePrincipalId jika tidak kosong; jika tidak, dari user_userPrincipalName; jika tidak, dari source_user_principal_name; jika tidak, dari details_user_principal_name; jika tidak, dari user_principal_name; jika tidak, dari properties.accountName; jika tidak, dari record.properties.log.user.uid |
| security_action, berhasil, statusText, resultType | security_result.action | Tetapkan ke ALLOW jika security_action adalah izinkan; jika tidak, tetapkan ke ALLOW jika berhasil benar atau statusText adalah Success atau resultType adalah success; jika tidak, tetapkan ke BLOCK jika berhasil salah atau statusText adalah failed atau resultType adalah failed |
| properties.action_name | security_result.action_details | Nilai disalin langsung dari properties.action_name |
| status_label | security_result.about.resource.attribute.labels | Digabungkan dari status_label |
| properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields | security_result.detection_fields | Digabungkan dari properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields |
| resultDescription, sec_result.description, properties.queryexecutionstatus | security_result.description | Nilai dari resultDescription (gsub newlines); jika tidak, dari sec_result.description; jika tidak, dari properties.queryexecutionstatus |
| policy_id_value | security_result.rule_id | Nilai disalin langsung dari policy_id_value |
| properties.Result, statusText, properties.queryexecutionstatus | security_result.summary | Nilai dari properties.Result jika tidak kosong; jika tidak, dari statusText; jika tidak, dari properties.queryexecutionstatus |
| target_application | target.application | Nilai dari target_application |
| properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, record.properties.server_instance_name | target.asset.hostname | Nilai dari properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, atau record.properties.server_instance_name |
| (hardcode) | target.cloud.environment | Tetapkan ke "MICROSOFT_AZURE" |
| properties.SPort, record.properties.SPort | target.port | Dikonversi menjadi bilangan bulat dari properties.SPort atau record.properties.SPort |
| properties.querytext.query | target.process.command_line | Nilai disalin langsung dari properties.querytext.query |
| properties.processId | target.process.pid | Dikonversi menjadi string dari properties.processId |
| subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label | target.resource.attribute.labels | Digabungkan dari subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label |
| properties_databasename, properties.resourceDisplayName, record.properties.databasename, record.properties.databaseName | target.resource.name | Nilai dari properties_databasename jika tidak kosong; jika tidak, dari properties.resourceDisplayName; jika tidak, dari record.properties.databasename; jika tidak, dari record.properties.databaseName |
| resourceId, properties.resourceId | target.resource.product_object_id | Nilai dari resourceId jika tidak kosong; jika tidak, dari properties.resourceId |
| properties_collectionname, properties.resourceDisplayName, record.properties.collectionname, record.properties.collectionName, properties.log.objectRef.resource | target.resource.resource_subtype | Nilai dari properties_collectionname jika tidak kosong; jika tidak, dari properties.resourceDisplayName; jika tidak, dari record.properties.collectionname; jika tidak, dari record.properties.collectionName; jika tidak, dari properties.log.objectRef.resource |
| resourceId, message | target.resource.resource_type | Disetel ke DATABASE jika resourceId cocok dengan pola; jika tidak, CLUSTER jika pesan cocok dengan MANAGEDCLUSTERS; jika tidak, VIRTUAL_MACHINE jika MANAGEDINSTANCES; jika tidak, DATABASE jika DATABASEACCOUNTS |
| resourceType | target.resource.type | Nilai disalin langsung dari resourceType |
| properties.CsUriStem, properties.log.requestURI, value (dari additionalInfo) | target.url | Nilai dari properties.CsUriStem jika tidak kosong; jika tidak, dari properties.log.requestURI; jika tidak, dari nilai (dari additionalInfo) |
| user_principal_name | target.user.email_addresses | Digabungkan dari user_principal_name (jika cocok dengan email) |
| properties.userId | target.user.product_object_id | Nilai disalin langsung dari properties.userId |
| properties.userDisplayName | target.user.user_display_name | Nilai disalin langsung dari properties.userDisplayName |
| user_principal_name, properties.userPrincipalName | target.user.userid | Nilai dari user_principal_name jika tidak kosong; jika kosong, nilai diambil dari properties.userPrincipalName |
| (hardcode) | metadata.product_name | Setel ke "Azure Resource Logs" |
| (hardcode) | metadata.vendor_name | Tetapkan ke "Microsoft" |
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.