Hallo Community!
Bisher habe ich immer Confixx für mich die Configarbeit machen lassen, aber ich möchte das, was dahinter steckt, auch endlich mal selber verstehen. Deswegen habe ich mir verschiedene Bücher geholt und im Internet recherchiert. Allerdings sind bei mir immer noch viele Fragen offen, deshalb würde ich euch bitten - wenn ihr die Zeit findet - mal über meine nachstehende Konfiguration zu schauen, um mir etwaige Fehler, Sicherheitslücken oder Verbesserungsvorschläge aufzuzeigen.
System und Szenario
Das ganze ist ein Debian Etch System mit Apache 2.2. Ich möchte auf diesem System nur eigene Seite hosten (-> mod_php: Frage dazu weiter unten). Ich verwende für php die Debian-Standard Pakete libapache2-mod-php5 und php5-cgi (wahrscheinlich gleich ein Widerspruch -> Frage dazu weiter unten). Der Server verfügt nur über eine IP, weshalb ich namensbasierte VirtualHosts angelegt habe. apache wird als prefork ausgeführt.
1) Die Sache mit CGI und mod_*
Wo ich immer noch nur die Hälfte verstehe ist die Sache, wie ich denn nun bestimmte Skripte ausführe. Generell gibt es ja die Möglichkeit sie entweder als Modul auszuführen oder über ein CGI-Interface und das ganze dann mittels suExec begrenzen.
1.1) PHP5
PHP wollte ich als Modul ausführen, weil es angeblich schneller ist und wahrscheinlich auch einfacher zu konfigurieren. PHP funktioniert auch auf dem Apachen schon wunderbar. Welche Vorteile hat für mich denn die Ausführung von PHP als CGI?
1.2) Perl
Zwar benötige ich derzeitig noch keine Perl-Unterstützung aber dennoch interessiert mich, wie das ganze funktionieren würde. Wenn ich also Perl-Skripte auf meinem Server vom Web aus ausführen wollen lassen würde, müssten sich diese im cgi-bin-Ordner befinden.
Die Anfrage eines Clients nach http://www.sample.de/cgi-bin/script.pl würde durch die ScriptAlias-Direktive [ScriptAlias /cgi-bin/ /var/www/sample/html/cgi-bin/] also auf die Datei /var/www/sample/html/cgi-bin/script.pl weitergeleitet und zur Ausführung berechtigt. "Berechtigt" im Sinne von, dass das Skript nun vom Apachen dem jeweiligen Sprachinterpreter (in diesem Fall dem Perl-Interpreter) übergeben wird, der das Skript interpretiert und die Ausgabe des Skripts wieder an den Apachen zurückleitet, der sie dann wieder an den Client sendet.
Erreiche ich das gleiche Ergebnis auch wenn ich folgende Einstellung vornehme oder verhält sich der Apache bei folgender Anweisung anders?
<Directory "/var/www/sample/html/cgi-bin/">
Options +ExecCGI
AddHandler cgi-script pl
</Directory>
Mit der Ausnahme, dass die obere ScriptAlias-Direktive alle Dateien als CGI-Skript ausführt und die Anweisung mit dem Directory-Container nur die Skripte ausführt für die der jeweilige Handler passend konfiguriert wurde.
1.3 suExec
Wie oben beschrieben will der Apache das Skript nun ausführen. Er macht das also unter seinen Benutzerrechten. Wie überall steht bringt das nun das Sicherheitsrisiko, dass das Skript die Rechte des Apachen erhält und somit quasi auf das komplette DocumentRoot Zugriff hat. Hier kommt suExec ins Spiel. Zwar bin ich der einzige Benutzer auf dem Server, aber dennoch interessiert mich die Konfiguration von suExec. Nach meinen bisherigen Wissensstand muss ich also das suExec-Modul laden und dann in der vHost-Konfiguration über die SuexecUserGroup-Direktive [SuexecUserGroup sampleUser sampleGroup] einen User und eine Gruppe bestimmen, unter dessen Berechtigungen das Skript nun ausgeführt wird.
Für meine vHosts habe ich jeweils einen Systemaccount ohne Shell angelegt. Diese gehören alle der Gruppe "ftpuser" (gid > 1000). Muss ich nun für jeden User eine eigene Gruppe anlegen? Weil wenn das Skript mit der Gruppenberechtigung eines dieser User ausgeführt wird, hat es ja auch Zugriff auf alle Dateien die für User der Gruppe "ftpuser" berechtigt sind... Also wäre das doch wieder ein Sicherheitsrisiko.
Des Weiteren habe ich dann mal meine suExec-Konfiguration angeschaut:
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
Was mir hier nicht ganz klar ist, ist die Anweisung [-D AP_USERDIR_SUFFIX="public_html"]. Gibt diese Anweisung das Webverzeichnis des jeweiligen Users an? Also quasi /var/www/user/public_html? Weil mein Webverzeichnis wäre ja /var/www/user/html... Folgt daraus, dass ich suExec nochmal kompilieren müsste, und dann mit "html" anstelle von "public_html". Außerdem noch mit der AP_GID_MIN=1000, damit ich noch sicherer fahre?
Was müsste ich noch konfigurieren, damit alle cgi-Skripte durch suExec reglementiert werden?
2) Die VirtualHosts-Konfiguration
Ich würde mich sehr freuen, wenn sich jmd. die Mühe machen würden, sich die nachstehende Konfiguration mal anzuschauen und mir etwaige Fehler zu benennen. Ich habe eine Default Konfiguration, die als erstes eingebunden, und somit als Standard-Konfiguration genutzt werden sollte, wenn keine andere matcht. Bei dieser Konfiguration wollte ich so restriktiv wie möglich sein, also wenn ihr ne Anmerkung habt, was ich noch sicherer gestalten könnte oder wo ich später evtl. Probleme bekommen könnte, dann bitte immer raus damit!
Meine Erklärungen und Fragen sind im Code fett geschrieben
default.conf
sample.conf
Wenn du bis hier her gelesen hast, dann schon mal ein großes Dankeschön! Wär echt genial, wenn du mir die Fehler die dir beim Lesen aufgefallen sind, jetzt noch drunterpostest! Danke!!!
Bisher habe ich immer Confixx für mich die Configarbeit machen lassen, aber ich möchte das, was dahinter steckt, auch endlich mal selber verstehen. Deswegen habe ich mir verschiedene Bücher geholt und im Internet recherchiert. Allerdings sind bei mir immer noch viele Fragen offen, deshalb würde ich euch bitten - wenn ihr die Zeit findet - mal über meine nachstehende Konfiguration zu schauen, um mir etwaige Fehler, Sicherheitslücken oder Verbesserungsvorschläge aufzuzeigen.
System und Szenario
Das ganze ist ein Debian Etch System mit Apache 2.2. Ich möchte auf diesem System nur eigene Seite hosten (-> mod_php: Frage dazu weiter unten). Ich verwende für php die Debian-Standard Pakete libapache2-mod-php5 und php5-cgi (wahrscheinlich gleich ein Widerspruch -> Frage dazu weiter unten). Der Server verfügt nur über eine IP, weshalb ich namensbasierte VirtualHosts angelegt habe. apache wird als prefork ausgeführt.
1) Die Sache mit CGI und mod_*
Wo ich immer noch nur die Hälfte verstehe ist die Sache, wie ich denn nun bestimmte Skripte ausführe. Generell gibt es ja die Möglichkeit sie entweder als Modul auszuführen oder über ein CGI-Interface und das ganze dann mittels suExec begrenzen.
1.1) PHP5
PHP wollte ich als Modul ausführen, weil es angeblich schneller ist und wahrscheinlich auch einfacher zu konfigurieren. PHP funktioniert auch auf dem Apachen schon wunderbar. Welche Vorteile hat für mich denn die Ausführung von PHP als CGI?
1.2) Perl
Zwar benötige ich derzeitig noch keine Perl-Unterstützung aber dennoch interessiert mich, wie das ganze funktionieren würde. Wenn ich also Perl-Skripte auf meinem Server vom Web aus ausführen wollen lassen würde, müssten sich diese im cgi-bin-Ordner befinden.
Die Anfrage eines Clients nach http://www.sample.de/cgi-bin/script.pl würde durch die ScriptAlias-Direktive [ScriptAlias /cgi-bin/ /var/www/sample/html/cgi-bin/] also auf die Datei /var/www/sample/html/cgi-bin/script.pl weitergeleitet und zur Ausführung berechtigt. "Berechtigt" im Sinne von, dass das Skript nun vom Apachen dem jeweiligen Sprachinterpreter (in diesem Fall dem Perl-Interpreter) übergeben wird, der das Skript interpretiert und die Ausgabe des Skripts wieder an den Apachen zurückleitet, der sie dann wieder an den Client sendet.
Erreiche ich das gleiche Ergebnis auch wenn ich folgende Einstellung vornehme oder verhält sich der Apache bei folgender Anweisung anders?
<Directory "/var/www/sample/html/cgi-bin/">
Options +ExecCGI
AddHandler cgi-script pl
</Directory>
Mit der Ausnahme, dass die obere ScriptAlias-Direktive alle Dateien als CGI-Skript ausführt und die Anweisung mit dem Directory-Container nur die Skripte ausführt für die der jeweilige Handler passend konfiguriert wurde.
1.3 suExec
Wie oben beschrieben will der Apache das Skript nun ausführen. Er macht das also unter seinen Benutzerrechten. Wie überall steht bringt das nun das Sicherheitsrisiko, dass das Skript die Rechte des Apachen erhält und somit quasi auf das komplette DocumentRoot Zugriff hat. Hier kommt suExec ins Spiel. Zwar bin ich der einzige Benutzer auf dem Server, aber dennoch interessiert mich die Konfiguration von suExec. Nach meinen bisherigen Wissensstand muss ich also das suExec-Modul laden und dann in der vHost-Konfiguration über die SuexecUserGroup-Direktive [SuexecUserGroup sampleUser sampleGroup] einen User und eine Gruppe bestimmen, unter dessen Berechtigungen das Skript nun ausgeführt wird.
Für meine vHosts habe ich jeweils einen Systemaccount ohne Shell angelegt. Diese gehören alle der Gruppe "ftpuser" (gid > 1000). Muss ich nun für jeden User eine eigene Gruppe anlegen? Weil wenn das Skript mit der Gruppenberechtigung eines dieser User ausgeführt wird, hat es ja auch Zugriff auf alle Dateien die für User der Gruppe "ftpuser" berechtigt sind... Also wäre das doch wieder ein Sicherheitsrisiko.
Des Weiteren habe ich dann mal meine suExec-Konfiguration angeschaut:
-D AP_DOC_ROOT="/var/www"
-D AP_GID_MIN=100
-D AP_HTTPD_USER="www-data"
-D AP_LOG_EXEC="/var/log/apache2/suexec.log"
-D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
-D AP_UID_MIN=100
-D AP_USERDIR_SUFFIX="public_html"
Was mir hier nicht ganz klar ist, ist die Anweisung [-D AP_USERDIR_SUFFIX="public_html"]. Gibt diese Anweisung das Webverzeichnis des jeweiligen Users an? Also quasi /var/www/user/public_html? Weil mein Webverzeichnis wäre ja /var/www/user/html... Folgt daraus, dass ich suExec nochmal kompilieren müsste, und dann mit "html" anstelle von "public_html". Außerdem noch mit der AP_GID_MIN=1000, damit ich noch sicherer fahre?
Was müsste ich noch konfigurieren, damit alle cgi-Skripte durch suExec reglementiert werden?
2) Die VirtualHosts-Konfiguration
Ich würde mich sehr freuen, wenn sich jmd. die Mühe machen würden, sich die nachstehende Konfiguration mal anzuschauen und mir etwaige Fehler zu benennen. Ich habe eine Default Konfiguration, die als erstes eingebunden, und somit als Standard-Konfiguration genutzt werden sollte, wenn keine andere matcht. Bei dieser Konfiguration wollte ich so restriktiv wie möglich sein, also wenn ihr ne Anmerkung habt, was ich noch sicherer gestalten könnte oder wo ich später evtl. Probleme bekommen könnte, dann bitte immer raus damit!
Meine Erklärungen und Fragen sind im Code fett geschrieben
default.conf
Code:
# Auf <IP>:<Port> werden Anfragen bearbeitet
NameVirtualHost <IP>:80
NameVirtualHost <IP>:443
# ht.access-files ausblenden
<Files ~ "^\.ht">
deny from all
</Files>
[U][B]Damit sollte doch auf dem gesamten Server der Zugriff auf .htaccess-Files verboten sein, oder?[/B][/U]
#[BEG]DefaultVirtualHost:80
<VirtualHost <IP>:80>
# WebVerzeichnis
DocumentRoot /var/www/
#[BEG]VerzeichnisAnweisungen
<Directory />
# Verzeichnisoptionen deaktivieren
Options None
# .htaccess-files deaktivieren
AllowOverride None
# Genrerellen Zugriff sperren
Order Allow,Deny
Deny from all
</Directory>
#[END]VerzeichnisAnweisungen
#[BEG]VerzeichnisAnweisungen
<Directory /var/www>
# Verzeichnisoptionen deaktivieren
Options None
# .htaccess-files deaktivieren
AllowOverride None
# Genrerellen Zugriff sperren
Order Allow,Deny
Deny from all
</Directory>
#[END]VerzeichnisAnweisungen
</VirtualHost>
#[END]DefaultVirtualHost:80
#[BEG]DefaultVirtualHost:443
<VirtualHost <IP>:443>
# WebVerzeichnis
DocumentRoot /var/www/
# SSl aktivieren
SSLEngine on
#[BEG]VerzeichnisAnweisungen
<Directory />
# Verzeichnisoptionen deaktivieren
Options None
# .htaccess-files deaktivieren
AllowOverride None
# Genrerellen Zugriff sperren
Order Allow,Deny
Deny from all
</Directory>
#[END]VerzeichnisAnweisungen
#[BEG]VerzeichnisAnweisungen
<Directory /var/www>
# Verzeichnisoptionen deaktivieren
Options None
# .htaccess-files deaktivieren
AllowOverride None
# Genrerellen Zugriff sperren
Order Allow,Deny
Deny from all
</Directory>
#[END]VerzeichnisAnweisungen
</VirtualHost>
#[END]DefaultVirtualHost:443
sample.conf
Code:
# [BEG]BeispielVirtualHost
<VirtualHost <IP>:80>
# suExec-Konfiguration
SuexecUserGroup sampleUser sampleGroup
# ScriptAusführung im Ordner cgi-bin
ScriptAlias /cgi-bin/ /var/www/sample/html/cgi-bin/
# Auf diesen URLs werden Anfragen bearbeitet
ServerName sample.de
ServerAlias www.sample.de
# WebVerzeichnis
DocumentRoot /var/www/sample/html
#[BEG]VerzeichnisAnweisungen
<Directory /var/www/sample/html>
# Verzeichnisoptionen setzen
#Options +FollowSymLinks +SymLinksIfOwnerMatch
# .htaccess-files erlauben
AllowOverride All
# Genrerellen Zugriff erlauben
Order Deny,Allow
Allow from all
</Directory>
#[END]Verzeichnisanweisungen
# Hostspezifische Logdateien
#ErrorLog /var/log/apache2/sample_error.log
#CustomLog /var/log/apache2/sample_access.log combined
# Alternativen: debug, info, notice, warn, error, crit, alert, emerg
#LogLevel warn
<VirtualHost <IP>:80>
# [END]BeispielVirtualHost
Wenn du bis hier her gelesen hast, dann schon mal ein großes Dankeschön! Wär echt genial, wenn du mir die Fehler die dir beim Lesen aufgefallen sind, jetzt noch drunterpostest! Danke!!!