From f9ece707fa1c6fa204d0a76a5a2ab9d6357bfe15 Mon Sep 17 00:00:00 2001 From: sendnrw <> Date: Wed, 29 Oct 2025 10:06:28 +0000 Subject: [PATCH] Initial commit --- .gitea/workflows/container.yml | 51 ++++++++ .gitea/workflows/release.yml | 192 +++++++++++++++++++++++++++++ CHANGELOG.md | 13 ++ LICENSE | 136 +++++++++++++++++++++ README.md | 58 +++++++++ SECURITY.md | 214 +++++++++++++++++++++++++++++++++ 6 files changed, 664 insertions(+) create mode 100644 .gitea/workflows/container.yml create mode 100644 .gitea/workflows/release.yml create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md diff --git a/.gitea/workflows/container.yml b/.gitea/workflows/container.yml new file mode 100644 index 0000000..08c2037 --- /dev/null +++ b/.gitea/workflows/container.yml @@ -0,0 +1,51 @@ +name: release-tag +on: + push: + branches: + - 'main' +jobs: + release-image: + runs-on: ubuntu-fast + env: + DOCKER_ORG: ${{ vars.DOCKER_ORG }} + DOCKER_LATEST: latest + RUNNER_TOOL_CACHE: /toolcache + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker BuildX + uses: docker/setup-buildx-action@v2 + with: + config-inline: | + [registry."${{ vars.DOCKER_REGISTRY }}"] + http = true + insecure = true + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + registry: ${{ vars.DOCKER_REGISTRY }} + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Get Meta + id: meta + run: | + echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT + echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + platforms: | + linux/amd64 + push: true + tags: | + ${{ vars.DOCKER_REGISTRY }}/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }} + ${{ vars.DOCKER_REGISTRY }}/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }} \ No newline at end of file diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..51d37a1 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,192 @@ +name: build-binaries + +on: + push: + branches: [ "main" ] + tags: [ "v*" ] + +# Change this Variables to your needs +# Set these Secrets in your Organisation-Settings +# AGENT_URL=https://agent.your-domain.xyz <-- No Tailing-Slash (/) at the end!! +# AGENT_TOKEN= + +env: + GO_VERSION: "1.25" + BINARY_NAME: release-agent + +# Do not edit following except you need to change build-options + +jobs: + build: + if: startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-fast + + strategy: + matrix: + include: + - goos: linux + goarch: amd64 + ext: "" + - goos: linux + goarch: arm64 + ext: "" + - goos: linux + goarch: arm + goarm: "7" + ext: "" + - goos: windows + goarch: amd64 + ext: ".exe" + + steps: + - name: Checkout source + uses: actions/checkout@v3 + + - name: Set up Go ${{ env.GO_VERSION }} + uses: actions/setup-go@v4 + with: + go-version: ${{ env.GO_VERSION }} + cache: true + + - name: Build ${{ matrix.goos }}/${{ matrix.goarch }}${{ matrix.goarm && format('/v{0}', matrix.goarm) || '' }} + shell: bash + run: | + set -e + mkdir -p dist/package + if [ -n "${{ matrix.goarm }}" ]; then export GOARM=${{ matrix.goarm }}; fi + CGO_ENABLED=0 GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -trimpath -ldflags "-s -w" \ + -o "dist/package/${BINARY_NAME}${{ matrix.ext }}" . + # cp -r static dist/package/ + + - name: Package archive with static assets + shell: bash + run: | + set -e + cd dist + if [ "${{ matrix.goos }}" == "windows" ]; then + ZIP_NAME="${BINARY_NAME}-windows-amd64.zip" + (cd package && zip -r "../$ZIP_NAME" .) + else + ARCH_SUFFIX="${{ matrix.goarch }}" + if [ "${{ matrix.goarch }}" == "arm" ]; then ARCH_SUFFIX="armv${{ matrix.goarm }}"; fi + TAR_NAME="${BINARY_NAME}-${{ matrix.goos }}-${ARCH_SUFFIX}.tar.gz" + tar -czf "$TAR_NAME" -C package .) + fi + + - name: Upload workflow artifact + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.goarm && format('v{0}', matrix.goarm) || '' }} + path: dist/*.tar.gz + if-no-files-found: ignore + - uses: actions/upload-artifact@v3 + with: + name: windows-amd64 + path: dist/*.zip + if-no-files-found: ignore + + release: + if: startsWith(github.ref, 'refs/tags/') + needs: build + runs-on: ubuntu-fast + permissions: + contents: write + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + path: ./dist + + - name: Create / Update release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }} + with: + name: "Release ${{ github.ref_name }}" + tag_name: ${{ github.ref_name }} + draft: false + prerelease: false + files: | + dist/**/${{ env.BINARY_NAME }}-*.tar.gz + dist/**/${{ env.BINARY_NAME }}-*.zip + + publish-agent: + if: startsWith(github.ref, 'refs/tags/') + needs: release + runs-on: ubuntu-fast + env: + PRODUCT: ${{ env.BINARY_NAME }} + AGENT_URL: ${{ secrets.AGENT_URL }} + AGENT_TOKEN: ${{ secrets.AGENT_TOKEN }} + SERVER_URL: ${{ github.server_url }} + REPOSITORY: ${{ github.repository }} + TAG: ${{ github.ref_name }} + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + path: ./dist + - name: Publish release metadata to Version Agent + shell: bash + run: | + set -euo pipefail + if [[ -z "${AGENT_URL:-}" || -z "${AGENT_TOKEN:-}" ]]; then + echo "Missing AGENT_URL or AGENT_TOKEN" >&2; exit 1 + fi + + VERSION="${TAG#v}" + MAJOR="${VERSION%%.*}" + BRANCH="${MAJOR}.x" + + CHANNEL="stable" + [[ "$VERSION" == *"-rc"* ]] && CHANNEL="rc" + [[ "$VERSION" == *"-beta"* ]] && CHANNEL="beta" + + RELEASED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")" + NOTES_URL="${SERVER_URL}/${REPOSITORY}/releases/tag/${TAG}" + + publish() { # args: OS ARCH FILE + local OS="$1" ARCH="$2" FILE="$3" + local BIT="64"; case "$ARCH" in 386|armv7) BIT="32";; esac + + local FNAME="$(basename "$FILE")" + local URL="${SERVER_URL}/${REPOSITORY}/releases/download/${TAG}/${FNAME}" + + local SHA256 SIZE + SHA256="$(sha256sum "$FILE" | awk '{print $1}')" + SIZE="$(stat -c%s "$FILE")" + + jq -n \ + --arg product "$PRODUCT" \ + --arg branch "$BRANCH" \ + --arg channel "$CHANNEL" \ + --arg arch "$ARCH" \ + --arg bit "$BIT" \ + --arg os "$OS" \ + --arg version "$VERSION" \ + --arg released_at "$RELEASED_AT" \ + --arg notes "$NOTES_URL" \ + --arg url "$URL" \ + --arg sha256 "$SHA256" \ + --argjson size "$SIZE" \ + '{ + product:$product, + branch:$branch, channel:$channel, arch:$arch, bit:$bit, os:$os, + release:{ + version:$version, released_at:$released_at, notes_url:$notes, + assets:[{url:$url, sha256:$sha256, size_bytes:$size}] + } + }' > payload.json + + curl -fsS -H "Content-Type: application/json" \ + -H "Authorization: Bearer ${AGENT_TOKEN}" \ + -d @payload.json "${AGENT_URL}/v1/publish" + } + + shopt -s nullglob + for f in dist/**/${PRODUCT}-linux-amd64.tar.gz; do publish linux amd64 "$f"; done + for f in dist/**/${PRODUCT}-linux-arm64.tar.gz; do publish linux arm64 "$f"; done + for f in dist/**/${PRODUCT}-linux-armv7.tar.gz; do publish linux armv7 "$f"; done + for f in dist/**/${PRODUCT}-windows-amd64.zip; do publish windows amd64 "$f"; done diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..dff1d98 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +## v1.0.0 (2025-mm-dd) + +### This release fixes the following bugs + +- [Features](features) + +### This release added the following features + +- [Features](features) + +--- diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..546053e --- /dev/null +++ b/LICENSE @@ -0,0 +1,136 @@ +# CommonsProtect Lizenz – Nicht-kommerzielle Edition (CPL-NC) + +**Version:** CPL-NC-1.0 +**Stand:** 30.01.2025 +**Lizenzgeber:** Jan Bergner +**Urheberrecht:** © 2025 Jan Bergner +**Projektname:** [PROJEKT_NAME] +**Quelle/Repository:** [REPOSITORY_URL] +**Kontakt (für kommerzielle Lizenz oder Ausnahmen):** [KONTAKT_EMAIL] +**Rechtsraum (optional):** [JURISDIKTION / GERICHTSSTAND] + +--- + +## 0. Zweck und Geltungsbereich + +Diese Lizenz regelt die Bedingungen für Nutzung, Veränderung und Weiterverbreitung der Software („**Werk**“) durch jede natürliche oder juristische Person („**Lizenznehmer**“). Sie soll offene Zusammenarbeit ermöglichen und zugleich eine **kommerzielle Nutzung ohne ausdrückliche Erlaubnis** verhindern. + +--- + +## 1. Definitionen + +**1.1 Nicht-kommerzielle Nutzung (NC):** Nutzung, bei der **keine direkten oder indirekten Einnahmen** erzielt werden, weder durch Verkauf, Vermietung, Lizenzen, Abonnements, Werbung, Spenden, Sponsoring noch bezahlte Partnerschaften. +**1.2 Kommerzielle Nutzung:** Jede Nutzung, die **ganz oder teilweise monetarisiert** ist oder einem geschäftlichen Zweck dient. +**1.3 Abgeleitete Werke:** Werke, die auf dem Werk basieren oder Teile davon enthalten (inkl. Modifikationen, Übersetzungen, Zusammenführungen). +**1.4 Bereitstellung als Dienst:** Bereitstellung des Werks oder eines abgeleiteten Werks als gehosteten Dienst (z. B. Web-Service, API, SaaS). + +--- + +## 2. Lizenzgewährung (NC-Lizenz) + +Unter den Bedingungen dieser Lizenz gewährt der Lizenzgeber dem Lizenznehmer **unentgeltlich** ein weltweites, einfaches, nicht übertragbares Recht, das Werk für **nicht-kommerzielle Zwecke** zu + +- nutzen, auszuführen und bereitzustellen, +- vervielfältigen und weitergeben, +- verändern und abgeleitete Werke zu erstellen. + +--- + +## 3. Namensnennung (Attribution) + +Bei jeder Nutzung oder Weitergabe des Werks oder abgeleiteter Werke **muss** der Lizenznehmer deutlich auf die Urheberschaft und Quelle hinweisen: + +- Nennung des Lizenzgebers **siehe oben** (und optional des Projektnamens **siehe oben**) +- Verweis/Link auf die Quelle **siehe oben** +- Hinweis auf die Lizenz: „Lizenziert unter der CommonsProtect Lizenz – Nicht-kommerzielle Edition (CPL-NC-1.0)“ + +**Beispielformulierung:** +> „Dieses Werk (bzw. Teile davon) basiert auf der Arbeit von **siehe oben**, verfügbar unter **siehe oben**, lizenziert unter CPL-NC-1.0.“ + +Die Attribution muss in für die Zielgruppe üblicher Form erfolgen (z. B. im Impressum, in der Dokumentation, Readme, „About“-Dialog oder im Quellcode). + +--- + +## 4. Beschränkung auf nicht-kommerzielle Nutzung + +**Kommerzielle Nutzung ist ohne vorherige schriftliche Erlaubnis des Lizenzgebers untersagt.** Das Verbot umfasst insbesondere, aber nicht abschließend: + +1. **Vertrieb & Lizenzen:** Verkauf, Vermietung, entgeltliche Lizenzierung oder Bündelung in kommerziellen Produkten/Packages. +2. **Integration in entgeltliche Angebote:** Nutzung in Produkten, Diensten oder Workflows, die verkauft, lizenziert oder bezahlt bezogen werden. +3. **Gehostete Bereitstellung (SaaS/API):** Betrieb als Dienst mit direkter oder indirekter Monetarisierung (inkl. Werbung, Paywalls, Abos, Spendenplattformen, Sponsoring). +4. **Monetarisierte Inhalte & Plattformen:** Nutzung in oder für Inhalte/Plattformen, die Einnahmen generieren (z. B. Streaming, Social Media, YouTube, Blogs) – **auch bei teilweiser Monetarisierung** (Werbung, bezahlte Partnerschaften, Abos, Spenden usw.). +5. **Unternehmensinterne Nutzung mit wirtschaftlichem Zweck:** Einsatz im Unternehmen, soweit er dem unmittelbaren oder mittelbaren **geschäftlichen Nutzen** dient (z. B. Produktion, Vertrieb, Kundenbetrieb). + +> **Klarstellung:** Auch freiwillige Spenden, „Premium“-Zugänge, Paywalls, Werbeeinblendungen oder Sponsoring gelten als Monetarisierung. + +**Ausnahmen / kommerzielle Lizenz:** Für kommerzielle Nutzung ist eine **separate, schriftliche Vereinbarung** mit dem Lizenzgeber erforderlich. Kontakt: **siehe oben**. + +--- + +## 5. Weitergabe und Modifikationen + +**5.1 Lizenzbeifügung:** Bei jeder Weitergabe des Werks oder abgeleiteter Werke ist diese Lizenz (einschließlich Version und Stand) vollständig beizufügen. +**5.2 Lizenzkompatibilität:** Abgeleitete Werke **müssen** unter dieser Lizenz oder einer **inhaltsgleich nicht-kommerziellen** und **attributionspflichtigen** Lizenz weitergegeben werden, die mindestens denselben Schutzumfang in Bezug auf NC und Attribution bietet. +**5.3 Kennzeichnung von Änderungen:** Wesentliche Änderungen sind nachvollziehbar zu dokumentieren (z. B. im Changelog oder Header). +**5.4 Quelloffenheit:** Soweit eine Weitergabe erfolgt, **muss** der den ausführbaren Fassungen zugrunde liegende Quellcode in angemessener Weise zugänglich sein (z. B. durch Beifügung oder öffentlichen Link), es sei denn, dies ist technisch nicht anwendbar. + +--- + +## 6. Keine Gewährleistung („as is“) & Haftungsausschluss + +Das Werk wird **„wie besehen“** bereitgestellt – **ohne** ausdrückliche oder konkludente Garantien, einschließlich, aber nicht beschränkt auf **Marktgängigkeit**, **Eignung für einen bestimmten Zweck**, **Rechtsmängelfreiheit** oder **Fehlerfreiheit**. +Die Nutzung erfolgt **auf eigenes Risiko**. Der Lizenzgeber haftet – **soweit gesetzlich zulässig** – nicht für direkte, indirekte, zufällige, besondere oder Folgeschäden, einschließlich Datenverlust, Betriebsunterbrechung, Sicherheitsvorfälle oder entgangenen Gewinn. + +**Produkthaftung:** Eine Haftung nach **Produkthaftungsrecht** (z. B. § 1 ProdHaftG (DE) oder vergleichbare Normen anderer Rechtsordnungen) ist ausgeschlossen, da das Werk unentgeltlich, ohne Abnahme und ohne Zusicherungen bereitgestellt wird. + +--- + +## 7. Nicht für sicherheitskritische Anwendungen + +Das Werk ist **nicht vorgesehen** für sicherheitskritische Einsatzbereiche, u. a.: + +- Medizinische Geräte +- Luft- und Raumfahrt +- Automatisierte Verkehrs-/Steuerungssysteme +- Industrieanlagen mit hohem Gefährdungspotenzial +- Systeme, bei denen Fehlfunktionen zu Personen- oder erheblichen Sachschäden führen können + +Eine Verwendung in solchen Bereichen erfolgt ausschließlich auf eigene Gefahr des Lizenznehmers. + +--- + +## 8. Drittkomponenten, Rechte Dritter und Marken + +**8.1 Drittsoftware:** Das Werk kann Komponenten enthalten, die gesonderten Lizenzen unterliegen. Diese **bleiben maßgeblich**; im Konfliktfall gelten ihre Bedingungen. +**8.2 Schutzrechte Dritter:** Der Lizenznehmer ist verantwortlich, Rechte Dritter zu beachten. +**8.3 Marken & Bezeichnungen:** Marken, Logos und Kennzeichen des Lizenzgebers oder Dritter werden durch diese Lizenz **nicht** lizenziert. + +--- + +## 9. Laufzeit, Beendigung und Wiedereinsetzung + +**9.1 Laufzeit:** Diese Lizenz gilt ab dem in den Metadaten genannten Stand, bis sie gemäß diesem Abschnitt endet oder durch eine Folgeversion ersetzt wird. +**9.2 Automatische Beendigung:** Bei Verstoß gegen diese Lizenz endet die Lizenz **automatisch**. +**9.3 Wiedereinsetzung:** Der Lizenzgeber **kann** die Lizenz nach Abhilfe des Verstoßes nach eigenem Ermessen wieder einsetzen (schriftliche Bestätigung empfohlen). + +--- + +## 10. Sonstiges + +- **Exportkontrolle:** Der Lizenznehmer beachtet einschlägige Export-/Sanktionsvorschriften. +- **Salvatorische Klausel:** Sollten einzelne Bestimmungen unwirksam sein, bleibt der Rest wirksam; eine wirksame Regelung tritt an ihre Stelle, die dem wirtschaftlichen Zweck am nächsten kommt. +- **Kein Verzicht:** Das Unterlassen der Durchsetzung einer Bestimmung gilt nicht als Verzicht. +- **Gesamte Vereinbarung:** Diese Lizenz bildet die vollständige Vereinbarung hinsichtlich des Werks – ergänzende Abreden bedürfen der Schriftform. +- **Abtretung:** Rechte und Pflichten aus dieser Lizenz dürfen ohne Zustimmung des Lizenzgebers nicht abgetreten werden, es sei denn, gesetzlich unabdingbar. + +--- + +## 11. Hinweis zur Open-Source-Definition + +Diese Lizenz ist **keine** OSI-anerkannte Open-Source-Lizenz im Sinne der [Open Source Definition](https://opensource.org/osd). Sie ist eine **„source-available“**-Lizenz mit **Nicht-Kommerzialisierungs-Beschränkung**. + +--- + +## 12. Kontakt für Ausnahmen / kommerzielle Nutzung + +Anfragen zu Ausnahmen oder kommerziellen Lizenzen bitte an **siehe oben** richten. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ced480c --- /dev/null +++ b/README.md @@ -0,0 +1,58 @@ +# [PROJECT_NAME] + +--- + +## Table of contents + +- [Features](#features) +- [Quickstart](#quickstart) +- [Deployment](#deployment) +- [Configuration](#configuration) +- [Security](#security) +- [License](#license) +- [Roadmap](#roadmap) + +--- + +## Features + +- Funktion 1 + +--- + +## Quickstart + +### Requirements + +- A + +### Deployment + +- A + +### Configuration + +- A + +--- + +## Security + +- **Responsible Disclosure:** Report vulnerabilities responsibly to **[SECURITY_CONTACT_EMAIL]**. +- **SECURITY.md:** Contains procedures and response times. +- **Secrets:** Do not commit secrets to the repo (use CI secrets/parameter stores). + +--- + +## License + +This project is licensed under **CPL-NC-1.0**. +See [LICENSE](./LICENSE) for details. + +--- + +## Roadmap + +- [ ] v0.2: [FEATURE_1] +- [ ] v0.3: [FEATURE_2] +- [ ] v1.0: Stabiler API-Vertrag & Langzeit-Support diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..69243c4 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,214 @@ +# SECURITY.md + +## Inhalt + +- [Kontakt & Meldung von Schwachstellen](#kontakt--meldung-von-schwachstellen) +- [Geltungsbereich](#geltungsbereich) +- [Unterstützte Versionen](#unterstützte-versionen) +- [Transport- & Netzwerksicherheit (TLS)](#transport--netzwerksicherheit-tls) +- [Secret-Management (Docker-Secrets, Vault, .env)](#secret-management-docker-secrets-vault-env) +- [Container- & Orchestrierungs-Sicherheit](#container--orchestrierungs-sicherheit) +- [Sicheres Hosting & Infrastruktur-Hardening](#sicheres-hosting--infrastruktur-hardening) +- [Supply-Chain, Abhängigkeiten & SBOM](#supply-chain-abhängigkeiten--sbom) +- [CI/CD- & Releasemanagement-Sicherheit](#cicd--releasemanagement-sicherheit) +- [Anwendungs-Hardening (Headers, CORS, CSP)](#anwendungs-hardening-headers-cors-csp) +- [Daten- & Protokollierungsrichtlinien](#daten--protokollierungsrichtlinien) +- [Sicherheits-Tests](#sicherheits-tests) +- [Vorfallreaktion & Backups](#vorfallreaktion--backups) +- [Bedrohungsmodell (kurz)](#bedrohungsmodell-kurz) + +--- + +## Kontakt & Meldung von Schwachstellen + +Wenn Sie eine Schwachstelle gefunden haben, melden Sie diese **vertraulich**: + +- E-Mail: **security@patchping.org** +- Optional PGP: ****, öffentlicher Schlüssel: **** +- Reaktionsziel: Erstbestätigung innerhalb von **3 Werktagen**, Status-Update innerhalb von **7 Tagen**. +- Bitte nutzen Sie **Responsible Disclosure**: Keine öffentliche Offenlegung, keine Datenveränderung, keine Dienstunterbrechung. Testen Sie nur Systeme im Geltungsbereich. + +**Außerhalb des Geltungsbereichs**: Social Engineering, physischer Zugriff, DDoS/Stress-Tests ohne ausdrückliche schriftliche Genehmigung. + +--- + +## Geltungsbereich + +- **Repos / Services**: ``, `` +- **Umgebungen**: Dev, Staging, Production +- **Abhängigkeiten**: Alle in `package.json`/`go.mod`/`requirements.txt` etc. +- **Nicht umfasst**: Drittanbieter-Dienste außerhalb unserer Kontrolle, persönliche Forks. + +--- + +## Unterstützte Versionen + +| Version | Status | Sicherheitsfixes bis | +|--------:|---------------|----------------------| +| `main` | aktiv | laufend | +| `vX.Y` | LTS (12 Mon.) | `` | +| <älter> | EOL | – | + +> Sicherheitsupdates erhalten ausschließlich **unterstützte** Linien. + +--- + +## Transport & Netzwerksicherheit (TLS) + +- **Anforderung**: TLS **1.2+** (bevorzugt **TLS 1.3**). +- **Zertifikate**: Aus vertrauenswürdigem CA-Store, **OCSP-Stapling** aktivieren, **HSTS** mit Preload für Public Sites (nach sorgfältiger Prüfung). +- **Cipher**: Moderne Profile (z. B. Mozilla „intermediate“ oder „modern“). Kein `TLS_RSA_*`, keine Null-/Export-Cipher. +- **Perfect Forward Secrecy** (ECDHE) verpflichtend. +- **In-Cluster** (Service-zu-Service): mTLS (z. B. mit Service Mesh oder Sidecars). + +**Beispiel NGINX (vereinfacht)**: +```nginx +ssl_protocols TLSv1.2 TLSv1.3; +ssl_prefer_server_ciphers on; +ssl_ciphers HIGH:!aNULL:!MD5:!3DES; +ssl_session_cache shared:SSL:10m; +ssl_stapling on; ssl_stapling_verify on; +add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; +``` + +--- + +## Secret-Management (Docker-Secrets, Vault, .env) + +- **Do not**: Secrets in Git, Images, Layern oder in `ENV` persistieren. +- **Do**: + - **Docker Swarm/Kubernetes/Compose Secrets** oder **Vault / Cloud Secret Manager** verwenden. + - Rotations-Policy, minimale TTLs, Least Privilege. + - Im Code nur **über Files/Runtime** einlesen (`/run/secrets/...` o. ä.). + +**Docker Compose (Beispiel)**: +```yaml +services: + app: + image: your/app:latest + secrets: + - db_password + environment: + DB_PASSWORD_FILE: /run/secrets/db_password +secrets: + db_password: + file: ./secrets/db_password.txt # nicht ins Repo committen +``` + +**Im Code (Pseudocode)**: +```python +import os, pathlib +def read_secret(path_or_envfile): + p = os.getenv("DB_PASSWORD_FILE", path_or_envfile) + return pathlib.Path(p).read_text(encoding="utf-8").strip() +``` + +> Für lokale Entwicklung: `.env.example` bereitstellen, `.env` in `.gitignore`. + +--- + +## Container & Orchestrierungs-Sicherheit + +- **Images**: Minimal-Basis (distroless/alpine), keine Paketmanager/Compiler in Runtime-Images; **immutable Tags + Digests** pinnen. +- **User**: Container **nicht als root** (`USER 10001:10001`). +- **FS**: `readOnlyRootFilesystem`, nur benötigte Volumes. +- **Capabilities**: Drop all; selektiv erlauben (`NET_BIND_SERVICE` etc.). +- **Seccomp/AppArmor**: Restriktive Profile aktivieren. +- **Netzwerk**: Default-Deny zwischen Pods/Services, nur benötigte Egress/DNS. +- **Runtime**: Health/Readiness, Ressourcengrenzen (`requests/limits`), Image-Signing (z. B. cosign). + +**Dockerfile (Skizze)**: +```dockerfile +FROM gcr.io/distroless/python3 +WORKDIR /app +COPY app/ /app +USER 10001:10001 +CMD ["python", "main.py"] +``` + +--- + +## Sicheres Hosting & Infrastruktur-Hardening + +- **Zugriff**: MFA/2FA überall, **FIDO2** bevorzugt; keine Passwort-SSH-Logins, nur Keys; kurzlebige Zugangstokens (OIDC). +- **Patchen**: OS & Middleware regelmäßig, automatische Sicherheitsupdates wo möglich. +- **Firewalls/WAF**: Eingehend/ausgehend minimal; Rate Limiting. +- **Logs**: Zentral sammeln (tamper-evident), Zeit/NTP synchronisieren. +- **Backups**: Verschlüsselt (at rest & in transit), Restore-Tests (mind. quartalsweise). +- **DNS/Email**: DNSSEC wo möglich; SPF, DKIM, DMARC „quarantine/reject“. +- **Cloud**: Least Privilege IAM, getrennte Accounts/Projekte pro Umgebung, Security Groups knauserig. + +--- + +## Supply-Chain, Abhängigkeiten & SBOM + +- **Pinning**: Exakte Versionen (oder Range + Lockfiles). +- **Automatische Updates**: Renovate/Dependabot mit Review. +- **Scanning**: SCA (Dependencies), Image-Scanner (Trivy/Grype), OS-Patches. +- **SBOM**: Erzeugen (CycloneDX oder SPDX) und dem Release beilegen. +- **Verifikation**: Signierte Artefakte (Sigstore/cosign); Registry-Policies (nur signiert zulassen). + +--- + +## CI/CD & Releasemanagement-Sicherheit + +- **Branch Protection**: Reviews, status checks, signierte Commits/Tags. +- **Secrets im CI**: Nur benötigte Variablen, maskiert; **keine** Secrets in Job-Logs; OIDC-Föderation statt dauerhafter Cloud-Keys. +- **Isolierung**: Untrusted PRs in isolierten Workflows ohne Secrets; Dependency Caching mit Prüfsummen. +- **Artefakte**: Prüfsummen/Signaturen veröffentlichen; Provenance (SLSA-Gedanken). +- **Checks**: SAST, IaC-Scan (Terraform/K8s), Container-Scan als Pflicht vor Release. + +--- + +## Anwendungs-Hardening (Headers, CORS, CSP) + +- **Security Headers** (Beispiele): + - `Content-Security-Policy: default-src 'self'` (feinjustieren) + - `X-Content-Type-Options: nosniff` + - `X-Frame-Options: DENY` (oder `SAMEORIGIN` falls nötig) + - `Referrer-Policy: no-referrer` + - `Permissions-Policy: camera=(), geolocation=()` +- **CORS**: Nur notwendige Origins/Methoden/Headers; keine `*` für Credentials. +- **AuthN/Z**: Rate Limits, Lockouts, MFA-Optionen; sichere Session-Cookies (`Secure`, `HttpOnly`, `SameSite=Strict`). +- **Crypto**: Bewährte Bibliotheken, aktuelle Algorithmen, kein Eigenbau. + +--- + +## Daten & Protokollierungsrichtlinien + +- **Klassifizierung**: Öffentliche / Intern / Vertraulich / Geheim. +- **PII**: Data Minimization; Verschlüsselung at rest (z. B. AES-256), Feld-Level-Encryption bei Bedarf. +- **Logs**: Keine Secrets/PII; Rotations- & Aufbewahrungsfristen; Zugriff nur für Befugte. +- **DSGVO**: Rechtsgrundlage dokumentieren, Betroffenenrechte, Auftragsverarbeiterverträge. + +--- + +## Sicherheits-Tests + +- **SAST**: Bei jedem Commit/PR. +- **DAST**: Gegen Staging mit Test-Accounts. +- **IaC/Cloud**: Terraform/K8s/Cloud Config Scanner. +- **Dependency/Container**: bei jedem Build. +- **Penetrationstests/Bug Bounty**: Mind. jährlich bzw. vor großen Releases; Scope wie oben. + +--- + +## Vorfallreaktion & Backups + +- **Runbooks**: Erkennung → Eindämmung → Beseitigung → Wiederherstellung → Lessons Learned. +- **Kommunikation**: Interne Kanäle, Eskalationsmatrix, rechtliche Meldepflichten (z. B. 72-Stunden-Fenster beachten). +- **Backups**: 3-2-1-Regel, regelmäßige Restore-Drills, KMS-geschützt. + +--- + +## Bedrohungsmodell (kurz) + +- **Angriffsflächen**: Öffentliche HTTP(S)-Endpunkte, CI/CD, Artefakt-Registry, Admin-Backends, Supply-Chain. +- **Gegner**: Opportunistische Angreifer, Botnets, gezielte Kompromittierung von Zugangsdaten. +- **Kontrollen (Auszug)**: MFA, mTLS, Least Privilege, Code-& Dependency-Scans, signierte Builds, Netzwerk-Policies, Monitoring/Alerting. + +--- + +### Änderungshistorie + +- `30.01.2025` – Initiale Version.