-- =====================================================================
-- SIMAP — Pemantauan keamanan
--
--   mysql -u root -p simap_db < database/20_pemantauan_keamanan.sql
--
-- Sistem ini menyimpan data seribu anak: nilai, kehadiran, tagihan, dan
-- nomor telepon orang tuanya. Serangan yang berhasil jarang terlihat saat
-- terjadi — yang terlihat justru jejaknya: percobaan masuk yang gagal
-- berulang kali, satu akun yang tiba-tiba membuka ratusan data, atau
-- pengunduhan rapor di luar jam kerja.
--
-- Tabel ini merekam jejak itu agar dapat dilihat, bukan supaya aman dengan
-- sendirinya.
-- =====================================================================

SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS keamanan_log (
  id         BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  jenis      ENUM('LOGIN_GAGAL','LOGIN_OK','KUNCI_AKUN','AKSES_DITOLAK',
                  'CSRF_GAGAL','RATE_LIMIT','UNGGAH_DITOLAK','SQLI_DICURIGAI',
                  'DATA_MASSAL','SANDI_GANTI','PERAN_UBAH','LAIN') NOT NULL,
  berat      ENUM('INFO','WASPADA','BAHAYA') NOT NULL DEFAULT 'INFO',
  user_id    INT UNSIGNED NULL,
  username   VARCHAR(80) NULL,
  ip         VARCHAR(45) NULL,
  user_agent VARCHAR(255) NULL,
  jalur      VARCHAR(190) NULL,
  keterangan VARCHAR(255) NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_waktu (created_at),
  KEY idx_jenis (jenis, created_at),
  KEY idx_ip (ip, created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Alamat yang diblokir sementara setelah terlalu banyak percobaan gagal
CREATE TABLE IF NOT EXISTS keamanan_blokir (
  ip         VARCHAR(45) NOT NULL PRIMARY KEY,
  alasan     VARCHAR(120) NOT NULL,
  sampai     DATETIME NOT NULL,
  oleh       INT UNSIGNED NULL,
  created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT IGNORE INTO setting (skey, svalue, tipe, grup, label) VALUES
 ('keamanan_maks_gagal',   '8',  'number',  'keamanan',
  'Percobaan masuk gagal dari satu alamat sebelum diblokir sementara'),
 ('keamanan_blokir_menit', '30', 'number',  'keamanan',
  'Lama pemblokiran sementara (menit)'),
 ('keamanan_simpan_hari',  '90', 'number',  'keamanan',
  'Lama catatan keamanan disimpan sebelum dibersihkan'),
 ('keamanan_ambang_massal','150','number',  'keamanan',
  'Jumlah data yang dibuka satu akun dalam sejam sebelum dianggap mencurigakan');

INSERT IGNORE INTO permissions (kode, nama, modul) VALUES
 ('keamanan.lihat', 'Melihat pemantauan keamanan', 'sistem');

INSERT IGNORE INTO role_permission (role_id, permission_id)
SELECT r.id, (SELECT id FROM permissions WHERE kode = 'keamanan.lihat')
  FROM roles r WHERE r.kode IN ('SUPERADMIN', 'KEPALA_SEKOLAH');

SELECT 'pemantauan keamanan siap' AS info;
