Einleitung
Was ist Linux?
Linux Kernel (kernel.org) + GNU Tools (gnu.org/software/coreutils/)
Freie Software, »OpenSource« und die GPL
GPL (Generic Public License)
Haftungsausschluss
Quelltext verfügbar
"Jeder darf alles"
GPL bleibt GPL
BSD, Apache, MIT, Mozilla
Linux-Distributionen
- Slackware
- Redhat(rpm)
- Fedora(Redhat mit Desktop)
- RHEL $$
- CentOS
- SUSE (rpm, yast)
- OpenSuse
- SLES $$ (Enterprise Server)
- Debian(deb)
- Ubuntu ->LTS 5 Jahre
- Rasberian
- Arch
- Knoppix
- Mint
- Kalilinux
- Fedora
Einrichtung einer Debian VM mit Virutalbox
Wir brauch folgendes:
- Virtutalbox von virtualbox.org
- Putty von chiark.greenend.org.uk
- Debian Image von debian.org hier kann das amd64-netinst ISO ververwendet
Es kann natürlich auch eine andere virutalisierungs Lösung genommen werden. Das Windows Subsystem for Linux (WSL) sollte für diese Schulung nicht verwendet werden da hier einige Teile fehlen (z.B. der Bootloder und große Teile von eigentlichen Linux Kernel)
Die installtion ist recht offentlichlich, hier trotztdem nochmal als Video
(HTML5 Video)
Die Bedienung des Linux-System
Die Ubuntu User Wiki (in deutsch) ist sehr zu emfpehlen, wenn die man page zu unverständlich ist, bessere Beispiele oder andere Hinweiße fehlen einfach dort mal nachsehen. Da Ubuntu eine Debian-basieren Distro ist treffen die meißten Puntek dort zu.
Anmelden und Abmelden
Linux-Systeme kommen standardmäßig mit sechs virtuellen Konsolen. Hier handelt es sich nicht um ein Fenster innerhalb der grafischen Benutzeroberfläche, sondern um eine komplette nicht-graphische Alternative auf reiner Textbasis. Diese virtuellen Konsolen erreicht man über Strg + Alt + F1 bis F6 (ggf. auch Strg + Alt + F3 bis F6) . Virtuelle Konsolen sind hilfreich, falls der Xserver einmal abstürzen oder etwas anderes dafür sorgen sollte, dass die grafische Oberfläche nicht mehr erreichbar ist. Dann kann man hier nach dem Fehler suchen.
Dabei ist F2 meißt die Grafische Oberfläche und F3-F6 Text-Konsolen (tty)
Verbindungen mit Putty
Nach der Anmeldung auf der Konsole kann man sich mit dem Befehl ip a
die IP der VM ausgeben lassen und sich via Putty verbinden zukönnen
Im falle von VirtualBox wird jedoch ein privates Netz (10.0.2.0) erstellt, welches von außen (bzw. eurem Rechner) nicht erreichbar ist. Ist hat den Vorteil das die VM immer noch Internet Zugriff hat, aber z.B. selbst wenn ein DHCP Server installiert wird, ihr euer Netzwerk nicht zerschießt.
Ihr könntet den Virtualbox Netzwerk Adapter auf Bridged stellen, dann würde die VM eine IP von eurdem Router bekommen und wäre für alle im Netzwerk erreichbar. Ich emfehle dies für den Anfang noch nicht, anstelle richten wir eine Portweiterleitung ein um trotzdem auf die VM zukommen:
Die IP bei Hostnamen eingeben, der Session einen Namen geben und ggf. unter Session -> Data -> Auto-login username noch der Usernamen angeben. Dann unter Session -> Save drücken und mit einem Doppelklick auf den Session Namen die Sitzung öffnen[
Der Systemadministrator
Der normale Nutzer hat keine Administratorrechte, diese hat aktuell nur der Benutzer Root. Um nun z.B. Software installieren zukönnen können wir mit dem Befehl su zum Root Benutzer werden.
Nun empfehle ich das Programm sudo zuinstallieren. Es ist besser immer als normale Nutzer zuarbeiten und nur den Befehl sudo zuverwenden wenn die erhöten Rechte auch benötigt werden - oft können damit auch Fehler vermieden werden .
- su - um das mit zum Root Nutzer zuwerden
- apt-get install sudo - zum das Programm sudo zuinstallieren
- visudo - um die Konfigraution des Sudo Programms zuöffnen
- unter der Zeile
root ALL=(ALL:ALL) ALL
fügt ihr nun euren Nuter ein, z.B.fish ALL=(ALL:ALL) ALL
- Speichern mit
STRG+X
und Enter - Verlassen der Root Sitzung mit
exit
- Nun können Programme z.B. mit
sudo apt-get install sudo
installieren werden
Nun sollte in Snapshot der VM erzeugt werden. Sollte etwas kaputt gespielt werden, kann einfach auf diesen weider zurück geweselt werden.
VM Snapshot
Die TABULATOR-Taste
In Linux lassen sich alle Pfade und Kommendos mit der TAB-Taste vervollständigen.
z.B. sudo shut{TAB} oder cd /e{TAB}/sp{TAB}.
Gibt man nur cd /etc/s{TAB} passiert nicht (ggf. hört man ein Ping von Putty), da es mehrere Möglichkeiten gibt, hier nochmal TAB drücken um eine Liste möglichen Pfaden zubekommen.
Die Hilfe - man
Fast jeden Programm hat einen Manuel Eintrag, welcher mit man PROGRAMM Aufgerufen werden kann. Hier kann mit / SUCHWORT
gesucht werden und mit n
zum nächsten N
zum vorherigen gesprungen werden. Mit ?
kann Rückwärtz gesucht werden
z
und w
sind "Bild-Auf" und "Bild-Ab"
Manual-Pages
1 * Kommandos
2 * systemaufrufe
5 * Konfigurationsdateien
* ....
An- und Ausschalten
exit
Beendet die Quelle Shelllogout
Beendet die Sitzung (Abmelden)- code>shutdown -r now startet das System sofort neu, alternativ
init 6
(dazu später mehr) oderreboot
shutdown -h 5
fährt das System in 5 Minuten runter
Sind das System zeitgesteuert runtergefahren bekommen alle Angemeldeten User eine Miteilung: The system is going down for reboot at Fri 2018-11-30 21:56:39 CET!
Broadcast message from [email protected] on pts/0 (Fri 2018-11-30 21:51:51 CET):
Der PATH
Wie unter Windows gibt es auch unter Linux eine Pfad Variable, wenn z.B. der Befehl shutdown eingeben wird geprüft ob der Befehl in der PATH Varible steht. Diese kann man sich mit echo $PATH
ausgeben lassen. Pfade sind mit einem Doppelpunkt getrennt - zu den Verzeichnissen später mehr.
[email protected]:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
[email protected]:~$ sudo su
[sudo] Passwort für fish:
[email protected]:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
[email protected]:~$ sudo echo $PATH
[sudo] Passwort für fish:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
[email protected]:~$
#todo
----------------------------------------- vi (vim) Einfügemodus | ^ |vi --> Kommandomodus :w -> write :q -> quit :wq :q!
u --> undo
/
"copy" --> 5yy
"cut" --> 5dd
"paste" --> p,P
"visuelles markieren" --> v --> "Zeichenweise"
V --> Zeilenweise
Suchen und ersetzen:
:%s/ALT/NEU/g
:%s;ALT;NEU;g
Übung:
Hängen Sie an die /etc/profile folgende Zeile an:
umask 077
Verzeichnisse
pwd, mkdir, rmdir
touch,
rm -r
rm -i
cp [
mv
Erzeugen Sie ein Backup von /etc unterhalb von /tmp
ls
Links
- kopieren Sie die /etc/passwd in Ihr Home-Verzeichnis
- Erzeugen Sie je einen Hard- und einen Softlink auf diese Kopie
- Unterschiede?
find [Pfad] [Option]...
-name "
-size +/-
-mtime +/-ZAHL --> Bezug: ZAHL*24h
-atime
-ctime
-mmin / -amin / -cmin
Übung
Finden Sie Hardlinks im Dateisystem, die auf dateien zeigen.
--> Linkzähler > 1
-links +1
-type f
Suchen in Dateien / in Datenströmen
grep ...
~~~~~~~~~~ --> regulärer Ausdruck
.... | grep
--color
-c ... count
-i ... ignore case
-n ... Zeilennummern
-v ... Suche negieren
standard regular expressions
(man 7 regex) vs. (man 7 glob)
^ ... Zeilenanfang $ ... Zeilenende
. ... ein beliebiges Zeichen
[abc] ... genau ein Zeichen aus Liste
[^abc] ... genau ein Zeichen nicht aus Liste
.* ... beliebig viele beliebige Zeichen
extended regular expressions
n+ ... n mindestens einmal
n{a} ... a mal der Ausdruck n
n{a,b} ... Ausdruck n mind. a-mal, maximal b-mal
(abs|bcd) .... Alternative
Ein-/Ausgabe-Umleitung
cmd > datei cmd < datei
cmd >> datei
cmd 2> datei 2>&1
cmd 2>> datei
cmd | cmd --> stdout weiter zu stdin
Filterkommandos
cat, tac, head, tail
less ( /
"string" -> komplette Zeichenkette maskieren
"soft-quoting" -> $ wird interpretiert
'string' -> komplette Zeichenkette maskieren
"hard-quoting"
interaktive Shell Login-Shell Skript
/etc/bash.bashrc /etc/profile nix
~/.bashrc ~/.profile
:%s/^# (.._)/\1/
--> locale-gen
$VAR --> ${VAR}
$(cmd) --> cmd
$((rechnen)) --> $[ rechnen ]
cmd ; cmd
cmd | cmd
cmd & cmd
cmd && cmd
cmd || cmd
Das Dateisystem
- reguläre Datei
d Verzeichnis
l Symbolischer Link
b Block-Gerätedatei
c Zeichen-Gerätedatei
p FiFo (named pipe)
s Socket
/bin -> Kommandos für user
/sbin -> Kommandos für sysadmin
/lib -> Libraries
/usr/{lib,bin,sbin} -> nahezu gesamte Software
/usr/local/{bin,sbin,lib} -> händisch installierte SW
/opt
/etc -> Konfiguration
Benutzerverwaltung
Benutzer Gruppen
UID -> 0 -> root GID -> 0 -> root
UID < 1000? Systemaccount GID < 500
primäre Gruppe keine Gruppen in
Gruppen
public-group-system: jeder kommt per
default in die selbe gruppe ("users")
private-group-system: jeder hate seine eigene
Gruppe
Benutzer Gruppen
/etc/passwd:
name:x:UID:GID primär:GECOS:Homedir:Shell
/etc/shadow:
name:PW-Hash:
/etc/group:
name:x:GID:
Benutzer Gruppen
useradd groupadd
usermod groupmod
userdel groupdel
passwd
Richten Sie einen Benutzer ein, der bei der ersten Anmeldung sein Passwort ändern muss. Test!
sudo
/etc/sudoers < -> visudo
Wer Wo = Was
max ALL = /usr/sbin/useradd
robert ALL = /usr/bin/less /var/log/user.log
%admin ALL = NOPASSWD: ALL
www-data ALL = NOPASSWD: /usr/sbin/reboot
Übung:
Geben Sie einem Benutzer das Recht, per "sudo" neue Benutzer einzurichten. Test!
Dateiberechtigungen
Eigentümer(u) Gruppe(g) Andere(o)
r w x r w x r w x
4 2 1 4 2 1 4 2 1
chmod UGO
chmod
chmod g+w
chmod o-rwx
chmod g+w,o-rwx
chmod u=rw,g=r,o=
chgrp
chown
r... lesen
w... write
x... execute
Standard-Rechte:
umask: Welche Rechte sollen nicht gesetzt sein?
022
Dateien: 666 (-) umask -> 644
Verzeichnis: 777 (-) umask -> 755
Zusatzrechte:
SUID-Flag 4 -> Prozeß läuft immer als
chmod u+s ... Eigentümer der ausführbaren
Datei
SGID-Flag 2 -> Dateien "erben" die Gruppe des
chmod g+s Verzeichnisses mit SGID-Flag
Sticky-Bit 1 -> Dateien können nur von deren
chmod o+t Eigentümer gelöscht werden.
chmod NXYZ
Übung:
Erzeugen Sie eine Projektgruppe.
Nehmen Sie zwei Benutzer in diese Gruppe auf
Erzeugen Sie ein Projekt-Verzeichnis mit passenden Rechten.
- useradd / usermod
- groupadd / groupmod
- mkdir / chgrp / chmod
Suchen Sie alle Kommandos, die das SUID-Flag gesetzt haben!
find .... (man find)
ls + grep
Posix-ACL
gleich? rxw
neu? Rechte können an beliebig viele Benutzer/gruppen gehängt werden.
ACL-Eintrag:
user:
group:
getfacl / setfacl
Prozeßverwaltung
PID
ps x, ps ax, ps aux (ps -ef)
kill -Signal
kill -2 1234
kill -SIGINT 1234
kill -INT 1234
Nice-Level
-20 ...... 0 ...... +19
< -- root -|
nice -n
renice
Neue Platte nutzen
- Partitionieren
- Dateisystem anlegen
- Dateisystem mounten
- /etc/fstab
mount [-t
mkfs -t
--> mkfs.
Linux-Dateisysteme:
- ext2 +stabil -starr -kein Journal
- ext3 ext2+Journal
- ext4
(- reiserfs +Journal, +flexibel, B-Tree, -"veraltet")
- xfs +Journal, +flexibel, +für sehr große Dateien/Dateisysteme
- btrfs +COW, +flexibel, +VolumeManagement, +RAID, Snapshots
Booten (grub1,grub2,lilo,pxelinux,isolinux,...)
Bios
|
MBR (512 Bytes) stage1 "grub-install"
|
Grub stage2
|------------ initrd/initramfs ----- Treiber laden
Kernel ----------------< <<<<-------------|
|
mount /
|
init (1. Prozess)
Dienste Verwalten
System-V Init <===> systemd
Runlevel: Targets:
0 ... Halt
1 ... SingleUserMode basic.target
2 ... MultiUser
3 ... MultiUser+Netz multi-user.target
4 ... 3 + Grafik (RedHat) graphical.target
5 ... 3 + Grafik (SuSE)
6 ... Reboot systemctl isolate
service
chkconfig --del/--add rsyslog
insserv [-] rsyslog
update-rc.d
systemctl list-units --type=service
systemctl start|stop|restart|status|..
systemctl enable|disable
systemctl mask|unmask
Zeitgesteuerte Vorgänge at / cron
Dienst: atd
#> at 14:00
cp -pr /etc /tmp ..
+D
atq / at -c
cron
System-Cronjobs:
/etc/crontab:
/etc/cron.d/*
/etc/cron.{hourly|daily|monthly|weekly}/
Benutzer-Cronjobs:
crontab -e
crontab -u www-data
Übung Senden Sie sich alle 2 Minuten die aktuelle Plattenauslastung per Email an user@localhost
df mail Logging (syslogd,rsyslogd,syslog-ng) su --- syslog ---> syslog-dienst -> /var/log/syslog cron (/dev/log) /var/log/mail sshd | /pfad/cmd ... @192.168.2.3 logger | wall
Nachricht: Text + TAG
Kategorie (facility)
Priorität (level)
logger -p kat.prio
/etc/logrotate.conf /etc/logrotate.d/* --- /var/log/syslog { daily rotate 7 compress delaycompress dateext }
journalctl
journalctl |grep ...
journalctl -n 10 -f
journalctl -u cron -u exim4
journalctl --since
Netzwerkkonfiguration
dmseg ls /proc ls /sys lspci (-v) (apt-get install pcuutils) udevd (Hot-Plug Deamon)
```
02:01.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01)
Subsystem: VMware PRO/1000 MT Single Port Adapter
Physical Slot: 33
Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 19
Memory at fd5c0000 (64-bit, non-prefetchable) [size=128K]
Memory at fdff0000 (64-bit, non-prefetchable) [size=64K]
I/O ports at 2000 [size=64]
[virtual] Expansion ROM at fd500000 [disabled] [size=64K]
Capabilities:
``` Netzwerk Treiber wird aus Kernel geladen (e1000)
ip a
ifconfig (apt-get install ifconf)
```
bernhard@debian9:~$ ip link show
1: lo:
Treiber laden mit `modprobe e1000`
Ethernet Interaces, z.B.
* lo - eth0/eht1 + ens33
Namen bleiben gleich und sind an die pyhische Stelle in der Hardware gebunden (z.b. PCI POrt 1)
ip list show = ip list = ip l
### ipadresse manuell vergeben
https://www.heise.de/netze/tools/netzwerkrechner/
killall dhclient (ggf. netzwerk manger bei GUI) .... rmmod e1000 && modprobe e1000 treiber laden und entladen
ip addr add 192.168.1.1 dev ens33 - vergibt keine netzwerkmase (ifconfig macht das)
ip addr del 192.168.1.1/24 dev ens33
ip addr add 192.168.1.1/24 dev ens33
es können auch mehr adressen vergeben werden.z.b. (geht bei ifconfig nicht, bei ip schon) ip addr add 192.168.1.2/24 dev ens33 ip addr add 192.168.1.3/24 dev ens33
ip route show -> ip r
``` bernhard@debian9:~$ ip route show default via 192.168.253.2 dev ens33 proto static metric 100 192.168.253.0/24 dev ens33 proto kernel scope link src 192.168.253.148 metric 100 ```
ip route add 192.168.5.0/24 dev ens33 (nettwork is down)
ip link set uo dev ens33 ip route add 192.168.5.0/24 dev ens33
ip r...
Netz via Gateway erreichen
`ip route add 192.168.100.0/24 via 192.168.92.254`
ip route add default via 192.168.92.2 = ip route add 0.0.0.0/0
### DNS
``` bernhard@debian9:~$ cat /etc/resolv.conf # Generated by NetworkManager search localdomain nameserver 192.168.253.2 ```
in resolv kann auch search(domain) eingetragen werden
/etc/hosts...
Host Name mit hostame anzeigen und auch setzne
``` bernhard@debian9:~$ hostname debian9 bernhard@debian9:~$ hostname debian-ew hostname: you must be root to change the host name bernhard@debian9:~$ sudo hostname debian-ew [sudo] password for bernhard: bernhard@debian9:~$ #neu bash ums zuüberhemn bernhard@debian9:~$ bash bernhard@debian-ew:~$ sudo /s^C bernhard@debian-ew:~$ sed s/debian9/debian-ew/g /etc/hosts 127.0.0.1 localhost 127.0.1.1 debian-ew
# The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters ```
dhcliet ens1000
...
debian unter 7etc/network/interaces
ifup eht0 (ens33), ifdown...
systemctl start network manger übernimmt konfig für nicht-root nutzer (ggf. nur bei GUI), schreib nicht in interaces sodern eigene Datei
...
ping -c 1 nur ein ping
pign -s 2000 ip - paketmit 2000byte
mtu ist nur 1500
siehe ip link
geht mit ping -s 1472 ip
```
bernhard@debian-ew:~$ ip link
1: lo:
--- localhost ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 0.349/0.349/0.349/0.000 ms bernhard@debian-ew:~$ ping -c 1472 1.1.1.1 -c 1 PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 64 bytes from 1.1.1.1: icmp_seq=1 ttl=128 time=16.3 m ```
tracertoute is eigentlich nur ein ping...
sudo traceroute -p 80 -T web.de
...
telnet --> nc
nmap port scan
arp -n ping geht nicht, aber arp zeigt ggf. eine mac adresse
nmspa mit sS schickt nur erstes tcp-paket damit man nich tim log auftuacht, z.b. webserver log
nc kann man port aufmachen und hören was ankommt und z.b. mit echo hallo | nc ... an ads ding senden
### tcpdump
< hier bsp mit nc ? >
### nslookup, dig, host
host -t MX google.de [NAMESERVER]
host -t MX google.de 8.8.8.8 host -t A google.de
dig (sudo apt-get install dnsutils)
``` bernhard@debian9:~$ dig ewerk.com
; < <>> DiG 9.10.3-P4-Debian < <>> ewerk.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER< <- opcode: QUERY, status: NOERROR, id: 25597
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; MBZ: 0005 , udp: 4096
;; QUESTION SECTION:
;ewerk.com. IN A
;; ANSWER SECTION:
ewerk.com. 5 IN A 212.122.40.136
;; AUTHORITY SECTION:
ewerk.com. 5 IN NS ns2.ewerkrz.net.
ewerk.com. 5 IN NS ns1.ewerkrz.net.
;; ADDITIONAL SECTION:
ns1.ewerkrz.net. 5 IN A 212.123.35.78
ns2.ewerkrz.net. 5 IN A 212.123.32.78
;; Query time: 2 msec
;; SERVER: 192.168.253.2#53(192.168.253.2)
;; WHEN: Fri Nov 30 07:20:05 EST 2018
;; MSG SIZE rcvd: 133
```
# Chapter X - Secure Shell (SSH)
SSH TEXT
## Symetische
## Asymenstische Verschöüssung
Verbindng auf ssh server ... show ssh host key
``` bernhard@debian9:~$ ssh localhost The authenticity of host 'localhost (::1)' can't be established. ECDSA key fingerprint is SHA256:72mgQrigBUC3k6JmQNt2n7i7vjA9jtXFm9qImoJ6K+U. Are you sure you want to continue connecting (yes/no)? ```
ls -alh /etc/sshd/*key*
show key... überpprüfen ssh-key ssh-keygen -l -f /etc/ssh
Server pub key wird nichth ~/.ssh.know_hosts...
DH, peffect prviatcy...
ssh user@server
ssh ip "cat /dev/sda" > sda.img
lieber dd und zip
scp copy files
Aufgabe etc nach server kpier
``` bernhard@debian9:~$ tar -cvzf etc.tar.gz /etc/^C bernhard@debian9:~$ scp etc.tar.gz user7@35.241.186.99: etc.tar.gz 100% 1166KB 5.9MB/s 00:00 bernhard@debian9:~$ ```
... copy file ... copy dir ... packen mit tar
mit tar auf stdout auf scp tar -c /etc/ | ssh .... "cat > etc.tar" .. vorteil dabei das kein speicherung lokal angezeigt und speicherplatz verbraucht wird
## rsync
Quelle -> Ziel
rysnc -av (archive modus) /etc7 user@server:dir
Änderung nur Blockweise, meta...
## ssh-keygen
rechte auf aut_keys beachten, jemand anders könnte sonst mit acount meldune... chmod ... oder copy id verwenden ssh-kyge mit pw, sonst wenn private key weg ist ...
## ssh-copy-id
...
## ssh-agent ssh-agent bash...
aurothery_key notitz ...paramter
## port-weiterleitung mit ssh
ssh nutzer@server -L 2525:127.0.0.1:25 zum server mit -R zumServer hin
## X-Forwarding
echo $DISPLAY
X-CLients brauch ein X-Server um die Ausgabe ausgeben zukönnen (CLients z.b. firefox xeys...)