Zum Inhalt springen
TURNKEYGNU / LINUX
AnwendungenDokumentationBlogBildschirmfotosGitHubTurnKey Hub
文Deutsch
EnglishEspañol中文日本語PortuguêsDeutsch
Haus/Initihooks - Systeminitialisierung, Konfiguration und Preseeding

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:

root password dialog

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:

  1. 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.

  2. 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:

  1. 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.

  2. 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.

  3. 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:

    1. turnkey-init-fence als Dienst aktiviert und startet ihn

      Der Dienst ist aktiviert / deaktiviert über update-rc.d

    2. 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()
TURNKEYGNU / LINUX

Eigene Infrastruktur betreiben, ohne bei null anzufangen.

TurnKey erkunden
Über TurnKeyDokumentationHäufige FragenBlogGitHub
Frei und quelloffenStandardmäßig sicherSofort einsatzbereit