Dokumentation
Initihooks - Systeminitialisierung, Konfiguration und Preseeding
Wir wollen diese Dokumentation auf dem neuesten Stand halten, aber die Inithooks Dokumentationsquelle (auf GitHub) sollte immer auf dem neuesten Stand sein.
Einleitung
Bevor wir ein TurnKey-System einem feindlichen Internet aussetzen, müssen wir es zuerst initialisieren. Dadurch werden Passwörter eingerichtet, Sicherheitsupdates installiert und die Einstellungen der wichtigsten Anwendungen konfiguriert.
Dieser Initialisierungsprozess kann interaktiv oder nicht interaktiv sein, je nachdem, was am besten funktioniert, wenn man bedenkt, wo und wie das System eingesetzt wird.
Interaktive Systeminitialisierung
Ein Konfigurationsassistent zeigt eine kurze Abfolge einfacher Textdialoge, die primitiv aussehen, aber einen schnellen Schritt-für-Schritt-Prozess bieten, der überall funktioniert und nur die nackten Elemente erfordert. Minimum an Softwareabhängigkeiten - ein großer Vorteil für sicherheitssensible Anwendungen:

Alle Software ist potenziell fehlerhaft, aber wir können das Risiko minimieren, indem wir absichtlich Einfachheit gegenüber schickem Augenschmaus bevorzugen.
Die Konfigurationsdialoge laufen an einer von zwei Stellen:
Die Boot-Konsole beim ersten Boot auf Build-Typen (z. B. ISO, VM, VMDK), bei denen die reale oder virtuelle Maschine normalerweise Zugriff auf eine interaktive Systemkonsole bietet.
Das erste Administration Login auf Build-Typen, die Kopflos virtuelle Maschinen (z. B. AWS-Marktplatz, OpenStack, Xen), die nicht die Möglichkeit bieten, zum Startzeitpunkt mit dem System zu interagieren.
Nach dem Booten leitet ein virtueller Zaun Versuche, auf potenziell anfällige Dienste zuzugreifen, auf eine Webseite um, auf der erklärt wird, wie SSH zum ersten Mal in die Maschine eingeschaltet wird, um die System. Nach der Initialisierung fällt der virtuelle Zaun herunter und alle Dienste können normal aufgerufen werden.
Nicht-interaktive Systeminitialisierung
Die TurnKey Hub Die Bereitstellung wird optimiert, indem die Systeminitialisierungseinstellungen mit Werten vorab festgelegt werden, die der Benutzer vor dem Starten einer Instanz über die Cloud-Bereitstellungs-Web-App des Hubs bereitstellt.
Das bedeutet, dass das System beim ersten Booten nicht über Textdialoge mit dem Benutzer interagieren muss.
Preseeding ist gut dokumentiert und kann von anderen Hosting-Anbietern oder privaten Clouds in ähnlicher Weise verwendet werden, um die Bereitstellung zu rationalisieren.
Unter der Haube: alles, was Sie wissen wollten, aber Angst hatten, zu fragen
Stop! Die vorhergehende Einführung erklärte alles, was Sterbliche über den Systeminitialisierungsprozess wissen müssen.
Der Rest der Dokumentation ist bestimmt für:
Appliance-Hacker möchten lernen, wie TurnKey unter der Haube funktioniert und eigene Konfigurationshaken entwickeln.
Experten-Benutzer, die verstehen wollen, wie die Systeminitialisierung in der Tiefe funktioniert.
Hosting-Anbieter und Fullstack-Ninjas aus der privaten Cloud sind an einer engen Integration zwischen TurnKey und benutzerdefinierten Bedienfeldern interessiert.
Dies ist keine Voraussetzung, nur ein Bonus. Ohne spezielle Integration können TurnKey-Bilder wie jedes andere Debian- oder Debian-basierte Bild mit Ihren vorhandenen Bereitstellungsskripten bereitgestellt werden. Wenn Sie Debian oder Ubuntu bereitstellen können, sollte es trivial sein, TurnKey bereitzustellen.
Inithooks Paketdesign-Ziele
Das inithooks-Paket führt Systeminitialisierungsskripte aus, die:
- Wiederherstellen von geheimen Schlüsseln (z. B. SSH, Standard-SSL-Zertifikat): Das ist nicht nur eine gute Idee, es ist notwendig, den Mann in der Mitte Angriffe zu vermeiden.
- Passwörter festlegen (z. B. root, Datenbank, Anwendung): notwendig, um das Risiko von fest verdrahtete Standardpasswörter
- Konfigurieren Sie grundlegende Anwendungseinstellungen (z. B. Domain, Admin-E-Mail): Besonders nützlich bei der Konfiguration der Anwendung würde erfordern, das Format einer Konfigurationsdatei zu jagen.
Inithooks bietet auch einen Pre-Seeding-Mechanismus, der es einfach macht, TurnKey mit benutzerdefinierten Bedienfeldern zu integrieren, die von verschiedenen Virtualisierungslösungen und Cloud bereitgestellt werden. Hosting-Anbieter.
Wie es funktioniert
Inithooks selbst ist so generisch und barebones wie möglich, so dass der Großteil der Funktionalität bis zu den Appliance-spezifischen "Hook" -Skripten selbst,
Diese Skripte befinden sich in zwei Unterverzeichnissen unter /usr/lib/inithooks - everyboot.d und firstboot.d.
Das bedeutet, dass ein Skript namens 1-foo vor 2-bar ausgeführt wird, das wiederum vor 3-foobar ausgeführt wird. Deshalb haben Skripte in diesen Verzeichnissen am Anfang lustige Zahlen.
Das inithooks-Top-Level-Init-Script wird bereits früh in der Systeminitialisierung, auf Runlevel 2 15, ausgeführt, was die Konfiguration des Systems vor dem Start der meisten Dienste ermöglicht. Dies sollte bei der Entwicklung von Hook-Skripten berücksichtigt werden.
firstboot.d Skripte
Skripte im firstboot.d-Unterverzeichnis werden unter folgenden Bedingungen ausgeführt:
Wenn der Benutzer "turnkey-init" von einer Root-Shell aus ausführt, kann dieser Befehl verwendet werden, um den firstboot.d inithooks interaktiv erneut auszuführen, um den Appliance bei Bedarf neu zu konfigurieren. Bestimmte Skripte, wie z. B. solche, die geheime Schlüssel regenerieren, werden übersprungen.
Wenn sich der Benutzer zum ersten Mal als root in ein Headless-System einloggt, wird "turnkey-init" ausgeführt, so dass der Benutzer die Appliance-Initialisierung interaktiv abschließen kann.
Wenn ein TurnKey Appliance zum ersten Mal bootet
inithooks prüft, ob dies der erste Boot ist oder nicht, indem er den Wert des RUN_FIRSTBOOT-Flags in /etc/default/inithooks. überprüft Wenn der Wert falsch ist, werden die Skripte ausgeführt und die Flagge auf true umgeschaltet.
Die Firstboot-Skripte können je nach Build-Typ in einem von zwei Modi, interaktiv oder nicht interaktiv, ausgeführt werden.
Interaktiver Modus auf nicht-kopflosen Builds - Live CD ISO, VMDK und OVF: Mit diesen Bildtypen wird ein interaktiver Zugriff auf die virtuelle Konsole während des Bootens erwartet, so dass einige der inithooks-Initialisierungsskripte mit dem Benutzer über Text interagieren. Dialoge beim ersten Booten des Systems (z. B. Abfrage von Passwörtern, Anwendungseinstellungen usw.) Dies sind die gleichen Skripte, die ausgeführt werden, wenn Sie "turnkey-init" ausführen.
Nicht-interaktiver Modus bei Headless Builds - OpenStack, OpenVZ, OpenNode, Xen: Mit diesen Bildtypen kann beim Booten nicht von einem interaktiven Zugriff auf die virtuelle Konsole ausgegangen werden. Der erste Boot muss in der Lage sein, nicht interaktiv zu laufen, sonst riskieren wir, den Boot zu hängen, während er auf Benutzerinteraktion wartet, die niemals stattfindet.
Anstatt mit dem Benutzer zu interagieren, initialisiert das System die Anwendungseinstellungen mit Dummy-Standards vor und setzt alle Passwörter auf einen zufälligen Wert. Wenn ein Root-Passwort bereits festgelegt wurde (z. B. in einem Pre-Deployment-Skript), wird das Headless-Preseeding-Skript es nicht überschreiben, sodass Ihr Root-Passwort gut funktionieren sollte.
Die Ausgabe des nicht-interaktiven Ausführens der Firstboot-Skripte wird auf /var/log/inithooks.log. protokolliert
Die interaktive Appliance-Konfiguration verzögert sich, bis sich der Benutzer zum ersten Mal als root anmeldet. Dies wird mit Hilfe des /usr/lib/inithooks/firstboot.d/29preseed-Hooks erreicht, der nur auf Headless Builds existiert:
#!/bin/bash -e # generic preseeding of inithooks.conf if it doesn't exist [ -e $INITHOOKS_CONF ] && exit 0 MASTERPASS=$(mcookie | cut --bytes 1-8) cat>$INITHOOKS_CONF<<EOF export ROOT_PASS=$MASTERPASS export DB_PASS=$MASTERPASS export APP_PASS=$MASTERPASS export APP_EMAIL=admin@example.com export APP_DOMAIN=DEFAULT export HUB_APIKEY=SKIP export SEC_ALERTS=SKIP export SEC_UPDATES=FORCE EOF chmod +x /usr/lib/inithooks/firstboot.d/30turnkey-init-fence
Initialisierungszaun: Der obige Headless-Vorsegel aktiviert auch den "Initialisierungszaun"-Mechanismus, der IPtables verwendet, um Versuche, auf den lokalen Webserver zuzugreifen, auf ein statisches Web umzuleiten Seite von inithooks/bin/simplehttpd.py.
Auf dieser Seite wird erklärt, dass Sie sich zuerst als root anmelden müssen, um die Initialisierung des Systems abzuschließen. Der Zweck des Zauns wird verwendet, um Benutzer am Zugriff auf uninitialisierte Webanwendungen zu hindern, die in einigen Fällen ein Sicherheitsrisiko darstellen können.
Nachdem sich der Benutzer als root angemeldet hat und den Initialisierungsprozess abgeschlossen hat, wird der "Initialisierungszaun" ausgeschaltet. Benutzer können dann auf Anwendungen zugreifen, die auf dem lokalen Webserver ausgeführt werden.
Was firstboot.d/30turnkey-init-fence tut:
turnkey-init-fence als Dienst aktiviert und startet ihn
Der Dienst ist aktiviert / deaktiviert über update-rc.d
aktiviert ~$USERNAME/.profile.d/turnkey-init-fence
Das .profile.d-Script startet eine DTACH-Sitzung, die an einen Socket gebunden ist
wenn eine Session bereits an den Socket-Anhang gebunden ist
Welchen Befehl führen wir in der Dtach-Sitzung aus?
turnkey-init -> initfence deaktivieren (Service und profile.d)
Everyboot.d Skripte
Skripte, die sich im Unterverzeichnis everyboot.d befinden, laufen auf jedem Boot. Wir versuchen, die Anzahl der Skripte, die hier leben, zu minimieren, weil sie im Grunde ein Init-Skript eines armen Mannes sind und echte Init-Skripte oft eine bessere Idee sind.
Setzen des Root-Passworts in einer Headless-Bereitstellung
Bei Headless-Bereitstellungen muss sich der Benutzer als root anmelden, um den Appliance-Initialisierungsprozess abzuschließen, aber wie melden Sie sich als root an?
Kein Problem, wenn Sie OpenNode oder ProxMox verwenden - diese Systeme fordern Sie auf, ein Root-Passwort auszuwählen, bevor Sie ein TurnKey-Image bereitstellen.
Auf OpenStack können Sie sich als root mit Ihrem konfigurierten SSH-Schlüsselpaar anmelden oder das zufällige root-Passwort aus dem "Systemlog" abrufen.
Andere Virtualisierungs- / Private-Cloud-Lösungen sollten in der Lage sein, ihre vorhandenen Bereitstellungsskripte zum Festlegen des Root-Passworts zu verwenden, genau wie sie es bereits mit Debian und Ubuntu tun.
Eine weitere erweiterte Option ist das "Preseed" der /etc/inithooks.conf-Datei im Dateisystem der apliance, bevor Sie sie zum ersten Mal booten. So können Sie inithooks nutzen, um nicht nur das Root-Passwort, sondern auch die Datenbank- und Anwendungspasswörter, Admin-E-Mails, Domainnamen usw. vorzukonfigurieren.
Beachten Sie jedoch, dass die Verwendung von Vorsäen den "Initilisierungszaun" deaktiviert. Wenn Sie Preseding verwenden, geht TurnKey davon aus, dass Sie bereits auf andere Weise mit dem Benutzer interagiert haben (z. B. Web-Bedienfeld), um die vorab festgelegten Konfigurationswerte zu erhalten.
Vorsaat
Standardmäßig werden die Firstboot-Skripte, wenn ein Appliance zum ersten Mal ausgeführt wird, den Benutzer interaktiv über die virtuelle Konsole auffordern, verschiedene Passwörter und Grundeinstellungen für die Anwendungskonfiguration.
Es ist möglich, diesen interaktiven Konfigurationsprozess zu umgehen, indem Sie /etc/inithooks.conf im Appliance-Dateisystem erstellen und inithooks-Konfigurationsvariablen in das Appliance-Dateisystem schreiben. vor dem ersten Systemstart, z. B.:
cat>/etc/inithooks.conf<<EOF export ROOT_PASS=supersecretrootpass export DB_PASS=supersecretmysqlpass export APP_EMAIL=admin@example.com export APP_PASS=webappadminpassword export SEC_ALERTS=admin@example.com export SEC_UPDATES=FORCE export HUB_APIKEY=SKIP EOF
Machen Sie sich keine Sorgen, sensible Passwörter dort zu lassen: Nach dem ersten Booten leert inithooks /etc/inithooks.conf aus, so dass wichtige Passwörter nicht versehentlich im Freiraum bleiben.
Dieser Vorseelungsmechanismus macht es relativ einfach, TurnKey mit benutzerdefinierten Bedienfeldern, Virtualisierungslösungen usw. zu integrieren.
Wie genau Sie /etc/inithooks.conf erstellen, liegt an Ihnen und den Fähigkeiten der von Ihnen verwendeten Virtualisierungsplattform. So bieten viele Virtualisierungsplattformen beispielsweise eine Einrichtung, über die Sie Skripte ausführen oder Dateien zum Dateisystem hinzufügen können, bevor Sie zum ersten Mal booten.
Liste der Initialisierungshaken und Vorsättigungskonfigurationsparameter
Im Folgenden finden Sie eine Liste interaktiver Firstboot-Hooks. Alle interaktiven Hooks haben Vorseeling-Optionen zur Unterstützung von Cloud-Bereitstellung, Hosting und ISV-Integration.
Beachten Sie, dass fast alle Appliances ihre eigenen anwendungsspezifischen Secret-Regeneration-Hooks haben.
Gemeinsam für alle Appliances:
30rootpass ROOT_PASS 50auto-apt-archive AUTO_APT_ARCHIVE [ SKIP ] 80tklbam HUB_APIKEY [ SKIP ] 85secalerts SEC_ALERTS [ SKIP ] 92etckeeper ETCKEEPER_COMMIT [ SKIP ] 95secupdates SEC_UPDATES [ SKIP | FORCE ]
Spezifisch für Headless-Gehäuse:
29preseed INITFENCE [ SKIP ]
Appliance spezifisch:
35mysqlpass DB_PASS 35pgsqlpass DB_PASS 40ansible APP_PASS 40couchdb APP_PASS 40espocrm APP_PASS 40etherpad APP_PASS 40githttp APP_PASS 40icesecretset APP_PASS 40jenkins APP_PASS 40mediawiki APP_PASS 40mibew APP_PASS 40mongodb APP_PASS 40moodle APP_PASS 40mumblesupw APP_PASS 40observium APP_PASS 40odoo APP_PASS 40openvas APP_PASS 40orangehrm APP_PASS 40otrs APP_PASS 40phpmumbleadmin APP_PASS 40plone APP_PASS 40sugarcrm APP_PASS 40suitecrm APP_PASS 40torrentserver APP_PASS 40trac APP_PASS 40typo3 APP_PASS 40zoneminder APP_PASS 40nextcloud APP_PASS, APP_DOMAIN 40openldap APP_PASS, APP_DOMAIN 40owncloud APP_PASS, APP_DOMAIN 40zurmo APP_PASS, APP_DOMAIN 40domain-controller APP_PASS, APP_DOMAIN [, APP_REALM] 40b2evolution APP_PASS, APP_EMAIL 40collabtive APP_PASS, APP_EMAIL 40concrete5 APP_PASS, APP_EMAIL 40django APP_PASS, APP_EMAIL 40dokuwiki APP_PASS, APP_EMAIL 40drupal7 APP_PASS, APP_EMAIL 40e107 APP_PASS, APP_EMAIL 40ezplatform APP_PASS, APP_EMAIL 40gallery APP_PASS, APP_EMAIL 40joomla APP_PASS, APP_EMAIL 40kliqqi APP_PASS, APP_EMAIL 40limesurvey APP_PASS, APP_EMAIL 40mahara APP_PASS, APP_EMAIL 40mambo APP_PASS, APP_EMAIL 40mantis APP_PASS, APP_EMAIL 40mattermost APP_PASS, APP_EMAIL 40mayan APP_PASS, APP_EMAIL 40moinmoin APP_PASS, APP_EMAIL 40omeka APP_PASS, APP_EMAIL 40oscommerce APP_PASS, APP_EMAIL 40phpbb APP_PASS, APP_EMAIL 40processmaker APP_PASS, APP_EMAIL 40redmine APP_PASS, APP_EMAIL 40roundup APP_PASS, APP_EMAIL 40silverstripe APP_PASS, APP_EMAIL 40simpleinvoices APP_PASS, APP_EMAIL 40sitracker APP_PASS, APP_EMAIL 40twiki APP_PASS, APP_EMAIL 40ushahidi APP_PASS, APP_EMAIL 40vanilla APP_PASS, APP_EMAIL 40vtiger APP_PASS, APP_EMAIL 40wordpress APP_PASS, APP_EMAIL 40xoops APP_PASS, APP_EMAIL 40canvas APP_PASS, APP_EMAIL, APP_DOMAIN 40drupal8 APP_PASS, APP_EMAIL, APP_DOMAIN 40elgg APP_PASS, APP_EMAIL, APP_DOMAIN 40gitlab APP_PASS, APP_EMAIL, APP_DOMAIN 40gnusocial APP_PASS, APP_EMAIL, APP_DOMAIN 40icescrum APP_PASS, APP_EMAIL, APP_DOMAIN 40phplist APP_PASS, APP_EMAIL, APP_DOMAIN 40piwik APP_PASS, APP_EMAIL, APP_DOMAIN 40prestashop APP_PASS, APP_EMAIL, APP_DOMAIN 40punbb APP_PASS, APP_EMAIL, APP_DOMAIN 40simplemachines APP_PASS, APP_EMAIL, APP_DOMAIN 40zencart APP_PASS, APP_EMAIL, APP_DOMAIN 40magento APP_PASS, APP_EMAIL, APP_DOMAIN [, APP_PRIVKEY, APP_PUBKEY] 40bugzilla APP_PASS, APP_EMAIL [, APP_OUTMAIL] 40foodsoft APP_PASS, APP_EMAIL [, APP_VARIANT] 40ghost APP_PASS, APP_EMAIL, APP_DOMAIN [, APP_UNAME]
Wenn nicht vorgefertigt, wird der Benutzer interaktiv gefragt. Die SKIP- und FORCE-Optionen sollten selbsterklärend sein. Beachten Sie, dass Supdates automatisch übersprungen werden, wenn Sie sich im Live-Demo-Modus befinden.
Entwicklungsnotizen
Du erschaffst also ein neues Appliance und möchtest Initialisierungshaken hinzufügen. Großartig! Hier sind einige Beispiele, um dich in Gang zu bringen.
Nicht interaktiver Inithook
Das folgende Beispiel wird im Joomla15 Appliance verwendet. Es regeneriert die Geheimnis, und legt ein zufälliges mysql-Passwort für den Joomla-Benutzer fest.
/usr/lib/inithooks/firstboot.d/20regen-joomla-secrets
#!/bin/bash -e
# regenerate joomla secret key and mysql password
. /etc/default/inithooks
updateconf() {
CONF=/var/www/joomla/configuration.php
sed -i "s/var $1 = \(.*\)/var $1 = '$2';/" $CONF
}
updateconf '\$secret' $(mcookie)$(mcookie)
PASSWORD=$(mcookie)
updateconf '\$password' $PASSWORD
$INITHOOKS_PATH/bin/mysqlconf.py --user=joomla --pass="$PASSWORD"
Interaktiver Inithook
Das folgende Beispiel wird verwendet, um das Root-Passwort in allen Appliances festzulegen. Wenn ROOTPASS nicht festgelegt ist, wird der Benutzer aufgefordert, ein Passwort interaktiv einzugeben.
/usr/lib/inithooks/firstboot.d/30rootpass #!/bin/bash -e # set root password . /etc/default/inithooks [ -e $INITHOOKS_CONF ] && . $INITHOOKS_CONF $INITHOOKS_PATH/bin/setpasspass.py root --pass="$ROOTPASS"
/usr/lib/inithooks/bin/setpass.py
#!/usr/bin/python
# Copyright (c) 2010 Alon Swartz <alon@turnkeylinux.org>
"""Set account password
Arguments:
username username of account to set password for
Options:
-p --pass= if not provided, will ask interactively
"""
import sys
import getopt
import subprocess
from subprocess import PIPE
from dialog_wrapper import Dialog
def fatal(s):
print >> sys.stderr, "Error:", s
sys.exit(1)
def usage(e=None):
if e:
print >> sys.stderr, "Error:", e
print >> sys.stderr, "Syntax: %s <username> [options]" % sys.argv[0]
print >> sys.stderr, __doc__
sys.exit(1)
def main():
try:
opts, args = getopt.gnu_getopt(sys.argv[1:], "hp:", ['help', 'pass='])
except getopt.GetoptError, e:
usage(e)
if len(args) != 1:
usage()
username = args[0]
password = ""
for opt, val in opts:
if opt in ('-h', '--help'):
usage()
elif opt in ('-p', '--pass'):
password = val
if not password:
d = Dialog('TurnKey GNU/Linux - First boot configuration')
password = d.get_password(
"%s Password" % username.capitalize(),
"Please enter new password for the %s account." % username)
command = ["chpasswd"]
input = ":".join([username, password])
p = subprocess.Popen(command, stdin=PIPE, shell=False)
p.stdin.write(input)
p.stdin.close()
err = p.wait()
if err:
fatal(err)
if __name__ == "__main__":
main()