Files

1599 lines
70 KiB
HTML
Raw Permalink Normal View History

{% extends "base.html" %}
{% block title %}Security{% endblock %}
{% block content %}
<h1>[!] Security Center</h1>
<!-- Tab navigation -->
<div class="toolbar" id="tabs">
<button class="btn" onclick="showTab('hardening')" id="tab-hardening">Hardening</button>
<button class="btn" onclick="showTab('apps')" id="tab-apps">Security Apps</button>
<button class="btn" onclick="showTab('ids')" id="tab-ids">IDS / Monitoring</button>
<button class="btn" onclick="showTab('ddos')" id="tab-ddos">DDoS Protection</button>
<button class="btn" onclick="showTab('ssl')" id="tab-ssl">SSL Audit</button>
<button class="btn" onclick="showTab('clamav')" id="tab-clamav">ClamAV</button>
<button class="btn" onclick="showTab('rkhunter')" id="tab-rkhunter">rkhunter</button>
<button class="btn" onclick="showTab('chkrootkit')" id="tab-chkrootkit">chkrootkit</button>
<button class="btn" onclick="showTab('lynis')" id="tab-lynis">Lynis</button>
<button class="btn" onclick="showTab('ossec')" id="tab-ossec">OSSEC</button>
<button class="btn" onclick="showTab('modsec')" id="tab-modsec">ModSecurity</button>
<button class="btn" onclick="showTab('aide')" id="tab-aide">AIDE</button>
<button class="btn" onclick="showTab('cowrie')" id="tab-cowrie">Cowrie</button>
<button class="btn" onclick="showTab('backup')" id="tab-backup">Backup</button>
</div>
<!-- ═══════════════════════ HARDENING TAB ═══════════════════════ -->
<div class="tab-content" id="panel-hardening">
<div class="grid grid-2">
<div class="card">
<div class="card-title">SSH Hardening</div>
<div id="ssh-status" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<label>SSH Port</label>
<input type="number" id="ssh-port" value="22" style="width:80px;">
<label><input type="checkbox" id="ssh-noroot" checked> Disable root login</label>
<label><input type="checkbox" id="ssh-nopasswd" checked> Disable password auth</label>
<div style="margin-top:10px;">
<button class="btn" onclick="sshStatus()">Check Status</button>
<button class="btn btn-warn" onclick="sshHarden()">Apply Hardening</button>
</div>
</div>
<div class="card">
<div class="card-title">Kernel Hardening</div>
<div id="kernel-status" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<button class="btn" onclick="kernelStatus()">Check Status</button>
<button class="btn btn-warn" onclick="kernelHarden()">Apply Hardening</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Automatic Security Updates</div>
<div id="updates-status" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<button class="btn" onclick="updatesStatus()">Check Status</button>
<button class="btn btn-warn" onclick="updatesEnable()">Enable Auto-Updates</button>
</div>
<div class="card">
<div class="card-title">User & Permission Audit</div>
<div id="audit-out" class="output" style="max-height:300px;"></div>
<div style="margin-top:10px;">
<button class="btn" onclick="userAudit()">Run Audit</button>
<button class="btn" onclick="suidAudit()">SUID Binaries</button>
<button class="btn" onclick="worldWritable()">World-Writable</button>
<button class="btn" onclick="cronAudit()">Cron Jobs</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">.sec Patch Updates</div>
<div id="sec-out" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div style="margin-bottom:8px;">
<label>.sec filename</label>
<input type="text" id="sec-filename" placeholder="e.g. ubuntu2404_0326.sec" style="width:280px;">
</div>
<div class="toolbar" style="flex-wrap:wrap;gap:5px;">
<button class="btn" onclick="secDetect()">Detect OS</button>
<button class="btn" onclick="secCheck()">Check Updates</button>
<button class="btn" onclick="secList()">List All</button>
<button class="btn" onclick="secDownload()">Download</button>
<button class="btn" onclick="secPreview()">Preview</button>
<button class="btn btn-warn" onclick="secApply()">Apply</button>
<button class="btn" onclick="secHistory()">History</button>
</div>
</div>
<div class="card">
<div class="card-title">Open Port Scan</div>
<div id="ports-out" class="output" style="max-height:300px;"></div>
<button class="btn" onclick="portScan()" style="margin-top:10px;">Scan Ports</button>
</div>
</div>
<!-- ═══════════════════════ SECURITY APPS TAB ═══════════════════════ -->
<div class="tab-content" id="panel-apps" style="display:none;">
<div id="apps-list"></div>
<div class="card" style="margin-top:15px;">
<div class="card-title">Output</div>
<div id="apps-out" class="output" style="max-height:500px;"></div>
</div>
</div>
<!-- ═══════════════════════ IDS / MONITORING TAB ═══════════════════════ -->
<div class="tab-content" id="panel-ids" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">Login Tracker</div>
<div id="login-out" class="output" style="max-height:300px;"></div>
<div style="margin-top:10px;">
<button class="btn" onclick="loginTracker()">Check Logins</button>
<button class="btn" onclick="activeSessions()">Active Sessions</button>
</div>
</div>
<div class="card">
<div class="card-title">Security Logs</div>
<div id="seclog-out" class="output" style="max-height:300px;"></div>
<button class="btn" onclick="securityLogs()" style="margin-top:10px;">Load Logs</button>
</div>
</div>
<div class="card">
<div class="card-title">File Integrity Monitoring</div>
<div id="integrity-out" class="output" style="max-height:300px;"></div>
<div style="margin-top:10px;">
<button class="btn" onclick="integrityCheck()">Check Integrity</button>
<button class="btn btn-warn" onclick="integrityInit()">Initialize Baseline</button>
</div>
</div>
<div class="card">
<div class="card-title">Process Audit</div>
<div id="process-out" class="output" style="max-height:300px;"></div>
<button class="btn" onclick="processAudit()" style="margin-top:10px;">Audit Processes</button>
</div>
<div class="card">
<div class="card-title">Alert Configuration</div>
<div id="alert-out" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<label>Alert Email</label>
<input type="email" id="alert-email" placeholder="admin@example.com" style="width:250px;">
<label>Webhook URL (optional)</label>
<input type="text" id="alert-webhook" placeholder="https://hooks.slack.com/..." style="width:100%;">
<div style="margin-top:10px;">
<button class="btn" onclick="alertStatus()">Check Status</button>
<button class="btn btn-warn" onclick="alertSetup()">Enable Alerts</button>
<button class="btn btn-danger" onclick="alertRemove()">Disable Alerts</button>
</div>
</div>
</div>
<!-- ═══════════════════════ DDOS TAB ═══════════════════════ -->
<div class="tab-content" id="panel-ddos" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">Connection Statistics</div>
<div id="conn-out" class="output" style="max-height:300px;"></div>
<button class="btn" onclick="connStats()" style="margin-top:10px;">Refresh</button>
</div>
<div class="card">
<div class="card-title">Bandwidth</div>
<div id="bw-out" class="output" style="max-height:300px;"></div>
<button class="btn" onclick="bwStats()" style="margin-top:10px;">Refresh</button>
</div>
</div>
<div class="card">
<div class="card-title">SYN Flood Detection</div>
<div id="syn-out" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<button class="btn" onclick="synCheck()">Check Now</button>
<button class="btn btn-warn" onclick="synProtect()">Enable SYN Protection</button>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Nginx Rate Limiting</div>
<div id="rate-out" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<label>Requests/sec</label>
<input type="number" id="rate-rps" value="10" style="width:60px;">
<label>Burst</label>
<input type="number" id="rate-burst" value="20" style="width:60px;">
<div style="margin-top:10px;">
<button class="btn" onclick="rateStatus()">Check Status</button>
<button class="btn btn-warn" onclick="rateEnable()">Enable</button>
<button class="btn btn-danger" onclick="rateRemove()">Remove</button>
</div>
</div>
<div class="card">
<div class="card-title">Auto-Blacklist</div>
<div id="blacklist-out" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<label>Threshold (connections per IP)</label>
<input type="number" id="bl-threshold" value="100" style="width:80px;">
<div style="margin-top:10px;">
<button class="btn" onclick="blacklistStatus()">Status</button>
<button class="btn btn-warn" onclick="blacklistEnable()">Enable</button>
<button class="btn btn-danger" onclick="blacklistDisable()">Disable</button>
</div>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Manual IP Block</div>
<input type="text" id="block-ip" placeholder="1.2.3.4" style="width:150px;">
<button class="btn btn-danger" onclick="blockIP()">Block</button>
<button class="btn" onclick="unblockIP()">Unblock</button>
<div id="block-out" class="output" style="max-height:150px;margin-top:10px;"></div>
<button class="btn" onclick="showBlacklist()" style="margin-top:5px;">Show All Blocked</button>
</div>
<div class="card">
<div class="card-title">Tor Exit Node Blocking</div>
<div id="tor-out" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<button class="btn btn-warn" onclick="torBlock(true)">Block Tor Exits</button>
<button class="btn" onclick="torBlock(false)">Unblock</button>
</div>
</div>
<div class="card">
<div class="card-title">Cloudflare Integration</div>
<label>Zone ID</label>
<input type="text" id="cf-zone" placeholder="Cloudflare Zone ID" style="width:250px;">
<label>API Token</label>
<input type="password" id="cf-token" placeholder="Cloudflare API Token" style="width:250px;">
<div id="cf-out" class="output" style="max-height:150px;margin:10px 0;"></div>
<button class="btn" onclick="cfStatus()">Check Status</button>
<button class="btn btn-danger" onclick="cfAttack(true)">Under Attack Mode ON</button>
<button class="btn" onclick="cfAttack(false)">Under Attack Mode OFF</button>
</div>
</div>
<!-- ═══════════════════════ SSL AUDIT TAB ═══════════════════════ -->
<div class="tab-content" id="panel-ssl" style="display:none;">
<div class="card">
<div class="card-title">Certificate Status</div>
<div id="ssl-certs" class="output" style="max-height:400px;"></div>
<div style="margin-top:10px;">
<button class="btn" onclick="sslAll()">All Certificates</button>
<button class="btn" onclick="sslAutoRenew()">Auto-Renew Status</button>
<button class="btn btn-warn" onclick="sslRenewDry()">Dry Run Renewal</button>
<button class="btn btn-danger" onclick="sslRenew()">Force Renew All</button>
</div>
</div>
<div class="card">
<div class="card-title">Domain SSL Audit</div>
<label>Domain</label>
<input type="text" id="ssl-domain" placeholder="example.com" style="width:250px;">
<div id="ssl-out" class="output" style="max-height:400px;margin:10px 0;"></div>
<button class="btn" onclick="sslCheck()">Check Certificate</button>
<button class="btn" onclick="sslExpiry()">Check Expiry</button>
<button class="btn" onclick="sslGrade()">Grade TLS Config</button>
<button class="btn btn-warn" onclick="sslHeaders()">Add Security Headers</button>
</div>
</div>
<!-- ═══════════════════════ CLAMAV TAB ═══════════════════════ -->
<div class="tab-content" id="panel-clamav" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">ClamAV Status</div>
<div id="clam-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="clamStatus()">Check Status</button>
<button class="btn btn-warn" onclick="clamInstall()">Install ClamAV</button>
<button class="btn btn-danger" onclick="clamUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Virus Definitions</div>
<div id="clam-defs" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn btn-warn" onclick="clamUpdateDefs()">Update Definitions</button>
</div>
</div>
<div class="card">
<div class="card-title">Scan</div>
<div id="clam-scan" class="output" style="max-height:400px;margin-bottom:10px;"></div>
<div style="margin-bottom:8px;">
<label>Scan Path</label>
<input type="text" id="clam-path" value="/var/www" style="width:300px;">
</div>
<div class="toolbar">
<button class="btn" onclick="clamScan()">Scan Path</button>
<button class="btn" onclick="clamScanQuick()">Quick Scan</button>
<button class="btn btn-warn" onclick="clamScanFull()">Full System Scan</button>
<button class="btn btn-danger" onclick="clamQuarantineScan()">Scan + Quarantine</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Quarantine</div>
<div id="clam-quarantine" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="clamQuarantineList()">List Quarantined</button>
<button class="btn btn-danger" onclick="clamQuarantineDelete()">Purge Quarantine</button>
</div>
</div>
<div class="card">
<div class="card-title">Logs</div>
<div id="clam-log" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="clamLog()">View Logs</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Scheduled Scans</div>
<div id="clam-schedule" class="output" style="max-height:200px;margin-bottom:10px;"></div>
<label>Frequency</label>
<select id="clam-freq" style="width:120px;">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
<option value="monthly">Monthly</option>
</select>
<label>Paths</label>
<input type="text" id="clam-sched-paths" value="/" style="width:200px;">
<div style="margin-top:10px;">
<button class="btn" onclick="clamSchedStatus()">Check Schedule</button>
<button class="btn btn-warn" onclick="clamSchedSet()">Set Schedule</button>
<button class="btn btn-danger" onclick="clamSchedRemove()">Remove Schedule</button>
</div>
</div>
<div class="card">
<div class="card-title">Configuration</div>
<div id="clam-config" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="clamConfig()">View Config</button>
</div>
</div>
</div>
<!-- ═══════════════════════ RKHUNTER TAB ═══════════════════════ -->
<div class="tab-content" id="panel-rkhunter" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">rkhunter Status</div>
<div id="rkh-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="rkhStatus()">Check Status</button>
<button class="btn btn-warn" onclick="rkhInstall()">Install</button>
<button class="btn btn-danger" onclick="rkhUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Signature Updates</div>
<div id="rkh-update" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn btn-warn" onclick="rkhUpdate()">Update Signatures + Properties</button>
</div>
</div>
<div class="card">
<div class="card-title">Rootkit Scan</div>
<div id="rkh-scan" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="rkhCheck()">Full Scan</button>
<button class="btn" onclick="rkhCheckQuick()">Quick Scan</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Whitelist</div>
<div id="rkh-whitelist" class="output" style="max-height:250px;margin-bottom:10px;"></div>
<button class="btn" onclick="rkhWhitelist()">Show Whitelist</button>
<div style="margin-top:8px;">
<input type="text" id="rkh-wl-item" placeholder="/usr/bin/something" style="width:250px;">
<button class="btn btn-warn" onclick="rkhWhitelistAdd()">Add to Whitelist</button>
</div>
</div>
<div class="card">
<div class="card-title">Logs & Config</div>
<div id="rkh-log" class="output" style="max-height:250px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="rkhLog()">View Log</button>
<button class="btn" onclick="rkhConfig()">View Config</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Scheduled Scans</div>
<div id="rkh-schedule" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<label>Frequency</label>
<select id="rkh-freq" style="width:120px;">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
</select>
<div class="toolbar" style="margin-top:8px;">
<button class="btn" onclick="rkhSchedStatus()">Check Schedule</button>
<button class="btn btn-warn" onclick="rkhSchedSet()">Set Schedule</button>
<button class="btn btn-danger" onclick="rkhSchedRemove()">Remove Schedule</button>
</div>
</div>
</div>
<!-- ═══════════════════════ CHKROOTKIT TAB ═══════════════════════ -->
<div class="tab-content" id="panel-chkrootkit" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">chkrootkit Status</div>
<div id="chk-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="chkStatus()">Check Status</button>
<button class="btn btn-warn" onclick="chkInstall()">Install</button>
<button class="btn btn-danger" onclick="chkUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Logs & Config</div>
<div id="chk-log" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="chkLog()">View Log</button>
<button class="btn" onclick="chkConfig()">View Config</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Rootkit Scan</div>
<div id="chk-scan" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="chkRun()">Standard Scan</button>
<button class="btn" onclick="chkExpert()">Expert Mode</button>
</div>
</div>
<div class="card">
<div class="card-title">Scheduled Scans</div>
<div id="chk-schedule" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<label>Frequency</label>
<select id="chk-freq" style="width:120px;">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
</select>
<div class="toolbar" style="margin-top:8px;">
<button class="btn" onclick="chkSchedStatus()">Check Schedule</button>
<button class="btn btn-warn" onclick="chkSchedSet()">Set Schedule</button>
<button class="btn btn-danger" onclick="chkSchedRemove()">Remove Schedule</button>
</div>
</div>
</div>
<!-- ═══════════════════════ LYNIS TAB ═══════════════════════ -->
<div class="tab-content" id="panel-lynis" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">Lynis Status</div>
<div id="lyn-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="lynStatus()">Check Status</button>
<button class="btn btn-warn" onclick="lynInstall()">Install</button>
<button class="btn btn-danger" onclick="lynUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Hardening Index</div>
<div id="lyn-index" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="lynIndex()">Get Hardening Score</button>
</div>
</div>
<div class="card">
<div class="card-title">Security Audit</div>
<div id="lyn-audit" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="lynAuditQuick()">Quick Audit</button>
<button class="btn btn-warn" onclick="lynAuditFull()">Full Audit</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Findings</div>
<div id="lyn-findings" class="output" style="max-height:400px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn btn-danger" onclick="lynWarnings()">Warnings</button>
<button class="btn btn-warn" onclick="lynSuggestions()">Suggestions</button>
<button class="btn" onclick="lynReport()">Full Report</button>
</div>
</div>
<div class="card">
<div class="card-title">Logs & Profile</div>
<div id="lyn-log" class="output" style="max-height:400px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="lynLog()">View Log</button>
<button class="btn" onclick="lynProfile()">Audit Profile</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Scheduled Audits</div>
<div id="lyn-schedule" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<label>Frequency</label>
<select id="lyn-freq" style="width:120px;">
<option value="weekly" selected>Weekly</option>
<option value="daily">Daily</option>
<option value="monthly">Monthly</option>
</select>
<div class="toolbar" style="margin-top:8px;">
<button class="btn" onclick="lynSchedStatus()">Check Schedule</button>
<button class="btn btn-warn" onclick="lynSchedSet()">Set Schedule</button>
<button class="btn btn-danger" onclick="lynSchedRemove()">Remove Schedule</button>
</div>
</div>
</div>
<!-- ═══════════════════════ OSSEC TAB ═══════════════════════ -->
<div class="tab-content" id="panel-ossec" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">OSSEC Status</div>
<div id="osc-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="oscStatus()">Check Status</button>
<button class="btn btn-warn" onclick="oscInstall()">Install</button>
<button class="btn btn-danger" onclick="oscUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Service Control</div>
<div id="osc-control" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="oscStart()">Start</button>
<button class="btn" onclick="oscStop()">Stop</button>
<button class="btn btn-warn" onclick="oscRestart()">Restart</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Alerts</div>
<div id="osc-alerts" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="oscAlerts()">Recent Alerts</button>
<button class="btn" onclick="oscAlertsToday()">Today's Alerts</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">File Integrity (Syscheck)</div>
<div id="osc-syscheck" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="oscSyscheck()">Show Changes</button>
</div>
<div class="card">
<div class="card-title">Active Response</div>
<div id="osc-ar" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="oscActiveResponse()">Show Active Response</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Logs</div>
<div id="osc-log" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="oscLog()">View OSSEC Log</button>
</div>
<div class="card">
<div class="card-title">Configuration & Rules</div>
<div id="osc-config" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="oscConfig()">View Config</button>
<button class="btn" onclick="oscRules()">List Rules</button>
<button class="btn" onclick="oscAgents()">List Agents</button>
</div>
</div>
</div>
</div>
<!-- ═══════════════════════ MODSECURITY TAB ═══════════════════════ -->
<div class="tab-content" id="panel-modsec" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">ModSecurity Status</div>
<div id="mod-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="modStatus()">Check Status</button>
<button class="btn btn-warn" onclick="modInstall()">Install</button>
<button class="btn btn-danger" onclick="modUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">WAF Mode</div>
<div id="mod-mode" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn btn-warn" onclick="modEnable()">Enable (Block)</button>
<button class="btn" onclick="modDisable()">Detection Only</button>
<button class="btn" onclick="modNginxStatus()">Nginx Integration</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Audit Log</div>
<div id="mod-audit" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="modAuditLog()">Audit Log</button>
<button class="btn" onclick="modDebugLog()">Debug Log</button>
<button class="btn btn-warn" onclick="modTest()">Test WAF (XSS/SQLi)</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">OWASP CRS Rules</div>
<div id="mod-rules" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="modRulesList()">List Rules</button>
<button class="btn btn-warn" onclick="modCrsUpdate()">Update CRS</button>
<div style="margin-top:8px;">
<input type="text" id="mod-rule-id" placeholder="Rule ID (e.g. 941100)" style="width:180px;">
<button class="btn btn-danger" onclick="modRuleDisable()">Disable Rule</button>
<button class="btn" onclick="modRuleEnable()">Enable Rule</button>
</div>
</div>
<div class="card">
<div class="card-title">Configuration</div>
<div id="mod-config" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="modConfig()">ModSec Config</button>
<button class="btn" onclick="modCrsConfig()">CRS Config</button>
<button class="btn" onclick="modExclusions()">Exclusions</button>
</div>
</div>
</div>
</div>
<!-- ═══════════════════════ AIDE TAB ═══════════════════════ -->
<div class="tab-content" id="panel-aide" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">AIDE Status</div>
<div id="aide-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="aideStatus()">Check Status</button>
<button class="btn btn-warn" onclick="aideInstall()">Install</button>
<button class="btn btn-danger" onclick="aideUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Database</div>
<div id="aide-db" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn btn-warn" onclick="aideInit()">Initialize DB</button>
<button class="btn" onclick="aideUpdate()">Update DB (Accept Changes)</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Integrity Check</div>
<div id="aide-check" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="aideCheck()">Run Check</button>
<button class="btn" onclick="aideCompare()">Compare DBs</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Logs & Config</div>
<div id="aide-log" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="aideLog()">View Log</button>
<button class="btn" onclick="aideConfig()">View Config</button>
<button class="btn" onclick="aideRules()">View Rules</button>
</div>
</div>
<div class="card">
<div class="card-title">Scheduled Checks</div>
<div id="aide-schedule" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<label>Frequency</label>
<select id="aide-freq" style="width:120px;">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
</select>
<div class="toolbar" style="margin-top:8px;">
<button class="btn" onclick="aideSchedStatus()">Check Schedule</button>
<button class="btn btn-warn" onclick="aideSchedSet()">Set Schedule</button>
<button class="btn btn-danger" onclick="aideSchedRemove()">Remove Schedule</button>
</div>
</div>
</div>
</div>
<!-- ═══════════════════════ COWRIE TAB ═══════════════════════ -->
<div class="tab-content" id="panel-cowrie" style="display:none;">
<div class="grid grid-2">
<div class="card">
<div class="card-title">Cowrie Status</div>
<div id="cow-status" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="cowStatus()">Check Status</button>
<button class="btn btn-warn" onclick="cowInstall()">Install</button>
<button class="btn btn-danger" onclick="cowUninstall()">Uninstall</button>
</div>
</div>
<div class="card">
<div class="card-title">Service Control</div>
<div id="cow-control" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="cowStart()">Start</button>
<button class="btn" onclick="cowStop()">Stop</button>
<button class="btn btn-warn" onclick="cowRestart()">Restart</button>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Honeypot Activity</div>
<div id="cow-activity" class="output" style="max-height:500px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="cowSessions()">Recent Sessions</button>
<button class="btn" onclick="cowTopAttackers()">Top Attackers</button>
<button class="btn" onclick="cowCredentials()">Credentials Tried</button>
<button class="btn" onclick="cowDownloads()">Downloads</button>
</div>
</div>
<div class="grid grid-2">
<div class="card">
<div class="card-title">Logs</div>
<div id="cow-log" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn" onclick="cowLog()">Text Log</button>
<button class="btn" onclick="cowLogJson()">JSON Log</button>
</div>
</div>
<div class="card">
<div class="card-title">Configuration</div>
<div id="cow-config" class="output" style="max-height:300px;margin-bottom:10px;"></div>
<button class="btn" onclick="cowConfig()">View Config</button>
</div>
</div>
<div class="card">
<div class="card-title">Port Redirection</div>
<div id="cow-port" class="output" style="max-height:150px;margin-bottom:10px;"></div>
<div class="toolbar">
<button class="btn btn-warn" onclick="cowPortEnable()">Redirect 22 → 2222</button>
<button class="btn btn-danger" onclick="cowPortDisable()">Remove Redirect</button>
</div>
</div>
</div>
<!-- ═══════════════════════ BACKUP TAB ═══════════════════════ -->
<div class="tab-content" id="panel-backup" style="display:none;">
<div class="card">
<div class="card-title">Encrypted Backup</div>
<div id="backup-out" class="output" style="max-height:400px;margin-bottom:10px;"></div>
<label>Backup paths (space-separated)</label>
<input type="text" id="bk-paths" value="/etc /var/www /home" style="width:100%;">
<label>Encryption passphrase</label>
<input type="password" id="bk-pass" placeholder="strong passphrase" style="width:250px;">
<label>Remote destination (optional, scp format: user@host:/path)</label>
<input type="text" id="bk-remote" placeholder="user@backup-server:/backups/" style="width:100%;">
<div style="margin-top:10px;">
<button class="btn" onclick="backupStatus()">List Backups</button>
<button class="btn btn-warn" onclick="backupRun()">Run Backup Now</button>
<button class="btn" onclick="backupSchedule()">Setup Daily Schedule</button>
<button class="btn btn-danger" onclick="backupRemoveSchedule()">Remove Schedule</button>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script>
// ── Tab switching ──
function showTab(name) {
document.querySelectorAll('.tab-content').forEach(el => el.style.display = 'none');
document.querySelectorAll('#tabs .btn').forEach(el => el.style.background = '');
document.getElementById('panel-' + name).style.display = 'block';
document.getElementById('tab-' + name).style.background = '#1a2a1a';
}
showTab('hardening');
// ── Hardening ──
async function sshStatus() {
const r = await apiGet('/api/security/ssh/status');
showResult(r, 'ssh-status');
}
async function sshHarden() {
if (!confirm('This will modify SSH config. Make sure you have console access as backup!')) return;
const r = await apiPost('/api/security/ssh/harden', {
port: parseInt(document.getElementById('ssh-port').value),
disable_root: document.getElementById('ssh-noroot').checked,
disable_password: document.getElementById('ssh-nopasswd').checked
});
showResult(r, 'ssh-status');
}
async function kernelStatus() {
const r = await apiGet('/api/security/kernel/status');
showResult(r, 'kernel-status');
}
async function kernelHarden() {
const r = await apiPost('/api/security/kernel/harden');
showResult(r, 'kernel-status');
}
async function updatesStatus() {
const r = await apiGet('/api/security/kernel/status');
showResult(r, 'updates-status');
}
async function updatesEnable() {
const r = await apiPost('/api/security/auto-updates');
showResult(r, 'updates-status');
}
// ── .sec Updates ──
let _secDistro = '';
let _secVersion = '';
async function secDetect() {
const r = await apiGet('/api/security/updates/detect');
showResult(r, 'sec-out');
// Parse distro/version from output for auto-check
if (r.ok && r.data && r.data.stdout) {
const lines = r.data.stdout.split('\n');
for (const line of lines) {
if (line.startsWith('DISTRO_ID=')) _secDistro = line.split('=')[1];
if (line.startsWith('DISTRO_VERSION=')) _secVersion = line.split('=')[1];
}
}
}
async function secCheck() {
if (!_secDistro || !_secVersion) {
await secDetect();
}
if (!_secDistro || !_secVersion) {
document.getElementById('sec-out').innerHTML = '<span class="error">Run Detect OS first</span>';
return;
}
const r = await apiPost('/api/security/updates/check', {distro_id: _secDistro, version_id: _secVersion});
showResult(r, 'sec-out');
}
async function secList() {
const r = await apiGet('/api/security/updates/list');
showResult(r, 'sec-out');
}
async function secDownload() {
const fn = document.getElementById('sec-filename').value;
if (!fn) { document.getElementById('sec-out').innerHTML = '<span class="error">Enter a .sec filename</span>'; return; }
const r = await apiPost('/api/security/updates/download', {filename: fn});
showResult(r, 'sec-out');
}
async function secPreview() {
const fn = document.getElementById('sec-filename').value;
if (!fn) { document.getElementById('sec-out').innerHTML = '<span class="error">Enter a .sec filename</span>'; return; }
const r = await apiPost('/api/security/updates/preview', {filename: fn});
showResult(r, 'sec-out');
}
async function secApply() {
const fn = document.getElementById('sec-filename').value;
if (!fn) { document.getElementById('sec-out').innerHTML = '<span class="error">Enter a .sec filename</span>'; return; }
if (!confirm('Apply security update ' + fn + '? This will modify system packages and configuration.')) return;
document.getElementById('sec-out').innerHTML = '<span class="info">Applying ' + fn + '... this may take a few minutes</span>';
const r = await apiPost('/api/security/updates/apply', {filename: fn});
showResult(r, 'sec-out');
}
async function secHistory() {
const r = await apiGet('/api/security/updates/history');
showResult(r, 'sec-out');
}
async function userAudit() {
const r = await apiGet('/api/security/user-audit');
showResult(r, 'audit-out');
}
async function suidAudit() {
const r = await apiGet('/api/security/monitoring/suid-audit');
showResult(r, 'audit-out');
}
async function worldWritable() {
const r = await apiGet('/api/security/monitoring/world-writable');
showResult(r, 'audit-out');
}
async function cronAudit() {
const r = await apiGet('/api/security/monitoring/cron-audit');
showResult(r, 'audit-out');
}
async function portScan() {
const r = await apiGet('/api/security/port-scan');
showResult(r, 'ports-out');
}
// ── Security Apps ──
async function loadApps() {
const r = await apiGet('/api/security/apps');
if (!r.ok) return;
const el = document.getElementById('apps-list');
var html = '<div class="grid grid-2">';
for (var i = 0; i < r.data.length; i++) {
var a = r.data[i];
html += '<div class="card">' +
'<div class="card-title">' + a.name + ' <span style="color:#888;font-size:11px;">[' + a.cat + ']</span></div>' +
'<p style="font-size:12px;color:#888;margin-bottom:10px;">' + a.desc + '</p>' +
'<button class="btn" onclick="appCheck(\'' + a.name + '\')">Check</button> ' +
'<button class="btn btn-warn" onclick="appInstall(\'' + a.name + '\')">Install</button> ' +
'<button class="btn" onclick="appScan(\'' + a.name + '\')">Scan/Run</button> ' +
'<button class="btn btn-danger" onclick="appUninstall(\'' + a.name + '\')">Uninstall</button>' +
'</div>';
}
html += '</div>';
el.innerHTML = html;
}
async function appCheck(name) {
const r = await apiPost('/api/security/apps/check', {name: name});
showResult(r, 'apps-out');
}
async function appInstall(name) {
if (!confirm('Install ' + name + '? This may take a few minutes.')) return;
document.getElementById('apps-out').innerHTML = '<span class="info">Installing ' + name + '...</span>';
const r = await apiPost('/api/security/apps/install', {name: name});
showResult(r, 'apps-out');
}
async function appScan(name) {
document.getElementById('apps-out').innerHTML = '<span class="info">Running ' + name + '...</span>';
const r = await apiPost('/api/security/apps/scan', {name: name});
showResult(r, 'apps-out');
}
async function appUninstall(name) {
if (!confirm('Uninstall ' + name + '?')) return;
const r = await apiPost('/api/security/apps/uninstall', {name: name});
showResult(r, 'apps-out');
}
// ── IDS / Monitoring ──
async function loginTracker() {
const r = await apiGet('/api/security/monitoring/login-tracker');
showResult(r, 'login-out');
}
async function activeSessions() {
const r = await apiGet('/api/security/monitoring/active-sessions');
showResult(r, 'login-out');
}
async function securityLogs() {
const r = await apiGet('/api/security/monitoring/security-log');
showResult(r, 'seclog-out');
}
async function integrityCheck() {
const r = await apiGet('/api/security/monitoring/file-integrity');
showResult(r, 'integrity-out');
}
async function integrityInit() {
if (!confirm('Initialize file integrity baseline? This will overwrite any existing baseline.')) return;
const r = await apiPost('/api/security/monitoring/file-integrity/init');
showResult(r, 'integrity-out');
}
async function processAudit() {
const r = await apiGet('/api/security/monitoring/process-audit');
showResult(r, 'process-out');
}
async function alertStatus() {
const r = await apiGet('/api/security/monitoring/alerts/status');
showResult(r, 'alert-out');
}
async function alertSetup() {
const r = await apiPost('/api/security/monitoring/alerts/setup', {
email: document.getElementById('alert-email').value,
webhook: document.getElementById('alert-webhook').value
});
showResult(r, 'alert-out');
}
async function alertRemove() {
const r = await apiPost('/api/security/monitoring/alerts/remove');
showResult(r, 'alert-out');
}
// ── DDoS ──
async function connStats() {
const r = await apiGet('/api/security/ddos/connection-stats');
showResult(r, 'conn-out');
}
async function bwStats() {
const r = await apiGet('/api/security/ddos/bandwidth');
showResult(r, 'bw-out');
}
async function synCheck() {
const r = await apiGet('/api/security/ddos/syn-flood');
showResult(r, 'syn-out');
}
async function synProtect() {
const r = await apiPost('/api/security/ddos/syn-protection');
showResult(r, 'syn-out');
}
async function rateStatus() {
const r = await apiGet('/api/security/ddos/rate-limit/status');
showResult(r, 'rate-out');
}
async function rateEnable() {
const r = await apiPost('/api/security/ddos/rate-limit/enable', {
requests_per_second: parseInt(document.getElementById('rate-rps').value),
burst: parseInt(document.getElementById('rate-burst').value)
});
showResult(r, 'rate-out');
}
async function rateRemove() {
const r = await apiPost('/api/security/ddos/rate-limit/remove');
showResult(r, 'rate-out');
}
async function blacklistStatus() {
const r = await apiGet('/api/security/ddos/auto-blacklist/status');
showResult(r, 'blacklist-out');
}
async function blacklistEnable() {
const r = await apiPost('/api/security/ddos/auto-blacklist/enable', {
threshold: parseInt(document.getElementById('bl-threshold').value)
});
showResult(r, 'blacklist-out');
}
async function blacklistDisable() {
const r = await apiPost('/api/security/ddos/auto-blacklist/remove');
showResult(r, 'blacklist-out');
}
async function blockIP() {
const ip = document.getElementById('block-ip').value;
const r = await apiPost('/api/security/ddos/blacklist/add', {ip: ip});
showResult(r, 'block-out');
}
async function unblockIP() {
const ip = document.getElementById('block-ip').value;
const r = await apiPost('/api/security/ddos/blacklist/remove', {ip: ip});
showResult(r, 'block-out');
}
async function showBlacklist() {
const r = await apiGet('/api/security/ddos/blacklist/list');
showResult(r, 'block-out');
}
async function torBlock(enable) {
const r = await apiPost('/api/security/ddos/tor-block', {enable: enable});
showResult(r, 'tor-out');
}
async function cfStatus() {
const r = await apiPost('/api/security/ddos/cloudflare/status', {
zone_id: document.getElementById('cf-zone').value,
api_token: document.getElementById('cf-token').value
});
showResult(r, 'cf-out');
}
async function cfAttack(enable) {
const r = await apiPost('/api/security/ddos/cloudflare/toggle', {
zone_id: document.getElementById('cf-zone').value,
api_token: document.getElementById('cf-token').value,
enable: enable
});
showResult(r, 'cf-out');
}
// ── SSL ──
async function sslAll() {
const r = await apiGet('/api/security/ssl/expiry-all');
showResult(r, 'ssl-certs');
}
async function sslAutoRenew() {
const r = await apiGet('/api/security/ssl/autorenew-status');
showResult(r, 'ssl-certs');
}
async function sslRenewDry() {
const r = await apiGet('/api/security/ssl/renew-dry');
showResult(r, 'ssl-certs');
}
async function sslRenew() {
if (!confirm('Force renew ALL certificates?')) return;
const r = await apiPost('/api/security/ssl/renew');
showResult(r, 'ssl-certs');
}
async function sslCheck() {
const d = document.getElementById('ssl-domain').value;
const r = await apiPost('/api/security/ssl/check', {domain: d});
showResult(r, 'ssl-out');
}
async function sslExpiry() {
const d = document.getElementById('ssl-domain').value;
const r = await apiPost('/api/security/ssl/expiry', {domain: d});
showResult(r, 'ssl-out');
}
async function sslGrade() {
const d = document.getElementById('ssl-domain').value;
const r = await apiPost('/api/security/ssl/grade', {domain: d});
showResult(r, 'ssl-out');
}
async function sslHeaders() {
const d = document.getElementById('ssl-domain').value;
if (!confirm('Add security headers to nginx for ' + d + '?')) return;
const r = await apiPost('/api/security/ssl/security-headers', {domain: d});
showResult(r, 'ssl-out');
}
// ── ClamAV ──
async function clamStatus() {
const r = await apiGet('/api/security/clamav/status');
showResult(r, 'clam-status');
}
async function clamInstall() {
if (!confirm('Install ClamAV? This may take a few minutes.')) return;
document.getElementById('clam-status').innerHTML = '<span class="info">Installing ClamAV...</span>';
const r = await apiPost('/api/security/clamav/install');
showResult(r, 'clam-status');
}
async function clamUninstall() {
if (!confirm('Uninstall ClamAV?')) return;
const r = await apiPost('/api/security/clamav/uninstall');
showResult(r, 'clam-status');
}
async function clamUpdateDefs() {
document.getElementById('clam-defs').innerHTML = '<span class="info">Updating virus definitions...</span>';
const r = await apiPost('/api/security/clamav/update-defs');
showResult(r, 'clam-defs');
}
async function clamScan() {
const path = document.getElementById('clam-path').value;
document.getElementById('clam-scan').innerHTML = '<span class="info">Scanning ' + path + '...</span>';
const r = await apiPost('/api/security/clamav/scan', {path: path});
showResult(r, 'clam-scan');
}
async function clamScanQuick() {
document.getElementById('clam-scan').innerHTML = '<span class="info">Quick scan running...</span>';
const r = await apiPost('/api/security/clamav/scan-quick');
showResult(r, 'clam-scan');
}
async function clamScanFull() {
if (!confirm('Full system scan may take a long time. Continue?')) return;
document.getElementById('clam-scan').innerHTML = '<span class="info">Full system scan running... this will take a while</span>';
const r = await apiPost('/api/security/clamav/scan-full');
showResult(r, 'clam-scan');
}
async function clamQuarantineScan() {
const path = document.getElementById('clam-path').value;
if (!confirm('Scan ' + path + ' and quarantine infected files?')) return;
document.getElementById('clam-scan').innerHTML = '<span class="info">Scanning + quarantining...</span>';
const r = await apiPost('/api/security/clamav/quarantine-scan', {path: path});
showResult(r, 'clam-scan');
}
async function clamQuarantineList() {
const r = await apiGet('/api/security/clamav/quarantine/list');
showResult(r, 'clam-quarantine');
}
async function clamQuarantineDelete() {
if (!confirm('Delete all quarantined files permanently?')) return;
const r = await apiPost('/api/security/clamav/quarantine/delete');
showResult(r, 'clam-quarantine');
}
async function clamLog() {
const r = await apiGet('/api/security/clamav/log');
showResult(r, 'clam-log');
}
async function clamSchedStatus() {
const r = await apiGet('/api/security/clamav/schedule/status');
showResult(r, 'clam-schedule');
}
async function clamSchedSet() {
const freq = document.getElementById('clam-freq').value;
const paths = document.getElementById('clam-sched-paths').value;
const r = await apiPost('/api/security/clamav/schedule', {schedule: freq, paths: paths});
showResult(r, 'clam-schedule');
}
async function clamSchedRemove() {
const r = await apiPost('/api/security/clamav/schedule/remove');
showResult(r, 'clam-schedule');
}
async function clamConfig() {
const r = await apiGet('/api/security/clamav/config');
showResult(r, 'clam-config');
}
// ── rkhunter ──
async function rkhStatus() {
const r = await apiGet('/api/security/rkhunter/status');
showResult(r, 'rkh-status');
}
async function rkhInstall() {
if (!confirm('Install rkhunter?')) return;
document.getElementById('rkh-status').innerHTML = '<span class="info">Installing rkhunter...</span>';
const r = await apiPost('/api/security/rkhunter/install');
showResult(r, 'rkh-status');
}
async function rkhUninstall() {
if (!confirm('Uninstall rkhunter?')) return;
const r = await apiPost('/api/security/rkhunter/uninstall');
showResult(r, 'rkh-status');
}
async function rkhUpdate() {
document.getElementById('rkh-update').innerHTML = '<span class="info">Updating signatures...</span>';
const r = await apiPost('/api/security/rkhunter/update');
showResult(r, 'rkh-update');
}
async function rkhCheck() {
document.getElementById('rkh-scan').innerHTML = '<span class="info">Running full scan...</span>';
const r = await apiPost('/api/security/rkhunter/check');
showResult(r, 'rkh-scan');
}
async function rkhCheckQuick() {
document.getElementById('rkh-scan').innerHTML = '<span class="info">Running quick scan...</span>';
const r = await apiPost('/api/security/rkhunter/check-quick');
showResult(r, 'rkh-scan');
}
async function rkhWhitelist() {
const r = await apiGet('/api/security/rkhunter/whitelist');
showResult(r, 'rkh-whitelist');
}
async function rkhWhitelistAdd() {
const item = document.getElementById('rkh-wl-item').value;
if (!item) return;
const r = await apiPost('/api/security/rkhunter/whitelist/add', {item: item});
showResult(r, 'rkh-whitelist');
}
async function rkhLog() {
const r = await apiGet('/api/security/rkhunter/log');
showResult(r, 'rkh-log');
}
async function rkhConfig() {
const r = await apiGet('/api/security/rkhunter/config');
showResult(r, 'rkh-log');
}
async function rkhSchedStatus() {
const r = await apiGet('/api/security/rkhunter/schedule/status');
showResult(r, 'rkh-schedule');
}
async function rkhSchedSet() {
const freq = document.getElementById('rkh-freq').value;
const r = await apiPost('/api/security/rkhunter/schedule', {schedule: freq});
showResult(r, 'rkh-schedule');
}
async function rkhSchedRemove() {
const r = await apiPost('/api/security/rkhunter/schedule/remove');
showResult(r, 'rkh-schedule');
}
// ── chkrootkit ──
async function chkStatus() {
const r = await apiGet('/api/security/chkrootkit/status');
showResult(r, 'chk-status');
}
async function chkInstall() {
if (!confirm('Install chkrootkit?')) return;
document.getElementById('chk-status').innerHTML = '<span class="info">Installing...</span>';
const r = await apiPost('/api/security/chkrootkit/install');
showResult(r, 'chk-status');
}
async function chkUninstall() {
if (!confirm('Uninstall chkrootkit?')) return;
const r = await apiPost('/api/security/chkrootkit/uninstall');
showResult(r, 'chk-status');
}
async function chkRun() {
document.getElementById('chk-scan').innerHTML = '<span class="info">Running scan...</span>';
const r = await apiPost('/api/security/chkrootkit/check');
showResult(r, 'chk-scan');
}
async function chkExpert() {
document.getElementById('chk-scan').innerHTML = '<span class="info">Running expert mode...</span>';
const r = await apiPost('/api/security/chkrootkit/check-expert');
showResult(r, 'chk-scan');
}
async function chkLog() {
const r = await apiGet('/api/security/chkrootkit/log');
showResult(r, 'chk-log');
}
async function chkConfig() {
const r = await apiGet('/api/security/chkrootkit/config');
showResult(r, 'chk-log');
}
async function chkSchedStatus() {
const r = await apiGet('/api/security/chkrootkit/schedule/status');
showResult(r, 'chk-schedule');
}
async function chkSchedSet() {
const freq = document.getElementById('chk-freq').value;
const r = await apiPost('/api/security/chkrootkit/schedule', {schedule: freq});
showResult(r, 'chk-schedule');
}
async function chkSchedRemove() {
const r = await apiPost('/api/security/chkrootkit/schedule/remove');
showResult(r, 'chk-schedule');
}
// ── Lynis ──
async function lynStatus() {
const r = await apiGet('/api/security/lynis/status');
showResult(r, 'lyn-status');
}
async function lynInstall() {
if (!confirm('Install Lynis?')) return;
document.getElementById('lyn-status').innerHTML = '<span class="info">Installing...</span>';
const r = await apiPost('/api/security/lynis/install');
showResult(r, 'lyn-status');
}
async function lynUninstall() {
if (!confirm('Uninstall Lynis?')) return;
const r = await apiPost('/api/security/lynis/uninstall');
showResult(r, 'lyn-status');
}
async function lynIndex() {
const r = await apiGet('/api/security/lynis/hardening-index');
showResult(r, 'lyn-index');
}
async function lynAuditQuick() {
document.getElementById('lyn-audit').innerHTML = '<span class="info">Running quick audit...</span>';
const r = await apiPost('/api/security/lynis/audit-quick');
showResult(r, 'lyn-audit');
}
async function lynAuditFull() {
if (!confirm('Full audit may take several minutes. Continue?')) return;
document.getElementById('lyn-audit').innerHTML = '<span class="info">Running full audit... this will take a while</span>';
const r = await apiPost('/api/security/lynis/audit-full');
showResult(r, 'lyn-audit');
}
async function lynWarnings() {
const r = await apiGet('/api/security/lynis/warnings');
showResult(r, 'lyn-findings');
}
async function lynSuggestions() {
const r = await apiGet('/api/security/lynis/suggestions');
showResult(r, 'lyn-findings');
}
async function lynReport() {
const r = await apiGet('/api/security/lynis/report');
showResult(r, 'lyn-findings');
}
async function lynLog() {
const r = await apiGet('/api/security/lynis/log');
showResult(r, 'lyn-log');
}
async function lynProfile() {
const r = await apiGet('/api/security/lynis/profile');
showResult(r, 'lyn-log');
}
async function lynSchedStatus() {
const r = await apiGet('/api/security/lynis/schedule/status');
showResult(r, 'lyn-schedule');
}
async function lynSchedSet() {
const freq = document.getElementById('lyn-freq').value;
const r = await apiPost('/api/security/lynis/schedule', {schedule: freq});
showResult(r, 'lyn-schedule');
}
async function lynSchedRemove() {
const r = await apiPost('/api/security/lynis/schedule/remove');
showResult(r, 'lyn-schedule');
}
// ── OSSEC ──
async function oscStatus() {
const r = await apiGet('/api/security/ossec/status');
showResult(r, 'osc-status');
}
async function oscInstall() {
if (!confirm('Install OSSEC? This compiles from source and may take several minutes.')) return;
document.getElementById('osc-status').innerHTML = '<span class="info">Installing OSSEC from source...</span>';
const r = await apiPost('/api/security/ossec/install');
showResult(r, 'osc-status');
}
async function oscUninstall() {
if (!confirm('Uninstall OSSEC? This removes /var/ossec completely.')) return;
const r = await apiPost('/api/security/ossec/uninstall');
showResult(r, 'osc-status');
}
async function oscStart() {
const r = await apiPost('/api/security/ossec/start');
showResult(r, 'osc-control');
}
async function oscStop() {
const r = await apiPost('/api/security/ossec/stop');
showResult(r, 'osc-control');
}
async function oscRestart() {
const r = await apiPost('/api/security/ossec/restart');
showResult(r, 'osc-control');
}
async function oscAlerts() {
const r = await apiGet('/api/security/ossec/alerts');
showResult(r, 'osc-alerts');
}
async function oscAlertsToday() {
const r = await apiGet('/api/security/ossec/alerts-today');
showResult(r, 'osc-alerts');
}
async function oscSyscheck() {
const r = await apiGet('/api/security/ossec/syscheck');
showResult(r, 'osc-syscheck');
}
async function oscActiveResponse() {
const r = await apiGet('/api/security/ossec/active-response');
showResult(r, 'osc-ar');
}
async function oscLog() {
const r = await apiGet('/api/security/ossec/log');
showResult(r, 'osc-log');
}
async function oscConfig() {
const r = await apiGet('/api/security/ossec/config');
showResult(r, 'osc-config');
}
async function oscRules() {
const r = await apiGet('/api/security/ossec/rules');
showResult(r, 'osc-config');
}
async function oscAgents() {
const r = await apiGet('/api/security/ossec/agents');
showResult(r, 'osc-config');
}
// ── ModSecurity ──
async function modStatus() {
const r = await apiGet('/api/security/modsec/status');
showResult(r, 'mod-status');
}
async function modInstall() {
if (!confirm('Install ModSecurity with OWASP CRS?')) return;
document.getElementById('mod-status').innerHTML = '<span class="info">Installing ModSecurity...</span>';
const r = await apiPost('/api/security/modsec/install');
showResult(r, 'mod-status');
}
async function modUninstall() {
if (!confirm('Uninstall ModSecurity? Remember to remove modsecurity directives from nginx configs.')) return;
const r = await apiPost('/api/security/modsec/uninstall');
showResult(r, 'mod-status');
}
async function modEnable() {
const r = await apiPost('/api/security/modsec/enable');
showResult(r, 'mod-mode');
}
async function modDisable() {
const r = await apiPost('/api/security/modsec/disable');
showResult(r, 'mod-mode');
}
async function modNginxStatus() {
const r = await apiGet('/api/security/modsec/nginx-status');
showResult(r, 'mod-mode');
}
async function modAuditLog() {
const r = await apiGet('/api/security/modsec/audit-log');
showResult(r, 'mod-audit');
}
async function modDebugLog() {
const r = await apiGet('/api/security/modsec/debug-log');
showResult(r, 'mod-audit');
}
async function modTest() {
const r = await apiPost('/api/security/modsec/test');
showResult(r, 'mod-audit');
}
async function modRulesList() {
const r = await apiGet('/api/security/modsec/rules');
showResult(r, 'mod-rules');
}
async function modCrsUpdate() {
document.getElementById('mod-rules').innerHTML = '<span class="info">Updating CRS...</span>';
const r = await apiPost('/api/security/modsec/crs-update');
showResult(r, 'mod-rules');
}
async function modRuleDisable() {
const id = document.getElementById('mod-rule-id').value;
if (!id) return;
const r = await apiPost('/api/security/modsec/rule/disable', {rule_id: id});
showResult(r, 'mod-rules');
}
async function modRuleEnable() {
const id = document.getElementById('mod-rule-id').value;
if (!id) return;
const r = await apiPost('/api/security/modsec/rule/enable', {rule_id: id});
showResult(r, 'mod-rules');
}
async function modConfig() {
const r = await apiGet('/api/security/modsec/config');
showResult(r, 'mod-config');
}
async function modCrsConfig() {
const r = await apiGet('/api/security/modsec/crs-config');
showResult(r, 'mod-config');
}
async function modExclusions() {
const r = await apiGet('/api/security/modsec/exclusions');
showResult(r, 'mod-config');
}
// ── AIDE ──
async function aideStatus() {
const r = await apiGet('/api/security/aide/status');
showResult(r, 'aide-status');
}
async function aideInstall() {
if (!confirm('Install AIDE? Database initialization may take a few minutes.')) return;
document.getElementById('aide-status').innerHTML = '<span class="info">Installing AIDE...</span>';
const r = await apiPost('/api/security/aide/install');
showResult(r, 'aide-status');
}
async function aideUninstall() {
if (!confirm('Uninstall AIDE?')) return;
const r = await apiPost('/api/security/aide/uninstall');
showResult(r, 'aide-status');
}
async function aideInit() {
if (!confirm('Re-initialize AIDE database? This overwrites the existing baseline.')) return;
document.getElementById('aide-db').innerHTML = '<span class="info">Initializing database...</span>';
const r = await apiPost('/api/security/aide/init');
showResult(r, 'aide-db');
}
async function aideUpdate() {
document.getElementById('aide-db').innerHTML = '<span class="info">Updating database...</span>';
const r = await apiPost('/api/security/aide/update');
showResult(r, 'aide-db');
}
async function aideCheck() {
document.getElementById('aide-check').innerHTML = '<span class="info">Running integrity check...</span>';
const r = await apiPost('/api/security/aide/check');
showResult(r, 'aide-check');
}
async function aideCompare() {
const r = await apiPost('/api/security/aide/compare');
showResult(r, 'aide-check');
}
async function aideLog() {
const r = await apiGet('/api/security/aide/log');
showResult(r, 'aide-log');
}
async function aideConfig() {
const r = await apiGet('/api/security/aide/config');
showResult(r, 'aide-log');
}
async function aideRules() {
const r = await apiGet('/api/security/aide/rules');
showResult(r, 'aide-log');
}
async function aideSchedStatus() {
const r = await apiGet('/api/security/aide/schedule/status');
showResult(r, 'aide-schedule');
}
async function aideSchedSet() {
const freq = document.getElementById('aide-freq').value;
const r = await apiPost('/api/security/aide/schedule', {schedule: freq});
showResult(r, 'aide-schedule');
}
async function aideSchedRemove() {
const r = await apiPost('/api/security/aide/schedule/remove');
showResult(r, 'aide-schedule');
}
// ── Cowrie ──
async function cowStatus() {
const r = await apiGet('/api/security/cowrie/status');
showResult(r, 'cow-status');
}
async function cowInstall() {
if (!confirm('Install Cowrie honeypot? This will listen on port 2222.')) return;
document.getElementById('cow-status').innerHTML = '<span class="info">Installing Cowrie...</span>';
const r = await apiPost('/api/security/cowrie/install');
showResult(r, 'cow-status');
}
async function cowUninstall() {
if (!confirm('Uninstall Cowrie? This removes /opt/cowrie and the cowrie user.')) return;
const r = await apiPost('/api/security/cowrie/uninstall');
showResult(r, 'cow-status');
}
async function cowStart() {
const r = await apiPost('/api/security/cowrie/start');
showResult(r, 'cow-control');
}
async function cowStop() {
const r = await apiPost('/api/security/cowrie/stop');
showResult(r, 'cow-control');
}
async function cowRestart() {
const r = await apiPost('/api/security/cowrie/restart');
showResult(r, 'cow-control');
}
async function cowSessions() {
const r = await apiGet('/api/security/cowrie/sessions');
showResult(r, 'cow-activity');
}
async function cowTopAttackers() {
const r = await apiGet('/api/security/cowrie/top-attackers');
showResult(r, 'cow-activity');
}
async function cowCredentials() {
const r = await apiGet('/api/security/cowrie/credentials');
showResult(r, 'cow-activity');
}
async function cowDownloads() {
const r = await apiGet('/api/security/cowrie/downloads');
showResult(r, 'cow-activity');
}
async function cowLog() {
const r = await apiGet('/api/security/cowrie/log');
showResult(r, 'cow-log');
}
async function cowLogJson() {
const r = await apiGet('/api/security/cowrie/log-json');
showResult(r, 'cow-log');
}
async function cowConfig() {
const r = await apiGet('/api/security/cowrie/config');
showResult(r, 'cow-config');
}
async function cowPortEnable() {
if (!confirm('Redirect port 22 to Cowrie on 2222? Make sure your real SSH is on a different port!')) return;
const r = await apiPost('/api/security/cowrie/port-redirect', {enable: true});
showResult(r, 'cow-port');
}
async function cowPortDisable() {
const r = await apiPost('/api/security/cowrie/port-redirect', {enable: false});
showResult(r, 'cow-port');
}
// ── Backup ──
async function backupStatus() {
const r = await apiGet('/api/security/backup/list');
showResult(r, 'backup-out');
}
async function backupRun() {
document.getElementById('backup-out').innerHTML = '<span class="info">Running backup... this may take a while</span>';
const r = await apiPost('/api/security/backup/now', {
paths: document.getElementById('bk-paths').value,
encrypt_pass: document.getElementById('bk-pass').value
});
showResult(r, 'backup-out');
}
async function backupSchedule() {
const r = await apiPost('/api/security/backup/schedule', {
paths: document.getElementById('bk-paths').value,
encrypt_pass: document.getElementById('bk-pass').value,
schedule: 'daily',
keep: 7
});
showResult(r, 'backup-out');
}
async function backupRemoveSchedule() {
const r = await apiPost('/api/security/backup/schedule/remove');
showResult(r, 'backup-out');
}
// Load apps on tab switch
document.getElementById('tab-apps').addEventListener('click', loadApps);
</script>
{% endblock %}