Dokumentacja
ONLINE
O projekcie
SecureBox to demonstracja bezpiecznego środowiska uruchomieniowego dla aplikacji webowej. Celem projektu jest zbudowanie kontenera Docker odpornego na typowe wektory ataku, wdrożenie go w klastrze Kubernetes z zachowaniem zasady najmniejszych uprawnień, zautomatyzowanie procesu deploymentu przez Ansible oraz weryfikacja skuteczności zabezpieczeń za pomocą testów penetracyjnych i automatycznego skanowania CVE w pipeline'ie CI/CD.
Docker hardening Kubernetes RBAC Network Policy Ansible IaC Testy penetracyjne Trivy CVE scan GitHub Actions CI/CD OWASP
Parametry kontenera
3.9
MB — rozmiar obrazu
(Alpine Linux)
1001
UID użytkownika
(non-root)
0x0
Linux capabilities
(wszystkie zrzucone)
nginx
1.24
serwer HTTP
(Alpine 3.19)
Weryfikacja zabezpieczeń
Non-root user
Działa jako appuser (UID 1001)
Read-only filesystem
Zapis zablokowany — tylko /tmp przez tmpfs
Capabilities zrzucone
cap_drop: ALL — CapEff: 0000000000000000
Docker socket niedostępny
Brak /var/run/docker.sock w kontenerze aplikacji
TLS / Let's Encrypt
HTTPS via Traefik — certyfikat auto-odnawialny
Resource limits
CPU: 0.5 core max  |  RAM: 128 MB max
no-new-privileges
Zakaz eskalacji uprawnień przez execve
Architektura bezpieczeństwa
1
Docker
Alpine · non-root · read-only FS
Aktywny
2
Kubernetes
RBAC · NetworkPolicy · PodSecurity
Orkiestracja
3
Ansible (IaC)
Host hardening · Deployment · Audyt
Automatyzacja
4
Testy penetracyjne
Nikto · OWASP ZAP · Nmap · docker-bench
Weryfikacja
5
CI/CD (GitHub Actions)
Trivy · Checkov · kubesec · SARIF
Automatyczna kontrola
Nagłówki bezpieczeństwa HTTP
X-Frame-Options DENY
X-Content-Type-Options nosniff
Strict-Transport-Security max-age=31536000; includeSubDomains
Content-Security-Policy default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;
Referrer-Policy strict-origin-when-cross-origin
Permissions-Policy camera=(), microphone=(), geolocation=(), payment=()
Weryfikacja bezpieczeństwa — komendy
# Sprawdź użytkownika kontenera docker exec secure-webapp whoami → appuser # Test read-only filesystem docker exec secure-webapp sh -c "touch /pwned.txt 2>&1" → touch: /pwned.txt: Read-only file system # Sprawdź capabilities docker exec secure-webapp sh -c "cat /proc/1/status | grep Cap" → CapEff: 0000000000000000 # Nagłówki HTTP (dev) curl -I http://localhost:8080
# Uruchom klaster minikube start # Wdróż wszystkie manifesty kubectl apply -f k8s/ # Sprawdź status podów kubectl get pods -n webapp-prod # Test Network Policy (powinno się nie udać) kubectl run attacker --image=alpine -n default -it --rm -- sh wget -q --timeout=5 http://webapp-service.webapp-prod/ → timeout (Network Policy blokuje) # Port-forward do testów kubectl port-forward svc/webapp-service 8080:80 -n webapp-prod
# Instalacja (WSL2) pip3 install ansible ansible-galaxy collection install ansible.posix community.docker kubernetes.core # Wdróż aplikację ansible-playbook -i ansible/inventory/hosts.ini \ ansible/playbooks/03-deploy-app.yml # Hartowanie hosta (wymaga sudo) ansible-playbook -i ansible/inventory/hosts.ini \ ansible/playbooks/01-host-hardening.yml -K # Pełny audyt bezpieczeństwa ansible-playbook -i ansible/inventory/hosts.ini \ ansible/playbooks/05-security-audit.yml
# Skanowanie CVE w obrazie trivy image docker-webapp:latest --severity HIGH,CRITICAL # Skanowanie aplikacji webowej nikto -h http://localhost:8080 # Audyt konfiguracji Docker sudo sh docker-bench-security/docker-bench-security.sh # Skanowanie portów nmap -sV -p 8080 localhost # OWASP ZAP (pasywny scan) docker run -t ghcr.io/zaproxy/zaproxy:stable \ zap-baseline.py -t http://host.docker.internal:8080
# Status stacku produkcyjnego docker compose -f docker/docker-compose.prod.yml ps # Nagłówki HTTPS — powinien zwrócić HTTP/2 200 curl -I https://secure-box.szymonsulejczak.pl → HTTP/2 200 → strict-transport-security: max-age=31536000 # Weryfikacja certyfikatu TLS echo | openssl s_client -connect secure-box.szymonsulejczak.pl:443 2>/dev/null \ | openssl x509 -noout -dates -issuer → issuer=C=US, O=Let's Encrypt # Przekierowanie HTTP → HTTPS (powinno zwrócić 301) curl -I http://secure-box.szymonsulejczak.pl → HTTP/1.1 301 Moved Permanently → Location: https://secure-box.szymonsulejczak.pl/ # Logi Traefik (certyfikat Let's Encrypt) docker logs traefik --tail=50 # Aktualizacja obrazu do najnowszej wersji docker compose -f docker/docker-compose.prod.yml pull docker compose -f docker/docker-compose.prod.yml up -d