Panduan Instalasi & Migrasi
Halaman ini memandu proses instalasi paket pasax/secure-monitor ke dalam aplikasi Laravel Anda.
Halaman ini memandu proses instalasi paket pasax/secure-monitor ke dalam aplikasi Laravel Anda.
🌟 Nol Ketergantungan NPM (Zero NPM): Paket ini murni PHP Composer library standar seperti paket Spatie. Anda tidak perlu menginstal dependensi npm atau menjalankan build tools frontend.
1. Persyaratan Sistem#
Pastikan lingkungan server Anda memenuhi spesifikasi minimum berikut:
- PHP:
^8.2,^8.3,^8.4, atau^8.5 - Laravel:
^10.0,^11.0,^12.0, atau^13.0 - Ekstensi PHP:
pdo,mbstring,json,filter,openssl.
2. Pemasangan via Composer#
Menggunakan Packagist (Publik)#
Jika paket sudah diterbitkan di Packagist, cantumkan versi lengkap agar composer.json mencatat rilis patch yang akurat:
composer require "pasax/secure-monitor:^1.0.0"
Tips Constraint Versi: Jika Anda menjalankan
composer require pasax/secure-monitortanpa versi, Composer secara bawaan menyingkatnya menjadi^1.6. Menjalankanphp artisan pasax:installakan secara otomatis menyelaraskan entri dicomposer.jsonke versi lengkap terbaru (^1.6.7).
Menggunakan Repositori Lokal / Private Git (Monorepo atau Path)#
Jika Anda menggunakan paket ini secara internal sebelum publikasi ke Packagist, tambahkan konfigurasi repositori pada berkas composer.json proyek Laravel Anda:
"repositories": [
{
"type": "path",
"url": "../pasax",
"options": {
"symlink": true
}
}
]
Kemudian pasang paket:
composer require pasax/secure-monitor:@dev
3. Publikasi Aset Otomatis (`pasax:install`)#
Paket menyediakan perintah Artisan interaktif satu langkah untuk mempublikasikan seluruh berkas konfigurasi, migrasi, template Nginx, serta menerapkan aturan Hardening Apache .htaccess:
php artisan pasax:install
Perintah ini akan secara otomatis:
- Mempublikasikan berkas konfigurasi
config/pasax.php. - Mempublikasikan berkas migrasi database ke
database/migrations/. - Mempublikasikan template virtual host
nginx.confdi root proyek. - Memperbarui berkas
public/.htaccess:- Jika berkas belum ada: membuat
public/.htaccessbaru dengan aturan rewrite standar Laravel + blok hardening keamanan. - Jika berkas sudah ada: membuat cadangan otomatis
public/.htaccess.backup-YYYYMMDD_HHMMSSdan menyisipkan blok hardening keamanan di bagian bawah berkas tanpa merusak aturan rewrite kustom Anda. - Jika sudah memiliki aturan hardening: mendeteksi dan mempertahankan berkas yang sudah terlindungi.
- Jika berkas belum ada: membuat
- Menyematkan Variabel Lingkungan ke
.env&.env.example:- Menambahkan blok konfigurasi lengkap (
PASAX_*) disertai dokumentasi penjelasan fungsi berbahasa Indonesia langsung di bagian bawah berkas.envdan.env.example. - Menggunakan deteksi cerdas agar tidak terjadi duplikasi jika variabel sudah pernah ditambahkan sebelumnya.
- Menambahkan blok konfigurasi lengkap (
- Menyematkan Trait
HasPasaxSecurityRelationske Model User:- Secara otomatis mendeteksi model
User(app/Models/User.php) dan menambahkan importuse Internal\Pasax\Concerns\HasPasaxSecurityRelations;serta menyematkan traitHasPasaxSecurityRelations. - Idempotent: tidak akan menduplikasi jika trait sudah ada.
- Secara otomatis mendeteksi model
- Mendaftarkan Middleware WAF ke Aplikasi Host:
- Otomatis mendaftarkan
PasaxBlockIpAddress,PasaxDetectSecurityThreats, danPasaxInjectAnnouncementBannerke dalambootstrap/app.php(Laravel 11 & 12) atauapp/Http/Kernel.php(Laravel 10). - Idempotent: memeriksa keberadaan middleware terlebih dahulu sebelum mendaftarkan.
- Otomatis mendaftarkan
- Menyiapkan Dukungan API & Berkas Rute Kustom (
routes/):- Memeriksa apakah berkas
routes/api.phpsudah tersedia. Jika belum (pada Laravel 11+), otomatis menjalankanphp artisan install:apiagar dukungan API aktif. - Menghasilkan berkas
routes/pasax-service.phpuntuk endpoint headless REST API dan menyertakannya diroutes/api.php(require __DIR__.'/pasax-service.php';). - Menghasilkan berkas
routes/pasax.phpuntuk rute web dashboard Blade murni dan menyertakannya diroutes/web.php(require __DIR__.'/pasax.php';). Dilewati untuk--api-only(tanpa dashboard). - Memberikan kebebasan penuh kepada developer untuk mengkustomisasi prefix URL, middleware, otorisasi, dan tampilan tanpa terkunci pada rute internal paket.
- Memeriksa apakah berkas
Opsi Perintah:#
| Opsi | Fungsi |
|---|---|
--migrate |
Menjalankan migrasi database dan menyemai pengaturan bawaan ke pasax_settings secara otomatis (cocok untuk mode CI/non-interaktif). |
--force |
Menimpa seluruh berkas konfigurasi, migrasi, nginx.conf, dan public/.htaccess dengan template bawaan paket. |
--with-dashboard / --with-plain / --with-blade |
Mempublikasikan dashboard Blade murni — jalan di semua aplikasi Laravel, tanpa dependensi frontend. |
--api-only |
Jalan pintas: API ya, Web tidak (inti + keamanan saja, tanpa halaman/dashboard). |
--without-api |
Melewatkan pemasangan dukungan API (tanpa rute API). |
--without-web |
Melewatkan pemasangan dashboard web (tanpa halaman/dashboard). |
--lang=... |
Bahasa wizard instalasi (id default, en). |
--without-user-trait |
Melewatkan penyematan otomatis trait HasPasaxSecurityRelations ke model User. |
--without-middleware |
Melewatkan pendaftaran otomatis middleware WAF di bootstrap/app.php / Kernel.php. |
--without-routes |
Melewatkan pembuatan berkas rute routes/pasax.php dan routes/pasax-service.php. |
--without-nginx |
Melewatkan publikasi berkas nginx.conf jika server Anda tidak menggunakan web server Nginx. |
--without-htaccess |
Melewatkan pembaruan berkas public/.htaccess jika Anda menggunakan Nginx murni dan tidak memerlukan Apache .htaccess. |
--with-htaccess |
Memaksa pembaruan berkas public/.htaccess dengan aturan hardening keamanan paket. |
--without-env |
Melewatkan penyematan variabel konfigurasi ke berkas .env dan .env.example. |
4. Publikasi Aset Manual via Vendor Publish#
Jika Anda ingin mempublikasikan aset secara bertahap atau terpisah:
1. Publikasikan Konfigurasi Saja#
php artisan vendor:publish --tag=pasax-config
Berkas akan ditempatkan di: config/pasax.php.
2. Publikasikan Migrasi Saja#
php artisan vendor:publish --tag=pasax-migrations
Berkas migrasi akan disalin ke folder database/migrations/.
3. Publikasikan Berkas Rute Kustom#
# Publikasikan rute web dan API sekaligus:
php artisan vendor:publish --tag=pasax-routes
# Atau publikasikan terpisah:
php artisan vendor:publish --tag=pasax-routes-web
php artisan vendor:publish --tag=pasax-routes-api
Berkas akan ditempatkan di:
routes/pasax.php(rute web dashboard yang langsung me-render view).routes/pasax-service.php(rute headless REST API).
4. Publikasikan Template Nginx WAF Hardened Saja#
php artisan vendor:publish --tag=pasax-nginx
Berkas akan ditempatkan di root proyek: nginx.conf.
4. Publikasikan Template Apache `.htaccess` Hardened Saja#
php artisan vendor:publish --tag=pasax-htaccess --force
Berkas akan ditempatkan di: public/.htaccess.
5. Publikasikan Seluruh Aset Sekaligus#
php artisan vendor:publish --tag=pasax-all --force
6. Publikasikan Dashboard Monitoring Blade Murni#
php artisan vendor:publish --tag=plain-views
Perintah ini menyalin tujuh halaman Blade ke resources/views/pages/pasax/ (CSS/JS mandiri, tanpa build step dan tanpa dependensi frontend apa pun) beserta konfigurasi dashboard pada config/pasax.php. Dashboard diakses di prefix /pasax dan wajib login (lihat bagian Dashboard Monitoring.
4.5. Batas Wilayah & Struktur Berkas di `vendor/pasax/secure-monitor/`#
Paket ini menganut kebijakan Zero-Vendor-Edit Policy yang ketat. Ketika pengguna menjalankan composer require pasax/secure-monitor, berkas pengujian dan aset internal otomatis dieksklusikan melalui .gitattributes sehingga hanya pustaka runtime murni yang diterima di folder vendor/.
Struktur Lengkap yang Diterima di `vendor/pasax/secure-monitor/`:#
vendor/pasax/secure-monitor/
├── config/
│ └── pasax.php # Sumber konfigurasi bawaan (dipublikasikan ke config/pasax.php)
├── database/migrations/
│ ├── 2026_01_01_000001_create_pasax_tables.php # Skema utama (logs, blocks, tickets, dll.)
│ ├── 2026_10_13_000001_create_pasax_allowed_ips_table.php # Tabel whitelist IP global
│ └── 2026_10_21_000001_prefix_pasax_tables.php # Migrasi otomatis prefixing tabel
├── routes/
│ ├── pasax.php # Rute internal dashboard web
│ ├── pasax-service.php # Rute internal headless REST API
│ └── pasax-web-blade.php # Rute internal dashboard Blade murni
├── src/
│ ├── PasaxServiceProvider.php # Service Provider Laravel (Auto-discovery, Gate, Aliases)
│ ├── compat.php # Backward-compatibility alias
│ ├── Concerns/
│ │ ├── HasPasaxSecurityRelations.php # [PUBLIC API] Trait Eloquent untuk Model User
│ │ └── ResolvesPasaxTable.php # Helper resolusi nama tabel dinamis
│ ├── Console/Commands/
│ │ ├── PasaxInstallCommand.php # php artisan pasax:install
│ │ ├── PasaxUpgradeCommand.php # php artisan pasax:upgrade
│ │ ├── PasaxUninstallCommand.php # php artisan pasax:uninstall
│ │ ├── PasaxBaselineCommand.php # php artisan pasax:baseline
│ │ ├── PasaxScanAccessLogsCommand.php # php artisan pasax:scan-logs
│ │ ├── PasaxUnblockIpCommand.php # php artisan pasax:unblock-ip
│ │ └── PasaxPruneSecurityLogsCommand.php # php artisan pasax:prune-logs
│ ├── Facades/
│ │ └── Pasax.php # [PUBLIC API] Facade resmi Pasax (Pasax::stats(), dll.)
│ ├── Http/
│ │ ├── Controllers/Api/ # Controller headless REST API internal
│ │ ├── Controllers/Dashboard/ # Controller Blade dashboard internal
│ │ └── Middleware/
│ │ ├── PasaxBlockIpAddress.php # Middleware pencekal 403 untuk IP/Device terblokir
│ │ ├── PasaxDetectSecurityThreats.php # Middleware inspeksi muatan ancaman (WAF Engine)
│ │ ├── PasaxEnsureSecurityAdmin.php # Middleware otorisasi admin
│ │ ├── PasaxInjectAnnouncementBanner.php # Middleware injeksi pengumuman darurat
│ │ └── PasaxTrackUserActivity.php # Middleware pelacak sesi & heartbeat
│ ├── Listeners/
│ │ ├── LogFailedLoginAttempt.php # Event listener: pencatatan login gagal & lockout
│ │ ├── RecordUserLogin.php # Event listener: pencatatan login berhasil
│ │ └── ResetLoginAttempts.php # Event listener: reset percobaan login
│ ├── Models/ # [PUBLIC API] Model Eloquent resmi
│ │ ├── PasaxLog.php # Model log ancaman WAF
│ │ ├── PasaxBlockedIp.php # Model IP/perangkat yang diblokir
│ │ ├── PasaxAllowedIp.php # Model whitelist IP
│ │ ├── PasaxIpUnblockRequest.php # Model tiket banding unblock
│ │ ├── PasaxUserLogin.php # Model histori sesi login pengguna
│ │ ├── PasaxLoginAttempt.php # Model upaya login gagal
│ │ ├── PasaxSetting.php # Model konfigurasi dinamis runtime
│ │ └── PasaxTrustedIp.php # Model IP terpercaya pengguna
│ ├── Rules/ # [PUBLIC API] Validasi Laravel
│ │ ├── PasaxSafeImageFile.php # Validasi gambar anti-polyglot/webshell
│ │ └── PasaxSafeAssetPath.php # Validasi path anti-traversal
│ ├── Services/
│ │ ├── PasaxService.php # [CORE ENGINE] Mesin regex WAF ReDoS-immune
│ │ ├── ServerSecurityService.php # [CORE ENGINE] Audit integritas server & webshell
│ │ └── AccessLogStreamer.php # [CORE ENGINE] Streaming parser log web server
│ └── Support/
│ └── DashboardView.php # Helper render tampilan
├── stubs/ # [CETAK BIRU] Disalin ke host saat pasax:install
│ ├── nginx.conf.stub # Template vhost Nginx WAF hardened
│ ├── htaccess.stub # Template Apache .htaccess hardened
│ ├── apache2.conf.stub # Template vhost Apache 2
│ ├── blocked.blade.php # Template tampilan 403 kustom bawaan
│ ├── env.stub # Blok konfigurasi PASAX_* untuk .env
│ ├── routes/ # Stub rute publishable
│ └── blade/pages/pasax/ # Stub tampilan Blade monitoring bawaan
├── composer.json # Metadata paket Composer & auto-discovery
├── LICENSE # Lisensi lisensi MIT
├── README.md # Dokumentasi ringkas paket
├── SECURITY.md # Kebijakan pelaporan kerentanan
└── CHANGELOG.md # Catatan riwayat versi rilis
Kategori Hak Akses Berkas bagi Developer:#
| Kategori | Lokasi Berkas | Hak Akses Developer | Keterangan |
|---|---|---|---|
| 🟢 Public API | src/Facades/Pasax.php, src/Models/*, src/Rules/*, src/Concerns/* |
Dapat & Dianjurkan Dipanggil | Komponen resmi yang dirancang untuk diimpor ke dalam Controller, Model, dan Form Request aplikasi host Anda. |
| 🟡 Stubs (Cetak Biru) | stubs/*, config/pasax.php |
Disalin ke Aplikasi Host | Sumber cetak biru yang disalin ke aplikasi Anda saat menjalankan php artisan pasax:install. Anda bebas mengedit salinannya di aplikasi host. |
| 🔴 Core Engine | src/Services/*, src/Http/Middleware/*, database/migrations/* |
DILARANG KERAS DIUBAH | Berjalan secara otomatis di latar belakang. Modifikasi pada folder vendor akan hilang permanen saat composer update dan berisiko merusak perlindungan WAF. |
Panduan membuat tampilan dan API kustom tanpa mengubah vendor tersedia di Panduan Kustomisasi Aman (Blade & API).
5. Menjalankan Migrasi Database#
Jalankan perintah migrasi Laravel untuk membuat tabel-tabel pendukung paket:
php artisan migrate
Tabel-tabel yang dibuat secara default (satu migrasi create_pasax_tables):
blocked_ips: Menyimpan daftar karantina IP dan perangkat aktif/kedaluwarsa beserta hit counter.pasax_logs: Log audit ancaman keamanan, pola yang terdeteksi, bukti payload, dan aksi mitigasi.login_attempts: Pelacakan kegagalan login bertingkat (stepped lockout) per kombinasi email & IP.ip_unblock_requests: Tiket banding pembukaan blokir yang diajukan oleh pengguna publik.user_logins: Rekam jejak riwayat login pengguna, detail perangkat/browser, sesi aktif, dan waktu aktivitas terakhir.trusted_ips: Daftar alamat IP terpercaya per pengguna untuk otorisasi akses khusus.settings: Penyimpanan key-value pengaturan dinamis paket.allowed_ips: Allowlist global (IP/wildcard/CIDR) yang tidak pernah diblokir.
Data dari tabel lama
security_logs/security_settingsotomatis dipindahkan bila migrasi menemukan keduanya.
6. Mendaftarkan Trait ke Model User (Standar Spatie)#
Buka model pengguna aplikasi Anda (biasanya app/Models/User.php) dan sertakan trait HasPasaxSecurityRelations:
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Internal\Pasax\Concerns\HasPasaxSecurityRelations;
class User extends Authenticatable
{
use HasPasaxSecurityRelations;
// ... sisa model Anda
}
Catatan Kompatibilitas: Nama lama
use Internal\Pasax\Concerns\HasSecurityRelations;danuse HasSecurityRelations;tetap 100% didukung melalui alias.
Metode relasi Eloquent yang otomatis tersedia:
$user->logins(): Mengambil seluruh riwayat login (HasManykePasaxUserLogin).$user->trustedIps(): Mengambil daftar IP terpercaya milik pengguna (HasManykePasaxTrustedIp).$user->pasaxLogs()/$user->securityLogs(): Mengambil audit ancaman yang diasosiasikan dengan akun ini (HasManykePasaxLog).$user->blockedIps(): Mengambil daftar entri blokir yang dieksekusi oleh user admin ini (HasManykePasaxBlockedIp).$user->allowedIps(): Mengambil daftar IP allowlist yang didaftarkan oleh user admin ini (HasManykePasaxAllowedIp).$user->resolvedTickets(): Mengambil daftar tiket banding yang diselesaikan oleh user admin ini (HasManykePasaxIpUnblockRequest).
7. Mendaftarkan Middleware Keamanan ke Core Laravel#
Paket menyediakan 5 middleware terisolasi:
| Alias | Kelas Middleware | Peran |
|---|---|---|
pasax.block |
Internal\Pasax\Http\Middleware\PasaxBlockIpAddress |
Menolak request dari IP/perangkat yang sedang terblokir aktif (HTTP 403). |
pasax.detect |
Internal\Pasax\Http\Middleware\PasaxDetectSecurityThreats |
Menginspeksi payload request terhadap tanda-tanda serangan siber dan mengaktifkan auto-block/instant block. |
pasax.admin |
Internal\Pasax\Http\Middleware\PasaxEnsureSecurityAdmin |
Memastikan hanya user dengan wewenang admin yang dapat mengakses REST API admin. |
pasax.activity |
Internal\Pasax\Http\Middleware\PasaxTrackUserActivity |
Memperbarui heartbeat aktivitas login pengguna di database (ter-throttle 45 detik). |
pasax.announce |
Internal\Pasax\Http\Middleware\PasaxInjectAnnouncementBanner |
Menyuntikkan banner dan dialog pengumuman versi di halaman host yang ditentukan. |
Pendaftaran pada Laravel 11 / 12 / 13 (`bootstrap/app.php`)#
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
use Internal\Pasax\Http\Middleware\PasaxBlockIpAddress;
use Internal\Pasax\Http\Middleware\PasaxDetectSecurityThreats;
use Internal\Pasax\Http\Middleware\PasaxTrackUserActivity;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// Pasang di lapisan global
$middleware->append([
PasaxBlockIpAddress::class,
PasaxDetectSecurityThreats::class,
]);
// Pasang di grup web untuk pelacakan aktivitas user login
$middleware->web(append: [
TrackUserActivity::class,
]);
})
->create();
Pendaftaran pada Laravel 10 (`app/Http/Kernel.php`)#
Buka app/Http/Kernel.php dan tambahkan ke array $middleware:
protected $middleware = [
// ...
\Internal\Pasax\Http\Middleware\PasaxBlockIpAddress::class,
\Internal\Pasax\Http\Middleware\PasaxDetectSecurityThreats::class,
];
Tips Opsi Otomatis (Zero-Touch): Jika Anda mengatur
PASAX_AUTO_REGISTER_MIDDLEWARE=truedi berkas.env, paket akan otomatis menyuntikkanPasaxBlockIpAddressdanPasaxDetectSecurityThreatske Kernel HTTP aplikasi secara otomatis saat booting.
8. Dashboard Monitoring (Opsional)#
Paket tetap 100% headless secara default. Bila membutuhkan panel monitoring siap pakai, pasang dashboard Blade murni:
php artisan pasax:install --with-dashboard
# atau: php artisan vendor:publish --tag=plain-views
Halaman tersimpan di resources/views/pages/pasax/ dan dirender controller bawaan paket — cocok untuk semua aplikasi Laravel tanpa dependensi frontend.
Mengaktifkan#
# Aktifkan di .env
# PASAX_DASHBOARD_ENABLED=true
# PASAX_DASHBOARD_PREFIX=pasax
# Bersihkan cache
php artisan optimize:clear
Panel tersedia di /pasax dan berisi tujuh modul: Overview, Security Logs, Blocked IPs, Server Audit, User Sessions, dan Unblock Appeals, dan Settings.
Keamanan & Kontrol Akses#
- Rute hanya didaftarkan ketika
pasax.dashboard.enabled=true. - Seluruh rute memakai middleware
web+auth(wajib login) dan, secara bawaan,pasax.admin(Gatemanage-pasax). - Kustomisasi melalui
config/pasax.php:'dashboard' => [ 'enabled' => (bool) env('PASAX_DASHBOARD_ENABLED', false), 'prefix' => env('PASAX_DASHBOARD_PREFIX', 'pasax'), 'middleware' => ['web', 'auth'], 'admin_middleware' => ['Internal\\Pasax\\Http\\Middleware\\EnsureSecurityAdmin'], ],
9. Otomasi Deployment Server (VPS / Production)#
Saat melakukan deployment di VPS, git clone baru, atau menjalankan alur CI/CD produksi, gunakan perintah satu langkah:
php artisan pasax:deploy --force
Perintah ini otomatis:
- Menghasilkan dan mengamankan
PASAX_DASHBOARD_SECRETdi.env(tanpa menimpa jika sudah ada). - Mempublikasikan dan menjalankan migrasi tabel-tabel khusus Pasax.
- Menanam pengaturan keamanan bawaan ke tabel
pasax_settingssecara aman tanpa menduplikasi data (idempotent). - Menyegarkan seluruh cache framework.
- Menjamin keamanan data produksi: hanya menyentuh tabel Pasax dan tidak pernah menyentuh atau merusak tabel host aplikasi seperti
users.