Update SSH密钥部署及安全加固脚本

This commit is contained in:
2025-11-16 15:47:43 +08:00
committed by GitHub
parent 057cbbae8b
commit f2e9615fd0

View File

@@ -1,218 +1,31 @@
#!/bin/bash
# 完全自动化SSH密钥部署脚本
# 功能一键生成通用SSH密钥并自动部署到当前服务器
# 特性:
# 1. 完全自动化,无需任何交互
# 2. 生成通用密钥对固定密码88888888
# 3. 自动将公钥部署到当前服务器的authorized_keys
# 4. 自动加固SSH配置(禁用密码登录)
# 5. 生成的密钥可在多台服务器上通用
# 固定密码SSH配置脚本
# 所有服务器将使用相同的预定义32位密码: J7#p9X2mY4zR6v8S1qN3cF5hT0dW8eB2
# 配置参数
KEY_DIR="$HOME/.ssh"
KEY_NAME="universal_ssh_key"
KEY_PASS="88888888"
KEY_TYPE="ed25519"
SSH_PORT="22"
BACKUP_DIR="/tmp/ssh_setup_backup_$(date +%s)"
FIXED_PASSWORD="J7#p9X2mY4zR6v8S1qN3cF5hT0dW8eB2"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# 日志函数
log() {
echo -e "$(date '+%Y-%m-%d %H:%M:%S') $1"
# 设置root密码
echo "正在设置固定密码..."
echo "root:${FIXED_PASSWORD}" | chpasswd || {
echo -e "\033[31m密码设置失败\033[0m"
exit 1
}
# 安装必要依赖
install_deps() {
log "${YELLOW}检查系统依赖...${NC}"
local pkgs=(ssh-keygen ssh sshpass expect)
local missing=()
for pkg in "${pkgs[@]}"; do
if ! command -v "$pkg" &>/dev/null; then
missing+=("$pkg")
fi
done
# 配置SSH允许密码登录
echo "配置SSH密码登录..."
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
if [ ${#missing[@]} -gt 0 ]; then
log "${YELLOW}正在安装依赖: ${missing[*]}${NC}"
if command -v apt-get &>/dev/null; then
apt-get update -qq && apt-get install -y -qq "${missing[@]}" >/dev/null || {
log "${RED}依赖安装失败${NC}"
return 1
}
elif command -v yum &>/dev/null; then
yum install -y -q "${missing[@]}" >/dev/null || {
log "${RED}依赖安装失败${NC}"
return 1
}
else
log "${RED}不支持的包管理器${NC}"
return 1
fi
fi
return 0
}
# 生成SSH密钥
generate_key() {
log "${YELLOW}正在生成SSH密钥...${NC}"
mkdir -p "$KEY_DIR" || {
log "${RED}无法创建SSH目录${NC}"
return 1
}
# 生成新密钥
ssh-keygen -t "$KEY_TYPE" -C "universal_auto_key" -N "$KEY_PASS" -f "${KEY_DIR}/${KEY_NAME}" -q || {
log "${RED}密钥生成失败${NC}"
return 1
}
# 设置正确权限
chmod 700 "$KEY_DIR"
chmod 600 "${KEY_DIR}/${KEY_NAME}"
chmod 644 "${KEY_DIR}/${KEY_NAME}.pub"
log "${GREEN}SSH密钥生成成功${NC}"
return 0
}
# 部署公钥到本机
deploy_key_locally() {
log "${YELLOW}正在部署公钥到本机...${NC}"
mkdir -p "$BACKUP_DIR"
# 备份原密钥
if [ -f "${KEY_DIR}/authorized_keys" ]; then
cp "${KEY_DIR}/authorized_keys" "${BACKUP_DIR}/authorized_keys.bak" || {
log "${RED}authorized_keys备份失败${NC}"
}
fi
# 添加新公钥
if [ -f "${KEY_DIR}/${KEY_NAME}.pub" ]; then
mkdir -p "${KEY_DIR}"
touch "${KEY_DIR}/authorized_keys"
chmod 600 "${KEY_DIR}/authorized_keys"
# 检查是否已存在相同公钥
if ! grep -q "$(cat "${KEY_DIR}/${KEY_NAME}.pub")" "${KEY_DIR}/authorized_keys"; then
cat "${KEY_DIR}/${KEY_NAME}.pub" >> "${KEY_DIR}/authorized_keys" || {
log "${RED}公钥添加失败${NC}"
return 1
}
log "${GREEN}公钥已添加到本机${NC}"
else
log "${YELLOW}相同公钥已存在,跳过添加${NC}"
fi
else
log "${RED}公钥文件不存在${NC}"
return 1
fi
return 0
}
# 安全加固SSH配置
secure_ssh() {
log "${YELLOW}正在加固SSH配置...${NC}"
# 备份原配置
cp /etc/ssh/sshd_config "${BACKUP_DIR}/sshd_config.bak" || {
log "${RED}sshd_config备份失败${NC}"
return 1
}
# 应用安全配置
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# 重新加载SSH服务
if systemctl reload sshd >/dev/null 2>&1 || service sshd reload >/dev/null 2>&1; then
log "${GREEN}SSH配置已更新并重载${NC}"
else
log "${RED}SSH服务重载失败正在回滚...${NC}"
cp "${BACKUP_DIR}/sshd_config.bak" /etc/ssh/sshd_config
return 1
fi
return 0
}
# 验证部署
verify_deployment() {
log "${YELLOW}验证密钥登录...${NC}"
# 测试本地密钥登录
if ssh -i "${KEY_DIR}/${KEY_NAME}" -o PasswordAuthentication=no -o StrictHostKeyChecking=no -o ConnectTimeout=5 localhost "echo 连接测试成功" >/dev/null 2>&1; then
log "${GREEN}密钥登录验证成功${NC}"
return 0
else
log "${RED}密钥登录验证失败${NC}"
return 1
fi
}
# 显示成功信息
show_success() {
echo -e "\n${GREEN}✔ SSH密钥部署成功${NC}"
echo -e "=============================="
echo -e "${YELLOW}重要信息:${NC}"
echo -e "密钥路径: ${KEY_DIR}/${KEY_NAME}"
echo -e "密钥密码: ${KEY_PASS}"
echo -e "\n${YELLOW}使用说明:${NC}"
echo -e "1. 此密钥可在其他服务器上使用相同方法部署"
echo -e "2. 连接到其他服务器时使用:"
echo -e " ssh -i ${KEY_DIR}/${KEY_NAME} 用户名@服务器IP"
echo -e "3. 需要输入密钥密码时使用: ${KEY_PASS}"
echo -e "\n${RED}⚠ 请确保在其他服务器部署前先备份现有密钥${NC}"
echo -e "==============================\n"
}
# 主函数
main() {
# 安装依赖
install_deps || {
log "${RED}依赖安装失败,退出脚本${NC}"
exit 1
}
# 生成密钥
generate_key || {
log "${RED}密钥生成失败,退出脚本${NC}"
exit 1
}
# 部署到本机
deploy_key_locally || {
log "${RED}本地部署失败,退出脚本${NC}"
exit 1
}
# 安全加固
secure_ssh || {
log "${RED}SSH加固失败退出脚本${NC}"
exit 1
}
# 验证部署
verify_deployment || {
log "${RED}部署验证失败,退出脚本${NC}"
exit 1
}
# 显示成功信息
show_success
}
# 执行主函数
main
# 重启SSH服务
if systemctl restart sshd &>/dev/null || service sshd restart &>/dev/null; then
echo -e "\n\033[32m✔ 配置成功完成!\033[0m"
echo "=============================="
echo "用户名: root"
echo "固定密码: ${FIXED_PASSWORD}"
echo "=============================="
else
echo -e "\033[31mSSH服务重启失败\033[0m"
exit 1
fi