2016-04-26 6 views
0

Ich muss Ressourcen von einem Master-Server zu einem Slave-Server synchronisieren. Ich benutze rsync, weil es Ordner rekursiv unter Verwendung der inkrementellen Dateiliste synchronisieren kann. Ich konnte es mit ssh-keys so einfach wie möglich machen. Alles ist in Ordnung, aber es funktioniert nicht durch PHP shell_exec Funktion. Hier ist, was ich bisher gemacht habe und wo ich stecken bleibe. Hilfe wäre willkommen!Sicherer Weg Ressourcen zwischen Servern über php/linux zu synchronisieren

Master- und Slave-Server sind auf Ubuntu 14.04.4

Erstellung der SSH-Schlüssel Ordner in Home-Verzeichnis des Benutzers.

mkdir ~/.ssh 
chmod 0700 ~/.ssh 

Schaffung eines privaten/öffentlichen SSH-Schlüssel ohne Passwort

ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

Ungewiss Slave-Server

// log in slave server 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 
touch ~/.ssh/authorized_keys 
chmod 0644 ~/.ssh/authorized_keys 

Copy öffentlichen Schlüssel an den Slave-Server-Master öffentlichen SSH-Schlüssel empfangen kann (wo Ich möchte die Ressourcen synchronisieren)

// log in master server 
su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

Test-Synchronisation eines vorhandenen Ordner ... lassen Sie uns www/js sagen/

rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/ 

Yay, alles funktioniert gut.

Ich logne Slave-Server, entfernen Sie www/js Ordner rekursiv.

ich anmelden Master-Server

ich ein einfaches PHP-Skript erstellen, um zu testen, ob es innerhalb als "Shell-Befehl" arbeiten

test.php

var_dump(shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/')); 

Die Synchronisation nicht der Fall ist Arbeit von PHP. Wahrscheinlich, weil php Breite www-Daten Benutzer läuft? Wie kann ich es sicher von pĥp arbeiten lassen?

+0

Sie könnten Rsync verwenden oder Sie könnten die Home-Verzeichnisse in einem gemeinsamen Ordner speichern und sie auf jedem Server mounten. – mkaatman

+1

Ihre Home-Variable '~' wird möglicherweise nicht richtig erweitert. versuchen Sie den vollständigen Pfad –

+0

Slave-Server in meinem Fall sind wie Content Delivery. Mount einen gemeinsamen Ordner wäre in Ordnung, aber in meinem Fall erstellt oder aktualisiert PHP Ressourcen, dann müssen sie auf Slave-Servern synchronisieren, und PHP muss weiter laufen. Daher muss die Synchronisation von PHP ausgelöst werden. – Simmoniz

Antwort

0

** bearbeiten: Diese Antwort ist keine sichere. Sehen Sie bitte meine andere Antwort **


Schließlich fand ich heraus, wie es funktioniert

kopieren privaten ssh-Schlüssel zum www-data Stammordner. Dann wird PHP Lage sein, durch shell_exec Funktion der

www-data in rsync Home-Ordner/var/www/(in meinem Fall Ubuntu 14)

erstellen.ssh-Ordner, wenn nicht

mkdir /var/www/.ssh 
chown www-data /var/www/.ssh 
chmod 0700 /var/www/.ssh 

Kopie SSH-Schlüssel präsentieren und stellen Sie die richtige Rechte

cp ~/.ssh/id_rsa /var/www/.ssh 
chown www-data /var/www/.ssh/id_rsa 
chmod 0600 /var/www/.ssh/id_rsa 

Diese Linie arbeitet jetzt für mich:

shell_exec('rsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress [absolute_path]/www/js/ [slave user]@[slave host]:~/www/js/'); 

Wenn es jemand hilft ...

Aber da ich viel in der Sicherheit weiß, aber nicht sagen kann, dass ich ein Spezialist bin, frage ich mich, ob das sicher ist?

+0

Nein. Es ist nicht sicher. Sie sollten den Inhalt minimieren, auf den der Webserver schreiben kann.Obwohl dies an sich keine Sicherheitslücke darstellt, bietet es die Möglichkeit, dass beide Ihre Server übernehmen, wenn sie anderswo einen Schwachpunkt finden. Die einfachste Lösung (vorausgesetzt, Sie haben Root-Zugriff) besteht darin, den SSH-Zugriff für einen anderen Benutzer einzurichten und ihn über sudo (falls erforderlich) von PHP aus aufzurufen. Das bedeutet aber auch, dass Sie ein Berechtigungsmodell benötigen, wenn Sie noch kein Berechtigungsmodell haben. – symcbean

+0

In meinem Fall ist das Backend eigentlich alles seriös, läuft lange und wurde gut getestet. Die korrekte Authentifizierung und Autorisierung wird durchgeführt, bevor php/rsync ressources erzeugt. Aber wie du gesagt hast, wenn php es über einen anderen Benutzer aufruft, könnte das Küken sowieso gefunden werden ... – Simmoniz

+0

Dies ist eine sehr naive Sicht der Computersicherheit. – symcbean

0

Wie von symcbean vorgeschlagen, war meine vorherige Antwort ein Sicherheitsrisiko. Es kann sehr gefährlich sein, www-data auf entfernte Hosts ohne Passwort zugreifen zu können.. Ein besserer Ansatz besteht darin, einen Linux-Benutzer einzurichten, sagen wir "wwwsync", der rsync mit entfernten Hosts behandelt und www-data rsync "unter wwwsync user" ausführen lässt. Auf diese Weise können wir rsync steuern/sichern, indem wir festlegen, was wwwsync-Benutzer können und was nicht.

Erstellen eines Linux-Benutzers, der die Synchronisierung (sagen wir wwwsync) behandelt, und den ssh-key-Ordner im Home-Verzeichnis des Benutzers erstellen.

// log as root user  
adduser wwwsync 
// log as wwwsync 
su wwwsync 
// create ssh folder for ssh key creation 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 

Schaffung eines privaten/öffentlicher SSH-Schlüssel ohne Passwort

ssh-keygen -f ~/.ssh/id_rsa -q -P "" 

Ungewiss Slave-Server-Master-öffentliche SSH-Schlüssel

// log in slave server 
mkdir ~/.ssh 
chmod 0700 ~/.ssh 
touch ~/.ssh/authorized_keys 
chmod 0644 ~/.ssh/authorized_keys 

Copy Öffentliche Schlüssel erhalten kann zum Slave-Server (wo ich synchronisieren möchte ressources)

// log in master server as wwwsync 
su ssh-copy-id -i ~/.ssh/id_rsa.pub [slave user]@[slave host] 

Fabrikat www-data Benutzer (php) in der Lage rsync unter wwwsync Benutzer

// log in as root 
su root 
// edit sudo configuration 
sudo visudo 
// add this line at the bottom of the file 
www-data ALL=(wwwsync) NOPASSWD: /usr/bin/rsync 

Diese Zeile dann richtig von PHP

shell_exec('rsync -H -u wwwsync -avz -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --progress ~/www/js/ [slave user]@[slave host]:~/www/js/') 

arbeiten auszuführen Nächster wichtiger Schritt: Stellen Sie sicher, dass wwwsync über Rechte und Berechtigungen verfügt t, entsprechend Ihren Bedürfnissen, so dass www-Daten nicht unerwünschte Ressourcen zu Ihren entfernten Servern synchronisieren.

Verwandte Themen