← Back to homepage
Security Audit
Generated 2026-07-20 07:00 EDT ยท read-only, nothing was changed
I'll load the six audit tool schemas, then run them all read-only.
I'll run all six audit tools now (read-only).
Audit complete โ all six checks ran read-only. Nothing was changed. Prioritized report below.
# Security Audit โ jvrcode droplet (2026-07-20)
## ๐ด CRITICAL
- **`/var/www/wp/wp-config.php` is world-readable** โ WordPress DB credentials exposed to any local user/process. โ `chmod 640` (owner + web group only). *(Fixable via `fix_file_permissions`.)*
## ๐ HIGH
- **6 exposed `.git` directories in web roots** (`jvrcode.com`, `panini-wc2026`, `wp`, `app1`, `threadmarkusa`, `radio`) โ leak full source + history (often creds) if served. โ Add Nginx `location ~ /\.git { deny all; return 404; }`. *(Fixable via `secure_nginx_dotfiles`.)*
- **Flask dev server on port 5000, public (`0.0.0.0`)** โ Werkzeug/dev servers have no auth/TLS and aren't production-hardened. โ Bind to `127.0.0.1` behind Nginx, or `ufw deny 5000`.
## ๐ก MEDIUM
- **Node app on port 3400 listening on all interfaces (`*`)** โ should sit behind the Nginx TLS proxy, not face the internet directly. โ Bind loopback + reverse-proxy; firewall the port.
- **Icecast2 on port 8000, public** โ likely intentional (radio stream), but plaintext and internet-facing. โ Confirm it's meant to be public; otherwise front with Nginx/TLS.
## ๐ข LOW / informational
- **26 package updates pending (0 security).** โ Routine `apt upgrade` at next maintenance window.
- **`jvrcode.com` cert: 31 days left.** Within normal certbot window (renews ~30d out); nothing under the 21-day alert threshold. โ Just confirm `certbot.timer` is active.
- **7,308 failed SSH logins** (top: 141.11.250.228 ร530), targeting `admin`/`ubuntu`/`jvrcode`. Already mitigated โ fail2ban active, password auth off, key-only. No action needed.
- **`.../certifi/cacert.pem` world-readable** โ false positive; it's a public CA bundle, not sensitive.
- **`/var/www/panini-wc2026/.env`** present but not world-readable (0 KB). โ Verify it holds no secrets; keep out of any served path.
## Good posture (no action)
- SSH hardened: `PermitRootLogin prohibit-password`, `PasswordAuthentication no`, X11 forwarding off.
- UFW active, fail2ban active.
- Databases (MySQL 3306/33060, Postgres 5432, gunicorn 8001) correctly loopback-only.
- All TLS certs valid, none expiring within 21 days.
**Top 3 to act on:** (1) lock down `wp-config.php`, (2) block `.git` in Nginx, (3) get the port-5000 Flask app off the public interface.
I made no changes. Want me to save this report to a file, or start on any of the fixes? Each remediation uses a guarded tool (backup + validate + rollback) and will prompt for your confirmation before applying.
--- done: Audit complete โ all six checks ran read-only. Nothing was changed. Prioritized report below.
# Security Audit โ jvrcode droplet (2026-07-20)
## ๐ด CRITICAL
- **`/var/www/wp/wp-config.php` is world-readable** โ WordPress DB credentials exposed to any local user/process. โ `chmod 640` (owner + web group only). *(Fixable via `fix_file_permissions`.)*
## ๐ HIGH
- **6 exposed `.git` directories in web roots** (`jvrcode.com`, `panini-wc2026`, `wp`, `app1`, `threadmarkusa`, `radio`) โ leak full source + history (often creds) if served. โ Add Nginx `location ~ /\.git { deny all; return 404; }`. *(Fixable via `secure_nginx_dotfiles`.)*
- **Flask dev server on port 5000, public (`0.0.0.0`)** โ Werkzeug/dev servers have no auth/TLS and aren't production-hardened. โ Bind to `127.0.0.1` behind Nginx, or `ufw deny 5000`.
## ๐ก MEDIUM
- **Node app on port 3400 listening on all interfaces (`*`)** โ should sit behind the Nginx TLS proxy, not face the internet directly. โ Bind loopback + reverse-proxy; firewall the port.
- **Icecast2 on port 8000, public** โ likely intentional (radio stream), but plaintext and internet-facing. โ Confirm it's meant to be public; otherwise front with Nginx/TLS.
## ๐ข LOW / informational
- **26 package updates pending (0 security).** โ Routine `apt upgrade` at next maintenance window.
- **`jvrcode.com` cert: 31 days left.** Within normal certbot window (renews ~30d out); nothing under the 21-day alert threshold. โ Just confirm `certbot.timer` is active.
- **7,308 failed SSH logins** (top: 141.11.250.228 ร530), targeting `admin`/`ubuntu`/`jvrcode`. Already mitigated โ fail2ban active, password auth off, key-only. No action needed.
- **`.../certifi/cacert.pem` world-readable** โ false positive; it's a public CA bundle, not sensitive.
- **`/var/www/panini-wc2026/.env`** present but not world-readable (0 KB). โ Verify it holds no secrets; keep out of any served path.
## Good posture (no action)
- SSH hardened: `PermitRootLogin prohibit-password`, `PasswordAuthentication no`, X11 forwarding off.
- UFW active, fail2ban active.
- Databases (MySQL 3306/33060, Postgres 5432, gunicorn 8001) correctly loopback-only.
- All TLS certs valid, none expiring within 21 days.
**Top 3 to act on:** (1) lock down `wp-config.php`, (2) block `.git` in Nginx, (3) get the port-5000 Flask app off the public interface.
I made no changes. Want me to save this report to a file, or start on any of the fixes? Each remediation uses a guarded tool (backup + validate + rollback) and will prompt for your confirmation before applying.