Webserver apache 1.3

Vorbereitungen

Ein Webserver dient als Testserver für private Seiten und als Steuerung für krypton. Als Serversoftware kommt der Apache 1.3.28 zum Einsatz. Zusätzlich werden weitere Module wie PHP, SSL usw. integriert. Ich verwende immer noch den Apache 1.3.x, weil die 2.0-Serie zwar schon sehr stabil ist, aber noch nicht alle Module dafür angepasst wurden. Zu beachten ist, dass die Zusatzmodule zur Apache-Version passen.

#apache vorbereiten
tar xfj apache-1.3.28.tar.bz2
cd apache-1.3.28
./configure --prefix=/usr/local/apache
cd ..

#mod_ssl
tar xfj mod_ssl-2.8.15-1.3.28.tar.bz2
cd mod_ssl-2.8.15-1.3.28
./configure --with-apache=../apache_1.3.28 --with-ssl=/usr/local/ssl \\
 --with-crt=/etc/httpd/ssl.crt/server.crt \\
 --with-key=/etc/httpd/ssl.key/server.key
make && make install
cd ..

#php
tar xfz php-4.3.3.tar.bz2
cd php-4.3.3
./configure --with-apache=../apache_1.3.28 --enable-force-cgi-redirect \\
 --with-config-file-path=/etc/httpd --enable-track-var --with-openssl \\
 --with-zlib --with-mysql=/usr/local/mysql --with-gd \\
 --with-jpeg-dir=/usr/local --with-freetype-dir=/usr/local \\
 --with-png-dir=/usr/local --with-pdflib --enable-ftp \\
 --enable-exif
make && make install
cd..

#mod_perl
tar xfj mod_perl-1.0-current.tar.bz2
cd mod_perl_1.3.28
perl Makefile.PL APACHE_SRC=../apache_1.3.28/src USE_APACI=1 \\
 EVERYTHING=1 DO_HTTPD=1 PREP_HTTPD=1
make && make install
cd ..

#mod_dav
tar xfj mod_dav-1.0.3-1.3.6.tar.bz2
cd mod_dav-1.0.3-1.3.6
./configure --with-apache=../apache_1.3.28
make && make install
cd ..

#apache
./configure --prefix=/usr/local/apache --logfiledir=/var/log/httpd \\
 --sysconfdir=/etc/httpd --enable-module=all \\
 --disable-module=auth_db --disable-module=auth_dbm \\
 --activate-module=src/modules/perl/libperl.a \\
 --activate-module=src/modules/php4/libphp4.a \\
 --activate-module=src/modules/dav/libdav.a
make
#Testzertifikat
make certificate TYPE=custom
make install

Die gesamte Konfiguration des Apachen findet in der Datei /etc/httpd/httpd.conf statt. Ich werde hier nicht alle Optionen erklären, sondern nur die Wichtigsten näher betrachten. Die Datei ist gut kommentiert und auf der Apache-Seite findet sich eine hervorragende Dokumentation dazu.

ServerType standalone
ServerRoot "/var/apache"
LockFile /var/lock/httpd.accept.lock
PidFile /var/run/httpd.pid
ScoreBoardFile /var/log/httpd/apache_runtime_status

#don't get more information as needed
ServerTokens Prod

TimeOut 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 15

MinSpareServers 1
MaxSpareServers 5
StartServers 1
MaxClients 10
MaxRequestsPerChild 0

ClearModuleList
AddModule mod_mmap_static.c
AddModule mod_vhost_alias.c
AddModule mod_env.c
AddModule mod_define.c
AddModule mod_log_config.c
AddModule mod_log_agent.c
AddModule mod_log_referer.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
#AddModule mod_auth_dbm.c
#AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_proxy.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_example.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c

<IfDefine SSL>
  AddModule mod_ssl.c
</IfDefine>
<IfDefine PERL>
  AddModule  mod_perl.c
</IfDefine>
<IfDefine PHP4>
  AddModule  mod_php4.c
</IfDefine>
<IfDefine DAV>
  AddModule  mod_dav.c
</IfDefine>

Listen 192.168.0.1:8080
<IfDefine SSL>
Listen 192.168.0.1:8443
</IfDefine>

User  wwwrun
Group nogroup

ServerAdmin webmaster@laas.priv

ServerName www.laas.priv
UserDir www
DocumentRoot "/var/apache/htdocs"
DirectoryIndex index.html index.htm index.php
AccessFileName .htaccess
ExtendedStatus On

<Files ~ "^\.ht">
  Order allow,deny
  Deny from all
</Files>

<Directory />
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  AllowOverride FileInfo
</Directory>

<Location /server-status>
  SetHandler server-status
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
</Location>

<Location /server-info>
  SetHandler server-info
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
</Location>

<IfDefine PERL>
  <Location /perl-status>
    SetHandler  perl-script
    PerlHandler Apache::Status
    order deny,allow
    deny from all
    allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  </Location>
</IfDefine>

<Directory /var/apache/htdocs>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  Options +FollowSymLinks +Includes +ExecCGI
  AllowOverride AuthConfig
</Directory>

<Directory /var/apache/htdocs/cgi-bin>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  Options +FollowSymLinks +Includes +ExecCGI -Indexes
  AllowOverride AuthConfig
  <IfDefine PERL>
    AddHandler  perl-script .pl
    PerlHandler Apache::Registry
    PerlSendHeader On
  </IfDefine>
</Directory>

<Directory /var/apache/cgi-bin>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  Options +FollowSymLinks +Includes +ExecCGI -Indexes
  AllowOverride AuthConfig
  <IfDefine PERL>
    AddHandler  perl-script .pl
    PerlHandler Apache::Registry
    PerlSendHeader On
  </IfDefine>
</Directory>

<Directory /home/*/www>
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  Options -Indexes +Includes +ExecCGI
  AllowOverride none
</Directory>

<Directory /usr/local/netsaint/sbin>
  AllowOverride AuthConfig
  Order allow,deny
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  Options +ExecCGI +Includes
  SetHandler cgi-script
</Directory>

<Location cgi-bin>
  Options -Indexes +ExecCGI
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1 192.168.0.1 192.168.0.2 192.168.0.3 192.168.0.5
  SetHandler cgi-script
  <IfDefine PERL>
    AddHandler  perl-script .pl
    PerlHandler Apache::Registry
    PerlSendHeader On
  </IfDefine>
</Location>

CacheNegotiatedDocs
UseCanonicalName On
HostnameLookups Off
TypesConfig /etc/httpd/mime.types
DefaultType text/plain
<IfModule mod_mime_magic.c>
  MIMEMagicFile /etc/httpd/magic
</IfModule>

#code red and nimba worm goes direct to m$ ^^
<IfModule mod_alias.c>
  RedirectMatch (.*)\default.ida$ http://www.microsoft.com
  RedirectMatch (.*)\root.exe$    http://www.microsoft.com
  RedirectMatch (.*)\cmd.exe$     http://www.microsoft.com
  RedirectMatch (.*)\msadc$       http://www.microsoft.com
</IfModule>

#ignore code red and nimba requests
SetEnvIf Request_URI \cmd.exe|\root.exe|\default.ida worms

ErrorLog /var/log/httpd/error_log
LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

Customlog /var/log/httpd/access_log common env=!worms

# Set to one of:  On | Off | EMail
ServerSignature EMail

Alias /icons/ "/var/apache/icons/"
Alias /images/ "/var/apache/images/"
ScriptAlias /cgi-bin/ "/var/apache/cgi-bin/"

#NetSaint
Alias /netsaint/ "/usr/local/netsaint/share/"
ScriptAlias /cgi-bin/netsaint/ /usr/local/netsaint/sbin/

# FancyIndexing is whether you want fancy directory indexing or standard
IndexOptions FancyIndexing

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl .cgi
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

AddDescription "GZIP compressed document" .gz
AddDescription "tar archive" .tar
AddDescription "GZIP compressed tar archive" .tgz

ReadmeName README
HeaderName HEADER

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz

AddLanguage en .en
AddLanguage de .de

LanguagePriority de en

#activate php4 parsing
<IfDefine PHP4>
  AddType application/x-httpd-php .php
  AddType application/x-httpd-php .php3
  AddType application/x-httpd-php-source .phps
</IfDefine>

AddType application/x-tar .tgz
AddType application/x-tar .tar.gz
AddType text/html .shtml
AddHandler cgi-script .cgi
AddHandler server-parsed .shtml
AddHandler server-parsed .html
#<IfDefine PERL>
#AddHandler perl-script .pl
#</IfDefine>

BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

### Section 3: Virtual Hosts
NameVirtualHost 192.168.0.1:8080
<IfDefine SSL>
  NameVirtualHost 192.168.0.1:8443
</IfDefine>

<VirtualHost 192.168.0.1:8080>
  DocumentRoot "/var/apache/htdocs"
  ServerName www.laas.priv
  ServerAdmin webmaster@laas.priv
  <IfDefine SSL>
   SSLEngine off
  </IfDefine>
</VirtualHost>

#<VirtualHost _default_:*>
#</VirtualHost>

#Some MIME-types for downloading Certificates and CRLs
<IfDefine SSL>
  AddType application/x-x509-ca-cert .crt
  AddType application/x-pkcs7-crl    .crl
</IfDefine>

<IfModule mod_ssl.c>
  SSLPassPhraseDialog  builtin
  SSLSessionCache         dbm:/var/log/ssl_scache
  SSLSessionCacheTimeout  300
  SSLMutex  file:/var/log/ssl_mutex
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin
  SSLLog      /var/log/ssl_engine_log
  SSLLogLevel error
</IfModule>

<IfDefine SSL>
  <VirtualHost 192.168.0.1:8443>
    DocumentRoot "/var/apache/htdocs"
    ServerName www.laas.priv
    ServerAdmin webmaster@laas.priv
    SSLEngine on
    SSLCertificateFile /etc/httpd/ssl.crt/server.crt
    SSLCertificateKeyFile /etc/httpd/ssl.key/server.key
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
    CustomLog /var/log/ssl_request_log \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
  </VirtualHost>
</IfDefine>

Der erste Konfigurationsteil definiert grundlegende Eigenschaften des Servers. Unser Server heißt www.laas.priv. Der Server sollte immer unter der Kennung wwwrun laufen, niemals mit root-Rechten. Wird keine Seite angegeben, so landen wir im Verzeichnis /var/apache/htdocs und bekommen die dort abgelegte "index.html" zu sehen. Der Administrator ist unter der e-mail webmaster@laas.priv zu erreichen. "UserDir /home/*/www" gibt an, dass die Homepages unter dem Verzeichnis /home/nutzer/www zu finden sind. So wird z.B.der Aufruf von http://www.laas.priv/~mig auf die Datei /home/mig/www/index.html umgeleitet. Die Listen-Anweisungen teilen dem Server mit, von welchen Ports und auf welchen Netzwerkgeräten er Anfragen akzeptieren soll. Für jeden benutzten Port werden wir einen virtuellen Server aufsetzen.

Der Webserver kann nun mit

/usr/local/apache/bin/httpd -D SSL -D PHP4 -D PERL -D DAV

gestartet werden. Möchte man den Webserver ohne DAV-Unterstützung haben, so läßt man die Parameter "-D DAV" weg. Entsprechendes gilt für die anderen Module. Falls Probleme auftauchen, wird man in /var/log/httpd/error.log fündig.

Verzeichnisoptionen

Der Apache kann für jedes Verzeichnis explizite Zugriffsrechte festlegen. In der obigen Konfiguration wird zuerst der Zugriff auf alle Dateien, die mit ".ht" beginnen, verhindert. Das schließt insbesondere die ".htaccess"-Datei mit ein, deren Bedeutung im folgenden Abschnitt erläutert wird.

Wir können die Verzeichnisse explizit angeben, auf die jemand zugreifen darf. Man sollte immer zuerst jeden Zugriff verbieten, (deny from all) und dann explixit die Rechner aufführen, denen Zugriff gewährt wird (allow from ...). Jedes angegebene Verzeichnis schließt auch die Unterverzeichnisse mit ein. Eine ganz einfache Konfiguration besteht also darin, dass wir das Startverzeichnis /usr/local/apache freigeben. Hier ist noch die Bedeutung der einzelnen Optionen.

Option Bedeutung
ExecCGI Ausführung von CGI-Skripten ist erlaubt
FollowSymLinks erlaubt, "symbolic links" zu folgen
SymLonksIfOwnerMatch erlaubt, "symbolic links" zu folgen, wenn die Zieldatei demselben Nutzer wie der Link gehört
Includes Server-side includes sind erlaubt
IncludesNOEXEC Server-side includes sind erlaubt, aber nicht #exec- und #include-Anweisungen
Indexes Existiert im angeforderten Verzeichnis keine "index.html", so wird der Inhalt des Verzeichnisses angezeigt.

Apache-basierte Authentifizierung

Soll der Zugriff auf bestimmte Verzeichnisse reglementiert werden, so wird dort eine Datei .htaccess angelegt. Diese Datei enthält Informationen, welche Nutzer zugelassen sind und wo die Passwörter zu finden sind. Dieser Schutz ist nach heutigem Stand sehr schwer zu umgehen.

AuthName "restricted stuff"
AuthType Basic
AuthUserFile /etc/httpd/users
require user mig laas

Hier dürfen also nur die Benutzer mig und laas zugreifen. Die Passwörter setzt man mit folgenden Zeilen. Der Schalter -c muss beim ersten Aufruf angegeben werden, damit die Passwortdatei erzeugt wird.

htpasswd -c /etc/httpd/users laas
htpasswd /etc/httpd/users mig

Nun muss die Authentifizierung für das entsprechende Verzeichnis noch aktiviert werden. Dazu ergänzt man den Directory-Block um die Zeile AllowOverride AuthConfig.

SSL-Verschlüsselung

Falls man kein Zertifikat zur Hand hat, kann man sich testweise eins erstellen.

cd /usr/local/ssl/misc
./CA.pl -newcert

Hierbei sollte versucht werden, das Zertifikat ohne Passwort zu speichern, da sonst bei jedem Start des Apachen das Passwort eingegeben werden muss, um den Schlüssel lesen zu können. Das Zertifikat und der Schlüssel müssen dann noch nach /etc/httpd in die entsprechenden Verzeichnisse kopiert werden.