4.3. Dienste für Clients

4.3.1. Webserver

Der Webserver ist quasi die komfortable Bedienoberfläche für das Schulnetz. Über diesen Server werden einzelne CGI-Scripte ausgeführt, mit denen man zum Beispiel einen neuen Benutzer anlegen kann. Ansonsten lässt sich die Homepage der Schule anschauen und jeder Benutzer kann im Ordner public_html/ in seinem Homeverzeichnis seine eigenen Seiten im Schulnetz veröffentlichen.

Als Webserver wird apache verwendet. Falls apache noch nicht installiert ist, lässt sich dies mit apt-get install apache nachholen. Die Konfigurationsdatei heißt /etc/apache/httpd.conf. Diese muss an einigen stellen angepasst werden. Der folgende Ausschnitt aus der Konfigurationsdatei soll einen Anhaltspunkt geben, was gegenüber der Standardkonfigurationsdatei von Debian verändert werden muss:

#
# /etc/apache/httpd.conf
#

### Section 1: Global Environment
# Keine Änderungen nötig

### Section 2: 'Main' server configuration
ServerAdmin webmaster@gm.rt.schule-bw.de
ServerName server.gm.rt.schule-bw.de
DocumentRoot "/usr/local/httpd/htdocs"

<Directory />
    AuthUserFile     /etc/apache/passwd
    AuthGroupFile    /etc/apache/group
    Order allow,deny
    Options None
    AllowOverride None
</Directory>

#
# This should be changed to whatever you set DocumentRoot to.
#
<Directory /usr/local/httpd/htdocs/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

# Einzelne Verzeichnisse
<Directory /usr/local/httpd/htdocs/admin/>
    AllowOverride None
    Options ExecCGI FollowSymLinks Indexes
    DirectoryIndex index.html index.cgi

    AuthType Basic
    AuthName "Systemverwaltung"
    AuthUserFile  /etc/apache/passwd
    AuthGroupFile /etc/apache/group
    require group admin
</Directory>

<Directory /usr/local/httpd/htdocs/internet/>
    AllowOverride None
    Options ExecCGI FollowSymLinks
    DirectoryIndex index.html index.cgi

    AuthType Basic
    AuthName "Internet-Einwahl"
    AuthUserFile  /etc/apache/passwd
    AuthGroupFile /etc/apache/group
    require group internet
</Directory>

<Directory /usr/local/httpd/htdocs/organisation/>
    AllowOverride None
    Options Indexes
    DirectoryIndex index.html index.htm

    AuthType Basic
    AuthName "Organisation"
    AuthUserFile  /etc/apache/passwd
    AuthGroupFile /etc/apache/group
    require group lehrer
</Directory>

<Directory /usr/local/httpd/htdocs/passwd/>
    AllowOverride None
    Options ExecCGI FollowSymLinks
    DirectoryIndex index.html index.cgi

    AuthType Basic
    AuthName "Passwortaenderung"
    AuthUserFile  /etc/apache/passwd
    AuthGroupFile /etc/apache/group
    require group users
</Directory>

<Directory /usr/local/httpd/htdocs/mail-config/>
    AllowOverride None
    Options ExecCGI FollowSymLinks
    DirectoryIndex index.html index.cgi

    AuthType Basic
    AuthName "Mail-Weiterleitung"
    AuthUserFile  /etc/apache/passwd
    AuthGroupFile /etc/apache/group
    require group users
</Directory>

<Directory /usr/local/samba/homepage/>
    AllowOverride None
    Options Indexes FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

ScriptAlias /cgi-bin/ /usr/local/httpd/cgi-bin/

<Directory /usr/lib/cgi-bin/>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

<IfModule mod_mime.c>
    AddHandler cgi-script .cgi .sh .pl
</IfModule>

<IfModule mod_userdir.c>
    UserDir /home/public_html
</IfModule>

<Directory /home/public_html/*/>
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    <Limit GET POST OPTIONS PROPFIND>
        Order allow,deny
        Allow from all
    </Limit>
    <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
        Order deny,allow
        Deny from all
    </Limit>
</Directory>
Es wurden für einige Verzeichnisse die Zugriffsrechte gesetzt. Oft muss man sich erst anmelden (AuthType Basic), wenn man so ein Verzeichnis betreten will.

Mit /etc/init.d/apache restart wird die neue Konfiguration übernommen. Jetzt wird noch ein Script benötigt, das die Dateien /etc/apache/passwd und /etc/apache/group erzeugt. Diese sind für eine Anmeldung notwendig. Das Script mit dem Dateinamen /usr/local/sbin/generate_apache_auth hat folgenden Inhalt:

#!/usr/bin/perl -w
#
# /usr/local/sbin/generate_apache_auth
#
# WARNING: will run as root!!!
# Copyright (C) 1999 Thomas Bleher <thomas@gm.rt.schule-bw.de>
#  under the GNU GPL
#

umask(0027);
%valid_users = map {$_ => 1} split / /, (getgrnam('users'))[3];

open(DATEI, '/etc/shadow');
@passwords = <DATEI>;
close DATEI;

open DATEI, '>/etc/apache/passwd';
foreach (@passwords) {
    @user = split(/:/, $_);
    if (defined($valid_users{$user[0]})) {  ## nur normale user (Sicherheit)
        print DATEI "$user[0]:$user[1]\n";
    }
}
close DATEI;

open DATEI, '/etc/group';
@groups = <DATEI>;
close DATEI;

open DATEI, '>/etc/apache/group';
foreach (@groups) {
    @user = split(/:/, $_);
    $user[3] =~ s/,/ /g;
    $user[3] =~ s/root//g;
    print DATEI "$user[0]: $user[3]";
}
close DATEI;


$uid = 0;  # root
$gid = 33; # www-data
chown $uid, $gid, '/etc/apache/passwd', '/etc/apache/group';
Dieses Script wird mit chmod 700 /usr/local/sbin/generate_apache_auth ausführbar gemacht. Jedesmal, wenn ein neuer Benutzer angelegt wird, wenn ein Benutzer gelöscht wird oder wenn ein Passwort geändert wurde, muss dieses Script ausgeführt werden.

4.3.2. pop3-Server

Über einen POP3-Server können sich die Benutzer ihre Mail komfortabel über einen Mailclient (z.B. Mozilla-Mail, Outlook Express) abholen. Der POP3-Server verwendet die Mailboxen der lokalen Benutzer auf dem Server. Mit apt-get install qpopper wird ein einfacher POP3-Server installiert. Die Standardkonfiguration genügt; dieser Server muss nicht konfiguriert werden. Falls doch: Die Konfigurationsdatei heißt /etc/qpopper.conf.

4.3.3. Proxy und Filter

4.3.3.1. squid

Über den Proxy-Server squid erhalten die Clients Zugang zum Internet. Alle Rechner im Schulnetz greifen also nicht direkt auf das Internet zu, sondern nur auf den Proxy-Server, der dann die gewünschten Daten liefert. Zuerst muss die Software installiert werden: apt-get install squid. Die Konfigurationsdatei heißt /etc/squid.conf. In der Datei müssen einige Einstellungen angepasst werden. Hier sind die wichtigen Einstellungen:

#
# /etc/squid.conf
#

ftp_user webmaster@gm.rt.schule-bw.de

# ACCESS CONTROLS
# ---------------
[...]

# INSERT YOUR OWN RULE(S) HERE...
acl schulnetz src 192.168.0.0/255.255.255.0
acl server dst 192.168.0.1
http_access allow schulnetz

append_domain .gm.rt.schule-bw.de

always_direct allow server
Mit /etc/init.d/squid restart wird die Konfiguration übernommen.

4.3.3.2. squidGuard

Der Filter, der als Jugendschutzfilter eingerichtet werden kann, sperrt bestimmte Internetadressen. Aktuelle Listen erhält man unter www.squidguard.org/blacklist/.

Die Filtersoftware heißt squidguard und wird mit apt-get install squidguard installiert. Damit der Filter im Proxy integriert wird, muss /etc/squid.conf bearbeitet werden. Es müssen folgende zwei Einträge existieren:

#
# /etc/squid.conf
#
[...]

redirect_program /usr/bin/squidGuard
redirect_children 5
Dann müssen neue Blacklisten unter der oben genannten Adresse heruntergeladen werden. Mit cd /var/lib/squidguard/db; tar xfzv ~/blacklists.tar.gz wird das Archiv ins richtige Verzeichnis entpackt. Danach muss noch chmod -R 777 /var/lib/squidguard/db/blacklists ausgeführt werden. Die Konfigurationsdatei heißt /etc/squid/squidGuard.conf. Sie muss folgenden Inhalt haben:
#
# /etc/squid/squidGuard.conf
#
logdir /var/log/squid
dbhome /var/lib/squidguard/db

src localnet {
    ip 127.0.0.0/8
    ip 192.168.0.0/24
}

dest ads {
    domainlist      blacklists/ads/domains
    urllist         blacklists/ads/urls
}
dest aggressive {
    domainlist      blacklists/aggressive/domains
    urllist         blacklists/aggressive/urls
}
dest audio-video {
    domainlist      blacklists/audio-video/domains
    urllist         blacklists/audio-video/urls
}
dest drugs {
    domainlist      blacklists/drugs/domains
    urllist         blacklists/drugs/urls
}
dest gambling {
    domainlist      blacklists/gambling/domains
    urllist         blacklists/gambling/urls
}
dest hacking {
    domainlist      blacklists/hacking/domains
    urllist         blacklists/hacking/urls
}
dest mail {
    domainlist      blacklists/mail/domains
}
dest porn {
    domainlist      blacklists/porn/domains
    urllist         blacklists/porn/urls
    #expressionlist  blacklists/porn/expressions
}
dest proxy {
    domainlist      blacklists/proxy/domains
    urllist         blacklists/proxy/urls
}
dest violence {
    domainlist      blacklists/violence/domains
    urllist         blacklists/violence/urls
    #expressionlist  blacklists/violence/expressions
}
dest warez {
    domainlist      blacklists/warez/domains
    urllist         blacklists/warez/urls
}

acl {
    localnet {
        pass !aggressive !porn !violence all
        redirect http://server/cgi-bin/blocked.cgi?clientaddr=%a&url=%u
    }

    default {
        pass none
        redirect http://server/cgi-bin/blocked.cgi?clientaddr=%a&url=%u
    }
}
Damit werden die Adresslisten "aggressive", "porn" und "violence" abgeblockt. Wer eine solche Seite aufruft, bekommt das Script blocked.cgi zu sehen. Dieses Script gibt eine Fehlermeldung aus oder, wenn der Filter eine Bilddatei blockiert (z.B. Werbung), dann wird /usr/local/httpd/htdocs/blocked.gif angezeigt. Das Script blocked.cgi muss noch im Verzeichnis /usr/local/httpd/cgi-bin/ erstellt werden:
#!/usr/bin/perl
#
# /usr/local/httpd/cgi-bin/blocked.cgi
#
use CGI;
$q = new CGI;
$clientaddr = "";
$url="";

$clientaddr = $q->param('clientaddr') if defined($q->param('clientaddr'));
$url = $q->param('url') if defined($q->param('url'));

if ($url =~ /\.(gif|jpg|jpeg|mpg|mpeg|avi|mov)$/i) {
    print "Content-type: image/gif\n";
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime($time);
    printf "Expires: %s, %02d-%s-%02d %02d:%02d:%02d GMT\n\n", $day[$wday],
                                  $mday,$month[$mon],$year,$hour,$min,$sec;
    open(GIF, "$ENV{'DOCUMENT_ROOT'}/blocked.gif");
    while (<GIF>) {
        print;
    }
    close(GIF);
} else {
    print "Content-type: text/html\n";
    printf "Expires: %s, %02d-%s-%02d %02d:%02d:%02d GMT\n\n", $day[$wday],
                                  $mday,$month[$mon],$year,$hour,$min,$sec;
    print <<EOF;
<html>
<head>
    <title>403 Forbidden - Zugriff verweigert</title>
</head>
<body>
<center>
<h1>403 Forbidden - Zugriff verweigert</h1>
Der Zugriff wurde Ihnen aus einem der folgenden Gründe verweigert:
<table border="0">
<tr><td>
<ul>
    <li>Ihre IP-Adresse ist nicht aus dem Bereich des Schulnetzes</li>
    <li>Der Jugendschutzfilter ist aktiviert. Die Filterkategorien sind:
    <ul>
        <li>aggressive</li>
        <li>porn</li>
        <li>violence</li>
    </ul>
</ul>
</td></tr>
</table>
Wenn diese Seite zu Unrecht gesperrt wurde, schreiben Sie eine Mail an<br>
<a href="mailto:proxymaster\@gm.rt.schule-bw.de">
proxymaster\@gm.rt.schule-bw.de</a>
</center>
</body>
</html>
EOF
}
exit 0;
Mit chmod 755 /usr/local/httpd/cgi-bin/blocked.cgi wird das Script ausführbar gemacht. Damit squidGuard später schneller startet, wird squidGuard -C all einmal ausgeführt. Dabei werden die Adresslisten in ein Datenbankformat konvertiert. Mit /etc/init.d/squid restart wird der Filter letztendlich aktiviert.

4.3.4. Drucker

Damit der Netzwerkdrucker später über Samba den Windows-Clients zur Verfügung gestellt werden kann, muss der Netzwerkdrucker (der übrigens auch lokal am Druckerport des Servers angeschlossen sein könnte) zunächst auf dem Server eingerichtet werden. Dazu wird das "Common UNIX Printing System" benötigt, das mit apt-get install cupsys cupsys-client noch nachinstalliert werden muss. Konfiguriert wird das Druck-System über einen Webbrowser. Als Text-Browser eignet sich lynx. Möglicherweise muss dieser mit apt-get install lynx nachinstalliert werden. Mit /etc/init.d/cupsys start wird das Druck-System gestartet.

Mit lynx http://localhost:631/ wird der Webbrowser zur Konfiguration gestartet. Hier muss zunächst Manage Printers ausgewählt werden, danach Add Printer. Der Browser fragt nun nach einem Benutzernamen. Einfach "root" und das root-Passwort verwenden. Auf der nächsten Seite muss der Freigabe-Name eingegeben werden, also z.B. "netzdrucker". Location und Description sind weniger wichtig. Mit Continue geht's weiter. Auf der folgenden Seite muss jetzt als Device "AppSocket/HP JetDirect" ausgewählt werden. Im Feld Device URI auf der nächsten Seite muss "socket://192.168.0.254:9100" eingetragen werden. Model/Driver ist "Raw" und "Raw Queue (en)". Das bedeutet, dass die Druckdaten genau so an den Drucker weitergeleitet werden, wie der Windows-Client sie verschickt. Unter Windows muss also noch ein passender Druckertreiber installiert werden. Das war's soweit. Der Rest muss unter Samba konfiguriert werden.

4.3.5. Samba

Samba stellt den Windows-Clients Speicherplatz zur Verfügung: Ein Homeverzeichnis, ein Verzeichnis für temporäre Daten, ein öffentliches Verzeichnis und ein Verzeichnis für Windows-Programme. Für bestimmte Benutzergruppen gibt es weitere Verzeichnisse: Homepage und Admin beispielsweise. Außerdem gibt es noch ein sogenannten "netlogon-script", das beim Anmelden bei Samba auf dem Client gestartet wird und die Verzeichnisse automatisch einbindet. Zusätzlich gibt Samba noch den Drucker frei, der im vorigen Abschnitt eingerichtet wurde.

Zunächst muss samba installiert werden; das geht mit apt-get install samba. Die Konfigurationsdatei heißt /etc/samba/smb.conf. Sie hat folgenden Inhalt:

#
# /etc/samba/smb.conf
#
[global]
    workgroup = WORKGROUP
    netbios name = server
    server string = Samba Server
    comment = Samba Server

    hosts allow = 192.168.0.

    load printers = yes
    printcap name = cups
    printing = CUPS

    guest account = nobody

    #log file = /var/log/samba/log.%m  # für jede Maschine eine eigene Logfile
    log file = /var/log/samba/log.smb
    log level = 1
    max log size = 1000 # in KB
    syslog = 0

    security = user

    encrypt passwords = yes
    smb passwd file = /usr/local/samba/private/smbpasswd
    passwd program = /usr/bin/passwd %u
    unix password sync = yes

    socket options = TCP_NODELAY
    keepalive = 30

    interfaces = eth0

    local master = yes
    os level = 65
    domain master = yes
    preferred master = yes
    domain logons = yes

    logon script = logon.bat
    # für Roaming Profiles (WinNT)
    #logon path = \\SERVER\%U\profile
    # für Roaming Profiles (Win9X)
    #logon home = \\SERVER\%U\profile

    wins support = yes

    # alles in eine Zeile!
    invalid users = root daemon bin sys sync games man lp mail news uucp proxy
       postgres www-data backup operator list irc gnats identd sshd gdm telnetd
       ftp nut faxmaster partimag mysql homepage internet
    valid users = +users nobody
    admin users = +admin


[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = no
    public = yes
    guest ok = yes
    writeable = no
    printable = yes

[netlogon]
    path = /usr/local/samba/netlogon
    write list = +admin
    guest ok = yes

[homes]
    comment = Heimatverzeichnis von %U
    # wegen public_html: www-data
    force group = www-data
    read only = no
    create mask = 0755
    browseable = no

[tmp]
    comment = Temporaere Dateien
    path = /usr/local/samba/temp
    force group = users
    read only = no
    create mask = 0664
    directory mask = 0775
    guest ok = yes

[pub]
    comment = Oeffentliches Verzeichnis
    path = /usr/local/samba/pub
    write list = +lehrer
    force group = lehrer
    create mask = 0664
    force create mode = 0664
    directory mask = 0775
    force directory mode = 0775
    guest ok = yes

[homepage]
    comment = Gymnasium-Muensingen Homepage
    path = /usr/local/samba/homepage
    write list = +homepage
    force group = homepage
    create mask = 0664
    force create mode = 0664
    directory mask = 0775
    force directory mode = 0775

[programme]
    comment = Programme fuer Windows
    path = /usr/local/samba/programme
    # jeder darf schreiben (Windows-Programme brauchen das ;-)
    write list = +users nobody
    force group = admin
    create mask = 0664
    force create mode = 0664
    directory mask = 0775
    force directory mode = 0775
    guest ok = yes

[admin]
    comment = Admin-Verzeichnis
    path = /usr/local/samba/admin
    valid users = +admin
    force group = admin
    read only = no
    create mask = 0660
    force create mode = 0660
    directory mask = 0770
    force directory mode = 0770
Die angegebenen Verzeichnisse müssen natürlich existieren (alles unter /usr/local/samba/). Außerdem müssen für diese Verzeichnisse die passenden Zugriffsrechte gesetzt sein. Mit /etc/init.d/samba restart werden die Einstellungen übernommen.

Für die Druckfunktion muss das Verzeichnis /var/spool/samba existieren. Außerdem muss es den Mitglieder der Gruppe "users" erlaubt sein, in dieses Verzeichnis zu schreiben (sonst dürfen diese Benutzer nicht drucken). Dies ist zu erreichen mit den folgenden zwei Befehlen:

chgrp users /var/spool/samba
chmod g+wx /var/spool/samba

Hier ist das Netlogon-Script. Es verbindet einige Netzlaufwerke, sodass diese im Explorer zur Verfügung stehen. Außerdem wird die Uhrzeit des Clients nach der Server-Uhr gestellt. Damit es keine Probleme mit Mozilla-Profilen gibt, wird eine Datei bei jedem Einloggen auf den Client kopiert; in dieser Datei steht, dass das Mozilla-Profil unter "H:\Mozilla" zu finden ist.

@echo off
net use h: \\arktur\homes /yes
net use i: \\arktur\homepage /yes
net use v: \\arktur\pub /yes
net use t: \\arktur\tmp /yes
net use p: \\arktur\progs /yes
net time \\arktur /set /yes

rem Mozilla-Profil-Konfiguration:
copy \\arktur\netlogon\registry.dat C:\WINDOWS\Anwendungsdaten\Mozilla /Y

4.3.5.1. Logdateien

Samba benützt drei Logdateien: In /var/log/samba/log.nmbd protokolliert der nmbd-Dämon seine Zugriffe. In /var/log/samba/log.smbd steht, wann der smbd-Dämon gestartet wurde. Und in /var/log/samba/log.smb steht, wer auf irgendwelche Freigaben zugegriffen hat. Diese Logdateien sollen auch mit logrotate rotiert werden. Damit dies zuverlässig klappt, wird vor dem Rotieren der Samba-Dämon gestoppt und danach wieder gestartet.

Die Datei /etc/logrotate.d/samba muss folgenden Inhalt haben:

/var/log/samba/log.smb {
        weekly
        missingok
        rotate 7

        prerotate
                /etc/init.d/samba stop || true
                killall -q smbd || true
        endscript

        compress
        notifempty
}

/var/log/samba/log.smbd {
        weekly
        missingok
        rotate 7

        prerotate
                /etc/init.d/samba stop || true
                killall -q smbd || true
        endscript

        compress
        notifempty
}

/var/log/samba/log.nmbd {
        weekly
        missingok
        rotate 7

        prerotate
                /etc/init.d/samba stop || true
                killall -q nmbd || true
        endscript

        postrotate
                /etc/init.d/samba start
        endscript

        compress
        notifempty
}

4.3.5.2. Tägliches Neustarten

Da es offenbar öfters vorkommt, dass der Samba-Server, nachdem er ein paar Tage ununterbrochen lief, nicht mehr reagierte, wird der Samba-Server nun mittels eines Cron-Jobs täglich neugestartet. Dazu wird im Verzeichnis /etc/cron.daily/ die Datei samba-restart erstellt:

#!/bin/sh

/etc/init.d/samba stop
sleep 4
/etc/init.d/samba start
sleep 4

# überprüfen, ob nmbd läuft
ps `cat /var/run/samba/nmbd.pid` > /dev/null
if [ $? -eq 1 ]; then
  # nmbd läuft nicht...
  /etc/init.d/samba stop
  sleep 4
  /etc/init.d/samba start
fi
Die Datei muss noch mit chmod 755 /etc/cron.daily/samba-restart ausführbar gemacht werden.