#!/usr/bin/env bash # ============================================================================= # Enveloppe de la cle SSH de deploiement # ============================================================================= # Reference depuis ~deploy/.ssh/authorized_keys sur app-01 : # # restrict,pty,command="/opt/xpeditis/infra-prod/scripts/ssh-deploy-wrapper.sh" ssh-ed25519 AAAA... github-actions-prod # # Le `command=` d'OpenSSH ignore ce que le client demande et execute ce script, # en placant la commande d'origine dans SSH_ORIGINAL_COMMAND. Une cle volee ne # donne donc pas un shell : elle ne peut lancer que ce qui est autorise ici. set -euo pipefail CMD="${SSH_ORIGINAL_COMMAND:-}" LOG_TAG=xpeditis-ssh-deploy deny() { logger -t "$LOG_TAG" -- "REFUS: ${CMD}" echo "Commande non autorisee pour cette cle." >&2 exit 126 } logger -t "$LOG_TAG" -- "DEMANDE: ${CMD}" case "$CMD" in # rsync doit pouvoir se lancer en mode serveur pour recevoir infra/prod. # --server et --sender uniquement, chemin de destination contraint. "rsync --server "*"/opt/xpeditis/infra-prod/"*) exec $CMD ;; # Deploiement d'une version. Le tag est valide par une expression stricte : # sans cela, `deploy.sh "; rm -rf /"` serait accepte. "deploy "*) TAG="${CMD#deploy }" [[ "$TAG" =~ ^prod-[a-f0-9]{7,40}$ ]] || deny exec /opt/xpeditis/infra-prod/scripts/deploy.sh "$TAG" ;; # Retour arriere d'urgence. "rollback") kubectl -n xpeditis-prod rollout undo deploy/xpeditis-backend kubectl -n xpeditis-prod rollout undo deploy/xpeditis-frontend exec kubectl -n xpeditis-prod rollout status deploy/xpeditis-backend --timeout=180s ;; # Diagnostic en lecture seule. "status") kubectl -n xpeditis-prod get pods,deploy -o wide exec kubectl -n xpeditis-prod get events --sort-by=.lastTimestamp | tail -20 ;; *) deny ;; esac