sendmail PHP-Script-Whitelist

Fireball22

Registered User
Hallo zusammen,

um die Sicherheit auf meinen Serversystemen weiter zu erhöhen plane ich, eine sogenannte PHP-Script-Whitelist für sendmail zu erstellen.
D. h. nur bekannte Scripts (aus eigener Quelle oder Entwicklung) dürfen Mails verschicken, Malware dagegen nicht.

Gibt es da evtl. eine Methode um dies umzusetzen?

Ich freue mich auf eure Vorschläge!

MfG
Fireball22
 
Wenn du nur selbstgeschriebene Scripte einsetzt, dann sperr die mail()-Funktion und verwende SMTP mit Authentifizierung z.B. über PEAR-Module. Dann muß ein anderes Script erst mal die Auth-Daten für den Mailserver haben.
 
Vielen Dank für den Tipp!
Generell eine super Idee, allerdings kommt es dann hier auf Grund anderer Sicherheitsbeschränkungen am SMTP zu Problemen.

Ist es eigentlich auch möglich, das Programm hinter dem mail()-Befehl zu ändern, der müsste ja im Momement auf [...]/sendmail gehen.
Angenommen ich biege diesen um auf [...]/sendmail_control.sh und erstelle unter diesem Namen ein Bash-Script, das vor der Weitergabe der Mail an sendmail prüft, ob das Quellscript auf der Whitelist steht.
Wäre das irgendwie umsetzbar? Nebenbei: Ich glaube den mail()-Pfad kann man nur generell setzen, nicht für einzelne Vhosts?

MfG
Fireball22
 
Das kommt auf dein PHP-Setup an - wenn du PHP als FastCGI nutzt, kannst du recht einfach eigene Konfigs pro VHost verwenden und das unterschiedlich einstellen.
Allerdings würde ich den sendmail-Wrapper nicht in der PHP-Config ändern, sondern im Dateisystem ersetzen (du kannst über bestimmte PEAR-Module über dieses Sendmail-Binary senden und das sollte dann natürlich auch dein eigenes Wrapper sein).
 
PHP läuft bei mir als Apache-Modul.
Wie funktioniert das eigentlich genau mit diesem PEAR? Ich finde dazu nur ein PHP-Framework, also Libs, die man in den PHP-Code einbinden kann?

MfG
Fireball22
 
PEAR ist in der Tat ein Framework, welches dir Funktionen zur Verfügung stellt - kann zentral auf dem Server installiert sein oder auch lokal für einzelne Webseiten. Die entsprechenden Funktionen bindest du einfach per inlucde_once oder require_once ein und kannst sie nutzen - siehe http://pear.php.net
PHP als Modul kannst du eingeschränkt über die Apache-Konfig steuern - was geht, steht in der PHP-Doku.
 
Vielen Dank für eure hilfreichen Tipps!

Jetzt würde mich nur noch interessieren, wie du das mit dem eigenen Wrapper bbzw. eigenen Sendmail-Binaries gemeint hattest?
Gibt es da irgendwo einen Source-Code dieses Wrappers oder kann man anhand von diesem PEAR-Framework die Anfragen schon auf PHP-Seite mittels PHP-Script anfangen?

MfG
Fireball22
 
Wenn du Mails per SMTP beim Server einliefern willst statt über die mail()-Funktion von PHP, dann kannst du entweder selber eine Routine schreiben oder auf was fertiges zurück greifen (beispielsweise die Mail-Klassen von PEAR).
Was den Sendmail-Wrapper betrifft: Hushi hat auf seiner Webseite ein Wrapper-Script, was einfach nur mitloggt, welche Scripte Mails versandt haben. Dazu wird das sendmail-Binary (meist unter /usr/sbin oder /usr/lib) umbenannt und das Wrapper-Script (oft ein Shell- oder Perl-Script) kommt an die gleiche Stelle, macht die Prüfungen und gibt das Mail entsprechend an das umbenannte Sendmail-Binary weiter.
 
Dazu wird das sendmail-Binary (meist unter /usr/sbin oder /usr/lib) umbenannt [...]
Vom Umbenennen halte ich nicht viel. Eher sollte man den Wrapper irgendwie benennen und dann mittels sendmail_path darauf zeigen. Somit bleibt der ursprüngliche Pfad unberührt und es kommt zu keinen Problemen, wenn andere Systemapplikationen auf sendmail zugreifen wollen.
Die Funktionsweise des Wrappers (ob jetzt von huschi oder anderweitig) ändert sich dadurch nicht.
 
Ich habe nur das Vorgehen wie bei Hushi beschrieben wiedergegeben. Beide Methoden haben Vor- und Nachteile. In der php.ini umbiegen wirkt sich beispielsweise nich auf andere Script-Sprachen aus (z.B. Perl, Python), die man evtl. ja auch überwachen will.
 
Hallo zusammen,

habe hier etwas zum Thema Wrapper gefunden:

Ich frage mich nur, wie ich jetzt in dem Shell-Script abfrage, von welcher PHP-Datei die Anfrage kommt ($SCRIPT_NAME).
Habe geradeeben schon versucht die Apache Environment Variablen in der Config abzurufen und dann z. B. den Aufruf des geänderten Wrappers wie folgt zu starten: /usr/bin/sendmail_wrapper /var/www/vhosts/domain.de/httpdocs/mail.php


MfG
Fireball22
 
Vielen Dank für deinen Post, das trifft ja wirklich nahezu auf das zu, was ich vorhabe!
Schade ist nur hier, dass er die Weitergabe der Environment-Variablen per auto_prepend_file löst, d. h. diese Datei wird jedesmal vor jeder anderen .php-Datei ausgeführt.
Ich bezweifle auch, dass das komplett reibungslos funktioniert, man nehme nur mal an, dass während ein Script läuft ein anderes Script ausgeführt wird. Dann würde die Variable wieder überschrieben werden.

MfG
Fireball22
 
Ich bezweifle auch, dass das komplett reibungslos funktioniert, man nehme nur mal an, dass während ein Script läuft ein anderes Script ausgeführt wird. Dann würde die Variable wieder überschrieben werden

Das sollte eigentlich kein Problem sein, da die Variablen ja nicht systemweit exportiert werden, sondern nur für das Script und die daraus aufgerufenen Prozesse (also z.B. der sendmail-wrapper beim Mail-Versand) zur Verfügung stehen.
 
Mir ist geradeeben noch eine andere Möglichkeit gekommen, ich weiß nur nicht ob und wie man das umsetzen könnte.
Ist es denn irgendwie möglich anhand von iptables den Header von SMTP-Traffic zu analyisieren und diese Abfrage auf einen bestimmten Prozess zu binden?

MfG
Fireball22
 
iptables hat nix mit SMTP zu tun, wie soll das gehen? Je nach verwendetem MTA kannst du natürlich mit Tools eingreifen - postifx bietet u.a. die Möglichkeit, einen Policy-Daemon anzusprechen (andere haben da auch Möglichkeiten, aber die kenne ich kaum)
 
Ich setze bei mir QMail an.
iptables könnte rein theoretisch natürlich Mails blocken, es überwacht ja den kompletten I/O-Traffic, ist etwas auf Port 25 dabei, dann wird das ganauer untersucht, enthält dann der Header dann nicht einen bestimmten String und wurde das ganze über sendmail aufgerufen dann DROP.

MfG
Fireball22
 
Nein, kann es nicht. Was du meinst, ist eine Application-Firewall auf SMTP-Ebene, iptables setzt aber beim IP-Protokoll an, welches darunter liegt und nix von den höheren Ebenen kennt.
 
Back
Top