Lewati ke konten utama

Sensor dan Sensor Virtual

Pendahuluan

Modul ini menangani pendaftaran sensor fisik, pendaftaran (enrollment) host satu kali, manajemen inventaris antarmuka, penyerapan heartbeat dan metrik host, serta manajemen siklus hidup sensor virtual. Sensor fisik adalah host perangkat keras, sedangkan sensor virtual adalah beban kerja (workload) Suricata yang dapat disebarkan dan mengonsumsi dua antarmuka yang memenuhi syarat pada host tersebut.

Orkestrasi sensor telah dipecah menjadi layanan-layanan yang terfokus:

  • SensorsService — CRUD inti dan manajemen sensor
  • SensorInterfaceAllocationService — Validasi kumpulan (pool) antarmuka jaringan
  • ResilientHttpService — Circuit breaker + retry untuk panggilan HTTP eksternal
  • VirtualSensorsService — Manajemen siklus hidup sensor virtual
  • SensorHeartbeatService — Pemrosesan heartbeat

Semua controller mendelegasikan ke antarmuka layanan. Repositori (SensorRepository, SensorHeartbeatRepository, VirtualSensorRepository) menangani akses data.


Controller

ControllerRuteDeskripsi
SensorsControllerapi/sensorsCRUD dan siklus hidup Sensor
VirtualSensorsControllerapi/virtual-sensorsOperasi sensor virtual
SensorHeartbeatControllerapi/sensor-heartbeatPemrosesan heartbeat

File:

  • API/Controllers/Sensors/SensorsController.cs
  • API/Controllers/Sensors/VirtualSensorsController.cs
  • API/Controllers/Sensors/SensorHeartbeatController.cs

Entitas Sensor

File: Domain/Entities/Sensor.cs Tabel: sensors

KolomTipeBatasanDeskripsi
iduuidPKKunci utama (UUIDv7)
namevarchar(255)WajibNama tampilan sensor
organization_iduuidFK, WajibOrganisasi pemilik
statusvarchar(50)Wajibunknown, off, on
operational_statusvarchar(50)active, inactive, maintenance
sensor_ipvarchar(50)Bisa nullAlamat IP sensor
sensor_portintBisa nullNomor port sensor
sudo_uservarchar(100)Bisa nullPengguna sudo SSH untuk penyebaran
hostnamevarchar(255)Bisa nullNama host yang dilaporkan agen sensor
os_infovarchar(255)Bisa nullInformasi sistem operasi
architecturevarchar(100)Bisa nullArsitektur CPU yang dilaporkan
agent_versionvarchar(100)Bisa nullVersi agen host yang terinstal
enrollment_statusvarchar(50)Wajibpending, enrolled
management_interfacevarchar(255)Bisa nullAntarmuka jaringan manajemen
last_heartbeat_attimestampBisa nullHeartbeat agen terakhir diterima
last_inventory_attimestampBisa nullPembaruan inventaris antarmuka terakhir
created_attimestampStempel waktu pembuatan
updated_attimestampStempel waktu pembaruan terakhir

Properti Navigasi

[ForeignKey("OrganizationId")]
public Organization Organization { get; set; } = null!;
public ICollection<SensorHeartbeat> Heartbeats { get; set; }
public ICollection<VirtualSensor> VirtualSensors { get; set; }
public ICollection<SensorNetworkInterface> Interfaces { get; set; }

Model Status

Sensor memiliki dua dimensi status:

Status (konektivitas):

NilaiArti
unknownStatus awal, belum pernah terhubung
offSensor sedang offline
onSensor online dan melapor

Status Operasional (operasional):

NilaiArti
activeOperasi normal
inactiveDinonaktifkan oleh administrator
maintenanceSedang dalam pemeliharaan

Entitas Sensor Virtual

File: Domain/Entities/VirtualSensor.cs Tabel: virtual_sensors

KolomTipeBatasanDeskripsi
iduuidPKKunci utama (UUIDv7)
sensor_iduuidFK, WajibSensor induk
namevarchar(255)WajibNama sensor virtual
interface1varchar(255)WajibAntarmuka jaringan pertama
interface2varchar(255)WajibAntarmuka jaringan kedua
home_netvarchar(255)CIDR jaringan rumah (def: 192.168.0.0/16)
statusvarchar(50)WajibStatus siklus hidup
activation_statusvarchar(50)Bisa nullStatus aktivasi Ansible
activation_errortextBisa nullPesan kesalahan aktivasi gagal
execution_idvarchar(255)Bisa nullID eksekusi Ansible
deployment_pathvarchar(255)Bisa nullJalur target penyebaran
created_attimestampStempel waktu pembuatan
updated_attimestampStempel waktu pembaruan terakhir

Model Status Sensor Virtual

Status (siklus hidup):

NilaiArti
inactiveDibuat tetapi belum diaktivasi
activatingAktivasi sedang berlangsung via Ansible
activeBerhasil diaktivasi dan berjalan
failedAktivasi gagal

Status Aktivasi (eksekusi Ansible):

NilaiArti
pendingAntre untuk aktivasi
runningPlaybook Ansible sedang berjalan
successAktivasi selesai dengan sukses
failedAktivasi gagal (lihat kesalahan)

Entitas Heartbeat Sensor

File: Domain/Entities/SensorHeartbeat.cs Tabel: sensor_heartbeats

KolomTipeBatasanDeskripsi
iduuidPKKunci utama (UUIDv7)
sensor_iduuidFK, WajibSensor yang melapor
last_seentimestampBisa nullStempel waktu terakhir terlihat
isActiveboolBisa nullBendera aktif
created_attimestampStempel waktu pembuatan
updated_attimestampStempel waktu pembaruan terakhir

Tanggung Jawab Sensor

Registrasi dan Pendaftaran (Enrollment)

  • Membuat draf sensor dengan nama dan organisasi
  • Menghasilkan perintah instalasi satu kali dari UI
  • Menginstal satu agen host pada sensor fisik
  • Mendaftarkan sensor dan menyimpan metadata host plus inventaris antarmuka terstruktur

Orkestrasi Aktivasi

  • Mengaktifkan atau menonaktifkan sensor virtual melalui layanan Ansible
  • Melacak progres dan status aktivasi
  • Menyebarkan hanya Suricata dan sensor-client untuk setiap sensor virtual

Pemrosesan Heartbeat

  • Menerima laporan heartbeat dari agen host
  • Memperbarui last_heartbeat_at dan last_inventory_at pada sensor
  • Menyimpan status online di InfluxDB sensor_status
  • Menyimpan CPU host, memori, dan lalu lintas antarmuka yang layak di InfluxDB sensor_metrics

Tanggung Jawab Sensor Virtual

Manajemen Siklus Hidup

  • Membuat sensor virtual yang terikat pada sensor fisik
  • Mengonfigurasi pasangan antarmuka (interface1, interface2) dan jaringan rumah
  • Melacak jalur penyebaran dan status eksekusi

Aktivasi via Ansible

  • Mengirimkan permintaan aktivasi ke layanan Ansible di AnsibleSettings:ServiceUrl
  • Meneruskan konfigurasi termasuk:
    • Penetapan antarmuka
    • Detail koneksi InfluxDB
    • Titik akhir pengumpul data (data collector)
    • Kredensial registri Docker
    • URL Backend untuk callback

Alokasi Antarmuka

  • Antarmuka disimpan sebagai rekaman terstruktur pada sensor induk
  • Pembuatan sensor virtual memerlukan dua antarmuka eksplisit
  • Hanya antarmuka yang ditandai isEligible=true yang dapat ditetapkan
  • Status penetapan dilacak pada rekaman antarmuka itu sendiri

Dependensi Eksternal

DependensiKunci KonfigurasiTujuan
Layanan AnsibleAnsibleSettings:ServiceUrlPenyebaran sensor virtual
API Key SensorSensorApiSettings:ApiKeyAutentikasi pemicu sensor
URL BackendBackendUrlURL Callback untuk Ansible
Pengumpul DataDataCollector:Endpoint/PortTujuan data sensor
Registri DockerDockerRegistry:Registry/User/PassSumber gambar kontainer
InfluxDBInfluxDb:*Aliran metrik dan heartbeat

Pengaturan ini digabungkan ke dalam SensorRuntimeOptions untuk kenyamanan:

public sealed class SensorRuntimeOptions
{
public string BackendUrl { get; set; }
public string SensorApiKey { get; set; }
public string AnsibleServiceUrl { get; set; }
public string InfluxDbUrl { get; set; }
public string InfluxDbToken { get; set; }
public string InfluxDbOrg { get; set; }
public string InfluxDbBucket { get; set; }
public string DataCollectorEndpoint { get; set; }
public string DataCollectorPort { get; set; }
public string DockerRegistry { get; set; }
public string DockerUsername { get; set; }
public string DockerPassword { get; set; }
}

Layanan gRPC Healthcheck

File: Infrastructure/Services/SensorHealthcheckService.cs Proto: Protos/sensor_healthcheck.proto

Menyediakan titik akhir gRPC untuk sensor melaporkan status kesehatan. Dipetakan dalam pipa middleware:

app.MapGrpcService<SensorHealthcheckService>();

Aturan Cascade Delete

Induk → AnakPerilaku
Organisasi → SensorCascade
Sensor → SensorHeartbeatCascade
Sensor → VirtualSensorCascade

Area Risiko Utama

AreaRisiko
Orkestrasi aktivasiAlur multi-langkah bergantung pada kontrak respons Ansible eksternal
Tanpa tes integrasiJalur aktivasi kritis kekurangan cakupan pengujian
MonitorExecutionAsyncTask.Run bersifat fire-and-forget untuk memantau status eksekusi Ansible — tidak ada pelaporan kesalahan jika pemantauan gagal

Status Refactoring

Selesai

  1. Memecah layanan orkestrasi sensor menjadi layanan-layanan yang terfokus.
  2. Menambahkan penanganan siklus hidup VirtualSensorsService khusus.
  3. Menambahkan jalur eksekusi keluar yang resilien untuk interaksi Ansible.
  4. Memindahkan logika alokasi antarmuka ke layanan khusus.
  5. Menjaga controller tetap fokus pada transport dan delegasi.

Terbuka

  1. Menambahkan tes integrasi untuk alur aktivasi dan rollback.