150 lines
5.2 KiB
Bash
150 lines
5.2 KiB
Bash
#!/usr/bin/env bash
|
|
# ==============================================================================
|
|
# TheCr3w-dev — Stage 0 Infrastructure Discovery Script (READ-ONLY)
|
|
# ==============================================================================
|
|
# Cel: Zebranie podstawowych, bezpiecznych (read-only) informacji o stanie VPS,
|
|
# kontenerach Docker, sieciach, Caddy oraz usługach.
|
|
#
|
|
# ZASADA BEZPIECZEŃSTWA:
|
|
# Skrypt NIE modyfikuje żadnych plików, NIE zatrzymuje kontenerów, NIE zbiera
|
|
# haseł, tokenów, kluczy prywatnych ani plików .env.
|
|
# ==============================================================================
|
|
|
|
set -o pipefail
|
|
|
|
OUT_FILE="thecr3w_discovery_report_$(date +%Y%m%d_%H%M%S).txt"
|
|
exec > >(tee -a "${OUT_FILE}") 2>&1
|
|
|
|
echo "=============================================================================="
|
|
echo " THECR3W-DEV — AUDYT INFRASTRUKTURY (STAGE 0: READ-ONLY)"
|
|
echo " Data wykonania: $(date -u '+%Y-%m-%d %H:%M:%S UTC')"
|
|
echo "=============================================================================="
|
|
|
|
echo ""
|
|
echo "--- 1. SYSTEM OPERACYJNY I ZASOBY HOSTA ---"
|
|
echo "[OS Release]"
|
|
if command -v lsb_release &>/dev/null; then
|
|
lsb_release -a
|
|
elif [ -f /etc/os-release ]; then
|
|
cat /etc/os-release
|
|
else
|
|
uname -a
|
|
fi
|
|
|
|
echo ""
|
|
echo "[Kernel]"
|
|
uname -r
|
|
|
|
echo ""
|
|
echo "[Pamięć RAM i Swap]"
|
|
free -h
|
|
|
|
echo ""
|
|
echo "[Dysk / Przestrzeń magazynowa]"
|
|
df -hT -x tmpfs -x devtmpfs -x overlay
|
|
|
|
echo ""
|
|
echo "[Uptime i obciążenie]"
|
|
uptime
|
|
|
|
echo ""
|
|
echo "--- 2. DOCKER & DOCKER COMPOSE ---"
|
|
if command -v docker &>/dev/null; then
|
|
echo "[Docker Version]"
|
|
docker --version
|
|
|
|
echo ""
|
|
echo "[Docker Info - Storage & Security]"
|
|
docker info --format 'ServerVersion: {{.ServerVersion}}, StorageDriver: {{.Driver}}, CgroupDriver: {{.CgroupDriver}}, RootDir: {{.DockerRootDir}}'
|
|
|
|
echo ""
|
|
echo "[Aktywne i zatrzymane kontenery]"
|
|
docker ps -a --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
|
|
|
|
echo ""
|
|
echo "[Sieci Docker]"
|
|
docker network ls
|
|
|
|
echo ""
|
|
echo "[Wolumeny Docker]"
|
|
docker volume ls
|
|
else
|
|
echo "UWAGA: Polecenie 'docker' nie jest dostępne w PATH."
|
|
fi
|
|
|
|
echo ""
|
|
echo "[Docker Compose]"
|
|
if docker compose version &>/dev/null; then
|
|
docker compose version
|
|
elif command -v docker-compose &>/dev/null; then
|
|
docker-compose --version
|
|
else
|
|
echo "Docker Compose nie został wykryty."
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- 3. REVERSE PROXY — CADDY ---"
|
|
if docker ps --format '{{.Names}}' | grep -q "^caddy$"; then
|
|
echo "Kontener 'caddy': ZNALEZIONY i URUCHOMIONY."
|
|
echo "[Caddy Image]: $(docker inspect caddy --format '{{.Config.Image}}')"
|
|
echo "[Caddy Networks]: $(docker inspect caddy --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}} {{end}}')"
|
|
echo "[Caddy Mounts / Volumes]:"
|
|
docker inspect caddy --format '{{range .Mounts}}{{.Type}} -> Source: {{.Source}} | Dest: {{.Destination}} | RW: {{.RW}}{{"\n"}}{{end}}'
|
|
else
|
|
echo "Kontener o nazwie 'caddy' NIE jest aktualnie uruchomiony."
|
|
docker ps -a --filter "name=caddy" --format "table {{.Names}}\t{{.Status}}"
|
|
fi
|
|
|
|
echo ""
|
|
echo "[Weryfikacja /opt/proxy/Caddyfile]"
|
|
if [ -f "/opt/proxy/Caddyfile" ]; then
|
|
echo "Plik /opt/proxy/Caddyfile istnieje."
|
|
echo "--- Fragment reguł (zanonimizowany, pierwsze 60 linii bez sekretów) ---"
|
|
# Wyświetlamy strukturę bloków domenowych bez ewentualnych wrażliwych nagłówków/haseł
|
|
grep -E '^[a-zA-Z0-9\.\_\:\-]+[[:space:]]*\{|reverse_proxy|import|tls' /opt/proxy/Caddyfile || head -n 40 /opt/proxy/Caddyfile
|
|
else
|
|
echo "Plik /opt/proxy/Caddyfile NIE istnieje w tej ścieżce."
|
|
echo "Wyszukiwanie Caddyfile w standardowych lokalizacjach:"
|
|
find /opt /etc -maxdepth 3 -name "Caddyfile" 2>/dev/null || true
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- 4. HISTORYCZNY KONTENER 'app-app-1' ---"
|
|
if docker ps -a --format '{{.Names}}' | grep -q "^app-app-1$"; then
|
|
echo "Kontener 'app-app-1' znaleziony:"
|
|
docker inspect app-app-1 --format 'Image: {{.Config.Image}}, Status: {{.State.Status}}, Created: {{.Created}}'
|
|
else
|
|
echo "Kontener 'app-app-1' nie istnieje."
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- 5. PORTY NASŁUCHUJĄCE NA HOŚCIE (LSOF / SS) ---"
|
|
if command -v ss &>/dev/null; then
|
|
ss -tulpn | grep -E ':(80|443|22|5432|8080|3000|9000)' || ss -tulpn
|
|
elif command -v netstat &>/dev/null; then
|
|
netstat -tulpn
|
|
fi
|
|
|
|
echo ""
|
|
echo "--- 6. WERYFIKACJA SIECIOWA DOMEN Z POZIOMU VPS (DNS & HTTP) ---"
|
|
DOMAINS=("thecr3wnet.com" "login.thecr3wnet.com" "git.thecr3wnet.com" "app.thecr3wnet.com" "download.thecr3wnet.com")
|
|
|
|
for d in "${DOMAINS[@]}"; do
|
|
echo "[$d]"
|
|
if command -v dig &>/dev/null; then
|
|
echo " DNS A: $(dig +short "$d" | tr '\n' ' ')"
|
|
elif command -v host &>/dev/null; then
|
|
host "$d" | head -n 2
|
|
fi
|
|
# Sprawdzenie odpowiedzi HTTP z nagłówkami
|
|
HTTP_STATUS=$(curl -k -s -o /dev/null -w "%{http_code}" --connect-timeout 3 "https://$d" 2>/dev/null || echo "CONNECT_FAIL")
|
|
echo " HTTPS Status: $HTTP_STATUS"
|
|
done
|
|
|
|
echo ""
|
|
echo "=============================================================================="
|
|
echo " AUDYT ZAKOŃCZONY."
|
|
echo " Wynik zapisano w pliku: ${OUT_FILE}"
|
|
echo " Przejrzyj plik, upewnij się, że nie ma w nim sekretów, i przekaż wyniki."
|
|
echo "=============================================================================="
|
|
|