mirror of
https://github.com/bashclub/zamba-lxc-toolbox
synced 2025-10-02 08:16:18 +00:00
50
scripts/create-service-account
Normal file
50
scripts/create-service-account
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
USER="$1"
|
||||||
|
|
||||||
|
if [ -z "$USER" ]; then
|
||||||
|
echo "Usage: $0 <username>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prüfen, ob ldbmodify verfügbar ist
|
||||||
|
if ! command -v ldbmodify &> /dev/null; then
|
||||||
|
echo "Fehler: 'ldbmodify' ist nicht installiert. Bitte installiere 'ldb-tools' mit:"
|
||||||
|
echo " sudo apt update && sudo apt install ldb-tools"
|
||||||
|
exit 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Sicheres Passwort generieren (32 Zeichen, alphanumerisch + Sonderzeichen)
|
||||||
|
PASSWORD=$(openssl rand -base64 24)
|
||||||
|
|
||||||
|
# Benutzer anlegen mit generiertem Passwort
|
||||||
|
samba-tool user create "$USER" "$PASSWORD"
|
||||||
|
echo "✅ Benutzer $USER erfolgreich erstellt."
|
||||||
|
|
||||||
|
# DN des Benutzers ermitteln
|
||||||
|
DN=$(ldbsearch -H /var/lib/samba/private/sam.ldb "(sAMAccountName=$USER)" dn | awk '/^dn: / {print $2}')
|
||||||
|
|
||||||
|
if [ -z "$DN" ]; then
|
||||||
|
echo "❌ Fehler: DN für $USER nicht gefunden." >&2
|
||||||
|
exit 3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# userWorkstations=NONE setzen
|
||||||
|
ldbmodify -H /var/lib/samba/private/sam.ldb <<EOF
|
||||||
|
dn: $DN
|
||||||
|
changetype: modify
|
||||||
|
replace: userWorkstations
|
||||||
|
userWorkstations: NONE
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "------------------------------------------"
|
||||||
|
echo "BENUTZER ERSTELLT:"
|
||||||
|
echo "Username: $USER"
|
||||||
|
echo "Passwort: $PASSWORD"
|
||||||
|
echo "Distinguished Name:"
|
||||||
|
echo "$DN"
|
||||||
|
echo "------------------------------------------"
|
||||||
|
echo "Bitte notiere Benutzername, Passwort und DN sicher."
|
67
scripts/mailcow-update
Normal file
67
scripts/mailcow-update
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Konfiguration
|
||||||
|
MAILCOW_PATH="/opt/mailcow-dockerized"
|
||||||
|
SPOOL_DIR="/var/lib/check_mk_agent/spool"
|
||||||
|
INTERVAL_SECONDS=87000 # z. B. alle 24 Stunden + Toleranz
|
||||||
|
SPOOL_FILE="${SPOOL_DIR}/${INTERVAL_SECONDS}_mailcow_update"
|
||||||
|
|
||||||
|
# Sicherstellen, dass das Spool-Verzeichnis existiert
|
||||||
|
mkdir -p "$SPOOL_DIR"
|
||||||
|
|
||||||
|
# Temporäre Datei vorbereiten
|
||||||
|
TMP_FILE="$(mktemp)"
|
||||||
|
|
||||||
|
# Header für Local Check
|
||||||
|
echo "<<<local>>>" > "$TMP_FILE"
|
||||||
|
|
||||||
|
# In das Mailcow-Verzeichnis wechseln
|
||||||
|
if ! cd "$MAILCOW_PATH"; then
|
||||||
|
echo "2 Mailcow_Update - ERROR: Verzeichnis $MAILCOW_PATH nicht gefunden" >> "$TMP_FILE"
|
||||||
|
echo "3 Mailcow_Version - UNKNOWN: Verzeichnis nicht gefunden" >> "$TMP_FILE"
|
||||||
|
mv "$TMP_FILE" "$SPOOL_FILE"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Aktuelle Uhrzeit für Log
|
||||||
|
NOW="$(date '+%Y-%m-%d %H:%M:%S')"
|
||||||
|
|
||||||
|
# Mailcow-Version auslesen
|
||||||
|
GIT_TAG=$(git describe --tags --abbrev=0 2>/dev/null)
|
||||||
|
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null)
|
||||||
|
|
||||||
|
if [[ -n "$GIT_TAG" ]]; then
|
||||||
|
echo "0 Mailcow_Version - OK: Version $GIT_TAG ($GIT_COMMIT)" >> "$TMP_FILE"
|
||||||
|
else
|
||||||
|
echo "0 Mailcow_Version - OK: Commit $GIT_COMMIT (kein Tag)" >> "$TMP_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Auf Updates prüfen
|
||||||
|
UPDATE_CHECK=$(./update.sh --check 2>&1)
|
||||||
|
if echo "$UPDATE_CHECK" | grep -q "No updates available"; then
|
||||||
|
echo "0 Mailcow_Update - OK: Kein Update verfügbar ($NOW)" >> "$TMP_FILE"
|
||||||
|
mv "$TMP_FILE" "$SPOOL_FILE"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Erstes Update versuchen
|
||||||
|
UPDATE_OUTPUT=$(./update.sh --force --skip-ping-check 2>&1)
|
||||||
|
EXIT_CODE=$?
|
||||||
|
|
||||||
|
# Sonderfall: Skript wurde geändert und muss erneut ausgeführt werden
|
||||||
|
if echo "$UPDATE_OUTPUT" | grep -q "update.sh changed, please run this script again"; then
|
||||||
|
UPDATE_OUTPUT_2=$(./update.sh --force --skip-ping-check 2>&1)
|
||||||
|
EXIT_CODE=$?
|
||||||
|
UPDATE_OUTPUT="${UPDATE_OUTPUT}\n--- retry ---\n${UPDATE_OUTPUT_2}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$EXIT_CODE" -eq 0 ]; then
|
||||||
|
echo "0 Mailcow_Update - OK: Update erfolgreich durchgeführt ($NOW)" >> "$TMP_FILE"
|
||||||
|
else
|
||||||
|
echo "2 Mailcow_Update - CRITICAL: Update fehlgeschlagen ($NOW)" >> "$TMP_FILE"
|
||||||
|
echo "$UPDATE_OUTPUT" >> "$TMP_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ergebnis schreiben
|
||||||
|
mv "$TMP_FILE" "$SPOOL_FILE"
|
||||||
|
exit "$EXIT_CODE"
|
103
scripts/zmb-ad_auto-map-root.sh
Normal file
103
scripts/zmb-ad_auto-map-root.sh
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SMB_CONF="/etc/samba/smb.conf"
|
||||||
|
USERMAP_FILE="/etc/samba/user.map"
|
||||||
|
KEYTAB_PATH="/root/admin.keytab"
|
||||||
|
SYSTEMD_SERVICE="/etc/systemd/system/kinit-admin.service"
|
||||||
|
SYSTEMD_TIMER="/etc/systemd/system/kinit-admin.timer"
|
||||||
|
BASH_PROFILE="/root/.bash_profile"
|
||||||
|
|
||||||
|
# 1. Domain & Realm aus smb.conf auslesen
|
||||||
|
DOMAIN_NAME=$(awk -F '=' '/^[[:space:]]*workgroup[[:space:]]*=/ {gsub(/ /, "", $2); print $2}' "$SMB_CONF")
|
||||||
|
REALM_NAME=$(awk -F '=' '/^[[:space:]]*realm[[:space:]]*=/ {gsub(/ /, "", $2); print toupper($2)}' "$SMB_CONF")
|
||||||
|
|
||||||
|
if [[ -z "$DOMAIN_NAME" || -z "$REALM_NAME" ]]; then
|
||||||
|
echo "[FEHLER] Konnte 'workgroup' oder 'realm' aus smb.conf nicht auslesen."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[INFO] Domain: $DOMAIN_NAME"
|
||||||
|
echo "[INFO] Realm: $REALM_NAME"
|
||||||
|
|
||||||
|
# 2. user.map schreiben
|
||||||
|
echo "!root = ${DOMAIN_NAME}\\Administrator" > "$USERMAP_FILE"
|
||||||
|
echo "[OK] Benutzerzuordnung geschrieben in $USERMAP_FILE"
|
||||||
|
|
||||||
|
# 3. smb.conf patchen
|
||||||
|
if ! grep -q "^username map *= *$USERMAP_FILE" "$SMB_CONF"; then
|
||||||
|
sed -i "/^\[global\]/a username map = $USERMAP_FILE" "$SMB_CONF"
|
||||||
|
echo "[OK] smb.conf wurde um 'username map' ergänzt."
|
||||||
|
else
|
||||||
|
echo "[INFO] 'username map' bereits gesetzt."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Keytab erzeugen
|
||||||
|
echo "[INFO] Erzeuge Keytab für Administrator..."
|
||||||
|
samba-tool domain exportkeytab "$KEYTAB_PATH" --principal="administrator@$REALM_NAME"
|
||||||
|
chmod 600 "$KEYTAB_PATH"
|
||||||
|
echo "[OK] Keytab gespeichert unter $KEYTAB_PATH"
|
||||||
|
|
||||||
|
# 5. systemd-Service + Timer für automatisches kinit
|
||||||
|
echo "[INFO] Erstelle systemd-Service & Timer..."
|
||||||
|
|
||||||
|
cat > "$SYSTEMD_SERVICE" <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Kerberos Kinit für Administrator
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/bin/kinit -kt $KEYTAB_PATH administrator@$REALM_NAME
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cat > "$SYSTEMD_TIMER" <<EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Kerberos Kinit für Administrator (Boot)
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnBootSec=10sec
|
||||||
|
Unit=kinit-admin.service
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Aktivieren
|
||||||
|
systemctl daemon-reexec
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable --now kinit-admin.timer
|
||||||
|
|
||||||
|
# 6. root-Login: .bash_profile anpassen
|
||||||
|
echo "[INFO] Ergänze .bash_profile von root, um bei Login kinit auszuführen..."
|
||||||
|
mkdir -p "$(dirname "$BASH_PROFILE")"
|
||||||
|
touch "$BASH_PROFILE"
|
||||||
|
|
||||||
|
# Block nur hinzufügen, wenn er nicht bereits vorhanden ist
|
||||||
|
if ! grep -q "kinit -kt $KEYTAB_PATH administrator@$REALM_NAME" "$BASH_PROFILE"; then
|
||||||
|
cat >> "$BASH_PROFILE" <<EOF
|
||||||
|
|
||||||
|
# Automatisches Kerberos-Ticket beim Login holen
|
||||||
|
if ! klist -s; then
|
||||||
|
echo "[INFO] Kein gültiges Kerberos-Ticket – führe kinit aus..."
|
||||||
|
kinit -kt $KEYTAB_PATH administrator@$REALM_NAME && echo "[INFO] Kerberos-Ticket aktualisiert."
|
||||||
|
fi
|
||||||
|
EOF
|
||||||
|
echo "[OK] .bash_profile angepasst."
|
||||||
|
else
|
||||||
|
echo "[INFO] .bash_profile enthält bereits kinit-Befehl."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. samba-ad-dc neu starten
|
||||||
|
echo "[INFO] Starte samba-ad-dc neu..."
|
||||||
|
systemctl restart samba-ad-dc
|
||||||
|
|
||||||
|
# 8. Testausgaben
|
||||||
|
echo "[INFO] getent passwd root:"
|
||||||
|
getent passwd root || echo "[WARNUNG] Kein Eintrag für root"
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "[INFO] Test: samba-tool user list (falls kein Passwort kommt, war's erfolgreich):"
|
||||||
|
samba-tool user list | head -n 5 || echo "[WARNUNG] Fehler bei samba-tool"
|
||||||
|
|
@@ -17,7 +17,7 @@ chmod a+r /etc/apt/keyrings/docker.gpg
|
|||||||
# Add the repository to Apt sources:
|
# Add the repository to Apt sources:
|
||||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
apt-get update
|
apt-get update
|
||||||
DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get install -y -qq rsync docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get install -y -qq rsync docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin jq
|
||||||
DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get purge -y -qq postfix
|
DEBIAN_FRONTEND=noninteractive DEBIAN_PRIORITY=critical apt-get purge -y -qq postfix
|
||||||
|
|
||||||
SECRET=$(random_password)
|
SECRET=$(random_password)
|
||||||
@@ -73,6 +73,21 @@ EOF
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# fix docker errors for slow machines
|
||||||
|
cat << EOF > /etc/docker/daemon.json
|
||||||
|
{
|
||||||
|
"default-ulimits": {
|
||||||
|
"nproc": {
|
||||||
|
"name": "nproc",
|
||||||
|
"soft": -1,
|
||||||
|
"hard": -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
systemctl restart docker
|
||||||
|
|
||||||
|
|
||||||
cd /opt
|
cd /opt
|
||||||
git clone https://github.com/mailcow/mailcow-dockerized
|
git clone https://github.com/mailcow/mailcow-dockerized
|
||||||
cd mailcow-dockerized
|
cd mailcow-dockerized
|
||||||
@@ -104,6 +119,8 @@ DBUSER=mailcow
|
|||||||
DBPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
DBPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
||||||
DBROOT=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
DBROOT=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
||||||
|
|
||||||
|
REDISPASS=$(LC_ALL=C </dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
||||||
|
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
# HTTP/S Bindings
|
# HTTP/S Bindings
|
||||||
# ------------------------------
|
# ------------------------------
|
||||||
@@ -367,23 +384,6 @@ HTTP_REDIRECT=y
|
|||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
cat << EOF > data/conf/nginx/redirect.conf
|
|
||||||
server {
|
|
||||||
root /web;
|
|
||||||
listen 80 default_server;
|
|
||||||
listen [::]:80 default_server;
|
|
||||||
include /etc/nginx/conf.d/server_name.active;
|
|
||||||
if ( \$request_uri ~* "%0A|%0D" ) { return 403; }
|
|
||||||
location ^~ /.well-known/acme-challenge/ {
|
|
||||||
allow all;
|
|
||||||
default_type "text/plain";
|
|
||||||
}
|
|
||||||
location / {
|
|
||||||
return 301 https://\$host\$uri\$is_args\$args;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat << EOF > /etc/cron.daily/mailcowbackup
|
cat << EOF > /etc/cron.daily/mailcowbackup
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
Reference in New Issue
Block a user