Linux Administration im Seminar SVC und WIS V08092022

[[TOC]]

0. Bedienungshilfen

- history # Anzeige der Kommandohistorie, beim User student und root: "h"
- Mit der Pfeil-nach-oben-Taste (↑) können Sie durch die vorherigen Befehle blättern.
- Mit der Pfeil-nach-unten-Taste (↓) gehen Sie in der Liste wieder nach vorne.
- !!  # Letztes Kommando wiederholen
- !42 # Wiederhole Kommando 42 in der Historie
- Suchen in der History (Ctrl + R)
- Drücke erneut Ctrl + R, um zum nächstälteren passenden Befehl zu springen. 

- Doppelklick -> Wort markieren
- Mausrad drücken -> Wort wird an aktueller Cursorstelle eingefügt

1. Erste Schritte

pwd
who
who am i          # IP-Adresse des Client
date
hostname
echo $PATH        # Kommandosuchpfade
which ip
env               # Umgebungsvariablen anzeigen        
clear             # Bildschirm löschen
sudo -i           # Root bash starten
history           # Anzeige der letzten Kommandos
uname -a          # Kernelversion
lsb_release -a    # Linuxversion (sudo apt-get install lsb-core)
nano Dateiname    # 

Cheatsheet zum Nano-Editor

1.1 sshd Konfiguration

sshd -T # Anzeige der aktuellen Einstellungen im sshd
nano /etc/ssh/sshd_config :
PasswordAuthentication yes
PermitRootLogin yes
PubkeyAuthentication yes

systemctl status sshd
systemctl restart sshd
ssh-keygen -t ed25519 -c "comment"
ssh-copy-id ~/.ssh/id_ed25519.pub [email protected]
ssh [email protected] "apt install -y nginx"

ssh-keygen -y -f priv_key.pem   > pub_key # Public key aus dem private Key erzeugen

1.2 /etc/ssh/ssh_config:

.
.
ServerAliveInterval 60

2. Dateisystem

cd                      # Verzeichniss wechseln
cp, mv,rm               # Kopieren, verschieben/umbenennen, löschen 
du -sh * Verzeichnis    # Speicherplatzbelegung der Verz.
tree                    # Anzeige des Dateisystems als Baumstruktur
tree  -L Level          # 
mc                      # Midnight Commander <ctrl><o> ausblenden/aktivieren
vi, nano                # Editoren

rsync --archive --delete Quelleverz. Zielverzeichnis  

chown Datei User        # Den Besitzer einer Datei ändern
chmod Modus Datei       # Die Zugriffsrechte auf eine Datei ändern
iotop                   # Anzahl der Schreib/Lesevorgänge auf den Datenspeicher
lsblk                   # Anzeige aller Blockdevices
file -s /dev/sda        # Dateisystem auf Blockdevice anzeigen
# Self-Monitoring, Analysis and Reporting Technology S.M.A.R.T.
smartctl --all /dev/sda # Control and Monitor Utility for SMART Disks
                        # pin_Up_Time (verweist auf Motor-/Lagerschaden)
                        # Seek_Error_Rate und Calibration_Retry_Count (Probleme mit der Kopfmechanik)
                        # (Raw_)Read_Error_Rate und Reallocated_Sector_Ct (Kopf-/Oberflächenprobleme). I

2.1 Dateisystem, Backup

rsync Quelle Ziel (https://www.computerhope.com/unix/rsync.htm)

Optionen:

2.2 Das /proc Dateisystem

3. Datenspeicher

df -h
fdisk /dev/sdx             # Speicherdisk partitionieren
mkfs -t ext4 /dev/sdxy     # Ext4 Dateisystem auf SSD/HDD x Partition y erzeugen
mount -t nfs 172.x.y.z:/verzeichnis /mnt
sar -d Intervall Anzahl
dd if=xyz.iso of=/dev/sd... bs=1M conv=fsync # iso-Image auf sd.. sichern

4. Hauptspeicher und Swapbereich

free -m
sar -r Intervall Anzahl

4.1 Swapspeicher erweitern

sudo fallocate -l 1G /swapfile

alternativ:

sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo nano /etc/fstab

die nachfolgende Zeile einfügen:

/swapfile swap swap defaults 0 0

Die Swap - Funktion überprüfen:

sudo swapon --show
sudo free -h

5. Logdateien und sonstige Informationen

Anzeigen mit cat. more, tail -f:

Verarbeitung mit grep,cut,tail,uniq,sort,nl,…:
<p>

grep "Failed password" /var/log/auth.log    # journalctl -u ssh | grep ...
grep "Failed password" /var/log/auth.log | cut -f1-2 -d":" | uniq -c 
grep "Failed password" /var/log/auth.log | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c | sort -n
grep -o "user [a-z]* " /var/log/auth.log | cut -f2 -d" " | sort | uniq -c | sort -n
#fail2ban

bei Debian 12 gibt es keine /var/log/auth.log mehr:

journalctl -u ssh | grep "Failed password" 
journalctl -u ssh | grep "Failed password" | cut -f1-2 -d":" | uniq -c
journalctl -u ssh | grep "Failed password" | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c | sort -n
journalctl -u ssh | grep "Failed password" | cut -f2 -d" " | sort | uniq -c | sort -n

<p>
https://www.linuxcapable.com/how-to-install-fail2ban-on-debian-linux/

https://www.ezeelogin.com/kb/article/install-and-setup-cowrie-honeypot-on-ubuntu-545.html

https://www.ionos.de/digitalguide/server/sicherheit/honeypot-it-sicherheit-durch-ablenkprogramme/

2024-11-06T11:42:28.419780Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.169.207.233:47284 (172.31.33.5:2222) [session: b3f5d5e79b4b]
2024-11-06T11:42:38.301736Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T11:42:38.301908Z [HoneyPotSSHTransport,3,172.169.207.233] Connection lost after 9 seconds
2024-11-06T12:34:51.539217Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 125.25.33.107:51154 (172.31.33.5:2222) [session: ceb7b3a483cb]
2024-11-06T12:34:51.539904Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T12:34:51.540011Z [HoneyPotSSHTransport,4,125.25.33.107] Connection lost after 0 seconds
2024-11-06T11:42:28.419780Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 172.169.207.233:47284 (172.31.33.5:2222) [session: b3f5d5e79b4b]
2024-11-06T11:42:38.301736Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T11:42:38.301908Z [HoneyPotSSHTransport,3,172.169.207.233] Connection lost after 9 seconds
2024-11-06T12:34:51.539217Z [cowrie.ssh.factory.CowrieSSHFactory] New connection: 125.25.33.107:51154 (172.31.33.5:2222) [session: ceb7b3a483cb]
2024-11-06T12:34:51.539904Z [cowrie.ssh.transport.HoneyPotSSHTransport#info] connection lost
2024-11-06T12:34:51.540011Z [HoneyPotSSHTransport,4,125.25.33.107] Connection lost after 0 seconds
dmesg -HTwx   # Kernel Ringbuffer
uptime   # Anzahl der User und Waitqueue length
         # 1/5/15 Min.

journalctl -r | more
journalctl --since '2021-09-28' # Anzeige aller Journaleinträge seit dem 28.9.2021
journalctl --until '2021-09-28' # Anzeige aller Journaleinträge seit dem 28.9.2021
journalctl --vacuum-time=10d   # /var/log/journal verkleinern
journalctl --vacuum-size=100M

6. Netzwerk

6.1 Netzwerkkonfiguration

Ubuntu Server 22.04

 cat 00-installer-config.yaml
 # This is the network config written by 'subiquity'
 network:
  ethernets:
    ens160:
      addresses:
      - 172.20.46.82/24
      gateway4: 172.20.46.254
      nameservers:
        addresses:
        - 172.16.1.10
        search: []
  version: 2

 sudo netplan apply

Hostname ändern
Unter Ubuntu 18.04 reicht es nicht mehr aus, den Hostname über die /etc/hostname oder hostnamectl zu setzen. Nach einem Reboot des Servers wäre der Hostname wieder verloren, da dieser nicht gespeichert wurde. Folgender Weg ermöglicht das dauerhafte Setzen des Hostnames:

nano /etc/cloud/cloud.cfg

This will cause the set+update hostname module to not operate (if true)
preserve_hostname: false
Hier muss der Wert preserve_hostname von false auf true gesetzt werden.

This will cause the set+update hostname module to not operate (if true)
preserve_hostname: true
Danach kann über folgende Befehle der Hostname dauerhaft gesetzt werden:

sudo nano /etc/hostname 
sudo hostnamectl set-hostname web-01

https://netplan.io/examples

Standard

cat /etc/network/interfaces

.
.
.
auto ens192
iface ens192 inet static
  address 172.20.46.204
  netmask 255.255.255.0
  gateway 172.20.46.254
  dns-nameservers 172.16.1.10
.
.
.

systemctl restart networking

6.2 Netzwerktools

ip a                   # Alle Netzwerkschnittstellen anzeigen
ip address add 192.168.121.45/24 dev eth0                        
                       
nmap -sS -p 0-1000     # TCP SYN Port Scan 
nmap -sT -p 0-1000     # TCP Connect Scan 
nmap -sU               # UDP Port Scan 

nmap -sV               # Versionserkennungm des Dienstes
nmap -O                # Betriebssystem Erkennung

netstat -tulpn         # Listener mit Portnummer anzeigen
ss -lp4                # Listener mit Portnummer anzeigen
ss -tulpn | grep 9100  # Prozesse an Port 9100 anzeigen
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'

lsof -i :22            # Welche Prozesse nutzen Port 22? 
lsof -niTCP            # -n: Verhindert die DNS-Auflösung von IP-Adressen.
                       # Hostnamen werden also nicht aufgelöst, sondern direkt als 
                       # IP angezeigt (schneller und übersichtlicher). 
                       # -iTCP: Beschränkt die Ausgabe auf Netzwerk-Sockets, die das TCP-Protokoll verwenden.


# Hostname.Domain.TLD.<-Root  / FQDN->www.cisco.com(.)
nslookup www.heise.de
dig name.tp10cloud.de A          # Resource Record A ->IPv4
dig tp10cloud.com TXT            # Resource Record AAAA ->IPv6   
dig tp10cloud.de NS

# "https://www.whatsmydns.net/"  oder "https://www.experte.de/dns-check"
 
whois 221.181.185.148       # Regional Internet Registry Abfrage
traceroute www.heise.de 
nslookup 
dnstop -l 5 eth0            # Anzahl den DNS Abfragen anzeigen

nc IP-Adresse 22             # Banner grabbing ;)
nc  -lvnp  2222              # Portlistening
ncat  IP-Adresse Portnummer     
ncat -l -p 1337

sar -n DEV Intervall Anzahl 
iptraf-ng  
iptables -A INPUT -s 218.92.0.247  -j DROP # Alle IP-Pakete der Adresse 218... löschen
iptables -nvL INPUT
iptables -I INPUT -p icmp -s a.b.c.d -j DROP
iptables -I INPUT -p icmp -s a.b.c.d -j ACCEPT # ????



firewall-cmd --state           # ContOS, Fedora und RHEL
uwf status                     # Ubuntu 

curl ifconfig.me  # Anzeige der öffentlichen IP-Adresse
curl url -X POST -H 'content-type: application-json' -d '{ "id" : "4711" }'
# DB AG Timetable v1 API:
curl -X GET --header "Accept: application/xml" --header "Authorization: Bearer 8bbc15fe5ad950d50aea3de633a3b89d" "https://api.deutschebahn.com/timetables/v1/plan/8000105/220610/9"
curl --verbose

wget url -o logfile -O index.html     # GET auf url
curl url -s -o ausgabe    # -s silent, -o Dateiname

python3 -m http.server 2305


# TCP - Pakete anzeigen
tcpdump src ! 5.146.250.241 and dst ! 5.146.250.241 
tcpdump -i any -n port 80

6.4 Netzwerkperformance

ethstatus -i eno1 # Console-based ethernet statistics monitor
iftop             # Anzeige einzelner Verbindungen und Bandbreitenmessung
nethogs           # Net top tool grouping bandwidth per process
iptraf-ng         # Interactive Colorful IP LAN Monitor

ncat -ulp 1234 >/dev/null #
pv < /dev/random | ncat -u IP-Adresse 1234 

Host1: nc -l 1234 > /dev/null
Host2: pv /dev/random | nc -N Host2 1234

# ncat als Chat
Host1: ncat --chat -l -p 8888
Hostx: ncat Host1 -p 8888

6.5 Informationsquellen zu DNS, Webseiten,…

6.6 VNC Server unter Amazon AWS

sudo apt update
sudo apt install ubuntu-desktop
sudo apt install tightvncserver
sudo apt install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal dbus-x11
vi /home/ubuntu/.vnc/xstartup
#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey

vncconfig -iconic &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

vncserver :1

6.6.1 remmina - VNC-Client

Server: name.sepe21.de:1

Benutzer: ubuntu

Passwort: SEPE2023!

7. Prozesse / CPU

ps -auxf
ps -auxf | grep -c defunct #Zombiejagt 
top
htop
glances # apt install glances
sar -u Intervall Anzahl # apt install sysstat
iostat
vmstat
watch sensors   #

7.1 CPU-Benchmark Geekbench ( min. “GB RAM”)

mkdir geekbench-tmp
cd geekbench-tmp
wget https://cdn.geekbench.com/Geekbench-5.4.5-Linux.tar.gz
tar -zxvf Geekbench-5.4.5-Linux.tar.gz
cd Geekbench-5.4.5-Linux/
./geekbench_x86_64

8. Software

apt update              # Informationen von Paketquellen herunterladen
apt upgrade -y          # Updates aus Paketquellen installieren
apt install -y Paketname
apt remove Paketname
apt list                # Anzeige aller installierten Pakete
uname -r                # Kernel Release (z.b 5.8.0-43-generic)
apt autoremove -y

9. Systemdienste

systemctl status
systemctl start nginx
systemctl stop nginx
systemctl enable nginx
systemctl disable nginx

systemd-analyze plot > systemstart.svg # Systemstart SVG-Graphik

9.1 Zeitsynchronisierung

9.1.1 ntpd

sudo systemctl status ntp
ntpq -p

9.1.2 alternativ systemd.timesyncd

sudo apt purge ntp
sudo apt install systemd-timesyncd
sudo systemctl start systemd-timesyncd
sudo systemctl status systemd-timesyncd
timedatectl

Einstellungen für 172.20.48.x:

vi /etc/systemd/timesyncd.conf

# timesyncd.conf
.
.
.
[Time]
NTP=172.16.1.3
.
.

systemctl restart systemd-timesyncd

10. Sicherheit

10.0 ssh

ssh-keygen  # Schlüsselpaar unter .ssh erzeugen (id_ed25519, id_ed25519.pub)
ssh-copy-id [email protected]      

10.1 Hashfunktionen

echo "Text123" | sha256sum

10.2 Base64

echo -n "Hallo Welt" | base64

10.3 Symetrische Verschlüsselung mit openssl

# Advanced Encryption Standard (AES) 
# Verschlüsseln

echo "Geheim" | openssl enc -aes-256-cbc  > openssl.dat

# Entschlüsseln

openssl enc -aes-256-cbc -d -in openssl.dat

10.4 Asymetrische Verschlüsselung

# RSA (Rivest, Shamir und Adleman) 
# Der private Schlüssel wird erzeugt 
 
openssl genrsa -out private_key.pem 1024  # pem = Privacy-Enhanced Mail

# Aus dem privaten Schlüssel wird ein öffentlicher Schlüssel erzeugt
openssl rsa -in private_key.pem -out public_key.pem -outform PEM -pubout


# Die Nachricht "encrypt.txt" wird mit dem öffentlichen Schlüssel verschlüsselt (encrypt)
#
echo "Eine geheime Nachricht" > geheim.txt
openssl pkeyutl -encrypt -inkey public_key.pem -pubin -in geheim.txt -out encrypt.dat

# Die Nachricht wird entschlüsselt (decrypt)
 
openssl pkeyutl -decrypt -inkey private_key.pem -in encrypt.dat -out decrypt.txt

10.5 Signaturen

# Signieren
openssl dgst -sha256 -sign private_key.pem -out signatur.bin geheim.txt

# Signatur überprüfen
openssl dgst -sha256 -verify public_key.pem -signature signatur.bin geheim.txt

10.6 Selbstzertifiziertes https Zertifikat mit openssl und apache2

cd /etc/apache2 ; mkdir ssl ; cd ssl
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

cd /etc/apache2 ; a2enmod ssl
systemctl restart apache2

cd sites-available ;cp default-ssl.conf 001-ssl.conf
nano 001-ssl.conf

---------------------------------------------
#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

#   SSLCertificateFile directive is needed.
SSLCertificateFile      /etc/apache2/ssl/cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/key.pem
---------------------------------------------

a2nsight 001-ssl.conf ; systemctl restart apache2

# Umleitungs auf https/443 einrichten
vi 000-default.conf

-----------------------------------
.
Redirect permanent / https://3.66.188.236/
.
-----------------------------------

10.7 https Zertifikate mit openssl und nginx

cd /etc/ssl/certs
vi cert.conf

ssl_certificate /etc/ssl/certs/cert.pem;
ssl_certificate_key /etc/ssl/certs/key.pem;

ssl_protocols TLSv1.3 TLSv1.2;


vi /etc/nginx/sites-available/default

----------default-------------
# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
.
.
.
# include snippets/snakeoil.conf;
include snippets/cert.conf;
root /var/www/html;
------------------------------

vi /etc/nginx/sites-available/default

10.8 Certbot installieren

https://certbot.eff.org/ aufrufen und Anleitung ausführen

sudo certbot --apache

Zertifikat anzeigen:
cd /etc/letsencrypt/live/domain.name.de/
openssl x509 -in fullchain.pem -text --noout

11. Assembler, gcc, statisches und dynamisches Linken

cat x.c

main(void)
{
  int i=1;
  while(1){
    i=i+2;
    printf("%d\n",i);
  }
}

gcc -S  x.c
cat x.s

.L2
    addl    $2, -4(%rbp)
    movl    -4(%rbp), %eax
    movl    %eax, %esi
    movl    $.LC0, %edi
    movl    $0, %eax
    call    printf
    jmp     .L2

gcc x.c  -o x-dyn
gcc x.c -static -o x-static

ls -l x-*

ldd x-*

12. Systemaufrufe

.data
    s:
        .ascii "hello world\n"
        len = . - s
.text
    .global _start
    _start:

        movl $4, %eax   /* write system call number */
        movl $1, %ebx   /* stdout */
        movl $s, %ecx   /* the data to print */
        movl $len, %edx /* length of the buffer */
        int $0x80

        movl $1, %eax   /* exit system call number */
        movl $0, %ebx   /* exit status */
        int $0x80
as -o main.o main.S
ld -o main main.o
file main*
./main