Zabezpieczenia
Jak chronione są logowanie, uprawnienia, sekrety i połączenia
- Gdzie działa
- Logowanie
- Uprawnienia
- Przechowywane sekrety
- Dziennik audytu
- W przeglądarce
- Na serwerze
- Połączenia
- Kontenery
Gdzie działa
AnsibleForms jest hostowany samodzielnie, na twojej infrastrukturze, z danymi w utrzymywanej przez ciebie bazie danych.
- Nie ma usługi chmurowej AnsibleForms ani serwera licencji, nie ma też telemetrii ani sprawdzania aktualizacji.
- Interfejs jest serwowany przez samą aplikację i nie ładuje niczego z innych witryn.
- Aplikacja łączy się tylko z systemami skonfigurowanymi przez administratora, wymienionymi w Połączeniach wychodzących.
Elementy i to, co każdy z nich przechowuje:
| Element | Co robi | Co przechowuje |
|---|---|---|
| Aplikacja | Interfejs webowy, REST API, harmonogram | Żadnych własnych danych: wszystko jest w bazie danych |
| MySQL lub MariaDB | Baza danych aplikacji | Użytkowników, grupy, poświadczenia (zaszyfrowane), zadania z ich extravars i wynikiem, dziennik audytu |
| Środowisko uruchomieniowe (RTE) | Uruchamia playbooki, we własnym kontenerze | Pliki uruchamianych zadań, a sekrety zadania tylko w czasie jego działania |
| Folder trwały | Konfiguracja, formularze, playbooki i przesłane pliki | Pliki używane przez formularze i playbooki |
Pełny obraz znajdziesz w Jak to działa, a opis środowiska uruchomieniowego w RTE.
Logowanie
Każda strona i każde wywołanie API, które odczytuje lub zmienia dane, wymaga zalogowanego użytkownika. Nieliczne punkty końcowe dostępne bez logowania obsługują samo logowanie, wersję, nazwę i logo instancji, dokumentację API oraz konfigurację bazy danych przy pierwszym starcie, którą wyłącza ALLOW_SCHEMA_CREATION=0:
| Metoda | Jak działa |
|---|---|
| Konta lokalne | Hasła haszowane bcrypt, minimalna długość, a publiczne domyślne hasło administratora trzeba zmienić przy pierwszym logowaniu |
| LDAP / Active Directory | Katalog sprawdza hasło, a jego grupy są mapowane na role. Zobacz LDAP |
| OpenID Connect, Entra ID | Single sign-on przez twojego dostawcę tożsamości, który zapewnia też własne uwierzytelnianie wieloskładnikowe. Zobacz Uwierzytelnianie |
- Nieudane logowania blokują konto, a logowanie ma limit częstotliwości.
- Logowanie zwraca podpisany token dostępu ważny 30 minut i token odświeżania ważny 24 godziny.
- Tokeny można unieważnić przed wygaśnięciem: wylogowanie, zmiana hasła, zablokowanie użytkownika i odwołanie tokenu API unieważniają je na wszystkich węzłach jednocześnie, zobacz Tokeny.
- AnsibleForms nie ma własnego uwierzytelniania wieloskładnikowego: tam, gdzie jest wymagane, używaj single sign-on.
Uprawnienia
To, co użytkownik może robić, wynika z ról jego grup i jest sprawdzane przez serwer przy każdym żądaniu:
- Role definiuje się w config.yaml: które formularze widzi użytkownik i jakie ma opcje, takie jak projektant, strony ustawień czy zadania innych użytkowników.
- Serwer sprawdza każde uruchomienie względem reguł formularza (jego pól, ich wartości i dostępu użytkownika), także uruchomienia przez REST API, zobacz Weryfikacja uruchomienia.
- Rola administratora z założenia uruchamia dowolny playbook. Pozostałe role dostają tylko to, co zostało przyznane: użytkownik z kilkoma rolami otrzymuje opcję tylko wtedy, gdy żadna z tych ról jej nie odmawia, więc jedna restrykcyjna rola wystarczy, by ją wstrzymać.
Przechowywane sekrety
Hasła, tokeny i klucze są szyfrowane przed zapisaniem do bazy danych:
- Każdy przechowywany sekret, czyli poświadczenia, hasło powiązania LDAP, tokeny runnerów, sekrety klientów single sign-on, adresy webhooków i klucze API, jest szyfrowany algorytmem AES-256 z losowym wektorem inicjalizującym dla każdej wartości, przy użyciu ustawionego przez ciebie
ENCRYPTION_SECRET. - Żadne wywołanie API ani strona ustawień nie pokazuje przechowywanego sekretu, a kopie zapasowe pomijają sekrety główne.
- Sekrety mogą zostać w twoim vaulcie: HashiCorp Vault i CyberArk są odczytywane wtedy, gdy zadanie ich potrzebuje.
- Sekrety zadania docierają do środowiska uruchomieniowego zapieczętowane AES-256-GCM, kluczem wyprowadzonym z jego tokenu.
- Extravars, których nazwa wygląda na sekret, są maskowane w widoku zadania, a pola haseł zawsze, zobacz Dane zadań.
Reszta bazy danych, czyli zadania, ich extravars i wyniki, jest przechowywana bez zmian: chroń ją szyfrowaniem w spoczynku i kontrolą dostępu samej bazy danych, zobacz Baza danych.
Dziennik audytu
Każda zmiana i każda odrzucona próba są rejestrowane:
- Każde utworzenie, zmiana i usunięcie, przez interfejs lub API, trafia do dziennika audytu z użytkownikiem, jego adresem, akcją, obiektem i wynikiem. Rejestrowane są też odmowy i logowania, łącznie z nieudanymi.
- Wartości wyglądające na sekrety są redagowane przed zapisaniem.
- Dziennik jest domyślnie przechowywany 365 dni i można go kopiować do syslog przez UDP, TCP lub TLS.
W przeglądarce
Interfejs jest chroniony przed kodem wstrzykniętym do strony:
- Content-Security-Policy dopuszcza tylko własne skrypty i ramki aplikacji.
- Każda odpowiedź zawiera nagłówki ochronne: nosniff, ochronę przed osadzaniem w ramkach i HSTS przez HTTPS.
- HTML formularzy, teksty pomocy i odpowiedzi czatu są oczyszczane, a wynik zadań jest escapowany.
Na serwerze
Kod obsługujący dane od użytkownika unika klasycznych wstrzyknięć:
- Zapytania do bazy danych przekazują wartości jako parametry, nigdy jako tekst wklejony w zapytanie.
- Polecenia, łącznie z git, są uruchamiane z listy argumentów, nigdy przez powłokę, więc znaki powłoki nic nie robią.
- Wyrażenia serwerowe przechodzą przez sanitizer wyrażeń, a ich wywołania REST przez filtr hostów.
- Serwer MCP, asystent czatu i punkt końcowy metryk są wyłączone, dopóki ich nie włączysz.
Połączenia
Ruch do i z AnsibleForms może być szyfrowany od końca do końca:
- Aplikacja sama serwuje HTTPS lub działa za twoim reverse proxy.
- Środowisko uruchomieniowe komunikuje się z aplikacją przez WebSocket,
wss://przy adresie HTTPS, a aplikacja przypina certyfikat środowiska przychodzącego, zobacz Tryby RTE. - LDAP, single sign-on, runnery, git, magazyny sekretów i wywołania REST wyrażeń sprawdzają certyfikat serwera, z którym się łączą, chyba że administrator wyłączy to sprawdzanie dla serwera z certyfikatem samopodpisanym.
Połączenia wychodzące
AnsibleForms łączy się tylko z tym, co skonfiguruje administrator:
| Połączenie | Kiedy |
|---|---|
| LDAP, OpenID Connect, Entra ID (logowanie Microsoft i Graph) | Gdy skonfigurowano tę metodę logowania |
| AWX / AAP / Ascender, Semaphore, Rundeck, Jenkins | Gdy formularz działa na tym runnerze |
| Serwery git | Gdy skonfigurowano repozytorium |
| Serwer poczty, Slack, Teams, Telegram, webhooki | Gdy skonfigurowano kanał powiadomień |
| HashiCorp Vault, CyberArk | Gdy skonfigurowano magazyn sekretów |
| Dostawca modeli (Anthropic, OpenAI i inni) | Tylko przy włączonym asystencie czatu, który domyślnie jest wyłączony |
| Hosty i API wskazane w formularzach | Gdy wywołują je wyrażenia formularza lub playbook |
| Serwery syslog | Gdy skonfigurowano przekazywanie audytu lub logów |
Kontenery
Obrazy są budowane tak, aby działały z jak najmniejszymi uprawnieniami:
- Aplikacja i środowisko uruchomieniowe działają jako nieuprzywilejowany użytkownik
node, a nie jako root. - Są zbudowane na odchudzonych obrazach Debiana przypiętych przez digest, zobacz Bezpieczne wytwarzanie.
- Aplikacja nasłuchuje na jednym porcie, 8000.
Kroki zabezpieczania nowej instancji opisuje Utwardzanie.