|
| 1 | +#!/usr/bin/env bash |
| 2 | +#/ Usage: ghe-backup-secrets <host> |
| 3 | +#/ |
| 4 | +#/ Note: This script typically isn't called directly. It's invoked by the |
| 5 | +#/ ghe-backup command. |
| 6 | +set -e |
| 7 | + |
| 8 | +# Bring in the backup configuration |
| 9 | +# shellcheck source=share/github-backup-utils/ghe-backup-config |
| 10 | +. "$( dirname "${BASH_SOURCE[0]}" )/ghe-backup-config" |
| 11 | + |
| 12 | +# Grab the host |
| 13 | +host="$GHE_HOSTNAME" |
| 14 | + |
| 15 | +# Perform a host-check and establish GHE_REMOTE_XXX variables. |
| 16 | +ghe_remote_version_required "$host" |
| 17 | + |
| 18 | + |
| 19 | +# Function to backup a secret setting to a file. |
| 20 | +# backup-secret <description> <file-name> <setting-name> [--best-effort] |
| 21 | +backup-secret() { |
| 22 | + best_effort=false |
| 23 | + description="" |
| 24 | + file="" |
| 25 | + setting="" |
| 26 | + count=0 |
| 27 | + |
| 28 | + while [ $# -gt 0 ]; do |
| 29 | + case "$1" in |
| 30 | + --best-effort) |
| 31 | + shift 1 |
| 32 | + best_effort=true |
| 33 | + ;; |
| 34 | + *) |
| 35 | + case $count in |
| 36 | + 0) |
| 37 | + description=$1 |
| 38 | + ;; |
| 39 | + 1) |
| 40 | + file=$1 |
| 41 | + ;; |
| 42 | + 2) |
| 43 | + setting=$1 |
| 44 | + ;; |
| 45 | + *) |
| 46 | + >&2 echo "Too many arguments" |
| 47 | + ;; |
| 48 | + esac |
| 49 | + count=$((count+1)) |
| 50 | + shift 1 |
| 51 | + esac |
| 52 | + done |
| 53 | + |
| 54 | + log_info "* Transferring $description ..." 1>&3 |
| 55 | + ghe-ssh "$host" -- ghe-config "$setting" > "$file+" || ( |
| 56 | + if [ "$best_effort" = "false" ]; then |
| 57 | + echo "Warning: $description not set" >&2 |
| 58 | + fi |
| 59 | + ) |
| 60 | + if [ -n "$(cat "$file+")" ]; then |
| 61 | + mv "$file+" "$file" |
| 62 | + else |
| 63 | + unlink "$file+" |
| 64 | + fi |
| 65 | +} |
| 66 | + |
| 67 | +bm_start "$(basename $0)" |
| 68 | + |
| 69 | +# Create the snapshot directory if needed and change into it. |
| 70 | +mkdir -p "$GHE_SNAPSHOT_DIR" |
| 71 | +cd "$GHE_SNAPSHOT_DIR" |
| 72 | + |
| 73 | +log_info "* Transferring secrets data ..." 1>&3 |
| 74 | + |
| 75 | +backup-secret "management console password" "manage-password" "secrets.manage" |
| 76 | +backup-secret "password pepper" "password-pepper" "secrets.github.user-password-secrets" |
| 77 | +backup-secret "kredz.credz HMAC key" "kredz-credz-hmac" "secrets.kredz.credz-hmac-secret" |
| 78 | +backup-secret "kredz.varz HMAC key" "kredz-varz-hmac" "secrets.kredz.varz-hmac-secret" |
| 79 | + |
| 80 | +# backup encryption keying material and create backup value current encryption for GHES 3.7.0 onwards |
| 81 | +# this is for forwards compatibility with GHES 3.8.0 onwards |
| 82 | +if [ "$(version $GHE_REMOTE_VERSION)" -ge "$(version 3.7.0)" ]; then |
| 83 | + backup-secret "encrypted column encryption keying material" "encrypted-column-encryption-keying-material" "secrets.github.encrypted-column-keying-material" |
| 84 | + cat "$GHE_SNAPSHOT_DIR/encrypted-column-encryption-keying-material" | sed 's:.*;::' > "$GHE_SNAPSHOT_DIR/encrypted-column-current-encryption-key" |
| 85 | +fi |
| 86 | + |
| 87 | +if [ "$(version $GHE_REMOTE_VERSION)" -ge "$(version 3.8.0)" ]; then |
| 88 | + backup-secret "secret scanning encrypted secrets current storage key" "secret-scanning-encrypted-secrets-current-storage-key" "secrets.secret-scanning.encrypted-secrets-current-storage-key" |
| 89 | + backup-secret "secret scanning encrypted secrets delimited storage keys" "secret-scanning-encrypted-secrets-delimited-storage-keys" "secrets.secret-scanning.encrypted-secrets-delimited-storage-keys" |
| 90 | + backup-secret "secret scanning encrypted secrets current shared transit key" "secret-scanning-encrypted-secrets-current-shared-transit-key" "secrets.secret-scanning.encrypted-secrets-current-shared-transit-key" |
| 91 | + backup-secret "secret scanning encrypted secrets delimited shared transit keys" "secret-scanning-encrypted-secrets-delimited-shared-transit-keys" "secrets.secret-scanning.encrypted-secrets-delimited-shared-transit-keys" |
| 92 | +fi |
| 93 | + |
| 94 | +if [ "$(version $GHE_REMOTE_VERSION)" -ge "$(version 3.11.0)" ]; then |
| 95 | + backup-secret "secret scanning encrypted content keys" "secret-scanning-user-content-delimited-encryption-root-keys" "secrets.secret-scanning.secret-scanning-user-content-delimited-encryption-root-keys" |
| 96 | +fi |
| 97 | + |
| 98 | +# Backup argon secrets for multiuser from ghes version 3.8 onwards |
| 99 | +if [[ "$(version $GHE_REMOTE_VERSION)" -ge "$(version 3.8.0)" && "$(version $GHE_REMOTE_VERSION)" -lt "$(version 3.8.2)" ]]; then |
| 100 | + backup-secret "management console argon2 secret" "manage-argon-secret" "secrets.manage-auth.argon-secret" |
| 101 | +fi |
| 102 | + |
| 103 | +# Backup external MySQL password if running external MySQL DB. |
| 104 | +if is_service_external 'mysql'; then |
| 105 | + backup-secret "external MySQL password" "external-mysql-password" "secrets.external.mysql" |
| 106 | +fi |
| 107 | + |
| 108 | +# Backup Actions settings. |
| 109 | +if ghe-ssh "$host" -- ghe-config --true app.actions.enabled; then |
| 110 | + backup-secret "Actions configuration database login" "actions-config-db-login" "secrets.actions.ConfigurationDatabaseSqlLogin" |
| 111 | + backup-secret "Actions configuration database password" "actions-config-db-password" "secrets.actions.ConfigurationDatabaseSqlPassword" |
| 112 | + backup-secret "Actions framework access token key secret" "actions-framework-access-token" "secrets.actions.FrameworkAccessTokenKeySecret" --best-effort |
| 113 | + backup-secret "Actions Url signing HMAC key primary" "actions-url-signing-hmac-key-primary" "secrets.actions.UrlSigningHmacKeyPrimary" |
| 114 | + backup-secret "Actions Url signing HMAC key secondary" "actions-url-signing-hmac-key-secondary" "secrets.actions.UrlSigningHmacKeySecondary" |
| 115 | + backup-secret "Actions OAuth S2S signing cert" "actions-oauth-s2s-signing-cert" "secrets.actions.OAuthS2SSigningCert" |
| 116 | + backup-secret "Actions OAuth S2S signing key" "actions-oauth-s2s-signing-key" "secrets.actions.OAuthS2SSigningKey" |
| 117 | + backup-secret "Actions OAuth S2S signing cert thumbprint" "actions-oauth-s2s-signing-cert-thumbprint" "secrets.actions.OAuthS2SSigningCertThumbprint" |
| 118 | + backup-secret "Actions primary encryption cert thumbprint" "actions-primary-encryption-cert-thumbprint" "secrets.actions.PrimaryEncryptionCertificateThumbprint" |
| 119 | + backup-secret "Actions AAD cert thumbprint" "actions-aad-cert-thumbprint" "secrets.actions.AADCertThumbprint" --best-effort |
| 120 | + backup-secret "Actions delegated auth cert thumbprint" "actions-delegated-auth-cert-thumbprint" "secrets.actions.DelegatedAuthCertThumbprint" --best-effort |
| 121 | + backup-secret "Actions runtime service principal cert" "actions-runtime-service-principal-cert" "secrets.actions.RuntimeServicePrincipalCertificate" --best-effort |
| 122 | + backup-secret "Actions S2S encryption cert" "actions-s2s-encryption-cert" "secrets.actions.S2SEncryptionCertificate" |
| 123 | + backup-secret "Actions secondary encryption cert thumbprint" "actions-secondary-encryption-cert-thumbprint" "secrets.actions.SecondaryEncryptionCertificateThumbprint" |
| 124 | + backup-secret "Actions service principal cert" "actions-service-principal-cert" "secrets.actions.ServicePrincipalCertificate" --best-effort |
| 125 | + backup-secret "Actions SPS validation cert thumbprint" "actions-sps-validation-cert-thumbprint" "secrets.actions.SpsValidationCertThumbprint" |
| 126 | + backup-secret "Actions storage container prefix" "actions-storage-container-prefix" "secrets.actions.storage.container-prefix" |
| 127 | + |
| 128 | + backup-secret "Actions Launch secrets encryption/decryption" "actions-launch-secrets-private-key" "secrets.launch.actions-secrets-private-key" |
| 129 | + backup-secret "Actions Launch deployer HMAC key" "actions-launch-deployer-hmac" "secrets.launch.deployer-hmac-secret" |
| 130 | + backup-secret "Actions Launch Client id" "actions-launch-client-id" "secrets.launch.client-id" |
| 131 | + backup-secret "Actions Launch Client secret" "actions-launch-client-secret" "secrets.launch.client-secret" |
| 132 | + backup-secret "Actions Launch receiver webhook secret" "actions-launch-receiver-webhook-secret" "secrets.launch.receiver-webhook-secret" |
| 133 | + backup-secret "Actions Launch app private key" "actions-launch-app-private-key" "secrets.launch.app-private-key" |
| 134 | + backup-secret "Actions Launch app public key" "actions-launch-app-public-key" "secrets.launch.app-public-key" |
| 135 | + backup-secret "Actions Launch app id" "actions-launch-app-id" "secrets.launch.app-id" |
| 136 | + backup-secret "Actions Launch app relay id" "actions-launch-app-relay-id" "secrets.launch.app-relay-id" |
| 137 | + backup-secret "Actions Launch action runner secret" "actions-launch-action-runner-secret" "secrets.launch.action-runner-secret" |
| 138 | + backup-secret "Actions Launch service cert" "actions-launch-azp-app-cert" "secrets.launch.azp-app-cert" |
| 139 | + backup-secret "Actions Launch service private key" "actions-launch-app-app-private-key" "secrets.launch.azp-app-private-key" |
| 140 | +fi |
| 141 | + |
| 142 | +if ghe-ssh "$host" -- ghe-config --true app.packages.enabled; then |
| 143 | + backup-secret "Packages aws access key" "packages-aws-access-key" "secrets.packages.aws-access-key" |
| 144 | + backup-secret "Packages aws secret key" "packages-aws-secret-key" "secrets.packages.aws-secret-key" |
| 145 | + backup-secret "Packages s3 bucket" "packages-s3-bucket" "secrets.packages.s3-bucket" |
| 146 | + backup-secret "Packages storage service url" "packages-service-url" "secrets.packages.service-url" |
| 147 | + backup-secret "Packages blob storage type" "packages-blob-storage-type" "secrets.packages.blob-storage-type" |
| 148 | + backup-secret "Packages azure connection string" "packages-azure-connection-string" "secrets.packages.azure-connection-string" |
| 149 | + backup-secret "Packages azure container name" "packages-azure-container-name" "secrets.packages.azure-container-name" |
| 150 | +fi |
| 151 | + |
| 152 | +# Backup Chat Integration settings |
| 153 | +if ghe-ssh "$host" -- ghe-config --true app.chatops.enabled; then |
| 154 | + backup-secret "Chat Integration MSTeams app id" "chatops-msteams-app-id" "secrets.chatops.msteams.app-id" |
| 155 | + backup-secret "Chat Integration MSTeams app password" "chatops-msteams-app-password" "secrets.chatops.msteams.app-password" |
| 156 | + backup-secret "Chat Integration MSTeams public endpoint" "chatops-msteams-app-public-endpoint" "secrets.chatops.msteams.public-endpoint" |
| 157 | + backup-secret "Chat Integration MSTeams bot handle" "chatops-msteams-bot-handle" "secrets.chatops.msteams.bot-handle" |
| 158 | + backup-secret "Chat Integration MSTeams bot name" "chatops-msteams-bot-name" "secrets.chatops.msteams.bot-name" |
| 159 | + backup-secret "Chat Integration Slack app id" "chatops-slack-app-id" "secrets.chatops.slack.app-id" |
| 160 | + backup-secret "Chat Integration Slack client id" "chatops-slack-client-id" "secrets.chatops.slack.client-id" |
| 161 | + backup-secret "Chat Integration Slack client secret" "chatops-slack-client-secret" "secrets.chatops.slack.client-secret" |
| 162 | + backup-secret "Chat Integration Slack verification token" "chatops-slack-verification-token" "secrets.chatops.slack.verification-token" |
| 163 | + backup-secret "Chat Integration Slack config token" "chatops-slack-config-token" "secrets.chatops.slack.config-token" |
| 164 | + backup-secret "Chat Integration Slack public endpoint" "chatops-slack-public-endpoint" "secrets.chatops.slack.public-endpoint" |
| 165 | + backup-secret "Chat Integration Slack signing secret" "chatops-slack-signing-secret" "secrets.chatops.slack.signing-secret" |
| 166 | + backup-secret "Chat Integration Slack app level token" "chatops-slack-app-level-token" "secrets.chatops.slack.app-level-token" |
| 167 | + backup-secret "Chat Integration Slack slack command" "chatops-slack-slash-command" "secrets.chatops.slack.slash-command" |
| 168 | + backup-secret "Chat Integration Slack app name" "chatops-slack.app-name" "secrets.chatops.slack.app-name" |
| 169 | + backup-secret "Chat Integration Slack socket mode" "chatops-slack.socket-mode" "secrets.chatops.slack.socket-mode" |
| 170 | + backup-secret "Chat Integration public endpoint" "chatops-public-endpoint" "secrets.chatops.public-endpoint" |
| 171 | + backup-secret "Chat Integration app type" "chatops-app-type" "secrets.chatops.app-type" |
| 172 | + backup-secret "Chat Integration app id teams" "chatops-app-id-teams" "secrets.chatops.app-id-teams" |
| 173 | + backup-secret "Chat Integration webhook secret teams" "chatops-webhook-secret-teams" "secrets.chatops.webhook-secret-teams" |
| 174 | + backup-secret "Chat Integration client secret teams" "chatops-client-secret-teams" "secrets.chatops.client-secret-teams" |
| 175 | + backup-secret "Chat Integration clien id teams" "chatops-client-id-teams" "secrets.chatops.client-id-teams" |
| 176 | + backup-secret "Chat Integration storage secret" "chatops-storage-secret" "secrets.chatops.storage-secret" |
| 177 | + backup-secret "Chat Integration session secret" "chatops-session-secret" "secrets.chatops.session-secret" |
| 178 | + backup-secret "Chat Integration app id slack" "chatops-app-id-slack" "secrets.chatops.app-id-slack" |
| 179 | + backup-secret "Chat Integration webhook secret slack" "chatops-webhook-secret-slack" "secrets.chatops.webhook-secret-slack" |
| 180 | + backup-secret "Chat Integration client secret slack" "chatops-client-secret-slack" "secrets.chatops.client-secret-slack" |
| 181 | + backup-secret "Chat Integration client id slack" "chatops-client-id-slack" "secrets.chatops.client-id-slack" |
| 182 | +fi |
| 183 | + |
| 184 | +bm_end "$(basename $0)" |
| 185 | + |
| 186 | +exit 0 |
0 commit comments