diff --git a/README.md b/README.md index 5b7c76a..447ef73 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,148 @@ -# autoscript +# AutoScript - Zautomatyzowana Konfiguracja Serwera +## 1. Przegląd + +Ten projekt zawiera kompleksowy skrypt `start.sh`, który automatyzuje proces konfiguracji i zabezpieczania nowego serwera opartego na systemie Debian (lub jego pochodnych, jak Ubuntu). Skrypt instaluje niezbędne oprogramowanie, wzmacnia zabezpieczenia systemu (hardening) i wdraża środowisko aplikacyjne oparte na kontenerach Docker. + +Jest to idealne rozwiązanie do szybkiego przygotowania serwera deweloperskiego lub produkcyjnego, z gotowym do użycia reverse proxy (Traefik) oraz pełnym stosem monitoringu (Prometheus, Grafana). + +## 2. Główne Funkcje + +- **Automatyzacja:** Uruchom jeden skrypt, aby w pełni przygotować serwer. +- **Zabezpieczenia (Hardening):** + - Konfiguracja firewalla `UFW`. + - Wzmocnienie zabezpieczeń SSH (zmiana portu, blokada logowania roota, autoryzacja kluczem). + - Tworzenie dedykowanego użytkownika `admin` z uprawnieniami `sudo` i weryfikacją dwuetapową (TOTP). + - Instalacja i konfiguracja `CrowdSec` (system zapobiegania włamaniom). + - Wdrożenie podstawowych zabezpieczeń jądra systemu. +- **Środowisko Docker:** + - Instalacja i konfiguracja Docker Engine z najlepszymi praktykami (m.in. `userns-remap`). + - Wdrożenie `Traefik` jako reverse proxy z automatycznym generowaniem certyfikatów SSL/TLS od Let's Encrypt (przy użyciu Cloudflare DNS). +- **Monitoring i Alerty:** + - Wdrożenie `Prometheus` do zbierania metryk. + - Wdrożenie `Grafana` do wizualizacji danych z gotową konfiguracją. + - Wdrożenie `Alertmanager` do wysyłania powiadomień o anomaliach (e-mailem). + - Wdrożenie eksporterów metryk (`node-exporter`, `cAdvisor`, `blackbox-exporter`). +- **Zarządzanie Sekretami:** + - Bezpieczne zarządzanie hasłami i kluczami API przy użyciu `sops` i `age`, bez przechowywania ich w formie jawnego tekstu. + +## 3. Wymagania Wstępne + +Zanim uruchomisz skrypt, upewnij się, że posiadasz: + +1. **Nowy serwer** z systemem operacyjnym Debian lub Ubuntu. +2. **Dostęp do konta `root`** na tym serwerze. +3. **Domenę internetową** zarządzaną przez **Cloudflare**. +4. **Klucz API Cloudflare** z uprawnieniami do edycji strefy DNS (`DNS:Edit`). Możesz go wygenerować w panelu Cloudflare: `My Profile > API Tokens > Create Token`. +5. **Publiczny klucz SSH** (np. zawartość pliku `~/.ssh/id_ed25519.pub`), który zostanie użyty do autoryzacji nowego użytkownika `admin`. + +## 4. Konfiguracja + +Skrypt jest konfigurowany za pomocą zmiennych środowiskowych. + +### Zmienne Wymagane + +Musisz ustawić te zmienne przed uruchomieniem skryptu: + +- `PUBLIC_KEY`: Twój publiczny klucz SSH. + ```bash + # Przykład + export PUBLIC_KEY='ssh-ed25519 AAAA... twoja_nazwa@twoj_komputer' + ``` +- `CF_DNS_API_TOKEN`: Twój token API od Cloudflare. + ```bash + # Przykład + export CF_DNS_API_TOKEN='AbCdEfGhIjKlMnOpQrStUvWxYz1234567890' + ``` + +### Zmienne Opcjonalne + +Możesz dostosować działanie skryptu, ustawiając poniższe zmienne (mają one wartości domyślne): + +- `PRIMARY_DOMAIN`: Twoja główna domena (np. `mojadomena.com`). Domyślnie: `orzech.me`. +- `ADMIN_EMAIL`: Adres e-mail do powiadomień (np. od Let's Encrypt, Alertmanager). Domyślnie: `admin@orzech.me`. +- `TIMEZONE`: Strefa czasowa serwera. Domyślnie: `Europe/Warsaw`. +- `ALERT_SMTP_...`: Zmienne do konfiguracji serwera SMTP do wysyłania alertów. +- `*_VER`: Wersje obrazów Docker (np. `TRAEFIK_VER`). Pozwala na przypięcie konkretnych wersji oprogramowania. + +## 5. Użycie + +1. Sklonuj to repozytorium na swój lokalny komputer lub bezpośrednio na serwer. +2. Przejdź do folderu projektu: `cd autoscript`. +3. Ustaw **wymagane** zmienne środowiskowe (patrz punkt 4). + ```bash + export PUBLIC_KEY='...' + export CF_DNS_API_TOKEN='...' + ``` +4. Opcjonalnie ustaw inne zmienne, aby nadpisać wartości domyślne. + ```bash + export PRIMARY_DOMAIN='twojadomena.pl' + export ADMIN_EMAIL='admin@twojadomena.pl' + ``` +5. Uruchom skrypt z uprawnieniami `root`. + ```bash + sudo ./start.sh + ``` +6. Skrypt wykona wszystkie kroki automatycznie. Proces może potrwać kilka minut. + +## 6. Co robić po zakończeniu skryptu? + +Po pomyślnym wykonaniu skryptu, twoje środowisko jest gotowe, ale musisz wiedzieć o kilku ważnych zmianach: + +1. **Nowy Port SSH:** Port SSH został zmieniony na losowy numer z zakresu 10000-65535. **Znajdziesz go w pliku `/root/ssh_port.txt`**. + ```bash + # Zaloguj się na serwerze jako root i wykonaj: + cat /root/ssh_port.txt + ``` +2. **Logowanie na serwer:** + - Logowanie na konto `root` jest **zablokowane**. + - Możesz zalogować się tylko jako użytkownik `admin` przy użyciu podanego klucza SSH i nowego portu. + ```bash + ssh admin@ -p + ``` +3. **Konfiguracja Weryfikacji Dwuetapowej (TOTP):** + - Przy pierwszej próbie użycia `sudo` przez użytkownika `admin` (np. `sudo ls /root`), zostaniesz poproszony o skonfigurowanie TOTP. + - W terminalu wyświetli się **kod QR**. Zeskanuj go aplikacją do uwierzytelniania (np. Google Authenticator, Authy). + - Zapisz wyświetlone kody zapasowe w bezpiecznym miejscu! +4. **Dostęp do Usług:** + Wdrożone usługi będą dostępne pod subdomenami Twojej `PRIMARY_DOMAIN`: + - **Prometheus:** `https://prometheus.twojadomena.pl` + - **Grafana:** `https://grafana.twojadomena.pl` + - **Alertmanager:** `https://alertmanager.twojadomena.pl` + - **Traefik Dashboard:** Domyślnie nie jest publicznie dostępny. Aby go udostępnić, musiałbyś dodać odpowiednią regułę routingu w plikach konfiguracyjnych Traefik. + +5. **Hasła i Sekrety:** + - Hasło administratora Grafany jest generowane automatycznie. + - Wszystkie sekrety są zaszyfrowane w folderze `/opt/services/` przy użyciu `sops`. Aby je odczytać lub edytować, musisz użyć `sops` bezpośrednio na serwerze, np.: + ```bash + # To polecenie odszyfruje i wyświetli plik w edytorze + sudo sops /opt/services/monitoring/secrets/monitoring.env.sops + ``` + +## 7. Szczegółowy Opis Działania Skryptu + +Skrypt `start.sh` składa się z szeregu funkcji, które są wywoływane po kolei. + +- `ensure_root`: Sprawdza, czy skrypt jest uruchamiany z uprawnieniami `root`. +- `install_node_and_gemini`: Instaluje Node.js oraz Gemini CLI. +- `install_base_tools`: Instaluje podstawowe pakiety systemowe, takie jak `ufw` (firewall), `jq` (przetwarzanie JSON), `sops` (zarządzanie sekretami), `age` (szyfrowanie), `aide` (monitorowanie integralności plików) oraz `CrowdSec` (ochrona przed atakami). +- `bootstrap_sops`: Inicjalizuje konfigurację `sops` z kluczem `age`, który będzie używany do szyfrowania wszystkich sekretów. +- `create_admin_user`: Tworzy nowego użytkownika `admin`, dodaje go do grupy `sudo`, konfiguruje logowanie za pomocą klucza SSH i wymusza użycie weryfikacji dwuetapowej (TOTP) przy użyciu `sudo`. +- `harden_ssh`: Zabezpiecza serwer SSH: generuje nowe klucze hosta, blokuje logowanie na konto `root` i za pomocą hasła, zmienia domyślny port na losowy i ogranicza dostęp tylko do autoryzowanych grup. +- `configure_firewall`: Konfiguruje zaporę sieciową `UFW`, otwierając tylko niezbędne porty (nowy port SSH, HTTP, HTTPS, poczta, etc.) i blokując resztę. Dodaje również reguły chroniące kontenery Docker. +- `system_baseline`: Wprowadza zmiany w konfiguracji jądra systemowego w celu poprawy bezpieczeństwa i wydajności. Konfiguruje trwałe logi `journald` oraz automatyczne aktualizacje (`unattended-upgrades`). +- `install_docker`: Instaluje silnik Docker oraz wtyczkę `docker-compose`. Konfiguruje go zgodnie z zaleceniami bezpieczeństwa, m.in. włączając izolację przestrzeni nazw użytkowników (`userns-remap`). +- `prepare_secrets`: Przygotowuje wszystkie potrzebne sekrety (token Cloudflare, hasło do Grafany, hasło do SMTP) i szyfruje je za pomocą `sops`, aby nie były przechowywane na dysku jako jawny tekst. +- `deploy_traefik`: Wdraża kontener z Traefikiem. Konfiguruje go do obsługi ruchu HTTP/HTTPS, automatycznego przekierowywania na HTTPS oraz zamawiania certyfikatów SSL od Let's Encrypt. +- `deploy_monitoring`: Wdraża pełny stos monitoringu, w tym: + - **Prometheus:** do zbierania danych. + - **Grafana:** do ich wizualizacji. + - **Alertmanager:** do wysyłania alertów. + - **Exportery:** `node-exporter` (metryki systemu), `cAdvisor` (metryki kontenerów), `blackbox-exporter` (monitorowanie dostępności stron). + +## 8. Plik `.gitattributes` + +``` +* text=auto +``` +Ta linia w pliku `.gitattributes` jest ważna dla spójności projektu. Nakazuje ona systemowi Git automatyczne zarządzanie znakami końca linii w plikach tekstowych. Dzięki temu unikniesz problemów, jeśli będziesz pracować nad projektem na różnych systemach operacyjnych (np. Windows i Linux), które używają różnych standardów dla końca linii. \ No newline at end of file