[LINUX] Legen Sie den clientspezifischen SSH-Hostschlüssel auf mehreren plattenlosen Clients fest, die genau dasselbe Root-Dateisystem verwenden

Vorwort: Zielgruppe der Leser dieses Artikels

Es sind Informationen für Personen, die alle Anforderungen erfüllen.

Das Wesentliche des Problems

  1. Da mehrere Computer dasselbe Root-Dateisystem verwenden, führt die Verwendung der Standarddatei sshd_config dazu, dass sshd auf allen Computern dieselbe Hostschlüsseldatei (/ etc / ssh / ssh_host_ * _key) liest und startet.
  2. Linux kann / etc nicht vom Stammverzeichnis und einer anderen Partition trennen.
  3. Es ist fast unmöglich, Overlays mit einem plattenlosen Client zu verwenden, der NFS verwendet (Overlays unterstützen NFSv3 nicht).
  4. Wenn Sie den Hostschlüssel unter / etc / ssh ändern, bevor Sie sshd starten, ändern sich auch die Schlüssel anderer Hosts. Da es sich in erster Linie um einen plattenlosen Client handelt, ist dies nicht möglich, da die Dateien unter / etc nicht geändert werden können.

Lösung

Sie können das obige Problem mit den folgenden Methoden lösen.

  1. Es spielt keine Rolle, wo Sie es speichern. Speichern Sie daher alle knotenspezifischen Hostschlüssel im Voraus (erstellen Sie ein Unterverzeichnis mit dem Knotenhostnamen und fügen Sie sie alle ein).
  2. Bereiten Sie ein beschreibbares Verzeichnis vor (z. B. create / var / lib / sshd und hängen Sie es als tmpfs in / etc / fstab ein).
  3. Setzen Sie sshd_config so, dass der Hostschlüssel unter dem in 2 erstellten Verzeichnis gelesen wird.
  4. Ändern Sie beim Start nach dem Abrufen der IP (wenn der lokale Hostname bekannt ist) und kurz vor dem Start von sshd den im Unterverzeichnis für den lokalen Host gespeicherten Hostschlüssel von 1. in das Verzeichnis 2. Kopieren

Diese Technik kann nicht nur für sshd verwendet werden, sondern auch zum Starten anderer Daemons, die hostspezifische Informationen verwenden. (Mit DNS oder DHCP können Sie jedoch alles für IP und Hostnamen tun.)

Spezifische Methode

Alle Arbeiten werden auf dem NFS-Server ausgeführt, indem auf das an die Knoten verteilte Betriebssystem-Image chrootet wird. Im Folgenden wird angenommen, dass der Hostname des plattenlosen Knotens host1 bis host4 ist.

1. So generieren Sie einen einzelnen Hostschlüssel

Bewahren Sie aus Sicherheitsgründen alle Schlüssel in / root / host_keys auf.

# mkdir /root/host_keys; cd /root/host_keys
# for N in `seq 1 4`; do HN="host${N}"; mkdir ${HN}; for T in rsa ecdsa ed25519; do ssh-keygen -h -t ${T} -C ${HN} -N '' -f ${HN}/ssh_host_${T}_key; done; done

2. Erstellen Sie auch mit einem plattenlosen Client ein beschreibbares Verzeichnis

# mkdir /var/lib/sshd
# vim /etc/fstab
(Die Änderungen sind wie folgt)
#

Fügen Sie die folgende Zeile zu / etc / fstab hinzu

tmfps /var/lib/sshd tmpfs defaults,mode=700 0 0

3. Ändern Sie die Datei sshd_config

# vi /etc/ssh/sshd_config
(Die Änderungen sind wie folgt)
#

Änderungen (aktivierter und geänderter HostKey-Eintrag standardmäßig auskommentiert)

(Kürzung)
HostKey /var/lib/sshd/ssh_host_rsa_key
HostKey /var/lib/sshd/ssh_host_ecdsa_key
HostKey /var/lib/sshd/ssh_host_ed25519_key
(Kürzung)

4. Erstellen Sie einen Prozess, um die hostspezifische Schlüsseldatei zum richtigen Zeitpunkt zu kopieren

Um das Timing richtig zu handhaben, erstellen Sie eine neue Unit-Datei von systemd und formatieren Sie sie, um von hier aus ein dediziertes Skript aufzurufen.

4.1 Erstellen eines dedizierten Shell-Skripts

Der Dateiname kann beliebig sein, sollte aber / usr / local / sbin / copy_sshkeys sein.

# vim /usr/local/sbin/copy_sshkeys
# chmod 700 /usr/local/sbin/copy_sshkeys

Der Inhalt des Skripts ist wie folgt. Stellen Sie den Rückgabewert so ein, dass systemd den Fehler ermitteln kann.

#!/bin/bash
HN=`hostname`
RETVAL=0

if [ "${HN}" != "" ]
then
  cp -pf /root/host_keys/${HN}/ssh_host* /var/lib/sshd/
  RETVAL=$?
else
  #Fehler beim Abrufen des Hostnamens
  RETVAL=2
fi

exit $RETVAL

4.2. Erstellen einer systemd Unit-Datei

Erstellen Sie eine neue Unit-Datei unter / etc / systemd / system. Der Name dieser Datei kann beliebig sein, solange Sie die Regeln für die Erweiterung .service befolgen. Der Klarheit halber nennen Sie sie jedoch ssh_hostkey_copy.service.

# vi /etc/systemd/system/ssh_hostkey_copy.service
(Der Inhalt ist wie folgt)
# systemctl enable ssh_hostkey_copy.service
(Ausgabeergebnis weggelassen)
#

Der Inhalt der Unit-Datei lautet wie folgt.

[Unit]
Description=SSH Hostkey copy process for diskless clients
After=network.target local-fs.target
#Sshd abhängig von der Verteilung.Es kann Service sein
Before=ssh.service

[Service]
ExecStart=/usr/local/sbin/copy_sshkeys
Type=oneshot

[Install]
WantedBy=multi-user.target
RequiredBy=ssh.service

Jetzt können auch plattenlose Clients sshd mit dem eindeutigen Hostschlüssel starten.

Recommended Posts

Legen Sie den clientspezifischen SSH-Hostschlüssel auf mehreren plattenlosen Clients fest, die genau dasselbe Root-Dateisystem verwenden
Erstellen mehrerer Python-Umgebungen auf demselben System
Richten Sie einen Server ein, der mehrere Verbindungen gleichzeitig verarbeitet