Linux als SOHO-Server

für Linux- und Windows-Clients
http://linux.eusterholz.dyndns.org

Kapitel:

Home
Debian Installation
Debian Etc.
Internet-Zugang
Telnet
FTP
r-Utilities
SSH
Printing
NTP
Nameserver
NFS/NIS/Automount
Samba (SMB-Server)
Apache (WEB-Server)
Modem / ISDN
Backup
Etc.


CGI

Installation/Konfiguration ] Status/Info ] UserDir ] Virtuelle Hosts ] Authentifizierung ] [ CGI ] mod_perl ] PHP ] SSI ] SSL ] WebDAV ] Log-Dateien ] ht://Dig ]


CGI (Common Gateway Interface) ist eine Kommunikationsschnittstelle zwischen den Server-Prozessen  und dem Server selbst. Dabei werden die Gateway-Programme (CGI-Programme) auf dem Web-Server ausgeführt und liefern dynamische Daten als HTML-Daten an den Browser zurück. In den meisten Fällen reagieren ein CGI-Programme auf die Anfragen von Benutzern, z.B. aus fest definierten Eingabemasken heraus.
Zur Erstellung eines CGI-Programms gibt es keine spezielle Programmiersprache. Im einfachsten Fall kann das Programm unter Unix ein Shell-Skript bzw. unter DOS eine .bat-Datei sein. Es können aber auch beliebige höhere Programmiersprachen wie 'C', 'Pascal' usw. benutzt werden. Bei den Skript-Sprachen hat sich 'Perl' durchgesetzt.

Im Verlauf der Seite wird auf die CGI-Möglichkeiten vom Apache2-Server unter Debian eingegangen, dabei wird kurz die notwendige Konfiguration vorgestellt.

Konfiguration

Im Prinzip gibt es zwei unterschiedliche Möglichkeiten um CGI-Programme auf dem Apache-Server zu unterstützen:
Die erste Möglichkeit besteht daraus, dass ein bestimmtes Verzeichnis und damit auch die darunter liegenden Verzeichnisse als CGI-Verzeichnis deklariert werden. In diesen Verzeichnissen können dann keine normalen HTML-, Grafik- oder Textdateien abgelegt werden. Der Apache-Server versucht bei Aufruf dieser CGI-Dateien, diese als Prozesse auf der Betriebssystemebene zu starten.
Die zweite Möglichkeit ist, anstatt CGI-Scripte in bestimmten Verzeichnissen unterzubringen, kann Apache solche Scripte auch an einer bestimmten Endung erkennen, unabhängig davon, in welchem Verzeichnis sie sich befinden. Standardmäßig verwendet man für solche Scripte die Endung '.cgi', es kann aber auch jede beliebige andere noch nicht vergebene Dateiendung konfiguriert werden.

In der Default-Konfiguration von Apache2 unter Debian ist die Verwendung von CGI schon berücksichtigt, d.h. das entsprechende CGI-Modul : 'mod_cgi', zum Ausführen von CGI-Programme ist vorhanden und auch aktiviert. (Das Modul kann mit dem Kommando 'a2enmod cgi' aktiviert werden.) Weiterhin muss das Verzeichnis 'cgi-bin' existieren, sollte das nicht der Fall sein so kann dieses mit dem Kommando 'mkdir /usr/lib/cgi-bin' nachgeholt werden.

Um die Einstellungen zu verdeutlichen, folgt eine kurze Beschreibung der CGI relevanten Konfigurationen. In der default-Datei für den virtuellen Host: '/etc/apache2/sites-available/default' ist bereits ein CGI-Bereich vorgesehen. Hierzu der entsprechende Auszug:

Auszug aus: /etc/apache2/sites-available/default

NameVirtualHost *
<VirtualHost *>
...
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>
...
</VirtualHost>

Der CGI-Anteil wird mit dem Direktive: 'ScriptAlias' eingeleitet, danach folget das CGI-Verzeichnis in diesem Fall: '/usr/lib/cgi-bin/', indem die CGI-Scripte/Programme abgelegt werden können. Wichtig für den CGI-Support ist die Option: 'ExecCGI', die das Ausführen von CGI-Programmen erlaubt.

Möchte man, wie oben als zweite Möglichkeit beschrieben, CGI-Programme außerhalb des Verzeichnisses: '/cgi-bin/' verwenden, so ist in der Hauptkonfigurationsdatei: 'apache2.conf' die folgende Zeile frei zuschalten (gelbe Markierung):

Auszug aus: /etc/apache2/apache2.conf (ca. Zeile: 341)

...
# To use CGI scripts outside /cgi-bin/:
#
AddHandler cgi-script .cgi
...

Mit der Aktivierung der Zeile werden nun Dateien, mit der Endung: '.cgi', als CGI-Programm ausgeführt.

Weiterhin ist in den Verzeichnissen die entsprechende Option: '+EcecCGI' zu setzen. Soll z.B. in alle Verzeichnisse unterhalb: '/var/www/' das Ausführen von *.cgi-Dateien möglich sein, so ist die Option zu erweitern:

Auszug aus: /etc/apache2/sites-available/default

NameVirtualHost *
<VirtualHost *>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews +ExecCGI
                AllowOverride None
                Order allow,deny
                allow from all
                # This directive allows us to have apache2's default start page
                # in /apache2-default/, but still have / go to the right place
                RedirectMatch ^/$ /apache2-default/
        </Directory>
...

Anmerkungen

Zum Test der CGI-Fähigkeit des Apache-Servers kann folgendes kleines CGI-Testprogramm in Unix-Shell genutzt werden:

CGI-Testprogramm: cgi-test.cgi

#!/bin/sh

# disable filename globbing
set -f

echo Content-type: text/plain
echo

echo CGI/1.0 test script report:
echo

echo argc is $#. argv is "$*".
echo

echo SERVER_SOFTWARE   = $SERVER_SOFTWARE
echo SERVER_NAME       = $SERVER_NAME
echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE
echo SERVER_PROTOCOL   = $SERVER_PROTOCOL
echo SERVER_PORT       = $SERVER_PORT
echo REQUEST_METHOD    = $REQUEST_METHOD
echo HTTP_ACCEPT       = "$HTTP_ACCEPT"
echo PATH_INFO         = "$PATH_INFO"
echo PATH_TRANSLATED   = "$PATH_TRANSLATED"
echo SCRIPT_NAME       = "$SCRIPT_NAME"
echo QUERY_STRING      = "$QUERY_STRING"
echo REMOTE_HOST       = $REMOTE_HOST
echo REMOTE_ADDR       = $REMOTE_ADDR
echo REMOTE_USER       = $REMOTE_USER
echo AUTH_TYPE         = $AUTH_TYPE
echo CONTENT_TYPE      = $CONTENT_TYPE
echo CONTENT_LENGTH    = $CONTENT_LENGTH

Das Programm sollte auf dem Server, z.B. in das Verzeichnis: '/usr/lib/cgi-bin', abgelegt werden. Weiterhin ist darauf zu achten, dass das Programm mit den notwendigen Datei-Rechte versehen ist. Durch Aufruf mittels Browser: 'http://<localhost>/cgi-bin/cgi-test.cgi?Hello World' sollte es ausgeführt werden und relevante Informationen über den Server ausgeben.
Weitere CGI-Testprogramme sind, sofern die 'apache2-doc' installiert wurde, unter: '/usr/share/doc/apache2-doc/cgi-examples' zu finden.

Die Installation von CGI-Programmen ist zwar recht einfach, es sollte jedoch dabei immer bedacht werden, dass durch kleine Fehler zum Teil riesige Sicherheitslücke geschaffen werden. Um ein CGI-Programm zu installieren, müssen diese lediglich ins /cgi-Verzeichnis des Servers kopieren werden. Weiterhin ist dafür zu sorgen, dass diese ausführbar sind ('chmod 755 *.cgi'). Außerdem ist die Endung: '.cgi'  zu verwendet, sofern in der Serverkonfiguration nicht noch andere Endungen für CGI-Programme eingetragen sind.
Des weiteren sollten einige Sicherheitsaspekte nicht außer Acht gelassen werden:

  • Das CGI-Skript sollte dem selben User gehören, mit dessen Rechten auch der Apache-Server läuft.

  • Im Verzeichnis: '/cgi-bin/' gehören nur CGI's. Es sollten dort auf keinen Fall andere Programme und auch nicht Daten der CGI-Programme, wie z.B. Gästebücher speichert werden.

  • In den CGI-Programmen sollten möglichst keine externen Unix-Programme aufgerufen werden.

  • Es sollten am besten bereits vorhandene bewährte CGI-Programme genutzt werden, anstatt eigne zu schreiben. Das geht nicht nur schneller, sondern ist, auch zum Teil sicherer.

Weitere Infos

Homepage: Apache Software Foundation http://www.apache.org/
Apache Tutorial: Dynamic Content with CGI http://httpd.apache.org/docs-2.0/howto/cgi.html
Apache Module mod_cgi http://httpd.apache.org/docs-2.0/mod/mod_cgi.html
The Common Gateway Interface - RFC Project Page http://cgi-spec.golux.com/
System-Dokumentation: apache2-doc usr/share/doc/apache2-doc

Home ] Nach oben ] Installation/Konfiguration ] Status/Info ] UserDir ] Virtuelle Hosts ] Authentifizierung ] [ CGI ] mod_perl ] PHP ] SSI ] SSL ] WebDAV ] Log-Dateien ] ht://Dig ]

letzte Änderung: 11. September 2007

 

Copyright © 2004 Norbert Eusterholz