Probleme beim Absetzen von SSH Befehlen über Apache(Scriptsprache PHP)
Probleme beim Absetzen von SSH Befehlen über Apache(Scriptsprache PHP)
Hallo zusammen!!
Hoffe ihr könnt mir helfen, soooo vielleicht beschreib ich erstmal was ich im Allgemeinen machen will.
Ich habe einen kleinen Serververbund und soll zentral über einen Hauptserver, auf den ich über einen WebBrowser drauf kann, die anderen Server monitoren und verwalten
(So ähnlich wie Webmin, aber das Script läuft halt zentral auf einem Server)
Zum Monitoren gehört Serverdienste abfragen. Hab mir erstmal gedacht dass ein pidof <dienstname> reichen sollte.
Das Verwalten beinhaltet im wesentlichen das starten und stoppen dieser Dienste.
Das ganze wird so realisiert (zumindest sollte es so gemacht werden)...auf meinem zentralen Server hab ich meinen Webserver und meine php-scripte. (Hab mich für php entschieden da ich dass wenigstens ein bißchen kann)
Meine Abfragen ob ein Dienst auf einem Server läuft will ich über SSL realisieren, also ein exec(SSL benutzer@ip pidof <dienst>)
Hab damit ich kein Passwort für den Benutzer eingeben muss public-/private key verfahren benutzt.
So und jetzt komm ich auch schon zu meinem Problem.
Und zwar ist das eine bißchen verzwickte Angelegenheit. Apache läuft unter dem Benutzer "apache" und für diesen Benutzer kann ich keinen rsa-key erstellen da ich mich ja nicht als User "apache" einloggen kann.
Bin dass ganze mal umgangen in dem ich beim Apache den User auf "peter" gestellt habe und auf einem Testserver mit dem User "peter" die keys ausgetauscht habe.
und siehe da es hat funktioniert. Ich konnte ohne Passworteingabe über den Webserver die Dienste abfragen. Abeeerrr...der User peter hat aber nun bei meinen Scripten Probleme bereitet da ich z.B. in meinen Scripten Sessions verwende, jedoch der Benutzer Peter keine Rechte hat welche zu starten.
Hab nun überlegt den Apache wieder auf standard apache Benutzer zu stellen und evtl.
erstmal sowas wie einen Benutzerwechsel in mein Script einzufügen. Also d.h. apache schaltet über einen befehl in dem Script auf peter und führt die SSH-Befehle als peter aus...
Weiß aber net wie ich dass am besten realisieren kann..bzw. wie der Befehl zum Benutzerwechsel ohne seperate Passwordabfrage aussieht.
Ich bräuchte sowas wie exec(login -u peter:password) oder so...
Die Server basieren alle auf RedHat AS 3.0.
Ich glaube jetzt hab ich echt genug geschrieben. Hoffe es war wenigstens verständlich.
So ich danke jetzt schonmal jedem der sich da ein bißchen Gedanken macht um mir zu helfen.
@moderator: Entschuldige wenn ich im falschen Thema gepostet haben sollte. Bin mir aber nicht ganz sicher ob es eher zur Programmierung oder Netzwerk gehört...Einfach verschieben fall ich falsch sein sollte. Danke!
Hoffe ihr könnt mir helfen, soooo vielleicht beschreib ich erstmal was ich im Allgemeinen machen will.
Ich habe einen kleinen Serververbund und soll zentral über einen Hauptserver, auf den ich über einen WebBrowser drauf kann, die anderen Server monitoren und verwalten
(So ähnlich wie Webmin, aber das Script läuft halt zentral auf einem Server)
Zum Monitoren gehört Serverdienste abfragen. Hab mir erstmal gedacht dass ein pidof <dienstname> reichen sollte.
Das Verwalten beinhaltet im wesentlichen das starten und stoppen dieser Dienste.
Das ganze wird so realisiert (zumindest sollte es so gemacht werden)...auf meinem zentralen Server hab ich meinen Webserver und meine php-scripte. (Hab mich für php entschieden da ich dass wenigstens ein bißchen kann)
Meine Abfragen ob ein Dienst auf einem Server läuft will ich über SSL realisieren, also ein exec(SSL benutzer@ip pidof <dienst>)
Hab damit ich kein Passwort für den Benutzer eingeben muss public-/private key verfahren benutzt.
So und jetzt komm ich auch schon zu meinem Problem.
Und zwar ist das eine bißchen verzwickte Angelegenheit. Apache läuft unter dem Benutzer "apache" und für diesen Benutzer kann ich keinen rsa-key erstellen da ich mich ja nicht als User "apache" einloggen kann.
Bin dass ganze mal umgangen in dem ich beim Apache den User auf "peter" gestellt habe und auf einem Testserver mit dem User "peter" die keys ausgetauscht habe.
und siehe da es hat funktioniert. Ich konnte ohne Passworteingabe über den Webserver die Dienste abfragen. Abeeerrr...der User peter hat aber nun bei meinen Scripten Probleme bereitet da ich z.B. in meinen Scripten Sessions verwende, jedoch der Benutzer Peter keine Rechte hat welche zu starten.
Hab nun überlegt den Apache wieder auf standard apache Benutzer zu stellen und evtl.
erstmal sowas wie einen Benutzerwechsel in mein Script einzufügen. Also d.h. apache schaltet über einen befehl in dem Script auf peter und führt die SSH-Befehle als peter aus...
Weiß aber net wie ich dass am besten realisieren kann..bzw. wie der Befehl zum Benutzerwechsel ohne seperate Passwordabfrage aussieht.
Ich bräuchte sowas wie exec(login -u peter:password) oder so...
Die Server basieren alle auf RedHat AS 3.0.
Ich glaube jetzt hab ich echt genug geschrieben. Hoffe es war wenigstens verständlich.
So ich danke jetzt schonmal jedem der sich da ein bißchen Gedanken macht um mir zu helfen.
@moderator: Entschuldige wenn ich im falschen Thema gepostet haben sollte. Bin mir aber nicht ganz sicher ob es eher zur Programmierung oder Netzwerk gehört...Einfach verschieben fall ich falsch sein sollte. Danke!
Ich denke, du solltest das ganze über sudo Regeln. Einfach mit "visudo" das sudoers-file ändern und einen Eintrag dieser Art tätigen:
Danach kannst du das ganze mit
ausführen.
Code: Select all
apache ALL = NOPASSWD: [befehl] [username]
Code: Select all
exec(sudo [befehl])
Danke für die schnelle Antwort!!
An die Lösung mit einem sudo für den apache hab ich auch schon gedacht. Hab aber mir aber gedacht dass die Sicherheit des Systems nicht mehr gegeben wäre.
Bei der sudo-Variante würde ja auch die Authentifizierung des Rechners über den rsa-key wegfallen. D.h. ich könnte mich von jedem Rechner aus auf die Server über Benutzer apache und den sudo Befehl connecten...
Es sollte möglichst so sein , dass nur vom Webserver aus die Befehle abgesetzt werden können.
btw: Ist der sudo-User durch die Regelerstellung für ihn wirklich so eingeschränkt oder hat er die Möglichkeit dass ganze zu umgehen.
Danke nochmal für die Mühe!!
Gruß
Martin
An die Lösung mit einem sudo für den apache hab ich auch schon gedacht. Hab aber mir aber gedacht dass die Sicherheit des Systems nicht mehr gegeben wäre.
Bei der sudo-Variante würde ja auch die Authentifizierung des Rechners über den rsa-key wegfallen. D.h. ich könnte mich von jedem Rechner aus auf die Server über Benutzer apache und den sudo Befehl connecten...
Es sollte möglichst so sein , dass nur vom Webserver aus die Befehle abgesetzt werden können.
btw: Ist der sudo-User durch die Regelerstellung für ihn wirklich so eingeschränkt oder hat er die Möglichkeit dass ganze zu umgehen.
Danke nochmal für die Mühe!!
Gruß
Martin
Auf Rechner W (Webserver) läuft der Apache und du willst per ssh einen Befehl auf einem anderen Rechner C ausführen, wofür du aber die Rechte von "Peter" (auf C und W) brauchst. Also:
Apache bekommt via sudo die Erlaubnis als "Peter" auf W den Befehl auszuführen (ssh -l Peter [IP von C] [Befehl]) auszuführen und kann dann dessen Ausgabe bereitstellen. Wo ist jetzt die Unsicherheit? Du legst mit sudo genau einen Befehl fest, der für apache als Peter ausgeführt werden kann und die verschlüsselte Verbindung zwischen W und C besteht nach wie vor.
Oder missverstehe ich dich?
Apache bekommt via sudo die Erlaubnis als "Peter" auf W den Befehl auszuführen (ssh -l Peter [IP von C] [Befehl]) auszuführen und kann dann dessen Ausgabe bereitstellen. Wo ist jetzt die Unsicherheit? Du legst mit sudo genau einen Befehl fest, der für apache als Peter ausgeführt werden kann und die verschlüsselte Verbindung zwischen W und C besteht nach wie vor.
Oder missverstehe ich dich?
Ah okey ich glaube ich hab dich beim ersten mal missverstanden...
Also du meinst dass Benutzer "apache" sudo-Rechte bekommt um lokal als Benutzer "peter" einen ssh-Befehl auf Rechner C absetzen zu können...auf Beiden Rechnern muss Benutzer "peter" angelegt sein!?
Hoffe das stimmt so...danke für den Rat...werde es morgen gleich mal ausprobieren.
Gruß
Martin
Also du meinst dass Benutzer "apache" sudo-Rechte bekommt um lokal als Benutzer "peter" einen ssh-Befehl auf Rechner C absetzen zu können...auf Beiden Rechnern muss Benutzer "peter" angelegt sein!?
Hoffe das stimmt so...danke für den Rat...werde es morgen gleich mal ausprobieren.
Gruß
Martin
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Ich lasse bei sowas semaphoren files erzeugen, die entweder von root's crontab oder root's daemonisiertem (Endlosschleife mit while true) in einer screen session laufendem script (wenn die Reaktionsszeit kürzer als die von crontab sein soll) ausgewertet werden.
Damit hat sich das Rechteproblem erledigt und die Funktionalität ist gewährleistet. Zudem ist die Sicherheit nicht belastet, da keinem Prozess/User zusätzliche Rechte eingeräumt werden müssen.
Damit hat sich das Rechteproblem erledigt und die Funktionalität ist gewährleistet. Zudem ist die Sicherheit nicht belastet, da keinem Prozess/User zusätzliche Rechte eingeräumt werden müssen.
Es gibt keine dumme Fragen!
Killerhippy
Killerhippy
Hallo ich bins nochmal...
und zwar bin ich gerade dabei dass mit den sudo-Rechten umzusetzen, jedoch hab ich dabei ein bißchen Probleme.
Also hab unter root ganz normal visudo gestartet und im feld:
eingefügt. Hab mein php-Script ausgeführt und wollte mir dann über den Befehl:
den Status des http-Dienstes auf dem Server mit der IP:192.168.0.1 anzeigen lassen. Dies jedoch ohne Erfolg.
Habe testweise auch einen neuen Benutzer angelegt mit dem ich mich lokal anmelden kann...und hab dann in visudo folgendes eingefügt:
Wenn ich nun über die Konsole mit dem Benutzer "benutzer" den Befehl
gibt er mir folgendes zurück:
"Sorry user benutzer is not allowed to execute '/usr/bin/ssh 192.168.0.2 /etc/init.d/http status' as peter on localhost.localdomain"
Hat jemand ne Ahnung woran das liegen könnte?!
und zwar bin ich gerade dabei dass mit den sudo-Rechten umzusetzen, jedoch hab ich dabei ein bißchen Probleme.
Also hab unter root ganz normal visudo gestartet und im feld:
Code: Select all
#User privileg specificatons
apache ALL=NOPASSWD:/usr/bin/ssh peter
Code: Select all
echo exec("sudo -u peter /usr/bin/ssh 192.168.0.1 /etc/init.d/httpd status");
Habe testweise auch einen neuen Benutzer angelegt mit dem ich mich lokal anmelden kann...und hab dann in visudo folgendes eingefügt:
Code: Select all
#User privileg specificatons
apache ALL=NOPASSWD:/usr/bin/ssh peter
benutzer ALL=NOPASSWD:/usr/bin/ssh peter
Code: Select all
sudo -u peter /usr/bin/ssh 192.168.0.1 /etc/init.d/httpd status
"Sorry user benutzer is not allowed to execute '/usr/bin/ssh 192.168.0.2 /etc/init.d/http status' as peter on localhost.localdomain"
Hat jemand ne Ahnung woran das liegen könnte?!
- killerhippy
- Posts: 529
- Joined: 19. May 2000 19:36
- Contact:
Laut manpage:
Du muesstes also deine Zeile korrigieren:
Das NOPASSWD ist unnötig, da ssh von jedem user ohne Restriktionen ausgeführt werden kann.
Code: Select all
Runas_Spec
A Runas_Spec is simply a Runas_List (as defined above) enclosed in a
set of parentheses. If you do not specify a Runas_Spec in the user
specification, a default Runas_Spec of root will be used. A Runas_Spec
sets the default for commands that follow it. What this means is that
for the entry:
dgb boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm
The user dgb may run /bin/ls, /bin/kill, and /usr/bin/lprm -- but only
as operator. E.g.,
$ sudo -u operator /bin/ls.
Code: Select all
apache ALL = (peter) /usr/bin/ssh
Es gibt keine dumme Fragen!
Killerhippy
Killerhippy
Danke für die hilfreichen Antworten!!
Das NOPASSWD musste doch rein. Vorher hat er immernoch eine Passwortabfrage getätigt.
Der Eintrag sieht jetzt folgendermaßen aus:
und so funktioniert es auch prima.
Danke nochmal an alle die mitgeholfen haben!!
Das NOPASSWD musste doch rein. Vorher hat er immernoch eine Passwortabfrage getätigt.
Der Eintrag sieht jetzt folgendermaßen aus:
Code: Select all
apache ALL = (peter) NOPASSWD:/usr/bin/ssh
Danke nochmal an alle die mitgeholfen haben!!