9.0 KiB
Security
Overview
SilverLinux hosts critical infrastructure for Silver Solutions.
This document describes the security measures implemented on the server and operational security requirements.
Access Control
SSH Access
SSH access is limited to authorized administrators.
Authentication:
- SSH key authentication
- Password login discouraged
- Root login disabled
Primary user:
ubuntu
Firewall
UFW
UFW is enabled and used as the primary host firewall.
Verified allowed incoming ports from sudo ufw status verbose:
| Port | Purpose |
|---|---|
| 22 | SSH |
| 80 | HTTP |
| 443 | HTTPS |
| 2222 | Gitea Git SSH |
| 10000/udp | Jitsi JVB media |
| 8085 | Explicitly allowed non-standard TCP port |
| 8443 | Explicitly allowed non-standard HTTPS port |
| 8444 | Explicitly allowed non-standard TCP port |
| 8080 | Explicitly allowed non-standard TCP port |
| 32443 | Xray public tunneling endpoint |
Default policy:
- deny incoming
- allow outgoing
- deny routed
All other ports should remain blocked unless explicitly required.
Known runtime-published non-standard ports from the 2026-06-24 Docker snapshot:
| Port | Service | UFW state | Notes |
|---|---|---|---|
| 81 | Nginx Proxy Manager | Not listed as allowed | Admin interface is published by Docker, but not allowed by UFW snapshot |
| 2222 | Gitea | Allowed | Git SSH |
| 32443 | Xray | Allowed | Public tunneling endpoint |
| 5555 | BaGet | Not listed as allowed | Direct HTTP port is published by Docker, but not allowed by UFW snapshot |
| 8000 | Jitsi Web | Not listed as allowed | Direct HTTP port is published by Docker, but not allowed by UFW snapshot |
| 8443 | Jitsi Web | Allowed | Direct HTTPS port |
| 10000/udp | Jitsi JVB | Allowed | Required media bridge traffic |
| 8082 | OpenProject | Not listed as allowed | Direct HTTP port is published by Docker, but not allowed by UFW snapshot |
These ports must either be intentionally allowed and documented in UFW, or blocked at the host firewall if only Nginx Proxy Manager should be public.
UFW also allows 8080, 8085 and 8444, but no matching Docker-published service was identified in the 2026-06-24 Docker snapshot. These rules should be reviewed and removed if they are no longer required.
Intrusion Protection
Fail2Ban
Fail2Ban is enabled.
Purpose:
- Detect brute-force attacks
- Automatically block malicious IP addresses
- Protect SSH access
Planned improvements:
- Upgrade Fail2Ban coverage
- Add CrowdSec for collaborative intrusion detection
- Add Cloudflare rate limiting and WAF for exposed administrative endpoints
Secrets Management
Shared secrets are stored in:
/srv/secrets/company.env
Examples:
- SMTP credentials
- PostgreSQL passwords
- MSSQL SA password
- OpenProject secrets
- Future OAuth secrets
Rules:
- Never commit secrets to Git
- Never share secrets in documentation
- Never hardcode passwords in Docker Compose files
See:
docs/secrets.md
SSL Certificates
SSL certificates are managed through Nginx Proxy Manager.
Certificates are automatically renewed.
All public services should be accessible through HTTPS only.
Public Exposure
Public HTTP and HTTPS services are routed through the proxy Docker network and Nginx Proxy Manager.
Publicly exposed services:
- Gitea
- OpenProject
- Portainer
- DbGate
- Xray
- Jitsi Web
- BaGet
High-sensitivity exposure:
- DbGate exposes a database administration interface and must always require authentication and HTTPS.
- Xray exposes tunneling capability and must be monitored for abuse, unexpected traffic and unauthorized use.
- Portainer exposes Docker management and must be restricted to trusted administrators.
Nginx Proxy Manager findings from the 2026-06-24 proxy-host snapshot:
- No proxy host had an Nginx Proxy Manager access list assigned.
- DbGate was enabled without SSL Force, HTTP/2 or HSTS.
- Gitea, Jitsi Meet and BaGet were enabled without SSL Force.
- Plane.so has been removed from containers, Nginx Proxy Manager and server certificate storage.
cicd.silveressence.netis intentionally enabled as a frequently changing prototype deployment endpoint.exactsyncer.silveressence.netis intentionally enabled as a client-facing Exact Online syncer demo endpoint.
Priority hardening:
- Enable SSL Force for all HTTPS public service routes unless there is a documented exception.
- Add an access list or equivalent restriction for DbGate and Portainer.
- Define explicit exposure and authentication expectations for prototype and demo endpoints.
Email Security
Outgoing email is provided through Gmail SMTP.
Credentials are stored in:
/srv/secrets/company.env
Requirements:
- Use Gmail App Passwords only
- Never store personal account passwords
- Rotate credentials if exposure is suspected
Sender address:
noreply@silveressence.net
Authentication
Current
- Local user accounts
- Strong passwords
Planned
Future OAuth providers:
- Google OAuth2
- GitHub OAuth2
- Authelia SSO for exposed admin areas
Requirements:
- Store client secrets in company.env
- Use least-privilege scopes
- Disable unused authentication providers
Planned protected areas:
- DbGate
- Portainer
- Gitea administrator areas
- OpenProject administrator areas
Disabled
- OpenID authentication
Reason:
OpenID is not required and increases attack surface.
Two-Factor Authentication
Where supported:
- Enable 2FA for administrator accounts
- Encourage 2FA for all users
Priority:
- Gitea administrators
- OpenProject administrators
Database Security
PostgreSQL and Microsoft SQL Server are not exposed publicly.
Database access is restricted to Docker internal networks.
Applications and DbGate communicate with the database containers through the internal Docker network.
DbGate is the public administration entry point and must require authentication and HTTPS. Its web interface is routed through Nginx Proxy Manager; database ports 5432 and 1433 remain private.
Connectivity Layer Security
Xray is classified as a network tunneling and connectivity layer, not as an application service.
Requirements:
- Keep the Xray service isolated from private database networks unless a documented need exists.
- Monitor logs and traffic patterns for abuse.
- Review access policy after configuration changes.
- Keep secrets, UUIDs, keys and endpoint credentials outside the repository.
Docker Security
Services are isolated through Docker containers.
Principles:
- Public services should be exposed only through Nginx Proxy Manager
- Internal services should not expose ports publicly
- Services should communicate through Docker networks
- Containers should run with the minimum required privileges
Networks:
- proxy
- internal
- jitsi-docker-jitsi-meet-aa76415_meet.jitsi
- xray_default
- gitea-runner_default
Network model:
internalis for private database and backend traffic.proxyis for public HTTP and HTTPS services controlled by Nginx Proxy Manager.- Isolated stack networks are used for Jitsi, Xray and CI/CD runner separation.
xray_defaultcurrently exists without a running container attached; the activexraycontainer is attached toproxy.
System Updates
The operating system and containers should be updated regularly.
Recommendations:
- Apply Ubuntu security updates
- Update Docker images periodically
- Remove unused containers and images
- Review security advisories for critical services
Backup Security
Backups must include:
- Configuration files
- Docker Compose files
- Application data
- PostgreSQL databases
- Shared secrets
Backups must never be stored inside public repositories.
Security Review Checklist
Periodically verify:
- SSH keys are current
- Unused accounts are removed
- Fail2Ban is active
- Planned CrowdSec and Cloudflare WAF status is reviewed
- UFW is active
- SSL certificates are valid
- Secrets are not stored in repositories
- Backups are functioning
- Administrator accounts have 2FA enabled
- DbGate login is enforced
- DbGate proxy route has SSL Force and an access restriction policy
- Xray exposure policy is still valid
- Public services are still routed only through Nginx Proxy Manager
- Removed proxy hosts and unused certificates stay removed unless explicitly approved
- Prototype and demo proxy hosts have documented owners and exposure expectations
- Direct host-published ports are intentional or blocked by UFW
- UFW rules
8080,8085and8444still have a documented owner - Review application logs
- Review Docker logs
- Review authentication failures
- Review Fail2Ban bans
Incident Response
If a credential is exposed:
- Rotate the credential immediately.
- Update
/srv/secrets/company.env. - Restart affected services.
- Review logs for unauthorized access.
- Update documentation if required.
Related Documentation
- docs/server.md
- docs/secrets.md
- docs/backups.md
- docs/email.md
- docs/network.md
- docs/roadmap.md
- nginx-proxy-manager/README.md