Härtung
Das Admin-Konto, Anmeldegrenzen, die Datenbank, Ausdrücke, Jobdaten, die Browser-Richtlinie, optionale Funktionen und Rollenoptionen
- Das Admin-Konto
- Anmeldegrenzen und Passwörter
- Die Datenbank
- Ausdrücke und ausgehende Aufrufe
- Jobdaten
- Die Content-Security-Policy
- Die Einstellungsseiten und der Designer
- Optionale Funktionen
- Rollenoptionen
Das Admin-Konto
Das lokale Admin-Konto wird beim ersten Start aus ADMIN_USERNAME und ADMIN_PASSWORD angelegt, dessen Standard AnsibleForms!123 ist.
- Eine Anmeldung mit dem öffentlich bekannten Standardpasswort
AnsibleForms!123muss es zuerst ändern: Bis dahin beantwortet der Server jede Anfrage außer der Passwortänderung mit403(Codepassword_change_required), und der Browser zeigt eine Seite zum Ändern des Passworts, die sich nicht schließen lässt. Das neue Passwort darf nicht wieder der Standard sein. ADMIN_PASSWORDwird nur beim ersten Anlegen des Kontos gelesen: Setzen Sie vor dem ersten Start einen eigenen Wert.REINIT_ADMIN=1setzt das Passwort bei jedem Start aufADMIN_PASSWORDzurück. Verwenden Sie es nur, um ein verlorenes Passwort wiederherzustellen, entfernen Sie es dann und starten Sie neu.- Setzen Sie zuerst die beiden Hauptgeheimnisse: siehe Geheimnisse und Verschlüsselung.
- Sobald die Anmeldung über LDAP oder SSO funktioniert, behalten Sie den lokalen Admin nur für Notfälle, mit einem langen Passwort in Ihrem Tresor.
Anmeldegrenzen und Passwörter
Das Erraten von Passwörtern wird durch drei Grenzen gebremst. Die Fehlschläge werden in der Datenbank gezählt, sodass jeder App-Knoten dieselben Versuche sieht, und jede Grenze gilt ohne Neustart:
| Variable | Standard | Was sie tut |
|---|---|---|
LOGIN_MAX_FAILURES | 5 | Nach so vielen fehlgeschlagenen Anmeldungen wird ein lokales oder LDAP-Konto für LOGIN_LOCKOUT_MINUTES gesperrt. |
LOGIN_MAX_FAILURES_PER_IP | 30 | Eine Adresse mit so vielen fehlgeschlagenen Anmeldungen innerhalb von LOGIN_LOCKOUT_MINUTES wird bis zum Ende dieses Zeitfensters zurückgehalten: eine Adresse, die viele Konten probiert. |
LOGIN_LOCKOUT_MINUTES | 15 | Wie lange ein Konto gesperrt bleibt, und das Zeitfenster, in dem Fehlschläge gezählt werden. |
AUTH_RATE_LIMIT | 120 | Anfragen pro Minute von einer Adresse, pro App-Knoten, an Anmeldung, Abmeldung, Token-Erneuerung und die Single-Sign-on-Callbacks. |
Ein gesperrtes Konto oder eine zurückgehaltene Adresse erhält 429 mit einem Header Retry-After, bevor ein Passwort geprüft wird, und unabhängig davon, ob das Konto existiert; über AUTH_RATE_LIMIT lautet die Antwort ebenfalls 429. Eine erfolgreiche Anmeldung setzt den Zähler des Kontos zurück, ebenso ein Admin, der das Passwort des Benutzers setzt. 0 schaltet eine Grenze ab; LOGIN_LOCKOUT_MINUTES=0 schaltet sowohl die Sperre als auch die adressbezogene Grenze ab.
LOGIN_MAX_FAILURES_PER_IP und AUTH_RATE_LIMIT zählen pro Client-Adresse: Setzen Sie hinter einem Reverse Proxy TRUST_PROXY, damit die Adresse die des Clients und nicht die des Proxys ist, siehe Client-Adressen.
Ein über die Anwendung gesetztes lokales Passwort, für einen neuen Benutzer, durch einen Admin oder durch Benutzer, die ihr eigenes ändern, muss mindestens PASSWORD_MIN_LENGTH Zeichen haben (standardmäßig 8, 0 prüft keine Länge). Es darf weder der Benutzername noch das öffentlich bekannte Standardpasswort sein. ADMIN_PASSWORD wird nicht geprüft.
Die Datenbank
AnsibleForms hält alle Anmeldedaten und Jobs in seiner MySQL-Datenbank, halten Sie diese Datenbank also vom Netz fern:
- Das docker-compose-Projekt veröffentlicht MySQL auf dem Host (
MYSQLDB_LOCAL_PORT,3306) und wird mit dem root-PasswortAnsibleForms!123ausgeliefert. Entfernen Sie dieses Port-Mapping oder binden Sie es an127.0.0.1, und ändern Sie das Passwort. -
Verbinden Sie sich mit einem eigenen Konto statt mit
root, gesetzt inDB_USERundDB_PASSWORD. Es braucht nur Rechte auf das SchemaAnsibleForms:CREATE USER 'ansibleforms'@'%' IDENTIFIED BY '<password>'; GRANT ALL PRIVILEGES ON `AnsibleForms`.* TO 'ansibleforms'@'%';Das deckt das Anlegen des Schemas (einschließlich
CREATE DATABASE), das Patchen bei Upgrades sowie die Backups und Wiederherstellungen ab, die als derselbe Benutzer laufen: Der Dump wird mit--no-tablespaceserstellt, daher ist kein serverweites Recht wiePROCESSnötig. Ersetzen Sie%wo möglich durch die Adresse der Anwendung. Ein Benutzer mit Rechten auf jede Datenbank, wierootsie hat, macht aus einer Lücke in der Anwendung eine Lücke im gesamten Datenbankserver: Die Seite Status warnt davor in ihrer Prüfung Datenbankbenutzer, und das Protokoll bei jedem Start. - Setzen Sie
ALLOW_SCHEMA_CREATIONauf0, sobald das Schema existiert. Das Anlegen des Schemas löscht zuerst jede Tabelle; mit0können es weder der Bootstrap beim Start noch der Endpunkt/api/v2/schemaausführen.
Ausdrücke und ausgehende Aufrufe
Server-Ausdrücke laufen für jeden angemeldeten Benutzer auf dem Server, daher sind der Sanitizer und die ausgehenden Filter wichtig:
EXPRESSION_SANITIZER:strictoderparanoid, nielegacy, das Benutzer Servercode ausführen lässt.REST_DENIED_HOSTS: Hosts, die REST-Ausdrücke nicht erreichen dürfen, z. B.169.254.169.254,127.0.0.0/8.REST_ALLOWED_HOSTS: Wenn gesetzt, können REST-Ausdrücke nur diese Hosts und Bereiche erreichen. Die Sperrliste gewinnt über sie.
Beide Listen decken nur die REST-Hilfsfunktionen von AnsibleForms selbst ab; Playbooks laufen außerhalb davon und werden nicht gefiltert.
Ab 7.3.0 prüfen die REST-Hilfsfunktionen das Zertifikat des Endpunkts, wie jede andere Verbindung. REST_IGNORE_CERTS=1 schaltet die Prüfung ab: Verwenden Sie es nur für Endpunkte mit selbstsigniertem Zertifikat.
Jobdaten
Extravars und Ausgabe von Jobs werden in der Datenbank gespeichert und jedem angezeigt, der den Job sehen kann:
MASK_EXTRAVARS_REGEX: Extravars, deren Schlüssel passt, werden als********angezeigt. Der Standard istpassword|secret|token; Passwortfelder werden immer maskiert. Erweitern Sie ihn um die Namen, die Ihre Formulare verwenden, zum Beispielpassword|secret|token|apikey|passphrase.EXTRAVARS_USER_FIELDS: kürzt das Objektansibleforms_user, das mit jedem Job gesendet wird und sonst alle Gruppenmitgliedschaften des Benutzers enthält.REGEX_FILTER_JOB_OUTPUTblendet nur geschwätzige Tasks aus; verbergen Sie Geheimnisse mitno_log.
Die Content-Security-Policy
Die Oberfläche wird mit einem Header Content-Security-Policy ausgeliefert, der begrenzt, was eine Seite im Browser laden und ausführen darf:
- Skripte kommen nur von der Anwendung selbst, daher läuft ein in eine Seite eingeschleustes Skript nicht.
- Keine andere Website darf die Oberfläche in einem Frame anzeigen.
- Sie erlaubt, was die Anwendung braucht: lokale Formularausdrücke, die im Browser ausgewertet werden (
'unsafe-eval'), Inline-Styles, Bilder von beliebigen URLs (Formular- und Kategoriebilder) und die Worker des Code-Editors.
CONTENT_SECURITY_POLICY ist standardmäßig 1 und sollte so bleiben. Mit 0 wird die Richtlinie als Content-Security-Policy-Report-Only gesendet: Die Browserkonsole listet auf, was sie blockieren würde, und nichts wird blockiert. Verwenden Sie 0 nur für eine Einrichtung, die noch nicht mit der Richtlinie funktioniert, etwa ein Reverse Proxy, der ein eigenes Skript einschleust. Eine Änderung auf der Einstellungsseite gilt ohne Neustart.
Die Einstellungsseiten und der Designer
Administratoren können einen Großteil der Konfiguration im Browser ändern. Schränken Sie das ein, wo die Konfiguration anderswo liegt:
ALLOW_ENV_EDIT=0: schreibgeschützte Einstellungen, für eine verwaltete Umgebung.SHOW_DESIGNER=0: entfernt den integrierten Designer, wenn Formulare in Git gepflegt werden.
Optionale Funktionen
Diese Funktionen sind standardmäßig aus. Schalten Sie sie nur ein, wenn Sie sie verwenden; eine Änderung auf der Einstellungsseite gilt ohne Neustart:
ENABLE_MCP: stellt den MCP-Server unter/api/v2/mcpbereit, sodass MCP-Clients Formulare mit dem Token eines Benutzers starten können.ENABLE_CHAT: der Chat-Assistent. Formulardefinitionen und die gerade eingegebenen Werte werden an den konfigurierten Modellanbieter gesendet.
LAUNCH_VALIDATION funktioniert umgekehrt: Es ist standardmäßig enforce, daher weist der Server einen Start ab, dessen Werte die Regeln des Formulars verletzen, einschließlich Starts über die REST-API. Lassen Sie es dabei: log protokolliert nur, was abgewiesen würde, und off prüft nichts, siehe Startvalidierung.
Rollenoptionen
Einige Rollenoptionen in config.yaml gewähren mehr, als ihr Name vermuten lässt. Vergeben Sie sie mit Bedacht:
| Option | Warum sie wichtig ist |
|---|---|
allowScheduledJobs | Ein Benutzer mit ihr sieht jeden Zeitplan und kann ihn ändern, und ein Zeitplan läuft mit Admin-Rechten, für jedes Formular. Behandeln Sie sie als Option auf Admin-Ebene. |
allowBackupOps | Umfasst die Wiederherstellung, die die gesamte Datenbank ersetzt. |
showSettings | Öffnet die Administrationsseiten. Ohne die Rolle admin kann sie die Konten und Gruppen, die die Rolle admin nennt, nicht ändern, siehe Benutzer und Gruppen. |
showLogs | Zeigt das Serverprotokoll, das Hostnamen, Benutzernamen und Fehlerdetails enthalten kann. |
showConnectionsSettings | Öffnet die Verbindungsseiten: Anmeldedaten, Runner, Benachrichtigungskanäle und mehr. Das Hinzufügen, Ändern und Löschen von Runnern und Secret Stores bleibt Sache eines Admins, ebenso die Anmeldedaten von Verbindungen und Anmeldungen. Bei einem Repository bleiben das Hinzufügen oder Löschen sowie das Ändern seiner Adresse, seines Branches oder seiner use_for_*-Flags Sache eines Admins. |
showAllJobLogs | Zeigt die Jobs jedes Benutzers, nicht nur die eigenen. |
manageAllJobs | Bricht die Jobs jedes Benutzers ab, löscht sie und startet sie neu. |
allowApiTokens | Lässt den Benutzer API-Token erstellen, die bis zu API_TOKEN_MAX_DAYS (standardmäßig 90) leben. Abmelden mit einem Token oder sein Widerruf beendet es, und eine Passwortänderung beendet alle Token des Benutzers, siehe Token. |
extendedTokenExpiration | Lässt den Benutzer mit allowApiTokens auch API-Token erstellen, die nie ablaufen. |
allowFileUploads | Lässt den Benutzer Dateien über die Dateifelder eines Formulars hochladen. Für jeden Benutzer eingeschaltet, sofern keine Rolle es ausschaltet. |
allowChat, allowMcp | Lassen den Benutzer den Chat-Assistenten und den MCP-Server verwenden, wenn sie eingeschaltet sind. allowChat ist für jeden Benutzer eingeschaltet, sofern keine Rolle es ausschaltet, und allowMcp folgt allowChat, sofern keine Rolle es setzt. |
Ein Benutzer ohne die Rolle admin erhält keine der obigen Optionen auf Admin-Ebene, sofern keine Rolle sie ihm gibt. Setzt die Rolle admin keine Optionen, erhalten ihre Benutzer showSettings, showDesigner, showLogs, showAuditLog, allowBackupOps, allowJobRelaunch, showAllJobLogs, manageAllJobs und allowScheduledJobs. allowApiTokens und extendedTokenExpiration bleiben selbst für die Rolle admin aus: Setzen Sie sie bei den Rollen, die sie brauchen.
Setzen mehrere Rollen eines Benutzers dieselbe Option, gewinnt false. Die Optionen der Rolle default ergänzen nur die Optionen, die keine der eigenen Rollen des Benutzers setzt; sie setzen sie nie außer Kraft.