DevOps - softDsim/softDsim GitHub Wiki

Inhalt

  1. Operations
    1.1 Setup
    1.2 Architektur
    1.3 Benutzerkonzept & Zugriffe
    1.4 Services

  2. CI / CD
    2.1 Tooling
    2.2 Pipeline
    3.3 Vulnerabilities

Operations

Der Betrieb und die Sicherstellung der Verfügbarkeit ist Voraussetzung für die Bereitstellung einer Software. Im Folgenden werden die einzelen Punkte zur Servereinrichtung, Härtung und Bereitstellung diverser Services beschrieben.


Setup

sudo apt-get update && apt-get upgrade -y \
&& sudo apt-get install -y docker-ce docker-ce-cli containerd.io curl iptables-persistent rsync git nginx certbot davfs2 mutt
  • Installation ohne Paketmanager
    • Docker-Compose (Paketmanager liefert zu alte Version)
    • certbot (falls die Version aus dem Paketmanager zu alt ist) -> Anleitung
# installation docker-compose
cd $BASE_DIR_OPS/bin \
&& wget https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 \
&& mv docker-compose-linux-x86_64 docker-compose

Einbinden der individuellen Binaries beim Login. Genauer beschrieben in Benutzer Individualisierung
Alternativ könnte das Binary in den offiziellen PATH gelinkt / kopiert werden.


Hardening

Note: Komplexe Firewall Regeln können zu Connection Problemen führen. Alternativ kann dieser Schritt auch übersprungen werden, sorgt aber für eine geringere Härtung des Systems.

Schematischer Aufbau wie Packages gefiltert und geroutet werden. Detailliert Aufbau ist hier zu finden. IPtables Aufbau


Um den Netzwerkverkehr von außerhalb Deutschlands zu Blockieren ist das Zusatzmodul GeoIP notwendig. Das Modul ließt eine Liste von Länderzugeordneten IP-Ranges ein.

Installationsanleitung
Alternative Installationsanleitung mit Beispielen

# bsp. Regel
# -t mangle       = verwenden der spezifischen IP Tabelle
# -I PREROUTING   = einfügen der Regel an erster Stelle der Chain
# -p tcp          = Ankommendes Protocol TCP
# --dport 443     = Ziel Port (https)
# -m geoip        = verwenden des Modules geoip
# ! --src-cc DE   = wenn Quell IP keine Deutsche (DE), Range
# -j DROP         = Paket verwerfen

iptables -t mangle -I PREROUTING -p tcp --dport 443 -m geoip ! --src-cc DE,US -j DROP

Um die Github Action Server zuzulassen müssen die entsprechenden IP Adressen als "ACCEPT" vor den "DROP" Regeln eingefügt werden.

Das Script $BASE_DIR_OPS/bin/getGithubActionIP.sh baut die Regeln automatisch mit der aktuellsten IP-Referenzliste von Github auf.
Die Regeln sind in dem Moment nur statisch und nach jedem Neustart gelöscht.
Zum persistieren wird der Befehl iptables-save > ${BASE_DIR_OPS}/iptables/rules.v4 verwendet. (Dies ist im Script inkludiert)

Zu Testzwecken / Fehlersuche können die Regeln der Chain gelöscht und später wieder hinzugefügt werden
Löschen: iptables -t mangle -F PREROUTING
Hinzufügen: iptables-restore < ${BASE_DIR_OPS}/iptables/rules.v4


  • SSH (Secure Shell)\
    • Port nicht verändert, freie Ports der Uni-Firewall (22,80,443)
    • sshd config
# bsp. sshd config: /etc/ssh/sshd_config.d/cust.conf
PermitRootLogin no
PermitEmptyPasswords no
AllowUsers bspUser1 bspUser2 bspUser3
Match User bspUser1,bspUser2
	PasswordAuthentication no
Match all
Protocol 2
MaxAuthTries 5
X11Forwarding no

Benutzerkonzept & Zugriffe

User Funktion
deployadm Docker, Operations
deploydata copy Data
kompsim complexy Team User
connect restricted connect User (chsh -s /bin/rbash)

Benutzer Individualisierung

Gilt nur für deployadm und deploydata. Die Eintragungen Unterscheiden sich. Ein Backup der Home-Verzeichnisse wird auf BSCW gespeichert.

  • add nützliche aliases in .bashrc
  • add erweiterte aliases in .bashrc_aliases
  • add Erweiterten Path + Environment Variablen in .profile
# bsp. PATH erweitern: ~./profile

export BASE_DIR_OPS="***"
if [ -d "$BASE_DIR_OPS/bin" ] ; then
    PATH="$BASE_DIR_OPS/bin:$PATH"
fi

Ordner

# Hauptverzeichnis

    Owner       Group      Ordner
--------------------------------------    
├── [deploydata install ]  app          -> für DEV
├── [deploydata install ]  html         -> für DEV
└── [deployadm  admin   ]  operations
# operations

├── bin
│   ├── backup_db.sh
│   ├── cleanup.sh
│   ├── docker-compose
│   ├── getGithubActionIP.sh
│   └── reboot.sh
├── compose
│   ├── app_compose.yaml                -> für Preprod und Prod
│   └── app_DEV_compose.yaml
├── config                              -> Applikation / Script bezogene config
│   ├── .env_{DEV/PREPROD/PROD}_app     -> config mount für Application Container
│   ├── .env_{DEV/PREPROD/PROD}_compose -> config für Docker-Compose Container run
│   ├── muttrc                          -> Email (SMTP) Config
│   ├── receiverList                    -> Email Empfänger Liste
│   └── nginx-frontend.conf
├── iptables
│   ├── ghIPList.txt
│   ├── oldIP
│   └── rules.v4
├── logs
├── nginx
├── old
└── tmp

Architektur

HLD


Zugriff BSCW (mount WebDav)

# /etc/fstab

https://bscw.frankfurt-university.de/EduRes/bscw/bscw.cgi/home /mnt/bscw davfs uid=1003,gid=1007,rw,auto,_netdev,x-systemd.after=network-online.target 0 0

In der Datei /etc/davfs2/secrets werden die Credentials hinterlegt um das Interaktive Einbinden zu umgehen.


Zugriff auf den Server:
ssh [email protected]


Zugriff auf die Applikation erhält man durch folgende Url`s:

Ansprechpartner für die Domain welche über namecheap verwaltet wird ist Herr Hefter.

Konfiguration in namecheap:

Doamin


Services

Wie in der Architektur dargestellt gibt es auf dem Server dieverse laufende Programme und Scripte zur Produktbereitstellung.

Scripte

Script Funktion
backup_db.sh Backup aller Datenbank Volumes als archive auf BSCW
cleanup.sh Aufräumen von überflüssigen Daten (Images, Dev Daten)
getGithubActionIP.sh Prüft bei Github auf Änderungen und Aktualisiert die IP-Tables Rules
reboot.sh Stellt BSCW mount sicher und Informiert Anwender mit Basic Report

Cron

Script Zeit Ausführender
backup_db.sh 30 1 * * * root
cleanup.sh 20 1 * * * root
getGithubActionIP.sh 30 0 * * * deployadm
reboot.sh @reboot deployadm
docker system prune -f 35 0 * * 0 deployadm

Mail

Beispielkonfiguration für mutt. Für das Projekt wird lediglich der SMTP (Mails senden) benötigt.

# bsp.: ~/.muttrc -> ${BASE_DIR_OPS}/config/muttrc

set smtp_url = "smtps://[email protected]"    
set smtp_pass = "***"       
set from = "softDSim-Admin <[email protected]>"
set ssl_starttls= yes

Note: Um die Uni Mail Adresse zum versenden nutzen zu können muss der DNS-Resolver umgestellt werden in /etc/resolv.conf auf bspw. 8.8.8.8. Die Standardeinstellung löst die Adresse nicht auf.


Nginx

Die Konfiguration orientiert sich an folgenden Best Pracises.

# Verlinkung Nginx Config

/etc/nginx -> $BASE_DIR_OPS/nginx/

Anpassung des Services war notwendig da nginx nach dem Server Reboot nicht gestartet werden konnte.
Service Datei: /lib/systemd/system/nginx.service
Add in Sektion "[Serivce]" : ExecStartPre=/bin/sleep 10


Docker

IMAGE                                        PORTS        NAMES
-------------------------------------------------------------------------
ghcr.io/fra-uas-project/app-backend:0.1.4    8000->8000   APP_PROD
mariadb:10.7.3                               3320->3306   APP_DB_PROD
ghcr.io/fra-uas-project/app-frontend:0.1.4   8080->80     WEB_PROD

ghcr.io/fra-uas-project/app-backend:0.1.4    8001->8000   APP_PREPROD
mariadb:10.7.3                               3321->3306   APP_DB_PREPROD
ghcr.io/fra-uas-project/app-frontend:0.1.4   8081->80     WEB_PREPROD

ghcr.io/fra-uas-project/dj:latest            8002->8000   APP_DEV
mariadb:10.7.3                               3322->3306   APP_DB_DEV



  • Manuell start/stop der Umgebungen mit Alias (für docker-compose)
Alias Funktion
dcad startet/stoppt DEV Umgebung mit spezifischer config
dcapp startet/stoppt PREPROD Umgebung mit spezifischer config
dcapr startet/stoppt PROD Umgebung mit spezifischer config

Bsp.: dcad up -d
Alternativ zu: docker-compose -f $BASE_DIR_OPS/compose/app_DEV_compose.yaml --env-file $BASE_DIR_OPS/config/.env_DEV_app_compose



CI / CD

CI/CD steht je nach Auslegung für Continuous Integration, Continuous Delivery und Continuous Deployment. Dabei geht es um die Automatisierung von der Entwicklung bis zur integration in Produktion. Anhand der DevOps Phylosophie bei welcher Development und Operations in starkem Austausch stehen können in effizienten Iterationen Änderungen eingespielt werden. Der Lifecycle mit exemplarischen Produkten ist durch folgendes Bild dargestellt.

DevOps


Tooling

Produkte wie Circle CI, Jenkins, Github Actions und viele weitere dienen als Software zur Umsetzung solcher CI/CD Pipelines.

Das Projekt entschied sich für den Cloud-based Hosting Service Github mit git als Version Control System.
Github inkludiert viele Funktionen wie bspw.:

  • Github Actions (Workflows)
  • Container Registry
  • Wiki (Dokumentation)
  • Kanban Boards
  • Issue Ticket System
  • ...

Pipeline

Es gibt 2 Pipelines. Eine für Development und eine für die integration in Produktion ab dem main Branche.



  • Development Pipe

Pipe Stages - Backend

Nr. Dep Name Funktion
1 Check running Jobs Prüft ob von dem Typ aktuell Jobs laufen damit nicht 2 Jobs parallel gestartet werden
2 1 Build Base Image Kompiliert das React Frontend und kopiert es auf den Server
3 2 Rollout Backend Kompiliert das React Frontend und kopiert es auf den Server

*Dep=Dependencie (Abhängigkeit zu Stage Nr.)


Pipe Stages - Frontend

Nr. Dep Name Funktion
1 Check running Jobs Prüft ob von dem Typ aktuell Jobs laufen damit nicht 2 JObs parallel gestartet werden
2 1 Build and Deploy Kompiliert das React Frontend und kopiert es auf den Server

*Dep=Dependencie (Abhängigkeit zu Stage Nr.)


Für die Kompilation der Software müssen in DEV folgende Parameter genutzt werden.

Environment Variable CI=false, default in Github true ( Information zum CI Paramter)

npm ci --legacy-peer-deps ignore all peerDependencies when installing, in the style of npm version 4 through version 6

Parameter Funktion
ci clean install, nutzt die package-lock.json während der installation der Module
--legacy-peer-deps ignoriert alle peerDependencies bei der installation wie in npm Version 4-6, Information zu Depencies




  • PreProd / Prod Pipeline

Das grundsätzliche Ziel der Produktions Pipeline ist es

Pipe Stages - CI/CD

Nr. Dep Name Funktion
1 Check running Jobs Prüft ob von dem Typ aktuell Jobs laufen damit nicht 2 Jobs parallel gestartet werden
2 1 Scan (aktuell Placeholder) Prüft auf Vulnerabilities in Software und Dockerfiles der Images
3 2 Versioning Prüft die Commit Message. Vergibt automatisch Anhand der Commit Message eine Semantische Version für den weiteren Workflow
4 3 Build Frontend Komipliert Frontend, erstellt Docker Image und Uploaded in GHCR
5 3 Build Backend Erstellt Docker Image und Uploaded in GHCR
6 4,5 Deploy PreProd Startet Container mit neuem Image
7 6 Tests (Placeholder) Führt Applikationstests durch. Auf Basis dieser wird der nächste Schritt gestartet.
8 7 Deploy Prod Startet Container mit neuem Image

*Dep=Dependencie (Abhängigkeit zu Stage Nr.)


Semantische Versionierung

Versioning

Note: Bei jedem Commit auf den main Branch muss einer der folgende Begriffe enthalten sein, da die Pipe sonst abbricht.
Beispiel Message: "fixed size Button #patch"

  • #major
  • #minor
  • #patch

Vulnerabilities

<TBD by Othmane>

⚠️ **GitHub.com Fallback** ⚠️