Host: 173.249.30.224 (contabo, vmi3245237.contaboserver.net)
OS: Ubuntu 24.04 LTS, kernel 6.8.0-106
Purpose: Brian's second body — XFCE + TigerVNC + noVNC at https://vnc2.jonahtebaa.com/
Verdict: YELLOW (fixable items below are already applied; one medium left = SSH password auth)
22/tcp open ssh
80/tcp open http (redirects to 443)
443/tcp open https (vnc2.jonahtebaa.com)
5901/tcp filtered (blocked by UFW — correct)
6080/tcp filtered (blocked by UFW — correct)
Verdict: GREEN. VNC + websockify are bound to 127.0.0.1 and also UFW-blocked.
ss -tlnp)Xtigervnc -> 127.0.0.1 only. Good.websockify -> 127.0.0.1 only. Good.sshd -> all interfaces.nginx -> all interfaces.22/tcp ALLOW Anywhere
80/tcp ALLOW Anywhere
443/tcp ALLOW Anywhere
Verdict: GREEN.
~/.ssh/authorized_keys.Severity: MEDIUM. Recommend disabling PasswordAuthentication in /etc/ssh/sshd_config once Jonah has the key on his laptop too. Flag PermitRootLogin prohibit-password. Not auto-applied — needs confirmation Jonah has key-only access from his Mac.
notBefore=Apr 20 14:08:03 2026, notAfter=Jul 19 14:08:02 2026.certbot.timer active, next run Apr 21 05:39 CEST.options-ssl-nginx.conf managed by Certbot (TLS 1.2 + 1.3 only, strong ciphers).ssl_dhparam present.Verdict: GREEN.
/etc/fail2ban/jail.d/sshd.local:fail2ban-client status sshd reports jail running.Verdict: GREEN.
systemctl is-enabled unattended-upgrades = enabled).dpkg-reconfigure -f noninteractive unattended-upgrades re-applied defaults.Verdict: GREEN.
Severity: LOW — consider adding HTTP basic auth in front of the websockify proxy for defense-in-depth. Not applied; would break current single-click flow Jonah prefers.
@anthropic-ai/claude-code).Severity: LOW.
ubuntu-8gb-hel1-1 (Hetzner, 100.99.129.102), jonahs-macbook-pro (100.79.172.24), xiaomi-2203121c (100.84.194.110).Severity: MEDIUM (blocker on step 3).
Added to vnc2.jonahtebaa.com vhost:
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' data: blob: wss:; connect-src 'self' wss:;
Plus rate limit on /websockify: limit_req zone=vncws burst=60 nodelay (30 r/s).
Verdict: GREEN.
| Area | Status |
|---|---|
| External ports | GREEN |
| UFW | GREEN |
| TLS / certbot | GREEN |
| fail2ban | GREEN |
| unattended-upgrades | GREEN |
| nginx headers + rate limit | GREEN (applied today) |
| noVNC | GREEN (LOW gap: no front-auth) |
| Claude binaries | LOW (unverified patrickjaja checksum) |
| Tailscale | BLOCKED on auth key |
| SSH password auth | MEDIUM (still enabled) |
Overall: YELLOW. No red items. Two follow-ups:
1. Disable SSH password auth after Jonah confirms key access from his Mac.
2. Complete Tailscale join once authkey provided, then restrict ACL to four known nodes.