148 lines
No EOL
8.7 KiB
Markdown
148 lines
No EOL
8.7 KiB
Markdown
# 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@<IP_SERWERA> -p <NOWY_PORT_SSH>
|
|
```
|
|
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. |