\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 /www 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} Order deny,allow Deny from all Allow from localhost \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} Order deny,allow Deny from all Allow from Nachbar-PC \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 /www 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
Apache/1.3.33 Ben-SSL/1.55 Server at chello062178208184.1.15.univie.teleweb.at Port 80
\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
Apache/1.3.33 Ben-SSL/1.55 Server at chello062178208184.1.15.univie.teleweb.at Port 80
\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 404 Not Found

Not Found

The requested URL /asd was not found on this server.

Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.


Apache/1.3.33 Ben-SSL/1.55 Server at chello062178208184.1.15.univie.teleweb.at Port 80
# 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 here.

\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 " ServerName brasilia.aoe DocumentRoot /asd SSLDisable " >> /etc/apache-ssl/httpd.conf # curl -s brasilia.aoe|grep server The requested URL / was not found on this server.

\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,"> .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," 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=, orig_to=, 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= 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=, size=406, nrcpt=1 (queue active) Jul 6 15:39:35 tipitapa postfix/local[4136]: 06DD8179D8C: to=, orig_to=, relay=local, delay=1, status=sent (delivered to mailbox) Jul 6 15:39:35 tipitapa postfix/local[4136]: 06DD8179D8C: to=, orig_to=, 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 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 ----- (reason: 550 : Recipient address rejected: User unknown in local recipient table) ... \end{verbatim} Oder von postfix-seite: \begin{verbatim} From: Mail Delivery System 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 If you do so, please include this problem report. You can delete your own text from the attached returned message. The Postfix program : host comitan.oelzant.priv.at[62.178.208.184] said: 550 5.1.1 ... 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 ----- (reason: 554 : 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 (Deferred: 450 : Recipient address rejected: Bin Ring zerstoeren!) (Deferred: 450 : 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 : Recipient address rejected: Bin Ring zerstren!; from= to= proto=ESMTP helo= 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 : Recipient address rejected: Bin Ring zerstren!; from= to= proto=ESMTP helo= 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 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: "" } access "read-only" { users: "" read: "*" } auth "users" { hosts: "*" perl_auth: "/usr/lib/news/auth.dir/asdf.pl" default: "" } access "read-write" { 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