[Apache2]Genrelle Konfigurationsfragen (CGI,suExec,vhosts)

avalanche

New Member
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
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!!!
 
Wenn Du Deine Fragen kompakter zusammengeschrieben hättest, hätte evtl. auch schon mal jemand darauf geantwortet. :)
Welche Vorteile hat für mich denn die Ausführung von PHP als CGI?
Die Antwort gibt es tausendfach im Netz. Daher hier nur das wesentliche:
- Als CGI kannst Du mehr Sicherheiten einbauen.
- Als Mod läuft es schneller, nutzt persistente DB-Connections und profitiert von evtl. installierten PHP-Beschleunigern.

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.
Nein, siehe unten.

Erreiche ich das gleiche Ergebnis auch wenn ich folgende Einstellung vornehme oder verhält sich der Apache bei folgender Anweisung anders?
Nicht 100%ig. ScriptAlias schützt zusätzlich alle weiteren Dateien in diesem Verzeichnis vor unerlaubten Zugriff. Wenn Dein Script z.B. eine zusätzlich Datei "meins.txt" nutzt, so liefert die ScriptAlias-Version den Aufruf von .../cgi-bin/meins.txt einen 500er zurück. Die andere Version hingegen liefert diese Datei aus.

<Directory "/var/www/sample/html/cgi-bin/">
Wenn Du hier das cgi-bin weg läßt, kannst Du sogar Perl-Scripte ganz normal im normalen Web ausführen.

Muss ich nun für jeden User eine eigene Gruppe anlegen?
Sollte man grundsätzlich tun.

Gibt diese Anweisung das Webverzeichnis des jeweiligen Users an?
Ja und Nein. Eigentlich kann man diesen Teil ignorieren.

Außerdem noch mit der AP_GID_MIN=1000, damit ich noch sicherer fahre?
Welche Sicherheit erhoffst Du Dir davon? Hast Du Gruppen zwischen 100 und 1000?

die nachstehende Konfiguration mal anzuschauen und mir etwaige Fehler zu benennen.
Evtl. Fehler stehen in der error_log oder meldet der Apache von sich aus.

Damit sollte doch auf dem gesamten Server der Zugriff auf .htaccess-Files verboten sein, oder?
Ja.

huschi.
 
Last edited by a moderator:
Back
Top