chroot mit rsync (und fakeroot?) ohne root-Rechte durch die Gegend schieben

27/08/2009 - 23:20 von Marc Haber | Report spam
Hallo,

ich habe hier ein System, in dem ich ein chroot pflege, das die Basis
für die Installation neuer Server darstellt. Zusàtzlich habe ich in
einem weiteren Verzeichnis Dateien, die nach dem Auspacken des chroot
in dieses hineinkopiert und dort "personalisiert" werden. Da es sich
hierbei auch um Dateien vom Schlage eines /etc/shadow handelt, hàtte
ich sie gerne im "Gastgeber-Dateisystem" nicht mit 644-Regeln liegen.

Diese Setups möchte ich jetzt zwischen zwei Rechnern synchron halten,
und zwar soll das dafür gesetzte rsync möglichst ohne root-Rechte
laufen, da ich für dieses Setup kein root-Login über das Netz erlauben
und mir möglichst auch keinen mit sudo abbrechen möchte.

Hier sind die beiden Ansàtze, die ich bisher verfolgt habe

(1) fakeroot -s -i
Das rsync wird auf beiden Seiten mit fakeroot aufgerufen:
fakeroot -s fakeroot.state -i fakeroot.state rsync
In der Theorie liegen die Dateien dann im Gasteber-Dateisystem einem
user gehörend, aber mit den spàter "richtigen" Rechten, also ggf. ohne
world-read-bit.

In der Praxis scheitert das leider daran, dass fakeroot natürlich auch
die uid per wrapper auf null schiebt und das rsync-ssh somit nach
/root/.ssh greift und dort weder die notwendige ~/.ssh/config noch den
zum User gehörenden private key findet. rsync --ssh="sudo -u mh ssh"
oder rsync --ssh="su -c ssh mh" scheitert an syntaktischen
Herausforderungen und zerbricht im übrigen das auf einer preloadeten
library basierende fakeroot.

(2) Transport der Owner/Mode-Daten "out of band"
Neben den eigentlichen Daten liegt eine Datei, in der für jede Datei
das im Zielsystem erwartete Owner/Mode abgelegt ist. Diese Datei wird
mit rsynced. Dadurch dass das rsync ohne Root-Rechte làuft, kommen die
Dateien mit falschen Rechten im Zielsystem an, und ein danach (mi
root-Rechten) aufgerufenes lokales Skript bügelt die Owner/Mode-Daten
dann wieder so hin wie sie gewünscht sind.

Dies ist zwar der unelegantere Weg, aber vermutlich der, der als
ehester zum Ziel führt. Gibt es so ein Skript schon, das (inklusive
aller Grenzfàlle) aus einer Datei-Eingabe die Rechte von Dateien im
Verzeichnis neu setzt?

Das state-file von fakeroot taugt dafür übrigens nicht, da es leider
anstelle von Dateinamen nur device- und inode-Nummern enthàlt und
somit nicht von einem System auf ein anderes verschoben werden kann.
Obendrein ist es sehr aufwendig, ausgehend von device- und inodenummer
die Rechte zu _setzen_, da man quasi das ganze Dateisystem durchsuchen
müsste um die Datei mit der passenden inodenummer zu finden.


Habt Ihr noch andere Lösungen oder generell Ideen für diese Aufgabe?

Grüße
Marc

Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
 

Lesen sie die antworten

#1 Realname
28/08/2009 - 00:29 | Warnen spam
Marc Haber <mh+ schrieb:

In der Praxis scheitert das leider daran, dass fakeroot natürlich auch
die uid per wrapper auf null schiebt und das rsync-ssh somit nach
/root/.ssh greift und dort weder die notwendige ~/.ssh/config noch den
zum User gehörenden private key findet. rsync --ssh="sudo -u mh ssh"
oder rsync --ssh="su -c ssh mh" scheitert an syntaktischen
Herausforderungen und zerbricht im übrigen das auf einer preloadeten
library basierende fakeroot.



Möglich, dass ich dein Problem nicht verstanden habe.

Jedenfalls aber ist es ohne weiteres möglich, 'ssh' per Kommandozeilen-
schalter auf eine bestimmte Konfigurationsdatei zu lenken ('-F', siehe auch
Auswirkungen auf das Einlesen der systemweiten Konfig) oder einen bestimmten
Schlüssel zu verwenden ('-oIdentityFile').

Ähnliche fragen