文件
hyb-oa/deploy/trialrun/install-deployment-contract-refresh.sh

167 行
6.0 KiB
Bash
可执行文件

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SOURCE="$ROOT_DIR/scripts/refresh-deployment-contract.sh"
PUBLIC_KEY_FILE="${DEPLOY_REFRESH_PUBLIC_KEY_FILE:-}"
MARKER="# hyb-oa-managed-deployment-contract-refresh"
MODE="${1:-install}"
INSTALL_TEST_MODE=0
ROOT_PREFIX=""
fail() {
echo "[deployment-contract-refresh-installer][ERROR] $1" >&2
exit 1
}
if [[ "$(id -u)" != "0" ]]; then
test_root="${HYB_CONTRACT_REFRESH_INSTALL_TEST_ROOT:-}"
if [[ "$test_root" =~ ^/tmp/[A-Za-z0-9._/-]+$ && "$test_root" != */ \
&& "$test_root" != *"//"* && "/$test_root/" != *"/../"* ]]; then
INSTALL_TEST_MODE=1
ROOT_PREFIX="$test_root"
else
fail "root privileges are required"
fi
fi
TARGET="${ROOT_PREFIX}/usr/local/sbin/hyb-oa-deployment-contract-refresh"
AUTHORIZED_KEYS="${ROOT_PREFIX}/root/.ssh/authorized_keys"
SSH_DIRECTORY="${ROOT_PREFIX}/root/.ssh"
[[ -f "$SOURCE" && ! -L "$SOURCE" ]] || fail "reviewed refresh source is missing"
remove_managed_entry() {
python3 - "$AUTHORIZED_KEYS" "$MARKER" "$TARGET" "$INSTALL_TEST_MODE" <<'PY'
import os, sys, tempfile
path, marker, target, test_mode = sys.argv[1:]
if not os.path.exists(path):
raise SystemExit(0)
with open(path, encoding="utf-8") as handle:
lines = handle.read().splitlines()
result = []
index = 0
forced_prefix = f'command="{target}",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty,no-user-rc '
while index < len(lines):
line = lines[index]
if line == marker:
if index + 1 >= len(lines) or not lines[index + 1].startswith(forced_prefix):
raise SystemExit("managed forced-command marker is malformed")
index += 2
continue
result.append(line)
index += 1
directory = os.path.dirname(path)
fd, temp_path = tempfile.mkstemp(prefix=".authorized_keys.", dir=directory, text=True)
try:
with os.fdopen(fd, "w", encoding="utf-8") as handle:
if result:
handle.write("\n".join(result) + "\n")
handle.flush()
os.fsync(handle.fileno())
os.chmod(temp_path, 0o600)
if test_mode != "1":
os.chown(temp_path, 0, 0)
os.replace(temp_path, path)
finally:
if os.path.exists(temp_path):
os.unlink(temp_path)
PY
}
install_entry() {
[[ -n "$PUBLIC_KEY_FILE" && -f "$PUBLIC_KEY_FILE" && ! -L "$PUBLIC_KEY_FILE" ]] \
|| fail "DEPLOY_REFRESH_PUBLIC_KEY_FILE must name a regular public-key file"
key_line="$(sed -e '/^[[:space:]]*#/d' -e '/^[[:space:]]*$/d' "$PUBLIC_KEY_FILE")"
[[ "$(printf '%s\n' "$key_line" | wc -l)" -eq 1 ]] \
|| fail "public-key file must contain exactly one key"
read -r key_type key_blob key_comment <<<"$key_line"
[[ "$key_type" =~ ^(ssh-ed25519|ecdsa-sha2-nistp(256|384|521)|ssh-rsa)$ \
&& "$key_blob" =~ ^[A-Za-z0-9+/]+={0,3}$ ]] \
|| fail "public key format is invalid"
if [[ "$INSTALL_TEST_MODE" == "0" ]]; then
install -d -o root -g root -m 0700 "$SSH_DIRECTORY"
else
install -d -m 0700 "$SSH_DIRECTORY"
fi
[[ ! -L "$SSH_DIRECTORY" && ! -L "$AUTHORIZED_KEYS" ]] \
|| fail "root SSH paths must not be symbolic links"
touch "$AUTHORIZED_KEYS"
if [[ "$INSTALL_TEST_MODE" == "0" ]]; then
chown root:root "$AUTHORIZED_KEYS"
fi
chmod 0600 "$AUTHORIZED_KEYS"
PUBLIC_KEY_BLOB="$key_blob" python3 - "$AUTHORIZED_KEYS" "$MARKER" "$TARGET" "$key_type" "$key_line" "$INSTALL_TEST_MODE" <<'PY'
import os, re, sys, tempfile
path, marker, target, key_type, key_line, test_mode = sys.argv[1:]
key_blob = os.environ["PUBLIC_KEY_BLOB"]
with open(path, encoding="utf-8") as handle:
lines = handle.read().splitlines()
unmanaged = []
kept = []
pattern = re.compile(r"(?:^|\s)(?:ssh-ed25519|ecdsa-sha2-nistp(?:256|384|521)|ssh-rsa)\s+([A-Za-z0-9+/=]+)(?:\s|$)")
forced_prefix = f'command="{target}",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty,no-user-rc '
index = 0
while index < len(lines):
line = lines[index]
if line == marker:
if index + 1 >= len(lines) or not lines[index + 1].startswith(forced_prefix):
raise SystemExit("managed forced-command marker is malformed")
index += 2
continue
match = pattern.search(line)
if match and match.group(1) == key_blob:
unmanaged.append(line)
kept.append(line)
index += 1
if unmanaged:
raise SystemExit("dedicated key already has unmanaged or unrestricted root authorization")
forced = f'command="{target}",no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty,no-user-rc {key_line}'
kept.extend([marker, forced])
directory = os.path.dirname(path)
fd, temp_path = tempfile.mkstemp(prefix=".authorized_keys.", dir=directory, text=True)
try:
with os.fdopen(fd, "w", encoding="utf-8") as handle:
handle.write("\n".join(kept) + "\n")
handle.flush()
os.fsync(handle.fileno())
os.chmod(temp_path, 0o600)
if test_mode != "1":
os.chown(temp_path, 0, 0)
os.replace(temp_path, path)
finally:
if os.path.exists(temp_path):
os.unlink(temp_path)
PY
}
case "$MODE" in
install)
if [[ "$INSTALL_TEST_MODE" == "0" ]]; then
install -d -o root -g root -m 0755 "$(dirname "$TARGET")"
install -o root -g root -m 0755 "$SOURCE" "$TARGET"
[[ -f "$TARGET" && ! -L "$TARGET" \
&& "$(stat -c %u:%g:%a "$TARGET")" == "0:0:755" ]] \
|| fail "installed target ownership or mode is invalid"
probe_env=()
else
install -d -m 0755 "$(dirname "$TARGET")"
install -m 0755 "$SOURCE" "$TARGET"
[[ -f "$TARGET" && ! -L "$TARGET" && "$(stat -c %a "$TARGET")" == "755" ]] \
|| fail "installed target mode is invalid"
probe_env=(env HYB_CONTRACT_REFRESH_TEST_ROOT="$ROOT_PREFIX")
fi
"${probe_env[@]}" env SSH_ORIGINAL_COMMAND=probe "$TARGET" >/dev/null \
|| fail "installed target probe failed"
install_entry
echo "[deployment-contract-refresh-installer][PASS] forced command installed"
;;
uninstall)
remove_managed_entry
echo "[deployment-contract-refresh-installer][PASS] authorization removed; target retained"
;;
*)
fail "unsupported mode"
;;
esac