- Linux Administration im Seminar SVC und WIS
- 0. Bedienungshilfen
- 1. Erste Schritte
- 1.1 sshd Konfiguration
- 1.2 /etc/ssh/ssh_config:
- 2. Dateisystem
- 2.1 Dateisystem, Backup
- 2.2 Das /proc Dateisystem
- 3. Datenspeicher
- 4. Hauptspeicher und Swapbereich
- 4.1 Swapspeicher erweitern
- 5. Logdateien - "Verteidigung gegen die dunklen Künste"
- 6. Netzwerk
- 6.1 Netzwerkkonfiguration
- Ubuntu Server 22.04
- Standard
- 6.2 Netzwerktools
- 6.4 Netzwerkperformance
- 6.5 Informationsquellen zu DNS, Webseiten,...
- 6.6 VNC Server unter Amazon AWS
- 6.6.1 remmina - VNC-Client
- 7. Prozesse / CPU
- 7.1 CPU-Benchmark Geekbench ( min. "GB RAM")
- 8. Software
- 9. Systemdienste
- 9.1 Zeitsynchronisierung
- 9.1.1 ntpd
- 9.1.2 alternativ systemd.timesyncd
- Einstellungen für 172.20.48.x:
- 10. Sicherheit (Verteidigung gegen die dunklen Künste, S.Snape 1997)
- 10.0 ssh
- 10.1 Base64 Kodierung
- 10.2 Hashfunktionen
- 10.3 Symetrische Verschlüsselung mit openssl
- 10.4 Asymetrische Verschlüsselung
- 10.5 Signaturen
- 10.6 Selbsterstelltes Zertifikat
- 10.7 Zertifikat eines Dienstes anzeigen
- 10.8 Selbstzertifiziertes https Zertifikat mit openssl und apache2
- 10.9 https Zertifikate mit openssl und nginx
- 10.8 Certbot installieren
- 11. Assembler, gcc, statisches und dynamisches Linken
- 12. Systemaufrufe
- 14. Integration LLM zur Analyse von Systemdaten
- 14.1 Grundlagen
- 14.2 Beispiel Analyse CPU-Auslastung
- 14.4 Mit synthetischer IOWait Last
- 15. Kubernetes
- 15.1 kubectl
Linux Administration im Seminar SVC und WIS
-
Linux Administration im Seminar SVC und WIS
- 0. Bedienungshilfen
- 1. Erste Schritte
- 1.1 sshd Konfiguration
- 1.2 /etc/ssh/ssh_config:
- 2. Dateisystem
- 3. Datenspeicher
- 4. Hauptspeicher und Swapbereich
- 5. Logdateien - "Verteidigung gegen die dunklen Künste"
- 6. Netzwerk
- 7. Prozesse / CPU
- 8. Software
- 9. Systemdienste
-
10. Sicherheit (Verteidigung gegen die dunklen Künste, S.Snape 1997)
- 10.0 ssh
- 10.1 Base64 Kodierung
- 10.2 Hashfunktionen
- 10.3 Symetrische Verschlüsselung mit openssl
- 10.4 Asymetrische Verschlüsselung
- 10.5 Signaturen
- 10.6 Selbsterstelltes Zertifikat
- 10.7 Zertifikat eines Dienstes anzeigen
- 10.8 Selbstzertifiziertes https Zertifikat mit openssl und apache2
- 10.9 https Zertifikate mit openssl und nginx
- 10.8 Certbot installieren
- 11. Assembler, gcc, statisches und dynamisches Linken
- 12. Systemaufrufe
- 14. Integration LLM zur Analyse von Systemdaten
- 15. Kubernetes
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
whois
curl ipinfo.io
date
hostname
echo $PATH # Kommandosuchpfade
env # Umgebungsvariablen anzeigen
clear # Bildschirm löschen
sudo -i # Root bash starten
uname -a # Kernelversion
lsb_release -a # Linuxversion (sudo apt-get install lsb-core)
nano Dateiname #
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
# Auf dem Linuxclient:
ssh-keygen
ssh-copy-id root@name.tp10cloud.de
ssh root@name.tp10cloud.de "apt install -y mtr"
# Auf Windows
CMD starten
c:\Users\...>powershell
ssh-keygen.exe
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh root@PDB220001 "cat >> .ssh/authorized_keys"
ssh-keygen -y -f priv_key.pem > pub_key # Public key aus dem private Key erzeugen
# Privacy Enhanced Mail, Klartext Header+Foot + Base64 Kodierung
Ansible Module: https://docs.ansible.com/projects/ansible/latest/collections/index_module.html
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:
-
-a (Kurzversion für --archive): gleiche Bedeutung wie -rlptgoD => recursive,links,perms,times,group,owner,devices
-
-r (Kurzversion für --recursive): Unterverzeichnisse kopieren
-
-l (Kurzversion für --links): symbolische Links kopieren
-
-p (Kurzversion für --perms): Rechte der Quelldatei beibehalten
-
-t (Kurzversion für --times): Zeiten der Quelldatei beibehalten
-
-g (Kurzversion für --group): Gruppenrechte der Quelldatei beibehalten
-
-o (Kurzversion für --owner): Besitzrechte der Quelldatei beibehalten (nur als root User möglich)
-
-D (Kurzversion für --devices --specials): Gerätedateien der Quelldatei beibehalten (nur als root User möglich)
-
-v (Kurzversion für --verbose): zeigt während der Ausführung an welche Dateien synchronisiert werden
-
--delete: entfernt Dateien im Zielverzeichnis die mittelerweile im Quellverzeichnis nicht mehr vorhanden sind
-
--exclude=.Gerätedateien
-
--bwlimit=20 #kBps
2.2 Das /proc Dateisystem
- https://www.kernel.org/doc/html/latest/filesystems/proc.html
- https://digitalgateamg.com/de/blog/2022/06/17/proc-file-system-in-linux-2/
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 - "Verteidigung gegen die dunklen Künste"
Anzeigen mit cat. more, tail -f:
- /var/log/auth.log # Auf Debian 12: journalctl -u ssh
- /var/log/syslog
- /var/log/nginx/access.log
- /var/log/httpd/access.log
Verarbeitung mit grep,cut,tail,uniq,sort,nl,...:
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" # nmap -sS -Pn -p 0-1000
journalctl -u ssh | grep "Failed password" | wc -l
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"| sed 's/invalid user //' | cut -f9 -d" " | sort | uniq -c | sort -n
RIPEstat ist eine webbasierte Plattform des RIPE NCC (dem Regional Internet Registry für Europa, den Nahen Osten und Teile Zentralasiens). Man kann es sich als eine Art „Suchmaschine“ oder Analyse-Tool für IP-Adressen, Autonome Systeme (ASNs) und Routing-Informationen vorstellen.
https://stat.ripe.net/resource/107.181.128.0#tab=overview
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
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"
# https://www.iana.org/domains/root/db
# https://www.denic.de/
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
mtr # Kobination von ping und traceroute
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,...
- http://jodies.de/ipcalc
- sitereport.netcraft.com
- www.utrace.de
- web.archive.org
- wiki.ubuntuusers.de
- https://adayinthelifeof.nl/2012/03/12/why-putting-ssh-on-another-port-than-22-is-bad-idea/
- https://www.digitalocean.com/community/tutorials/how-to-configure-port-knocking-using-only-iptables-on-an-ubuntu-vps
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 (Verteidigung gegen die dunklen Künste, S.Snape 1997)
10.0 ssh
ssh-keygen # Schlüsselpaar unter .ssh erzeugen (id_ed25519, id_ed25519.pub)
ssh-copy-id root@wolf.tp10sepe.de
ssh root@wolf.tp10sepe.de # Ohne Passwordeingabe
# # Privacy Enhanced Mail, Klartext Header+Foot + Base64 Kodierung
10.1 Base64 Kodierung
echo -n -e "\x00\x01\x02" | base64
echo -n "Hallo Welt" | base64
echo -n "AAA" | base64
echo -n "AAAA" | base64
Anwendung: E-Mail Anhänge, Data-URLs in HTML/CSS, Datenübertragung in API's
10.2 Hashfunktionen
echo "Text123" | sha1sum
echo "Text123" | sha256sum
echo "Text123" | sha512sum
time dd if=/dev/random bs=16k count=10000 | sha256sum # 488 MB/s Intel(R) Core(TM) i7-9700 CPU @ 3.00GHz
# Signaturen, Passwörter, Deduplizierung, Blockchains
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 "geheim.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 Selbsterstelltes Zertifikat
openssl req -x509 -new -key dein_privater_key.pem -out certificate.pem -sha256 -days 365
# Inhalt des Zertifikates anzeigen:
openssl x509 -in certificate.pem -text -noout
10.7 Zertifikat eines Dienstes anzeigen
openssl s_client -showcerts -connect gitlab.tp10cloud.de:443
10.8 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.9 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 apt install certbot python3-certbot-apache
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
14. Integration LLM zur Analyse von Systemdaten
https://huggingface.co/collections/google/gemma-3-release-67c6c6f89c4f76621268bb6d
14.1 Grundlagen
- Schritt 1: Ollama installieren Ollama ist ein kostenloses Tool, das es extrem einfach macht, große Sprachmodelle (LLMs) wie Gemma, Llama oder Mistral lokal auf dem eigenen Computer auszuführen. Stell es dir wie einen App-Store oder eine Art "Steam" für KI-Modelle vor: Es bietet eine Bibliothek von Modellen und kümmert sich um den gesamten komplizierten Prozess des Herunterladens, der Installation und der Ausführung.
curl -fsSL https://ollama.com/install.sh | sh
https://github.com/ollama/ollama/blob/main/docs/linux.md
Session speichern:
# ollama run gemma3:12b
ollama run gemma-4-31B
>>>/save meinmodel
Created new model 'meinmodel'
>>>
14.2 Beispiel Analyse CPU-Auslastung
ollama run gemma3:12b "Das System hat 8 CPU-Kerne. Analysiere die Ausgabe der CPU-Auslastung aus /proc/loadavg: $(cat /proc/loadavg | cut -d" " -f1-3). Gib eine kurze Zusammenfassung."
sar -u 10 10 | ollama run gemma3:12b "Analysiere die Systemauslastung für %sys %user %iowait"
Die System-Auslastung in den Protokollen zeigt eine Reihe interessanter Punkte:
%user: Dieser Wert repräsentiert den Anteil der CPU-Zeit, der für Benutzerprogramme verwendet wird. Er schwankt zwischen 0,95% und 7,23%, mit einem Durchschnitt von 4,28%. Dieser Bereich deutet darauf hin, dass die Systeme Lasten in unterschiedlichen Intensitäten bearbeitet.
%sys: Dieser Wert zeigt den Anteil der CPU-Zeit, der für Kernel-Prozesse benötigt wird. Er bewegt sich zwischen 0,41% und 2,67%, mit einem Durchschnitt von 1,34%. Dieser relativ niedrige Wert ist ein gutes Zeichen, da es darauf hindeutet, dass das System effizient arbeitet und wenig Zeit für interne Vorgänge verwendet.
%iowait: Dieser Wert gibt den Anteil der CPU-Zeit an, die durch Warteschleifen auf E/A-Operationen (z. B. Festplattenzugriff) verloren geht. Er liegt zwischen 0,01% und 0,96%, mit einem Durchschnitt von 0,31%. Der geringe Wert zeigt, dass der Computer schnell auf Daten zugreifen kann und wenig Zeit mit Warteoperationen verbringt.
Insgesamt: Die Protokolldaten deuten darauf hin, dass das System stabil und effizient arbeitet. Es gibt keine Anzeichen für Überlastung oder Leistungsprobleme.
Ist es möglich, weitere Informationen über den Zeitpunkt des Systems zu erhalten? Dies würde die Analyse der Systemlast noch genauer machen. Zum Beispiel:
- Welche Programme werden im Hintergrund ausgeführt?
- Gibt es externe Faktoren, die die Last beeinflussen könnten (z. B. Netzwerkaktivität)?
Die Kenntnis dieser Details könnte dazu beitragen, die Gründe für Schwankungen in den CPU-Auslastungsprozentsätzen besser zu verstehen.
14.4 Mit synthetischer IOWait Last
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
cat /dev/sda >/dev/null &
sar -u 5 10 | ollama run gemma2:9b "Analysiere die Systemauslastung für %sys %user %iowait"
The system load analysis reveals some interesting trends:
**System Load (%sys)**:
* **Generally Low:** System usage is consistently low, hovering around 6% on average. This suggests that the Linux kernel
itself isn't heavily taxed.
* **Spikes:** There are noticeable spikes in system usage, reaching as high as 12.51% and 12.38%. These spikes indicate periods
of heavier kernel activity.
**User Load (%user)**:
* **Moderate:** User workload is fairly moderate, averaging around 2.12%. This means that your applications and processes are
consuming a reasonable amount of CPU time.
* **Variability:** There's noticeable variability in user load throughout the period, ranging from 1.08% to 4.72%.
**I/O Wait (%iowait)**:
* **Significant Portion:** I/O wait represents a substantial portion of system activity, averaging around 33.47%. This means
that your system is spending a considerable amount of time waiting for data transfers (reading from or writing to storage
devices).
* **High During Spikes:** During the periods with higher system load, I/O wait also increases significantly, reaching over 70%
at times.
**Analysis and Potential Issues:**
1. **I/O Bottleneck:** The high I/O wait suggests a potential bottleneck in your storage subsystem. This could be due to:
* Slow hard drive(s)
* Insufficient RAM (forcing more data to be stored on disk)
* Network issues if you're accessing remote filesystems
2. **Spike Causes:** Investigate the events causing the spikes in system and I/O wait. This could involve:
* Running resource-intensive applications at specific times
* Scheduled tasks or backups happening during that period
3. **Tuning:** Consider optimizing your storage configuration (e.g., using faster drives, RAID configurations, or SSDs) and
potentially adjusting system settings to improve I/O performance.
**Recommendations:**
1. **Monitor Performance:** Continue monitoring your system's resource usage to identify patterns and potential issues.
2. **Analyze Logs:** Check system logs for error messages or clues about the cause of the spikes in I/O wait.
3. **Storage Optimization:** Explore upgrading your storage hardware or configurations if your current setup is a bottleneck.
15. Kubernetes
15.1 kubectl
kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-68d75fd545-d6nvt 1/1 Running 0 15h
kube-system coredns-68d75fd545-s9k8b 1/1 Running 0 15h
kube-system kube-apiserver-talos-146-mvz 1/1 Running 0 15h
kube-system kube-apiserver-talos-3uq-g52 1/1 Running 0 15h
kube-system kube-apiserver-talos-p64-hck 1/1 Running 0 15h
kube-system kube-controller-manager-talos-146-mvz 1/1 Running 0 15h
kube-system kube-controller-manager-talos-3uq-g52 1/1 Running 2 (15h ago) 15h
kube-system kube-controller-manager-talos-p64-hck 1/1 Running 0 15h
kube-system kube-flannel-7rvw7 1/1 Running 0 15h
kube-system kube-flannel-gqd2r 1/1 Running 0 15h
kube-system kube-flannel-prtjx 1/1 Running 0 15h
kube-system kube-flannel-z67j4 1/1 Running 0 15h
kube-system kube-proxy-nbkcd 1/1 Running 0 15h
kube-system kube-proxy-qn97z 1/1 Running 0 15h
kube-system kube-proxy-v9wp2 1/1 Running 0 15h
kube-system kube-proxy-xpwhr 1/1 Running 0 15h
kube-system kube-scheduler-talos-146-mvz 1/1 Running 0 15h
kube-system kube-scheduler-talos-3uq-g52 1/1 Running 2 (15h ago) 15h
kube-system kube-scheduler-talos-p64-hck 1/1 Running 0 15h
kubectl get node
NAME STATUS ROLES AGE VERSION
talos-146-mvz Ready control-plane 15h v1.31.2
talos-3uq-g52 Ready control-plane 15h v1.31.2
talos-8s2-e9p Ready <none> 15h v1.31.2
talos-p64-hck Ready control-plane 15h v1.31.2
kubectl run nginx --image=nginx --port=80
kubectl port-forward nginx 8080:80 & # Blockiert ansonsten die aktuelle Shell
kubectl delete pod nginx
cat <<EOF >nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort # Definiert den Service-Typ
selector:
app: nginx # Findet die Pods mit diesem Label (aus Ihrem Deployment)
ports:
- protocol: TCP
port: 80 # Der interne Port des Services
targetPort: 80 # Der Port, an den der Service den Traffic weiterleitet (der Port Ihres Nginx-Containers)
# nodePort: 30080 # Optional: Sie können einen festen Port angeben (aus dem Bereich 30000-32767)
# Wenn Sie dies weglassen, wählt Kubernetes einen zufälligen Port.
EOF
kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15h
nginx-service NodePort 10.101.54.50 <none> 80:32611/TCP 2m56s
cat nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # Startet zwei identische Pods
selector:
matchLabels:
app: nginx # Dieser Selector muss mit dem im Service übereinstimmen
template:
metadata:
labels:
app: nginx # Dieses Label wird den Pods zugewiesen
spec:
containers:
- name: nginx
image: nginx # Verwendet das neueste Nginx-Image
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deployment-7769f8f85b-r9v79 1/1 Running 0 33s
nginx-deployment-7769f8f85b-tnnth 1/1 Running 0 33s
kubectl get endpoints nginx-nodeport-service
NAME ENDPOINTS AGE
nginx-nodeport-service 10.244.0.3:80,10.244.0.4:80 8m18s
kubectl port-forward service/nginx-nodeport-service 8080:80
curl http://localhost:8080
cat <<EOF >nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # Startet zwei identische Pods
selector:
matchLabels:
app: nginx # Dieser Selector muss mit dem im Service übereinstimmen
template:
metadata:
labels:
app: nginx # Dieses Label wird den Pods zugewiesen
spec:
containers:
- name: nginx
image: nginx # Verwendet das neueste Nginx-Image
ports:
- containerPort: 80
# --- Hier geschieht die Magie ---
# 1. Mountet das Volume in den Container
volumeMounts:
- name: nginx-index-html-volume
mountPath: /usr/share/nginx/html/index.html
# 'subPath' sorgt dafür, dass nur die index.html-Datei gemountet wird
# und nicht das gesamte Verzeichnis überschrieben wird.
subPath: index.html
# 2. Definiert das Volume, das auf das ConfigMap verweist
volumes:
- name: nginx-index-html-volume
configMap:
# Der Name des ConfigMaps, das Sie mit dem 'kubectl create'-Befehl erstellt haben
name: nginx-index-html-configmap
EOF
kubectl create configmap nginx-index-html-configmap --from-file=index.html
kubectl apply -f nginx-deployment.yaml
kubectl port-forward service/nginx-nodeport-service 8080:80 &
curl http://localhost:8080
Handling connection for 8080
<!DOCTYPE html>
<html>
<head>
<title>Willkommen auf meinem Kubernetes Nginx Server!</title>
</head>
<body>
<h1>Hallo Welt aus dem Kubernetes Cluster!</h1>
<p>Diese Seite wird von einem Nginx-Pod bereitgestellt.</p>
</body>
</html>