\documentclass[a4paper,11pt]{report}
\usepackage[german]{babel}
\usepackage{epsfig}
\usepackage{verbatim}
\newcommand{\url}[1]{\nobreak{\it#1}}
\newcommand{\tilda}{\def\~{}}
\newcommand{\grad}{\ensuremath{^\circ}}
\usepackage{german}
\selectlanguage{\austrian}
\begin{document}
\titlepage
\title{877.853\\
Projektpraktikum
}
\author{Alexander \"Olzant\\
9301547}
\maketitle

\tableofcontents


\chapter{Einleitung}

Wie besprochen, schreibe ich hier die \"Ubungsaufgaben unter Verwendung
von Debian GNU/Linux protokollarisch nieder.

\chapter{\"Ubungen}
\section{\"Ubungen zum Apache Webserver}

\subsection{Installiere den Apache Webserver}
\begin{verbatim}
# apt-get install apache
...
Setting up apache-ssl (1.3.33-6) ...
Starting web server: apache-ssl.
\end{verbatim}
\subsection{Schau in der chkconfig Liste nach, ob er gestartet wird, wenn der
Rechner hochf\"ahrt. Wenn das nicht der Fall ist, dann trag ihn f\"ur die
Runlevels 3 und 5 als zu startend ein und kontrolliere, ob das korrekt
erfolgt ist.}
\begin{verbatim}
# ls -l /etc/rc[35].d/*apache*
lrwxrwxrwx  1 root root 20 Sep 28  2003 /etc/rc3.d/S91apache-ssl ->
../init.d/apache-ssl
lrwxrwxrwx  1 root root 20 Sep 28  2003 /etc/rc5.d/S91apache-ssl ->
../init.d/apache-ssl
\end{verbatim}
\subsection{Starte jetzt Apache und rufe als Test in einem Browser (firefox,
konqueror, ...) die Webseite deines Rechners auf (zriXY.pclab). Wenn dein
Browser eine Fedora Core Test Page anzeigt, dann l\"auft der Apache!}
\begin{verbatim}
# curl -s -o/dev/null localhost && echo ok || echo "Webserver down" 
ok
\end{verbatim}
\subsection{Sieh dir die access$\_$log Datei an, ob dein Aufruf dort aufscheint.
Jede Zeile dort entspricht einer Anfrage. Versuche, einige Teile der Zeile
zu interpretieren!}
\begin{verbatim}
62.178.57.72 - - [25/May/2005:09:16:09 +0200] "SEARCH /\x90\x02...
\end{verbatim}
Da versucht wohl wieder jemand/frau, einen alten Exploit auszuprobieren ...

\begin{verbatim}
127.0.0.1 - - [05/Jul/2005:18:42:14 +0200] "GET / HTTP/1.1" 200 4110 "-"
"curl/7.13.2 (i386-pc-linux-gnu) libcurl/7.13.2 OpenSSL/0.9.7e zlib/1.2.2
libidn/0.5.13" 0 chello062178208184.1.15.univie.teleweb.at
\end{verbatim}

Das ist wohl das curl von grade eben (Source Host ist localhost aka
127.0.0.1, die Anfrage bezieht sich auf /, also das DocumentRoot, Zeit,
nicht vorhandener Referer und Browser Id sind auch erkenntlich)

\subsection{Rufe eine nicht existierende Datei per Browser auf und sieh dir
die error\_{}log an. Welchen HTTP-Statuscode verursachen nicht existierende
Seiten? Scheinen solche Anfragen auch in der access\_{}log auf?}
404, immer wieder (und sei es nur ein favicon.ico)

\subsection{La\ss{} den apache auf Port 81 auf Connections warten und \"uberpr\"ufe
das mit dem Browser. \"Andere die Einstellung wieder auf Port 80 zur\"uck, wenn
es geklappt hat. Zur Erinnerung: Starte den Apache immer neu, wenn du
\"Anderungen an seiner Konfiguration vornimmst!}
\begin{verbatim}
# sed -i -e 's/:80/:81/' -e 's/Listen 80/Listen 81/' \
 /etc/apache-ssl/httpd.conf && apache-sslctl graceful && (curl -s \
 -o/dev/null localhost:81 && echo ok || echo "Webserver down") && sed -i \
 -e 's/:81/:80/' -e 's/Listen 81/Listen 80/' /etc/apache-ssl/httpd.conf && \
 apache-sslctl graceful && (curl -s -o/dev/null localhost && echo ok || \
 echo "Webserver down")
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
ok
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
ok
\end{verbatim}

\subsection{Konfiguriere ServerAdmin und ServerName f\"ur deinen Rechner.}
\begin{verbatim}
# sed -i -e 's/ServerAdmin.*/ServerAdmin myaddress@mydomain/' \
         -e 's/ServerName.*/ServerName this.host.name/'
\end{verbatim}

\subsection{Erstelle ein Verzeichnis /www und lege eine index.html hinein
(Hier gibts eine fertige index.html, mit Rechtsklick speichern). \"Andere die
beiden entsprechende Direktiven in der httpd.conf, wo das Basisverzeichnis
des Webservers vorkommt, so ab, da\ss{} /www das neue Rootverzeichnis f\"ur den
Apache ist. Versichere dich, da\ss{} deine \"Anderungen erfolgreich waren!}
\begin{verbatim}
# mkdir /www ;  curl -s -o /www/index.html \
 http://www.mat.univie.ac.at/~martin/lehre/ss05/pp/apache/index.html && \
 sed -i -e 's/\/var\/www/\/www/' /etc/apache-ssl/httpd.conf && \
 apache-sslctl graceful && (curl -s localhost | grep -E "DocumentRoot \
 bereits in .*/www" || echo Fehler; true) && sed -i -e \
 's/\/www/\/var\/www/' /etc/apache-ssl/httpd.conf && apache-sslctl \
 graceful && rm -rf /www 
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
Wenn du das siehst, sollte dein Webserver sein DocumentRoot bereits in
<tt>/www</tt> haben!
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
\end{verbatim}

\subsection{Benenne die neue index.html in index.htm um. Jetzt sollte wieder
die Standardseite von Fedora kommen. Warum ist das so? (Tip: Scheint
index.htm in der DirectoryIndex-Direktive auf?). Versuche, die
Konfiguration entsprechend zu korrigieren.}
Offenbar gibt es ein {\tt index.php}, {\tt index.cgi} oder \"ahnliches, das in der 
{\tt DirectoryIndex} explizit genannt ist, das sieht hier z.{} B.{} so
aus:
\begin{verbatim}
    DirectoryIndex index.html index.htm index.shtml index.cgi
\end{verbatim}

\subsection{Erstelle ein Verzeichnis /www/protected/, das nur von deinem
eigenen Rechner zug\"anglich ist. Dazu mu\ss{}t du einen Eintrag f\"ur das
Verzeichnis in der Konfigurationsdatei erstellen und die Allow/Deny-Regeln
entsprechend eintragen. Probiere es von einem Nachbar-PC aus!}
\begin{verbatim}
<Directory /www/protected>
	Order deny,allow
	Deny from all
	Allow from localhost
</Directory>
\end{verbatim}

\subsection{Erstelle analog ein Verzeichnis /www/prot2/, das diesmal aber
nicht von deinem eigenen Rechner aus, sondern nur von deinem Nachbar-PC
zug\"anglich ist. \"Uberpr\"ufe wieder, ob es geklappt hat!}
\begin{verbatim}
<Directory /www/protected>
  Order deny,allow
  Deny from all
  Allow from Nachbar-PC
</Directory>
\end{verbatim}

\subsection{Lege (mittels adduser) einen Benutzer pinguin an. Die Dateien in
seinem Unterverzeichnis html sollen angezeigt werden, wenn man sich auf
http://zriXY.pclab/~pinguin/ verbindet. Vergi\ss{} nicht, das Verzeichnis html
auch tats\"achlich anzulegen (das kannst du als root tun). Als Index-Datei
kannst du die Datei aus \"Ubung 8 verwenden.
Achtung: Das Benutzerverzeichnis (/home/pinguin) mu\ss{} das Zugriffsrecht
\glqq x\grqq
f\"ur alle besitzen, sonst kann der Webserver nicht dorthin!}
\begin{verbatim}
# adduser --disabled-password --gecos tux  pinguin && mkdir -p \
 ~pinguin/public_html && chmod -R a+x ~pinguin/public_html && curl -s -o \
 ~pinguin/public_html/index.html \
 http://www.mat.univie.ac.at/~martin/lehre/ss05/pp/apache/index.html && \
 chmod a+r ~pinguin/public_html/index.html && (curl localhost/~pinguin/ |\
 grep -E "DocumentRoot bereits in .*/www" || echo fehler ) ; deluser \
 pinguin; rm -rf /home/pinguin \
Adding user `pinguin'...
Copying files from `/etc/skel'
Wenn du das siehst, sollte dein Webserver sein DocumentRoot bereits in
<tt>/www</tt> haben!
Removing user `pinguin'...
done.
\end{verbatim}

\subsection{Schau dir eine nicht-existierende Datei auf deinem Webserver
einmal mit ServerSignature, einmal ohne, an. Welche Daten stehen in der
ServerSignature? Wenn du die Webmaster-Emailadresse dort nicht siehst,
\"andere die Konfiguration so ab, da\ss{} sie angezeigt wird. Ist es die Adresse,
die du im Punkt 7 oben eintragen hast?
\"Uberlege kurz (nicht zu viel philosophisches \glqq Blabla\grqq{} :-), auf welchen Wert
du diese Option f\"ur deinen eigenen Webserver setzen w"urdest!}
\begin{verbatim}
# sed -i -e 's/ServerSignature.*/ServerSignature On/' \ 
 /etc/apache-ssl/httpd.conf && apache-sslctl graceful && curl -s \
 localhost/asd | grep Apache
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
<ADDRESS>Apache/1.3.33 Ben-SSL/1.55 Server at
chello062178208184.1.15.univie.teleweb.at Port 80</ADDRESS>
\end{verbatim}
\begin{verbatim}
# sed -i -e 's/ServerSignature.*/ServerSignature Off/' \
 /etc/apache-ssl/httpd.conf && apache-sslctl graceful && curl -s \
 localhost/asd | grep Apache
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
\end{verbatim}
\begin{verbatim}
# sed -i -e 's/ServerSignature.*/ServerSignature Email/' \
 /etc/apache-ssl/httpd.conf && apache-sslctl graceful && curl -s \
 localhost/asd | grep Apache
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
<ADDRESS>Apache/1.3.33 Ben-SSL/1.55 Server at <A
HREF="mailto:webmaster@chello062178208184.1.15.univie.teleweb.at">
chello062178208184.1.15.univie.teleweb.at</A> Port 80</ADDRESS>
\end{verbatim}

Paranoide Leute setzen das \"ublicherweise auf \glqq Off\grqq, damit
malici\"ose Holzhacker den Wald vor lauter B\"aumen nicht sehen. Ich bin
nicht so paranoid, finde aber immer noch den Zugang von Alexander
Talos, {\tt sendmail} als \glqq sandman\grqq{} und die Version als sein
Geburtsdatum auszugeben, am originellsten. 


\subsection{Erstelle einen eigenen Error-Handler f\"ur deinen Webserver, einmal
f\"ur fehlende, einmal f\"ur \glqq Access forbidden\grqq-Dateien und vergewissere dich,
da\ss{} der jeweils richtige aufgerufen wird. Access forbidden kannst du
\glqq provozieren\grqq, indem du z.B. einem Verzeichnis oder einer Datei alle Rechte
f\"ur \glqq others\grqq{}  wegnimmst.}
\begin{verbatim}
# echo -e "ErrorDocument 404 /missing.html\nErrorDocument 403 \
 /forbidden.html" >> /etc/apache-ssl/httpd.conf ; \
 echo forbidden > /var/www/forbidden.html; \
 apache-sslctl graceful; \
 chmod a-r /var/www/index.html; \
 curl -s localhost/asd 
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>404 Not Found</TITLE>
</HEAD><BODY>
<H1>Not Found</H1>
The requested URL /asd was not found on this server.<P>
<P>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the
request.
<HR>
<ADDRESS>Apache/1.3.33 Ben-SSL/1.55 Server at <A
HREF="mailto:webmaster@chello062178208184.1.15.univie.teleweb.at">chello062178208184.1.15.univie.teleweb.at</A>
Port 80</ADDRESS>
</BODY></HTML>

# curl -s localhost/ 
forbidden
\end{verbatim}
\subsection{Erstelle einen Redirect von /mat auf www.mat.univie.ac.at.}
\begin{verbatim}
# echo Redirect /mat http://mat.univie.ac.at/ >> /etc/apache-ssl/httpd.conf;\
  apache-sslctl graceful; curl -s localhost/mat/|grep mat
/usr/sbin/apache-sslctl graceful: httpsd gracefully restarted
The document has moved <A HREF="http://mat.univie.ac.at//">here</A>.<P>
\end{verbatim}

\subsection{Zusatzaufgabe f\"ur Flei\ss{}ige: Im DNS existieren CNAMEs von
zriXYa.pclab auf zriXY.pclab (also z.b. zri20449a.pclab auf
zri20449.pclab). Je nach im Browser eingegebenem Servername soll eine
andere Webseite zur\"uckgeliefert werden! (Bitte bei mir melden, wenn wer
diese \"Ubung machen will, dann erstelle ich den DNS-Eintrag!)}
\begin{verbatim}
# echo "<VirtualHost *:80>
ServerName brasilia.aoe
DocumentRoot /asd
SSLDisable
</VirtualHost>
" >> /etc/apache-ssl/httpd.conf
# curl -s brasilia.aoe|grep server
The requested URL / was not found on this server.<P>
\end{verbatim}

\section{8. April 2005: \"Ubungen zum IMAP/POP3 Server}

\subsection{Installiere das IMAP Paket.}
\begin{verbatim}
# apt-get install uw-imapd
\end{verbatim}

\subsection{Lege einen lokalen User (mit adduser) an und gib ihm ein
Pa\ss{}wort!}\label{useradd1}
\begin{verbatim}
# PASS=`perl -e 'use Digest::MD5 qw(md5_base64);
    open U,"</dev/urandom";$p=$s=10x"x";read U,$p,10;read \
    U,$s,10; $pass=md5_base64($p);$salt=md5_base64($s); \
    print $pass," ",crypt($pass,$salt),"\n"'`; \
  CRYPT=${PASS#* }; PASS=${PASS% *}; export CRYPT PASS; \
  useradd -p "$CRYPT" -c tux pinguin
\end{verbatim}

\subsection{\"Andere in /etc/aliases die Zeile root: {\tt
root@miranda.pclab} und
setze anstatt {\tt root@miranda.pclab} den Namen des soeben angelegten Users ein!
F\"uhre danach newaliases aus, um die \"Anderung zu aktivieren!}
\label{patchalias}

\begin{verbatim}
# sed -ie 's/root:.*/root: pinguin/' /etc/mail/aliases; newaliases
/etc/mail/aliases: 79 aliases, longest 29 bytes, 1117 bytes total
\end{verbatim}

\subsection{Schicke einige Mails an root und an den angelegten User (am
einfachsten z.b. mit {\tt echo blabla | mail \$user}}

\begin{verbatim}
$ (export user=pinguin; </dev/null mail -s "test ignore" $user)
Null message body; hope that's ok
\end{verbatim}

\subsection{Aktiviere jetzt im xinetd das imap und ipop3 Subsystem und starte den
xinetd neu.}

{\tt xinetd} habe ich derzeit nicht installiert, und da dies ja eine
pop3/imap4-\"Ubung ist, werde ich mal den klassischen {\tt inetd}
verwenden.

\begin{verbatim}
# sed -ie 's/#\(\(pop3\|imap2\).*\)/\1/'  /etc/inetd.conf ; killall -HUP inetd
# grep -E "pop|imap" /etc/inetd.conf|sed -e 's/#\(pop3.*\)/\1/'
pop3   stream  tcp     nowait  root    /usr/sbin/tcpd   ipop3d
imap2   stream  tcp     nowait  root    /usr/sbin/tcpd /usr/sbin/imapd
\end{verbatim}

\subsection{Richte dir in einem Mailclient (z.b. kmail oder mozilla) ein
IMAP und POP3 Postfach f\"ur den angelegten User ein. Wenn die Mails per POP3
geholt werden, sollen sie nicht gel\"oscht werden!}

\subsubsection{The Good: mutt}
\begin{verbatim}
# echo -e "set folder=imap://localhost/INBOX
set spoolfile=imap://localhost/INBOX
set imap_user=$USER
" >> .muttrc
\end{verbatim}

\subsubsection{The Bad: pine}
\begin{verbatim}
# echo -e "folder-collections= Remote-Mail {localhost/user=${USER}}INBOX.[]
inbox-path={imap.unet.univie.ac.at/user=${USER}}INBOX
rsh-command=/dev/null
disable-these-authenticators=cram-md5
" >> .pinerc
\end{verbatim}

\subsubsection{The Ugly: fetchmail}
\begin{verbatim}
# echo "poll localhost\nuser pinguin\npass $PASS" > .fetchmailrc; \
  chmod 0710 .fetchmailrc
# fetchmail -p POP3 -k -u pinguin -a -m cat -v | head
fetchmail: Unknown command in AUTHORIZATION state
fetchmail: Repoll immediately on pinguin@localhost
fetchmail: 6.2.5 querying localhost (protocol POP3) at Wed Jul  6 13:20:20 2005: poll started
fetchmail: POP3< +OK private.oelzant.priv.at POP3 3.3(20) w/IMAP2 client
(Comments to MRC@CAC.Washington.EDU) at Wed, 6 Jul 2005 13:20:20 +0200 (CEST)
fetchmail: POP3> CAPA
fetchmail: POP3< -ERR Unknown command in AUTHORIZATION state
fetchmail: POP3< +OK private.oelzant.priv.at POP3 3.3(20) w/IMAP2 client
(Comments to MRC@CAC.Washington.EDU) at Wed, 6 Jul 2005 13:20:20 +0200 (CEST)
fetchmail: POP3> USER pinguin
fetchmail: POP3< +OK User name accepted, password please
fetchmail: POP3> PASS *
fetchmail: POP3< +OK Mailbox open, 3 messages
\end{verbatim}

\begin{verbatim}
# fetchmail -p IMAP -k -u pinguin -a -m cat -v |tail
fetchmail: Server CommonName mismatch: private.oelzant.priv.at != localhost
fetchmail: Server CommonName mismatch: private.oelzant.priv.at != localhost

 not flushed
fetchmail: IMAP> A0015 STORE 3 +FLAGS (\Seen)
fetchmail: IMAP< * 3 FETCH (FLAGS (\Seen))
fetchmail: IMAP< A0015 OK STORE completed
fetchmail: IMAP> A0016 LOGOUT
fetchmail: IMAP< * BYE private.oelzant.priv.at IMAP4rev1 server terminating
connection
fetchmail: IMAP< A0016 OK LOGOUT completed
fetchmail: 6.2.5 querying localhost (protocol IMAP) at Wed Jul  6 12:59:41 2005: poll completed
fetchmail: normal termination, status 0
\end{verbatim}


\subsection{Versuche jetzt, beide eingerichteten Postf\"acher abzufragen.
Bekommst du die Mails, die du vorher geschickt hast?}

Siehe vorige Frage, die Mails sind natuerlich als gelesen markiert und nur
mit \glqq fetch all\grqq{} erneut verf\"ugbar.

\subsection{Versuche jetzt, als Server den Rechner deines Nachbarn und auch
seinen User einzutragen. Kannst du auch von dort Mails abrufen?}

Wenn der port nicht per tcp wrappers, firewall oder pop3/imapd-config
gesperrt ist, sicherlich.

\subsection{Ist es m\"oglich, die Mails f\"ur root per POP3/IMAP abzurufen?}

\begin{verbatim}
# fetchmail -p IMAP -k -u root -a -m cat -v |tail
fetchmail: Server CommonName mismatch: private.oelzant.priv.at != localhost
fetchmail: Server CommonName mismatch: private.oelzant.priv.at != localhost
fetchmail: Authorization failure on root@localhost
fetchmail: IMAP> A0004 LOGIN "root" *
fetchmail: IMAP< A0004 NO LOGIN failed
fetchmail: IMAP> A0005 *
fetchmail: IMAP> A0006 LOGOUT
fetchmail: IMAP< A0005 BAD Command unrecognized/login please: *
fetchmail: IMAP< * BYE private.oelzant.priv.at IMAP4rev1 server terminating
connection
fetchmail: IMAP< A0006 OK LOGOUT completed
fetchmail: 6.2.5 querying localhost (protocol IMAP) at Wed Jul  6 13:11:41
2005: poll completed
fetchmail: Query status=3 (AUTHFAIL)
fetchmail: normal termination, status 3
\end{verbatim}

nein

\subsection{Welche Informationen \"uber deine Mail-Abrufe siehst du in der
Logdatei?}

\begin{verbatim}
# grep -iE "pop|imap" /var/log/secure /var/log/messages /var/log/maillog
Jul  6 12:59:41 comitan imapd[5906]: Login user=pinguin host=localhost [127.0.0.1]
Jul  6 12:59:41 comitan imapd[5906]: Logout user=pinguin host=localhost [127.0.0.1]
Jul  6 13:11:38 comitan imapd[6399]: imap service init from 127.0.0.1
Jul  6 13:11:41 comitan imapd[6399]: Logout user=root host=localhost [127.0.0.1]
...
Jul  6 13:11:38 comitan imapd[6399]: Login failed user=root auth=root
host=localhost [127.0.0.1]
...
Jul  6 13:17:55 comitan ipop3d[6819]: connect from localhost (127.0.0.1)
Jul  6 13:17:55 comitan ipop3d[6820]: connect from localhost (127.0.0.1)
\end{verbatim}

bei imapd user und host, bei ipop3d nur die zeit (vermutlich
konfigurierbar)

\section{\"Ubungen zum vsftpd FTP Server}

\subsection{Installiere {\tt vsftpd}. Starte den Server.}

\begin{verbatim}
# apt-get install vsftpd
...
Starting FTP server: vsftpd.
\end{verbatim}

\subsection{Der Server soll auch beim Booten gestartet werden (wie \glqq 
\"ublich\grqq{}
per chkconfig)}

{\tt chkconfig} ist (wie \glqq \"ublich\grqq) auf Debian GNU/Linux nicht
vorhanden, update-rc.d meint, der Dienst w\"urde bereits getartet.

\begin{verbatim}
# update-rc.d vsftpd defaults
 System startup links for /etc/init.d/vsftpd already exist.
\end{verbatim}


\subsection{Lege ein Verzeichnis /ftp an und mache es zu deinem FTP
Hauptverzeichnis.}

\begin{verbatim}
# echo anon_root=/ftp >> /etc/vsftpd.conf; killall -HUP vsftpd
\end{verbatim}

\subsection{Lege einige Dateien und Verzeichnisse (egal welchen Inhalts) in
/ftp an.}

\begin{verbatim}
# mkdir -p /ftp/dir1/dir2; curl -s ftp://localhost/dir1/
drwxr-xr-x    2 0        0            4096 Jul 06 11:49 dir2
# echo xyz > /ftp/jkl; curl -s ftp://localhost/jkl
xyz
\end{verbatim}

\subsection{Logge dich als anonymer User ein und \"uberpr\"ufe, ob das Root
Verzeichnis ok ist (d.h. ob die Dateien, die du hingelegt hast, tats\"achlich
zu sehen sind).}

Siehe vorige \"Ubung.

\subsection{Versuche, eine Datei vom Server herunterzuladen.}

Siehe vorige \"Ubung.

\subsection{\"Andere die Nachricht, die erscheint, wenn du dich am Server
einloggst.}

\begin{verbatim}
# sed -i -e 's/^#ftpd_banner.*/ftpd_banner=Welcome in/' /etc/vsftpd.conf; \
  /etc/init.d/vsftpd restart; \
  sleep 1; \
  curl -v ftp://localhost/ 2>&1 | grep 220
Restarting FTP server: vsftpd.
< 220 Welcome in
\end{verbatim}

(oder, als dir message f\"urs root dir:)

\begin{verbatim}
# echo Hello World > /ftp/.message
# curl -v  ftp://localhost/ 2>&1 | grep 230
< 230-Hello World
< 230 Login successful.
\end{verbatim}

\subsection{Lege ein Verzeichnis in /ftp (z.b. /ftp/tmp), auf das alle
Benutzer alle Zugriffsrechte haben.}
\begin{verbatim}
# mkdir /ftp/tmp; chmod 1777 /ftp/tmp
# sed -i -e 's/#anon_upload_enable=YES/anon_upload_enable=YES/' \
    -e 's/#write_enable=YES/write_enable=YES/'  /etc/vsftpd.conf; \
  /etc/init.d/vsftpd restart
\end{verbatim}

\subsection{Versuche, eine Datei auf den Server in das soeben angelegte
Verzeichnis hinaufzuladen. Wenn es nicht geht, kontrolliere die daf\"ur
zust\"andigen Optionen in der Konfigurationsdatei noch einmal!}

\begin{verbatim}
# echo 123 > upload_file; \
  curl -T upload_file ftp://localhost/tmp/
-rw-------    1 111      65534           4 Jul 06 12:08 upload_file
# curl ftp://localhost/tmp/ ftp://localhost/tmp/upload_file
curl: (19) Failed to open file.
\end{verbatim}

\subsection{Deaktiviere jetzt jeglichen Schreibzugriff auf den Server und
teste es.}

\begin{verbatim}
# sed -i -e 's/anon_upload_enable=YES/#anon_upload_enable=YES/' \
    -e 's/write_enable=YES/#write_enable=YES/' /etc/vsftpd.conf; \
  /etc/init.d/vsftpd restart; \
  curl -T upload_file ftp://localhost/tmp/upload2
curl: (25) Failed FTP upload: 550
\end{verbatim}

\subsection{Leg den Benutzer tux an.}\label{useradd2}

\begin{verbatim}
# deluser pinguin; rm -rf /home/pinguin
# PASS=`perl -e 'use Digest::MD5 qw(md5_base64);  \
    open U,"</dev/urandom"; \
    $p=$s=10x"x"; \
    read U,$p,10; \
    read U,$s,10; \
    $pass=md5_base64($p); \
    $salt=md5_base64($s); \
    print $pass," ", crypt($pass,$salt),"\n"'`;  \
  CRYPT=${PASS#* }; \
  PASS=${PASS% *}; \
  export CRYPT PASS; \
  useradd -p "$CRYPT" -c pinguin -m tux
\end{verbatim}

\subsection{Versuche, ob du dich auf dem Rechner deines Nachbarn als tux
anmelden kannst.}

Vollinhaltlich von der Workstation nebenan \dots

\begin{verbatim}
> curl -u tux:$PASS ftp://brasilia.aoe/ 
drwxr-xr-x    5 1825     100          4096 Jul 06 12:24 Desktop
\end{verbatim}

\subsection{Wenn das geht, versucht es zu deaktivieren! Wenn nicht, dann
aktiviert es.}

\begin{verbatim}
# sed -i -e 's/^local_enable=YES/#local_enable=YES/' /etc/vsftpd.conf; \
  /etc/init.d/vsftpd restart; \
  sleep 1; \
  curl -u tux:"$PASS" ftp://localhost/
Restarting FTP server: vsftpd.
curl: (67) Access denied: 530
\end{verbatim}

\begin{verbatim}
# sed -i -e 's/^#local_enable=YES/local_enable=YES/' /etc/vsftpd.conf; \
  /etc/init.d/vsftpd restart; \
  sleep 1; \
  curl -u tux:"$PASS" ftp://localhost/
Restarting FTP server: vsftpd.
drwxr-xr-x    5 1825     100          4096 Jul 06 12:24 Desktop
\end{verbatim}


\subsection{  14. Sieh dir die Log-Datei des FTP Servers an und versuche
die Daten zu interpretieren (je eine Zeile ist ein Zugriff auf den Server).
Wenn dir einige Daten dort nicht klar sind, versuche mithilfe der
angegebenen Webseiten mehr Information dar\"uber herauszufinden. }

\begin{verbatim}
Wed Jul  6 14:07:05 2005 [pid 9595] [ftp] FAIL DOWNLOAD: Client
"127.0.0.1", "/tmp/upload_file", 0.00Kbyte/sec
Wed Jul  6 14:11:23 2005 [pid 9814] [ftp] FAIL UPLOAD: Client "127.0.0.1",
"/tmp/upload2", 0.00Kbyte/sec
Wed Jul  6 14:14:19 2005 [pid 9940] CONNECT: Client "127.0.0.1"
Wed Jul  6 14:14:19 2005 [pid 9939] [ftp] OK LOGIN: Client "127.0.0.1",
anon password "curl_by_daniel@haxx.se"
Wed Jul  6 14:14:19 2005 [pid 9941] [ftp] OK UPLOAD: Client "127.0.0.1",
"/tmp/upload3", 4 bytes, 1.08Kbyte/sec
Wed Jul  6 14:15:01 2005 [pid 9996] CONNECT: Client "127.0.0.1"
Wed Jul  6 14:15:01 2005 [pid 9995] [ftp] OK LOGIN: Client "127.0.0.1",
anon password "curl_by_daniel@haxx.se"
Wed Jul  6 14:25:57 2005 [pid 10665] CONNECT: Client "192.168.2.10"
Wed Jul  6 14:26:56 2005 [pid 10681] CONNECT: Client "192.168.2.99"
Wed Jul  6 14:31:28 2005 [pid 11052] [tux] OK LOGIN: Client "127.0.0.1"
\end{verbatim}

Misserfolge beim Login scheinen nur als {\tt CONNECT} auf, ansonsten sind
aus dem vsftpd.log alle Transfers und Logins mit Zeit, Herkunft und User
ersichtlich.

\section{\"Ubungen zum Postfix Mail Server}

\subsection{Installiere postfix!}

\begin{verbatim}
# apt-get install postfix
...
Postfix was not set up.  Start with 
  cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
.  If you need to make changes, edit
/etc/postfix/main.cf (and others) as needed.  To view Postfix configuration
values, see postconf(1).

After modifying main.cf, be sure to run '/etc/init.d/postfix reload'.
\end{verbatim}

\subsection{Konfiguriere die notwendigen Netzwerkeinstellungen (Hostname,
Domain, ...) in der /etc/postfix/main.cf.}

\begin{verbatim}
# cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf; \
  echo mydomain = 3.aoe >> /etc/postfix/main.cf; \
\end{verbatim}

\subsection{Starte nun den Server.}

\begin{verbatim}
# /etc/init.d/postfix start
Starting mail transport agent: Postfix.
\end{verbatim}

\subsection{Lege die lokalen User gandalf und frodo (z.b. mit adduser) an.
Gib beiden Usern mit passwd ein Pa\ss{}wort.}
\label{gandalf}

\begin{verbatim}
# adduser --disabled-password --gecos hobbit frodo
Adding user `frodo'...
Adding new group `frodo' (1002).
Adding new user `frodo' (1002) with group `frodo'.
Creating home directory `/home/frodo'.
Copying files from `/etc/skel'
# adduser --disabled-password --gecos wizard gandalf
Adding user `gandalf'...
Adding new group `gandalf' (1003).
Adding new user `gandalf' (1003) with group `gandalf'.
Creating home directory `/home/gandalf'.
Copying files from `/etc/skel'
\end{verbatim}

Den Sinn der Passwortvergabe kann ich an dieser Stelle nicht erkennen, zur
Methodik siehe \ref{useradd1} und \ref{useradd2}

\subsection{\"Andere den Alias f\"ur {\tt root}, soda\ss{} Mail statt an ihn an
{\tt gandalf}
geht und verifiziere das, indem du root eine Mail schickst.}

Siehe auch Sektion \ref{patchalias}

\begin{verbatim}
# sed -ie 's/root:.*/root: gandalf/' /etc/aliases; newaliases
# mail -s 'Of all the confounded nuisances you are the worst, Sam!' root \
    < /dev/null
# grep nuisance /var/mail/gandalf 
Subject: Of all the confounded nuisances you are the worst, Sam!
\end{verbatim}

\subsection{Schicke vom root Account aus per pine eine Email an frodo.}

\begin{verbatim}
# pine -s ignore frodo < /dev/null 
-su: pine: command not found
\end{verbatim}

Auf einem anderen Rechner, ganz weit weg ...

\begin{verbatim}
# pine -s ignore frodo@myhost < /dev/null
Argument Error: unknown flag "s"
Possible Starting Arguments for Pine program:
...
\end{verbatim}

Schlussfolgerung: Pine ist kein regul\"arer MUA.

\begin{verbatim}
# mail -s ignore frodo < /dev/null
Null message body; hope that's ok
\end{verbatim}


\subsection{\"Uberpr\"ufe (mit pine und \"uber das Maillog), ob die Mail
angekommen ist.}

{\tt pine} ist aus verschiedenen Gr\"unden (u. a. DFSG) nicht installiert,
mailx-output folgt.

\begin{verbatim}
# grep frodo /var/log/mail.log
Jul  6 15:30:48 tipitapa postfix/local[4087]: B24FB179D8C:
to=<frodo@tipitapa.aoe>, orig_to=<frodo>, relay=local, delay=1, status=sent
(delivered to mailbox)
# mailx -f /var/spool/mail/frodo < /dev/null 
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/spool/mail/frodo": 1 message 1 new
>N  1 root@tipitapa.aoe  Wed Jul  6 15:30   13/414   ignore
"/var/spool/mail/frodo" complete
\end{verbatim}

\subsection{Richte einen Alias {\tt office} ein, der empfangene Mails an gandalf
und frodo weiterleitet.}

\begin{verbatim}
# echo office: frodo,gandalf >> /etc/aliases; newaliases
\end{verbatim}

\subsection{Schick eine Mail an {\tt office} und schau dir das Maillog an!}
\label{qid}

\begin{verbatim}
# mutt -s "lazy lizards" office < /dev/null 
# tail /var/log/mail.log
Jul  6 15:39:35 tipitapa postfix/pickup[4014]: 06DD8179D8C: uid=0 from=<root>
Jul  6 15:39:35 tipitapa postfix/cleanup[4134]: 06DD8179D8C:
  message-id=<20050706133934.GA4129@tivoli.oelzant.priv.at>
Jul  6 15:39:35 tipitapa postfix/qmgr[4015]: 06DD8179D8C:
  from=<root@tipitapa.aoe>, size=406, nrcpt=1 (queue active)
Jul  6 15:39:35 tipitapa postfix/local[4136]: 06DD8179D8C:
  to=<frodo@tipitapa.aoe>, orig_to=<office>, relay=local, delay=1,
  status=sent (delivered to mailbox)
Jul  6 15:39:35 tipitapa postfix/local[4136]: 06DD8179D8C:
  to=<gandalf@tipitapa.aoe>, orig_to=<office>, relay=local, delay=1,
  status=sent (delivered to mailbox)
Jul  6 15:39:35 tipitapa postfix/qmgr[4015]: 06DD8179D8C: removed
\end{verbatim}

{\tt postfix} schreibt f\"ur den Empfang des Mail nur host/from/msgid
an, rcpt und delivery status l\"asst sich aber \"uber die queue ids leicht 
verfolgen.

\subsection{Schick eine Mail an einen nicht existierenden User des Rechners
deines Nachbarn und interpretiere die Fehler-Mail, die du zur\"uckbekommst.}

\begin{verbatim}
Date: Wed, 6 Jul 2005 15:47:40 +0200                                            
From: Mail Delivery Subsystem <MAILER-DAEMON>                                   
Subject: Returned mail: see transcript for details                              
To: aoe@private.oelzant.priv.at                                                 
                                                                                
[-- Attachment #1 --]                                                           
[-- Type: text/plain, Encoding: 7bit, Size: 0.5K --]                            
                                                                                
The original message was received at Wed, 6 Jul 2005 15:47:40 +0200             
from aoe@localhost [127.0.0.1]                                                  
                                                                                
   ----- The following addresses had permanent fatal errors -----               
<asdf@tipitapa3.aoe>                                                            
    (reason: 550 <asdf@tipitapa3.aoe>: Recipient address rejected: User
unknown in local recipient table)                                                      
...
\end{verbatim}
                
Oder von postfix-seite:
                                                                
\begin{verbatim}
From: Mail Delivery System <MAILER-DAEMON@tipitapa3.aoe>
Subject: Undelivered Mail Returned to Sender
To: root@tipitapa3.aoe

[-- Attachment #1: Notification --]
[-- Type: text/plain, Encoding: 7bit, Size: 0.5K --]

This is the Postfix program at host tipitapa3.aoe.

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

                        The Postfix program

<asdfgh@oelzant.priv.at>: host comitan.oelzant.priv.at[62.178.208.184]
said:
    550 5.1.1 <asdfgh@oelzant.priv.at>... User unknown (in reply to RCPT TO
command)
...
\end{verbatim}

\subsection{Schreibe in main.cf folgenden Abschnitt dazu, um dem Server
Zugriff auf die access Datei zu erm\"oglichen und restarte den postfix
danach:}

\begin{verbatim}
smtpd_recipient_restrictions = permit_mynetworks, reject_invalid_hostname, reject_unknown_hostname,
                               reject_unknown_sender_domain, reject_unknown_recipient_domain,
                               check_recipient_access hash:/etc/postfix/access,
															 check_relay_domains
\end{verbatim}

\subsection{Teste es durch eine einfache Access-Regel, die alle Mails an gandalf
zur\"uckweist.}


\begin{verbatim}
# echo gandalf@ REJECT > /etc/postfix/access;
  postmap /etc/postfix/access ; \
  /etc/init.d/postfix restart
\end{verbatim}

Ergebnis:

\begin{verbatim}
   ----- The following addresses had permanent fatal errors -----               
<gandalf@tipitapa3.aoe>                                                         
    (reason: 554 <gandalf@tipitapa3.aoe>: Recipient address rejected:
Access denied)
\end{verbatim}

\subsection{Schreibe eine Access-Regel f\"ur den User {\tt frodo}
 so, da\ss{} die
Meldung \glqq Bin Ring zerst\"oren!\grqq{} zur\"uckgeliefert und die Mail nicht an frodo
zugestellt wird.}


\begin{verbatim}
# echo frodo@ DEFER_IF_PERMIT 'Bin Ring zerstoeren!'> /etc/postfix/access; \
  postmap /etc/postfix/access ; \
  /etc/init.d/postfix restart
\end{verbatim}

\subsection{Teste, ob alles ok ist, indem du frodo eine Mail schickst.}

\begin{verbatim}
$ mutt -s asdasd frodo@tipitapa3.aoe < /dev/null
$ mailq -v
MSP Queue status...
/var/spool/mqueue-client is empty
                Total requests: 0
MTA Queue status...
                /var/spool/mqueue (1 request)
-----Q-ID----- --Size-- -Priority- ---Q-Time---
--------Sender/Recipient--------
j66ESuOr016764        0     120517 Jul  6 16:28
<aoe@private.oelzant.priv.at>
                 (Deferred: 450 <frodo@tipitapa3.aoe>: Recipient address
rejected: Bin Ring zerstoeren!)
                                                <frodo@tipitapa3.aoe>
                 (Deferred: 450 <frodo@tipitapa3.aoe>: Recipient address
rejected: Bin Ring zerstoeren!)
                Total requests: 1
\end{verbatim}

\subsection{Welche verschiedenen Eintr\"age kannst du in der Logdatei
erkennen?}

\begin{verbatim}
Jul  6 16:28:50 tipitapa postfix/master[5021]: daemon started -- version
 2.2.3, configuration /etc/postfix
Jul  6 16:28:55 tipitapa postfix/smtpd[5025]: warning: dict_nis_init: NIS
 domain name not set - NIS lookups disabled
Jul  6 16:28:55 tipitapa postfix/smtpd[5025]: connect from brasilia.aoe[192.168.2.99]
Jul  6 16:28:55 tipitapa postfix/smtpd[5025]: warning: support for
  restriction "check_relay_domains" will be removed from Postfix; use
  "reject_unauth_destination" instead
Jul  6 16:28:55 tipitapa postfix/smtpd[5025]: NOQUEUE: reject: RCPT from
  brasilia.aoe[192.168.2.99]: 450 <frodo@tipitapa3.aoe>: Recipient address
  rejected: Bin Ring zerstren!; from=<aoe@oelzant.priv.at>
  to=<frodo@tipitapa3.aoe> proto=ESMTP
  helo=<chello062178208184.1.15.univie.teleweb.at>
Jul  6 16:28:55 tipitapa postfix/smtpd[5025]: disconnect from
  brasilia.aoe[192.168.2.99]
Jul  6 16:30:24 tipitapa postfix/smtpd[5025]: connect from
  brasilia.aoe[192.168.2.99]
Jul  6 16:30:24 tipitapa postfix/smtpd[5025]: NOQUEUE: reject: RCPT from
  brasilia.aoe[192.168.2.99]: 450 <frodo@tipitapa3.aoe>: Recipient address
  rejected: Bin Ring zerstren!; from=<aoe@oelzant.priv.at>
  to=<frodo@tipitapa3.aoe> proto=ESMTP
  helo=<chello062178208184.1.15.univie.teleweb.at>
Jul  6 16:30:24 tipitapa postfix/smtpd[5025]: disconnect from
  brasilia.aoe[192.168.2.99]
\end{verbatim} 

Warnungen/Hinweise, Queue Messages, (dis)connects und NOQUEUE (reject).
Verfolgung von Mails siehe oben \ref{qid} \"uber Queue IDs.


\section{\"Ubungen zum Bind DNS Server}

\subsection{Installiere das {\tt bind} Paket.}

\begin{verbatim}
# apt-get install bind
Reading Package Lists... Done
Building Dependency Tree... Done
Sorry, bind is already the newest version.
0 packages upgraded, 0 newly installed, 0 to remove and 18  not upgraded.
\end{verbatim}

\subsection{Kopiere die Datei {\tt named.conf} nach {\tt /etc} und {\tt
named.ca},
{\tt named.local}, {\tt matrix.rev} und {\tt matrix.hosts} nach {\tt
/var/named}.}

\begin{verbatim}
# (cd /var/named; curl -s -O \
    http://www.mat.univie.ac.at/~martin/lehre/ss05/pp/dns/matrix.rev)
# (cd /var/named; curl -s -O \
    http://www.mat.univie.ac.at/~martin/lehre/ss05/pp/dns/matrix.hosts)
\end{verbatim}

named.conf und localhost setup ist bereits vorhanden ;)

\subsection{Konfiguriere {\tt /etc/named.conf} so, da\ss{} dein Rechner Masterserver
f\"ur die matrix Zone (die sich in der Datei {\tt /var/named/matrix.hosts}
befindet) ist. Mach dasselbe f\"ur den Reverse Lookup (verwende dazu das Netz
10.10.23.*).}

\begin{figure}
\begin{verbatim}
zone "matrix" {
        type master;
        file "/var/named/matrix.hosts";
};
zone "23.10.10.in-addr.arpa" {
        type master;
        file "/var/named/matrix.rev";
};
\end{verbatim}
\caption{named.conf}
\end{figure}

\subsection{\"Andere die Defaultinformationen in /var/named/matrix.hosts und
/var/named/matrix.rev auf sinnvolle Werte.
Konkret soll sp\"ater z.B. ein Rechner in der matrix Zone die IP 10.10.23.42
und den Namen test.matrix. haben.}
\begin{verbatim}
# sed -i -e "s/ns.domain/`hostname`/" \
    -e "s/domain-admin.domain/hostmaster.`hostname`/" \
    /var/named/matrix.hosts /var/named/matrix.rev  
# echo test 1D IN A         10.10.23.42 >> /var/named/matrix.hosts
# echo 42      IN PTR test.matrix. >> /var/named/matrix.rev
\end{verbatim}

\subsection{Starte den named.}

\begin{verbatim}
# ndc restart
new pid is 17515
\end{verbatim}

\subsection{\"Andere die /etc/resolv.conf: Trage deine Test-Domain matrix in
den search Pfad ein (l\"osche dabei das pclab heraus!) und die Server-IP
(10.10.a.b) bei nameserver ein (auch hier den vorhandenen Eintrag
entfernen!).}
\label{setdns}

Wieso? host/nslookup haben ohnehin ns parameter ...

\begin{verbatim}
# sed -i -e 's/pclab/matrix/' \
    -e "s/^nameserver.*/nameserver `hostname -i`/" /etc/resolv.conf 
\end{verbatim}

\subsection{Versuche, 127.0.0.1 mit host in einen Namen aufzul\"osen. Welcher
Name ist dieser IP zugeordnet?}

\begin{verbatim}
# host 127.0.0.1
1.0.0.127.in-addr.arpa domain name pointer localhost.
# nslookup -q=ptr 1.0.0.127.in-addr.arpa
Server:         127.0.0.1
Address:        127.0.0.1#53

1.0.0.127.in-addr.arpa  name = localhost.
\end{verbatim}

\subsection{Versuche, den Hostnamen und die IP Adresse deines zriXXYYY
Rechners aufzul\"osen. Geht das? Warum (nicht)?}

Der Rechner ist seit Aufgabe \ref{setdns} sein eigener DNS, hat kein
zri.*\\.mat konfiguriert, hierarchisch vergebener Name ist das auch keiner
(\glqq wir\grqq{} sind schlie\ss{}lich in  einem privaten Netz \dots), daher
kann der Name nicht aufgel\"ost werden.

\subsection{Trage nun folgende Rechner in den Nameserver sowohl als Lookup
als auch als Reverse Lookup ein:}
\subsubsection{10.10.23.1 hei\ss{}t gw}
\begin{verbatim}
# echo gw 1D IN A 10.10.23.1 >> /var/named/matrix.hosts
# echo 1 IN PTR gw.matrix. >> /var/named/matrix.rev
\end{verbatim}
\subsubsection{gw soll auch als gateway und router erreichbar sein}
\begin{verbatim}
# for i in gateway router; do 
    echo $i IN CNAME gw >> /var/named/matrix.hosts ; \
  done
\end{verbatim}
\subsubsection{10.10.23.2 hei\ss{}t zion}
\begin{verbatim}
# echo zion 1D IN A 10.10.23.2 >> /var/named/matrix.hosts
# echo 2 IN PTR zion.matrix. >> /var/named/matrix.rev
\end{verbatim}
\subsubsection{zion soll auch als email, ftp, www und ns erreichbar sein}
\begin{verbatim}
# for i in email ftp www ns ; do
    echo $i IN CNAME zion >> /var/named/matrix.hosts ; \
  done
\end{verbatim}
\subsubsection{10.10.23.3 hei\ss{}t neo}
\begin{verbatim}
# echo neo 1D IN A 10.10.23.3 >> /var/named/matrix.hosts
# echo 3 IN PTR neo.matrix. >> /var/named/matrix.rev
\end{verbatim}
\subsubsection{10.10.23.10 hei\ss{}t smith und agentsmith.}
\label{smith}
\begin{verbatim}
# for i in smith agentsmith ; do
    echo $i IN A 10.10.23.10 >> /var/named/matrix.hosts ; \
    echo 10 IN PTR $i.matrix. >> /var/named/matrix.rev; \
  done
\end{verbatim}
\subsubsection{Die Mails von neo sollen an Rechner architekt.matrix. (auch
eintragen mit selbst gew\"ahlter IP) gehen}
\begin{verbatim}
# echo architekt 1D IN A 10.10.23.33 >> /var/named/matrix.hosts
# echo neo 1D IN MX 666 architekt >> /var/named/matrix.hosts
# echo 33 IN PTR architekt.matrix. >> /var/named/matrix.rev
\end{verbatim}
\subsection{Mails an die gesamte Matrix sollen im Allgemeinen an den
Rechner zion gehen.}
\begin{verbatim}
# echo @ 1D IN MX 0 zion >> /var/named/matrix.hosts
\end{verbatim}
\subsection{10.10.23.99 hei\ss{}t orakel}
\begin{verbatim}
# echo orakel 1D IN A 10.10.23.99 >> /var/named/matrix.hosts
# echo 99 IN PTR orakel.matrix. >> /var/named/matrix.rev
\end{verbatim}

\section{Teste die Eintr\"age deiner Domain mit dem host Utility. Schreibe im
speziellen Abfragen, die folgendes herausfinden:}
\begin{verbatim}
# ndc reload
\end{verbatim}
\subsection{Den Namen von 10.10.23.99}
\begin{verbatim}
# host 10.10.23.99
99.23.10.10.in-addr.arpa domain name pointer orakel.matrix.
\end{verbatim}
\subsubsection{Die IP von agentsmith}
\begin{verbatim}
# host agentsmith.matrix
agentsmith.matrix has address 10.10.23.10
\end{verbatim}
\subsubsection{Ob es sich bei agentsmith um einen CNAME handelt}
Eine Anforderung, dass agentsmith ein CNAME sein sollte, war auch bei
mehrmaligem Lesen von Aufgabe \ref{smith} nicht ersichtlich, und gem\"ass
RFC wurden zwei A/PTR eingetragen. (Interpretation siehe auch\break
\url{http://archives.neohapsis.com/archives/postfix/2002-08/2177.html}
\footnote{The consensus on the BIND users list / newsgroup is that multiple
PTRs
   are legal, but almost always unnecessary, and more likely to cause
   problems than to solve them in actual practice.}
\begin{verbatim}
# host -t cname agentsmith.matrix
#
\end{verbatim}

Zum Ausgleich ein echter {\tt CNAME}:

\begin{verbatim}
# host -t cname ns.matrix
ns.matrix is an alias for zion.matrix.
\end{verbatim}

\subsubsection{Welcher Rechner f\"ur Emails an neo zust\"andig ist.}
\begin{verbatim}
# host -t mx neo.matrix
neo.matrix mail is handled by 666 architekt.matrix.
\end{verbatim}

\subsection{Teste einige Eintr\"age auch mit dem dig Tool und interpretiere die
Ausgabe.}

Das utility {\tt dig} produziert ebenso wie {\tt host -l -v -t any \dots}
h\"ubschen zonzefile-kompatiblen output, zeigt request und response an und
listet die eintr\"age s\"auberlich auf. z. B.
\begin{verbatim}
# dig neo.matrix

; <<>> DiG 9.2.4 <<>> neo.matrix
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1307
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;neo.matrix.                    IN      A

;; ANSWER SECTION:
neo.matrix.             86400   IN      A       10.10.23.3

;; AUTHORITY SECTION:
matrix.                 86400   IN      NS      comitan.aoe.

;; ADDITIONAL SECTION:
comitan.aoe.            86400   IN      A       192.168.2.1

;; Query time: 35 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul  6 17:31:18 2005
;; MSG SIZE  rcvd: 85
\end{verbatim}

Hier sind bei entsprechender Vergr\"osserung deutlich die F\"uhler des
Insekts zu sehen, leider reicht die Objektivapertur nicht aus, um auch
die Facettenaugen erkennen zu k\"onnen.

\subsection{Was kann man mit dem nslookup Tool machen?}
Im wesentlichen das gleiche wie mit host, die Syntax ist alelrdings eine
andere und der Zonefile-artige Output ist (afaik) nicht verf\"ugbar. z. B.

\begin{verbatim}
# nslookup  -q=any matrix.
Server:         127.0.0.1
Address:        127.0.0.1#53

matrix  nameserver = comitan.aoe.
matrix
        origin = comitan.aoe
        mail addr = hostmaster.comitan.aoe
        serial = 2004040703
        refresh = 28800
        retry = 14400
        expire = 3600000
        minimum = 86400
matrix  mail exchanger = 0 zion.matrix.
\end{verbatim}

\section{\"Ubungen zum NFS Server}

\subsection{Wie findet man heraus, ob NFS schon installiert ist?}

\begin{verbatim}
# rpcinfo -p|grep -E "nfs|mount"
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100005    1   udp    605  mountd
    100005    1   tcp    608  mountd
    100005    2   udp    605  mountd
    100005    2   tcp    608  mountd
    100005    3   udp    605  mountd
    100005    3   tcp    608  mountd
\end{verbatim}

\subsection{Starte den NFS Server!}

\begin{verbatim}
# /etc/init.d/portmap restart;/etc/init.d/nfs-kernel-server restart
Stopping portmap daemon: portmap.
Starting portmap daemon: portmap.
Stopping NFS kernel daemon: mountd nfsd.
Unexporting directories for NFS kernel daemon...done.
Exporting directories for NFS kernel daemon...done.
Starting NFS kernel daemon: nfsd mountd.
\end{verbatim}

\subsection{Vergewissere dich einerseits durch Ansehen der
Serverkonfiguration, andererseits durch einen showmount Befehl, da\ss{} der
Server noch keine Verzeichnisse exportiert.}

\begin{verbatim}
# showmount -e
Export list for comitan.aoe:
\end{verbatim}

\subsection{Erstelle ein Verzeichnis /mytmp, das du ohne Optionenliste an
alle im PC Labor freigibst.}
\label{chmod}

\begin{verbatim}
# mkdir /mytmp
# chmod 1777 /mytmp
# echo "/mytmp 10.10.23.0/24()" >> /etc/exports; exportfs -r; \
    showmount -e|grep mytmp
exportfs: /etc/exports [31]: No 'sync' or 'async' option specified for
export "10.10.23.0/24:/mytmp".
  Assuming default behaviour ('sync').
  NOTE: this default has changed from previous versions
/mytmp                  10.10.23.0/24
\end{verbatim}

\subsection{Finde einerseits heraus, ob das Verzeichnis generell read-write
oder read-only ist, andererseits, ob root darin beliebig schreiben darf
oder nicht! (kurz gesagt: Welche Defaultwerte gelten f\"ur einen Export, wenn
man keine Optionen angibt?)}

\begin{verbatim}
[root@df root]# mount brasilia:/mytmp /mnt/mytmp
[root@df root]# cd /mnt/mytmp
[root@df mytmp]# touch asd
touch: cannot touch `asd': Permission denied
> touch /mnt/mytmp/asd
touch: cannot touch `/mnt/mytmp/asd': Permission denied
\end{verbatim}

Default ist also {\tt ro,root\_{}squash,sync}

\subsection{Erstelle ein Verzeichnis /myspace und /mp3s und lege einige
Dateien hinein.}
\begin{verbatim}
# apt-get install mldonkey
# mlnet
# telnet localhost 4000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Welcome on mldonkey command-line

Use ? for help

MLdonkey command-line:
> s mp3
> vr
...
1011 sources, total available 18.99G
> d 1 2 3 ...
\end{verbatim}

\subsection{Gib {\tt /myspace} an das gesamte PCLabor zum Lese- und
Schreibzugriff frei.}
\label{mp3s}

\begin{verbatim}
# sed -i -e 's#^/mytmp.*#/mytmp 192.168.2.0/24(rw,root_squash,sync)#' \
  /etc/exports
# echo "/mp3s 192.168.2.0/24(ro,no_root_squash,sync)" >> /etc/exports
# exportfs -r
\end{verbatim}

\subsection{Versuche, /myspace deines Nachbarn auf deinem Rechner nach
/mnt/tmp zu mounten und eine Datei hineinzukopieren (Verzeichnisrechte
beachten!)}

Verzeichnisrechte siehe Aufgabe \ref{chmod}.

\begin{verbatim}
> touch /mnt/mytmp/asdf
# touch asd
# ls -ldn asd
-rw-r--r--  1 65534 65534 0 Jul  6 18:19 asd
\end{verbatim}

Facit: squashed access heist remapping auf anon user (nobody o. \"a.)

\subsection{Gib /mp3s ausschlie\ss{}lich an deinen Nachbarn nur zum Lesezugriff
frei.}

siehe Aufgabe \ref{mp3s}

\subsection{Darf dein Nachbar als root trotzdem darauf schreiben?}

\begin{verbatim}
# mount brasilia:/mp3s /mnt/mytmp
# ls -l /mnt/mytmp
total 0
-rw-r--r--  1 postgres postgres 0 Jul  6 18:19 asd
-rw-r--r--  1 aoe      aoe      0 Jul  6 18:20 asdf
# touch /mnt/mytmp/sdfsdf
touch: cannot touch `/mnt/mytmp/sdfsdf': Permission denied
\end{verbatim}

Nein, nat\"urlich nicht, ro gilt auch (und besonders, bei root\_{}squash)
f\"ur root. nur ein Verzeichnis mit permissions a-w, aber
rw,no\_{}toot\_{}squash  exportiert k\"onnte von remote root
\"uberschreiben werden.

\subsection{F\"uge in der /etc/exports die Option root\_{}squash beim /myspace
Eintrag hinzu. Kannst du jetzt als root (nach exportfs -r!) noch Dateien in
/myspace anlegen?}

Siehe vorherige Frage, das hatte ich vorher eigentlich auch schon :) 

Mit root\_{}squash nur squashed auf nobody, weil das dir (bei mir) 
tmp-berechtigungen hat; 
nicht jedoch, wenn die permissions Schreibzugriff fuer {\tt others} nicht
zulassen.

Mit no\_{}toot\_{}squash k\"onnte root nat\"urlich tats\"achlich
uid-0-Dateien anlegen/bearbeiten (sieht bei den nfsroots natuerlich so
aus).


\section{\"Ubungen zum NIS Server}

\subsection{Installiere den YP Server und starte ihn.}

\begin{verbatim}
# apt-get install nis
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
  nis
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 256kB of archives.
After unpacking 897kB of additional disk space will be used.
Get:1 http://ftp.at.debian.org unstable/main nis 3.13-3 [256kB]
Fetched 256kB in 1s (149kB/s)
Preconfiguring packages ...
Selecting previously deselected package nis.
(Reading database ... 180514 files and directories currently installed.)
Unpacking nis (from .../nis_3.13-3_powerpc.deb) ...
Setting up nis (3.13-3) ...
Configuring nis
---------------

You now need to choose a NIS domainname for your system. If you want this 
machine to just be a client, enter the NIS domainname of your network.
Otherwise
choose an appropriate NIS domainname.

Enter your NIS domain aoedomain


Your system needs more configuration.

Your system has not yet been completely configured as a NIS client - you
need to
setup /etc/nsswitch.conf and/or /etc/passwd and /etc/group. Please read 
/usr/share/doc/nis/nis.debian.howto.gz to find out how.

Setting NIS domainname to: aoedomain
Starting NIS services: ypbind
\end{verbatim}

\subsection{Initialisiere einen Master Server.}

\begin{verbatim}
# sed -e 's/^\(NISSERVER=\).*/\1master/' /etc/default/nis
# /etc/init.d/nis restart
Starting NIS services: ypserv yppasswdd ypxfrd ypbind 
\end{verbatim}

\subsection{Bearbeite die /var/yp/securenets so, da\ss{} nur die Eintr\"age f\"ur
127.0.0.1, deinen eigenen Rechner und den deines Nachbarn eingetragen sind.
Restarte den ypserv.}
\label{nisrestart}

\begin{verbatim}
# sed -ie 's/^0.0.0.0/255.255.255.0 192.168.2.0/' /etc/ypserv.securenets
# /etc/init.d/nis restart
Starting NIS services: ypserv yppasswdd ypxfrd ypbind [binding to YP server
.......... backgrounded]
\end{verbatim}

\subsection{Trage den Rechner deines Nachbarn als YP Server in /etc/yp.conf
und /var/yp/ypservers ein.}

\begin{verbatim}
# echo -e "domain aoedomain server 192.168.3.44\nypserver 192.168.3.44" \
   > /etc/yp.conf
# echo aoedomain > /etc/defaultdomain
\end{verbatim}

\subsection{\"Uberpr\"ufe mit den yp Tools, ob du z.b. die passwd oder group
Map deines Nachbarn lesen kannst (auch wenn diese vermutlich noch leer
sind).}
\label{ypcat}

\begin{verbatim}
# ypcat passwd
frodo:x:1002:1002:hobbit,,,:/home/frodo:/bin/bash
gandalf:x:1003:1003:wizard,,,:/home/gandalf:/bin/bash
\end{verbatim}

\subsection{Lege einen User mit einer User-ID $\geq$ MINUID (die du in
/var/yp/Makefile findest) an (mittels der Option -u bei adduser oder
useradd).}

Siehe Aufgabe \ref{gandalf}, UID\_{}MIN in {\tt login.defs} und MINUID in
{\tt /var/yp/Makefile} stimmen ferner bereits \"uberein.

\subsection{\"Uberpr\"ufe, ob du den User deines Nachbarn per YP sehen kannst.}

Siehe \"Ubung \ref{ypcat} zum Thema {\tt ypcat}

\subsection{Starte den {\tt yppasswdd}.}

Dieser daemon wird bei Debian GNU/Linux automatisch gestartet, siehe z. B.
{\tt nis restart} in Aufgabe \ref{nisrestart}

\subsection{Versuche, das Pa\ss{}wort des auf dem Nachbarrechner angelegten
Users per YP zu \"andern.}

Das geht, wenn {\tt nsswitch.conf} ok ist (nis eintr\"age, nona),
rpc.yppasswdd am Server l\"auft und der Client den Server per IP-Adresse
kennt (\dots)

\begin{verbatim}
gandalf@master:~$ yppasswd 
Changing NIS account information for gandalf on tipitapa.
Please enter old password:
Changing NIS password for gandalf on tipitapa.
Please enter new password:
Please retype new password:

The NIS password has been changed on tipitapa.
\end{verbatim}

\begin{verbatim}
[gandalf@client mnt]$ yppasswd 
...
The NIS password has been changed on tipitapa.
[root@df mnt]# yppasswd  gandalf
Changing NIS account information for gandalf on tipitapa.
Please enter root password:
Changing NIS password for gandalf on tipitapa.
Please enter new password:
Please retype new password:

The NIS password has been changed on tipitapa.
\end{verbatim}

\begin{verbatim}
[root@client mnt]# yppasswd  gandalf
Changing NIS account information for gandalf on tipitapa.
Please enter root password:
Changing NIS password for gandalf on tipitapa.
Please enter new password:
Please retype new password:

The NIS password has been changed on tipitapa.
\end{verbatim}

\subsection{Versuche, f\"ur diesen Benutzer Finger Information einzugeben.}

Abh\"angig vom {\tt YPCHANGEOK} setting (\glqq{\tt chsh}\grqq, \glqq{\tt
chfn}\grqq, \glqq{\tt chsh,chfn}\grqq) ist das m\"oglich oder nicht. Die
Variable ist bei Debian GNU/Linux in {\tt /etc/default/nis} gesetzt und wird von
{\tt /etc/init.d/nis} in {\tt -e} Variablen umgebaut, die {\tt \$YPPWDDIR}
auf der commandline mitbekommt.

\section{\"Ubungen zum Squid Proxy Server}

\subsection{Installiere das Squid Paket.}

\begin{verbatim}
# apt-get install squid
...
FATAL: Could not determine fully qualified hostname.  
  Please set 'visible_hostname'
...
/var/lib/dpkg/info/squid.postinst: line 114:  7337 Aborted /usr/sbin/squid -z
...
# echo visible_hostname tipitapa.aoe >> /etc/squid/squid.conf
\end{verbatim}

\subsection{Setze den Port des Squid Servers auf {\tt 8080}.}

\begin{verbatim}
# grep http_port /etc/squid/squid.conf
#  TAG: http_port
#       internal address:port in http_port. This way Squid will only be
# http_port 3128
#               cache_peer hostname type http_port icp_port
#               http_port
# echo http_port 8080 >> /etc/squid/squid.conf
\end{verbatim}

\subsection{Starte den Proxyserver.}


\begin{verbatim}
# /etc/init.d/squid restart
Restarting proxy server: Creating squid spool directory structure
2005/07/06 20:40:40| Creating Swap Directories
squid.
# netstat -an|grep 8080
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN     
\end{verbatim}

\subsection{Konfiguriere den Proxyserver in deinem Webbrowser.}

\begin{verbatim}
# http_proxy=http://localhost:8080/ lynx -dump www.apple.com > /dev/null
# http_proxy=http://localhost:8080/ lynx -dump www.apple.com > /dev/null
\end{verbatim}

\subsection{Gehe auf eine beliebige Webseite und finde heraus, ob der Proxy
tats\"achlich verwendet wird.}

\begin{verbatim}
# cat /var/log/squid/access.log 
1120675607.563    897 127.0.0.1 TCP_MISS/200 13541 GET
  http://www.apple.com/ - DIRECT/17.254.0.91 text/html
1120675624.223      1 127.0.0.1 TCP_HIT/200 13539 GET http://www.apple.com/
  - NONE/- text/html
\end{verbatim}

\subsection{Funktioniert der Zugriff auch von einem anderen Rechner aus?
Probier es mit deinem Nachbarn aus!}

\begin{verbatim}
1120675801.708      6 192.168.2.10 TCP_DENIED/403 1391 GET
  http://www.apple.com/ - NONE/- text/html
\end{verbatim}

Nein, die Default-konfiguration verweigert korrekterweise den Zugang von
Aussen.

\subsection{Wenn es nicht funktioniert, versuche in der Konfiguration
herauszufinden, wie man den Zugang f\"ur weitere Rechner au\ss{}er localhost
erm\"oglicht und konfiguriere den Squid entsprechend!}

\begin{verbatim}
# sed -ie '1s/.*/acl neighbour src 192.168.2.10\n\
    http_access allow neighbour\n&/' /etc/squid/squid.conf; \
  killall -HUP squid
# tail -1 /var/log/squid/access.log
1120676255.814      9 192.168.2.10 TCP_HIT/200 13540 GET
  http://www.apple.com/ - NONE/- text/html
\end{verbatim}


\section{\"Ubungen zum Samba Server}

\subsection{Installiere das Samba-Server-Paket (samba-common und
samba-client sind bereits installiert).}

\begin{verbatim}
# apt-get install samba
Reading Package Lists... Done
Building Dependency Tree... Done
Suggested packages:
  samba-doc
The following NEW packages will be installed:
  samba
0 upgraded, 1 newly installed, 0 to remove and 40 not upgraded.
Need to get 0B/2736kB of archives.
After unpacking 6820kB of additional disk space will be used.
Preconfiguring packages ...
Selecting previously deselected package samba.
(Reading database ... 180485 files and directories currently installed.)
Unpacking samba (from .../samba_3.0.14a-5_powerpc.deb) ...
Setting up samba (3.0.14a-5) ...
Starting Samba daemons: nmbd.
\end{verbatim}

\subsection{Starte den Samba-Server und sieh dir die Start-Konfiguration
an. Versuche, mittels {\tt smbclient} auf den Server zuzugreifen und dir die
verf\"ugbaren Freigaben anzeigen zu lassen. (Du ben\"otigst dazu noch keinen
Usernamen/Password, best\"atige beim Passwort-Prompt einfach mit ENTER.) Du
kannst sowohl DNS- als auch NetBIOS-Hostnamen verwenden.}

{\tt -N} unterdr\"uckt den pw-prompt

\begin{verbatim}
# smbclient -L tipitapa -N
Anonymous login successful
Domain=[DEBIAN_FANS] OS=[Unix] Server=[Samba 3.0.14a-Debian]

        Sharename       Type      Comment
        ---------       ----      -------
        IPC$            IPC       IPC Service (tipitapa server (Samba
3.0.14a-Debian))
        ADMIN$          IPC       IPC Service (tipitapa server (Samba
3.0.14a-Debian))
        lp              Printer   Generic dot-matrix printer entry
Anonymous login successful
Domain=[DEBIAN_FANS] OS=[Unix] Server=[Samba 3.0.14a-Debian]

        Server               Comment
        ---------            -------
        TIPITAPA             tipitapa server (Samba 3.0.14a-Debian)

        Workgroup            Master
        ---------            -------
        DEBIAN_FANS          
\end{verbatim}

\subsection{Sieh dir die Eintr\"age in den Logfiles zu deinen gerade
get\"atigten Zugriffen an.}

Ein (leeres) logfile f\"ur den Source Host wird in /var/log/samba angelegt,
ein Eintrag wird in /var/log/syslog erstellt:

\begin{verbatim}
Jul  6 21:12:02 tipitapa smbd[7649]: connect from 127.0.0.1 (127.0.0.1)
Jul  6 21:14:10 tipitapa smbd[7659]: connect from 192.168.2.10 (192.168.2.10)
\end{verbatim}

\subsection{Verwende die Man-Pages und Internetressourcen (Samba
Projektseite, Google o.\"a.) dazu herauszufinden, was der Parameter ``{\tt
os level}'' (smb.conf) beeinflusst bzw. welche Eigenart des SMB-Protokolls
dahinter steckt.}


\begin{verbatim}
# OS Level determines the precedence of this server in master browser
# elections. The default value should be reasonable
;   os level = 20
\end{verbatim}

Dieser esoterische Parameter entscheidet bei Hahnenk\"ampfen, welcher
Gockel gewinnt. 

Aus dem ``Official Samba-3 HOWTO and Reference Guide''
\footnote{\url{http://www.samba.org/samba/docs/Samba-HOWTO-Collection.pdf
}}:

{\em 4.4. Samba ADS Domain Control}
   
   The {\tt os level} must be set at or above a value of 32. A Domain Controller
	 must be the Domain Master Browser, must be set in user mode security, must
	 support Microsoft-compatible encrypted passwords, and must provide the
	 network logon service (domain logons). Encrypted passwords must be enabled.
	 For more details on how to do this, refer to[1191] Account Information
	 Databases.

\subsection{Lege eine Public-Freigabe an, auf die jeder Lesezugriff hat.
Versuche, auf diese Freigabe mit smbclient zuzugreifen und eine Datei von
der Freigabe auf deinen Rechner zu kopieren. Achte darauf, dass dazu auch
die lokalen UNIX-Rechte passen m\"ussen.}

\begin{verbatim}
# mkdir /mnt/stuff
# echo whatever > /mnt/stuff/newfile
# echo '[myexport]
    comment=various stuff
    path=/mnt/stuff
    public=yes
    writable=no' >> /etc/samba/smb.conf ; \
  killall -HUP smbd
\end{verbatim}

\begin{verbatim}
$ smbclient //tipitapa/myexport -N -c ls
Anonymous login successful
Domain=[DEBIAN_FANS] OS=[Unix] Server=[Samba 3.0.14a-Debian]
  .                                   D        0  Wed Jul  6 21:32:22 2005
  ..                                  D        0  Wed Jul  6 21:32:05 2005
  newfile                                      9  Wed Jul  6 21:32:22 2005

                49569 blocks of size 262144. 1113 blocks available

# smbclient //tipitapa/myexport -N -c "get newfile -"
Anonymous login successful
Domain=[DEBIAN_FANS] OS=[Unix] Server=[Samba 3.0.14a-Debian]
whatever
getting file \newfile of size 9 as - (0.3 kb/s) (average 0.3 kb/s)
\end{verbatim}

Bitte den Inhalt der Datei ``{\tt whatever}'' zu beachten.

\subsection{Mounte eine Freigabe deines eigenen Servers z.B. unter
/mnt/tmp.}

\begin{verbatim}
# apt-get install smbfs # fuer smbmount
# mkdir /mnt/mytmp
# mount //tipitapa/myexport /mnt/mytmp -o password=
Anonymous login successful
\end{verbatim}

Siehe auch die inoffiziellen symlink-Patches 
\footnote{\url{http://lists.samba.org/archive/samba/2000-July/019850.html}}.


\subsection{Passe die Freigabe der Home-Verzeichnisse deinen Vorstellungen
nach an und starte den Samba-Server neu. Lege dir einen normalen
UNIX-Benutzer an und aktiviere diesen mit smbpasswd f\"ur Samba. Mounte dann
sein Home-Verzeichnis in das Verzeichnis /mnt/mydir (das du vorher noch
anlegen mu\ss{}t) und lege einige Dateien und Verzeichnisse an.}

\begin{verbatim}
# sed -ie 's/^.*encrypt passwords = false/encrypt passwords = true/' \
    /etc/samba/smb.conf
# smbpasswd -a gandalf
# smbpasswd gandalf
New SMB password:
Retype new SMB password:
# /etc/init.d/samba restart
# mv /mnt/mytmp /mnt/mydir
# mount //tipitapa/gandalf /mnt/mydir -o username=gandalf,password=wizard
# sed -ie '/homes/,/writables/s/writable = no/writable = yes/' \
    /etc/samba/smb.conf 
# ls -la /mnt/mydir/
total 28
drwxr-xr-x   1 root    root    4096 Jul  6 22:02 .
drwxr-xr-x  12 root    root    4096 Jul  6 21:46 ..
-rw-r--r--   1 gandalf gandalf  266 Jul  6 15:26 .alias
# mkdir /mnt/mytmp/asd
# echo Hello World > /mnt/mytmp/asd
# cat /mnt/mytmp/asd/hello
Hello World
\end{verbatim}

\subsection{
Mounte eine Freigabe deines Nachbarn unter /mnt/nachbar (auch anlegen).
Lasse dir dazu von deinem Nachbarn einen User inkl. Password anlegen.
}

Siehe vorige Aufgabe

\subsection{Funktioniert der Zugriff auf deinen Server von einem unter
Windows gebooteten PC-Labor Rechner aus?}

Keine Ahnung, sowas habe ich nicht

\chapter{``Seminararbeit'' inn (NNTP Server) mit Anbindung an ein Webforum}

\section{Motivation}
Da es lange her ist, seit ich den letzten innd installiert habe und ich
eine sinnvolle Anwendung daf\"ur habe (Umbau von vbnntpd), erscheint mir
Rich \$alz's InterNetNews daemon am sinnvollsten eingehender zu bearbeiten.
Debian GNU/Linux hat allerdings {\tt inn} Pakete, ich verk\"urze mir die
Installation dementsprechend mit dpkg-source.

Nach einigen Versuchen stellte sich heraus, dass {\tt inn} Version 2
notwendig war, da hier erweiterte Authentifizierungsm\"oglichkleiten \"uber
externe Programme m\"oglich waren, die f\"ur die Zukunft notwendig sein
werden, Konfiguration siehe unten.

Nat\"urlich w\"are es sportlicher, wieder einmal unter {\tt AIX 4.3} zu
kompilieren, aber ich weiss, dass ich nicht der einzige bin, der dort
Spa\ss{} mit dem Linker hat (dynlibs unter AIX sind \dots{} anders).

\section{Installation}

\begin{verbatim}
# apt-get source inn2
Building dependency tree... Done
Need to get 1911kB of source archives.
Get:1 http://ftp.at.debian.org unstable/main inn2 2.4.2-3 (dsc) [741B]
Get:2 http://ftp.at.debian.org unstable/main inn2 2.4.2-3 (tar) [1864kB]
Get:3 http://ftp.at.debian.org unstable/main inn2 2.4.2-3 (diff) [46.4kB]
Fetched 1911kB in 24s (76.5kB/s)
dpkg-source: extracting inn2 in inn2-2.4.2
dpkg-source: unpacking inn2_2.4.2.orig.tar.gz
dpkg-source: applying ./inn2_2.4.2-3.diff.gz
# cd inn2-2.4.2/
# dpkg-buildpackage
dpkg-buildpackage: source package is inn2
dpkg-buildpackage: source version is 2.4.2-3
dpkg-buildpackage: source changed by Marco d'Itri <md@linux.it>
dpkg-buildpackage: host architecture powerpc
dpkg-checkbuilddeps: Unmet build dependencies: libdb4.3-dev
dpkg-buildpackage: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: (Use -d flag to override.)
\end{verbatim}

um alle dependencies zu erf\"ullen, brauche ich also noch {\tt libdb4.3-dev}

\begin{verbatim}
# apt-get install libdb4.3-dev
...
# dpkg-buildpackage
dpkg-buildpackage: source package is inn2
...
(cd build-tree/inn-2.4.2; /usr/bin/make  )
make[1]: Entering directory `/usr/src/inn2-2.4.2'
(cd build-tree/inn-2.4.2; /usr/bin/make install \
DESTDIR=/usr/src/inn2-2.4.2/debian/inn2  )
make[2]: Entering directory `/usr/src/inn2-2.4.2/build-tree/inn-2.4.2'
...
cd include   && /usr/bin/make all
cd lib       && /usr/bin/make all
cd storage   && /usr/bin/make library
cd history   && /usr/bin/make all
cd innd      && /usr/bin/make all
cd nnrpd     && /usr/bin/make all
cd innfeed   && /usr/bin/make all
cd control   && /usr/bin/make all
cd expire    && /usr/bin/make all
cd frontends && /usr/bin/make all
cd backends  && /usr/bin/make all
cd authprogs && /usr/bin/make all
cd scripts   && /usr/bin/make all
cd storage   && /usr/bin/make programs
cd doc     && /usr/bin/make all
cd samples && /usr/bin/make all
cd site    && /usr/bin/make all
...
make[2]: Leaving directory `/usr/src/inn2-2.4.2/build-tree/inn-2.4.2'
make[1]: Leaving directory `/usr/src/inn2-2.4.2'
...
dh_installdeb -a
dh_shlibdeps -a --exclude=ckpasswd
dh_gencontrol -a
dpkg-gencontrol: warning: unknown substitution variable ${PERLAPI}
dpkg-gencontrol: warning: unknown substitution variable ${misc:Depends}
dpkg-gencontrol: warning: unknown substitution variable ${misc:Depends}
dh_gencontrol -a -- \
    -VPERLAPI=$(perl -MConfig -e 'print "perlapi-$Config{version}"')
dpkg-gencontrol: warning: unknown substitution variable ${misc:Depends}
dpkg-gencontrol: warning: unknown substitution variable ${misc:Depends}
dh_md5sums -a
dh_builddeb -a
dpkg-deb: building package `inn2' in `../inn2_2.4.2-3_powerpc.deb'.
dpkg-deb: building package `inn2-ssl' in `../inn2-ssl_2.4.2-3_powerpc.deb'.
dpkg-deb: building package `inn2-inews' in `../inn2-inews_2.4.2-3_powerpc.deb'.
dpkg-deb: building package `inn2-dev' in `../inn2-dev_2.4.2-3_powerpc.deb'.
 dpkg-genchanges
dpkg-genchanges: not including original source code in upload
dpkg-buildpackage: binary and diff upload (original source NOT
		included)
signfile ../inn2_2.4.2-3_powerpc.changes
sh: pgp: command not found
# dpkg -i ../inn2*.deb
(Reading database ... 180364 files and directories currently installed.)
Preparing to replace inn2-dev 2.4.2-3 (using
.../inn2-dev_2.4.2-3_powerpc.deb) ...
Unpacking replacement inn2-dev ...
Selecting previously deselected package inn2-inews.
Unpacking inn2-inews (from .../inn2-inews_2.4.2-3_powerpc.deb) ...
Selecting previously deselected package inn2-ssl.
Unpacking inn2-ssl (from .../inn2-ssl_2.4.2-3_powerpc.deb) ...
Selecting previously deselected package inn2.
Unpacking inn2 (from ../inn2_2.4.2-3_powerpc.deb) ...
Setting up inn2-dev (2.4.2-3) ...
Setting up inn2-inews (2.4.2-3) ...
Setting up inn2 (2.4.2-3) ...
Starting news server: done.

Setting up inn2-ssl (2.4.2-3) ...
\end{verbatim}


\section{Konfiguration}

{\tt /usr/share/doc/inn2/INSTALL.gz} ist das offizielle Dokument daf\"ur.

Die Konfigurationsdateien legt Debian GNU/Linux in {\tt /etc/news} ab.
Da der
{\tt pathhost} Wert in {\tt /etc/news/inn.conf} auf \glqq {\tt unknown}
steht, muss diser noch konfiguriert werden.
(eigener Name im {\tt path} header). {\tt inews} beschwert sich mangels
{\tt server: localhost} Eintrag
noch, dass es keine Artikel posten kann:

\begin{verbatim}
# sed -ie 's/^pathhost.*/pathhost: '`hostname`'/' /etc/news/inn.conf
# sed -ie 's/^#server:.*/server: localhost/' /etc/news/inn.conf
$ lynx -dump nntp://localhost/|grep nntp
   1. nntp://localhost/control
   2. nntp://localhost/control.cancel
   3. nntp://localhost/control.checkgroups
   4. nntp://localhost/control.newgroup
   5. nntp://localhost/control.rmgroup
   6. nntp://localhost/junk
   7. nntp://localhost/local.general
   8. nntp://localhost/local.test
$ echo dummy | inews -n local.test -f alexander@oelzant.priv.at -t "test ignore"
$ lynx -dump nntp://localhost/local.test | grep ignore
     * [2]"test ignore" - alexander@oelzant.priv.at
\end{verbatim}

Um auch Zugang von aussen zu erlauben, ist es dann notwendig, 
{\tt /etc/news/reader.conf} anzupassen. Es sollen alle lesen, aber
nur authentifizierte BenutzerInnen schreiben k\"onnen. In {\tt
/usr/share/doc/inn2/perl-hook.gz} wird ein Mechanismus beschrieben, 
der {\tt perl} \"ahnlich wie bei Apache {\tt mod\_{}perl} direkt
ausf\"uhrt, auch andere Executables k\"onnten aber \"uber {\tt auth:}
aufgerufen werden. In einer {\tt auth\{\}} Gruppe kann dann {\tt
perl\_{}auth: /path/to/script} als Authenticator verwendet werden.

\begin{verbatim}
# echo 'auth "readers" {
		hosts: "*"
		default: "<read-only>"
}
access "read-only" {
		users: "<read-only>"
		read: "*"
}
auth "users" {
		hosts: "*"
		perl_auth: "/usr/lib/news/auth.dir/asdf.pl"
		default: "<users>"
}
access "read-write" {
		users: "<users>"
		newsgroups: "*"
		access: RPA
}' >> /etc/news/readers.conf
\end{verbatim}

{\bf\tt /usr/lib/news/auth.dir/asdf.pl:}
\hrule
\begin{verbatim}
#!/usr/bin/perl
# aoe 2005

require '/usr/lib/news/innshellvars.pl';
use vars qw(%attributes %authcodes %users);
use strict;
use warnings;

# does not do anything useful for now, but nnrpd needs it
sub auth_init {
}

sub authenticate {
        my %response = (
                        "ok"   => [281,'authenticated'],
                        "fail" => [502,'authentication unsuccessful']
                       );
# this will be modified to use db access in the near future

        if ($attributes{"username"} eq "aoe" && 
				    $attributes{"password"} eq "pass") {
                return(@{$response{'ok'}});
        } else {
                return(@{$response{'fail'}});
        }
}
\end{verbatim}
\hrule

\subsection{SSL Konfiguration}

\begin{verbatim}
Gem\"ass {\tt /usr/share/doc/inn2-ssl/README.Debian} muss
{\tt /usr/lib/news/bin/nnrpd-ssl} (leider ist dort der falsche Pfad
angegeben) mit Option {\tt -S} von inetd oder sonstwie aufgerufen werden,
dazu braucht es ein x509-Zertifikat. Da f\"ur den Zielserver noch keines
existiert, wird eines erstellt. Zum Schluss wird noch das {\tt
nnrpd}-binary durch einen Symlink auf {\tt nnrpd-ssl} ersetzt, da es
offenbar keine andere M\"oglichkeit gibt, {\tt innd} einen {\tt
STARTTLS}-f\"ahigen reader daemon unterzujubeln.

\begin{verbatim}
# mkdir /etc/news/ca
# cd /etc/news/ca
# chmod 600 .
# openssl genrsa -out ca.key 1024
# echo -e "AT\n\nWien\nFSINF CA\n\ntigerente.htu.tuwien.ac.at\n"\
"rootca@tigerente\n\n" \
    | openssl req -new -key ca.key -out ca.csr 2>/dev/null 
# mkdir ca.db.certs
# cat /dev/null > ca.db.index
# cat /dev/null > ca.db.index.attr
# echo 01 > ca.db.serial
# echo > ca.config ' 
extension =
[ ca ]
default_ca              = CA_own
[ CA_own ]
dir                     = .
certs                   = $dir
new_certs_dir           = $dir/ca.db.certs
database                = $dir/ca.db.index
serial                  = $dir/ca.db.serial
RANDFILE                = $dir/ca.db.rand
certificate             = $dir/ca.crt
private_key             = $dir/ca.key
default_days            = 10000
default_crl_days        = 30
default_md              = md5
preserve                = no
policy                  = policy_anything
x509_extensions = usr_cert
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
[ usr_cert ]
'
# openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
Signature ok
subject=/C=AT/ST=Some-State/L=Wien/O=FSINF
CA/CN=tigerente.htu.tuwien.ac.at/emailAddress=rootca@tigerente
Getting Private key
# openssl genrsa -out /etc/news/nnrpd-key.pem 1024
# echo -e "AT\n\nWien\nTigerente\n\ntigerente.htu.tuwien.ac.at\n"\
"usenet@tigerente.htu.tuwien.ac.at\n\n" \
    | openssl req -new -key /etc/news/nnrpd-key.pem -out nnrpd-cert.csr \
    2>/dev/null
# yes | openssl ca -config ca.config -days 10000 -in nnrpd-cert.csr \
    -cert ca.crt -keyfile ca.key -out /etc/news/nnrpd-cert.pem
Using configuration from ca.config
DEBUG[load_index]: unique_subject = "yes"
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'AT'
stateOrProvinceName   :PRINTABLE:'Some-State'
localityName          :PRINTABLE:'Wien'
organizationName      :PRINTABLE:'Tigerente'
commonName            :PRINTABLE:'tigerente.htu.tuwien.ac.at'
emailAddress          :IA5STRING:'usenet@tigerente.htu.tuwien.ac.at'
Certificate is to be certified until Nov 23 13:16:19 2032 GMT (10000 days)
Sign the certificate? [y/n]:

1 out of 1 certificate requests certified, commit? [y/n]Write out database
with 1 new entries
Data Base Updated
# cp ca.crt /etc/news/nnrpd-ca-cert.pem
# chown news:news /etc/news/nnrpd-key.pem
# chmod 600 /etc/news/nnrpd-key.pem
# chown news:news /etc/news/nnrpd-cert.pem
# chmod 600 /etc/news/nnrpd-cert.pem
# echo nntps   stream  tcp nowait news.news /usr/lib/news/bin/nnrpd-ssl \
    nnrpd -S >> /etc/inetd.conf 
# killall -HUP inetd
$ openssl s_client -host localhost -port 563 \
    -CAfile /etc/news/nnrpd-ca-cert.pem 2>&1 | grep Verify
    Verify return code: 0 (ok)
# mv /usr/lib/news/bin/nnrpd /usr/lib/news/bin/nnrpd.old
# ln -s nnrpd-ssl /usr/lib/news/bin/nnrpd
\end{verbatim}

\section{Bef\"ullen des Newsspool aus der Datenbank}

Um die Datenbank erst einmal in den Spool zu bekommen, muss {\tt artcutoff}
in {\tt inn.conf} von 10 (Tagen) auf (z. B.) 10000 gesetzt werden (offenbar auch
noch in {\tt expire.ctl}, {\tt incoming.conf} und {\tt storage.conf}). {\tt
maxartsize} hat f\"ur die Attachments weiter unten Bedeutung.

Das vorhandene script produziert so etwas wie active und newsgroup files,
feinere Granularit\"at und {\tt actsync} kommen bei Bedarf.

Mit ein paar Modifikationen k\"onnen nun die Artikel in den spool
eingespielt werden; das script ist zwar noch immer buggy und inn meint alle
paar tausend postings, dass die history kaputt w\"are \dots
\footnote{\url{http://entropy.brneurosci.org/linuxsetup32.html}
Installing and Maintaining an INN News Server}


\begin{verbatim}
# ctlinnd go go go
ctlinnd: Wrong reason
# tail -2 /var/log/news/news.err
Jul  9 01:49:28 tigerente innd: SERVER throttle File exists writing SMstore
  file -- throttling
Jul  9 01:49:28 tigerente innd: SERVER cant store article: File exists

# /etc/init.d/inn2 stop
# su -c "/usr/lib/news/bin/makedbz -s 218670 -o" news
# /etc/init.d/inn2 start
\end{verbatim}

oder, etwas weniger interaktiv ({\tt vbnntp/vbnntpd.10} f\"ttert hier
per nntp artikel an localhost:119, die \"alter als timestamp \$lastold sind)
\dots

\begin{verbatim}
lastold=1; 
while [ $lastold -lt `date +%s` ]; do 
  /etc/init.d/inn2 stop; 
	su -c "/usr/lib/news/bin/makedbz -s 218670 -o" news; 
	/etc/init.d/inn2 start;
	newlog=`su -c "cd /home/aoe; /home/aoe/vbnntp/vbnntpd.10 -f "$lastold" \
	  aoe | tail`; 
	lastold=${newlog#*-};
	lastold=${lastold%%-*};
	echo  $lastold; 
	sleep 1;
done
\end{verbatim}

Da die Attachments noch Probleme machen, werden diese geloescht und neu
eingespielt.

\begin{verbatim}
news:~$ < ~aoe/attach.txt xargs -i /usr/lib/news/bin/ctlinnd cancel "{}"
# /etc/init.d/inn2 stop
news:~$ /usr/lib/news/bin/makehistory
# /etc/init.d/inn2 start
aoe:~$ vbnntp/vbnntpd.10 -f "attach>0 ORDER BY dateline"
\end{verbatim}


\section{Nachgedanken Posten, endg\"ultige Authentifizierungsmechanismen
usw}

Diese und einige andere Features m\"ussen erst einmal warten, aber mittels 
eines
conjob, der {\tt su -c 'cd /home/aoe; /home/aoe/vbnntp/vbnntpd.10 -f `date
+\%s -d \"{}10 min ago\"{}`'} oder \"ahnliches macht, kann nun regelm\"assig
der Foreninhalt konvertiert werden; auch ein daemon mit der gleichen
Funktionalit\"at w\"are denkbar.

{\tt
vbnntp}\footnote{\url{http://tigerente.htu.tuwien.ac.at/\~ aoe/vbnntp/}}
entstand vor drei Jahren aus Frust \"uber das Informatik-Forum, das leider
zu diesem Zeitpunkt gegen\"uber news ziemlich beliebt geworden war, ruhte
nach der \"ubereilten Umstellung auf eine 3.x Beta-Version der Forensoftware 
und ist hiermit zu neuem Leben erwacht.






\end{document}
% vim: textwidth=75
