自签发、CA机构签发、SSH、SCP、RSYNC,SUDO详解

一、为什么?

1. 自建CA为什么比Let's Encrypt强?

不能把CA放公网!Let's Encrypt是给公网服务用的(比如10.0.0.30的Web服务),但内网服务(比如OpenVPN)必须用自签CA。
CA私钥必须物理隔离,不能与业务服务器共存。

2. 为什么必须用SSH+sudo?

直接用root SSH?等着被勒索吧!
管理账号必须最小权限,禁止root直接登录。

3.base64加解密

 echo -n 'zjx!@12345'|base64 #加密
emp4IUAxMjM0NQ==
root@D-3PGMZJ3-0948:~# echo -n 'emp4IUAxMjM0NQ==' |base64 -d #解密
zjx!@12345root@D-3PGMZJ3-0948:~#

加密不等于保密,本质是编码。敏感数据需额外加密(如 AES + Base64)

生成随机8位长度密码:openssl rand -base64 10 | head -c8

4.创建10个新用户,并指定8个字符长度的随机密码脚本:

#!/bin/bash
#
#********************************************************************
#Author:                zz_zjx
#Feature Description:   批量创建10个用户 + 8位随机密码(Ubuntu 适用)
#Date:                  2025-09-15
#FileName:             user.sh
#Copyright (C):         2025 All rights reserved
#********************************************************************
set -euo pipefail  # 严格模式:遇到错误/未定义变量/管道失败时立即退出OUTPUT_FILE="user_credentials.txt"
LOG_FILE="user_creation.log"# 初始化文件
> "$OUTPUT_FILE"
> "$LOG_FILE"echo "🔐 正在创建 10 个新用户(user01 到 user10)..."
echo "📄 账号密码将保存到:$OUTPUT_FILE"
echo "📝 详细日志:$LOG_FILE"for i in {1..10}; doUSERNAME="user$(printf "%02d" $i)"# 生成 8 位纯字母数字密码(使用 [:alnum:] 更规范)PASSWORD=$(LC_ALL=C openssl rand -base64 12 | tr -dc '[:alnum:]' | head -c 8)# 检查用户是否已存在if id "$USERNAME" &>/dev/null; thenecho "⚠️  [$USERNAME] 已存在,跳过创建。" | tee -a "$LOG_FILE"echo "$USERNAME : (已存在,未设新密码)" >> "$OUTPUT_FILE"continuefi# 创建用户(-m 创建家目录,-s 设置默认 shell)if sudo useradd -m -s /bin/bash "$USERNAME" 2>>"$LOG_FILE"; then# 设置密码(通过 chpasswd)if echo "$USERNAME:$PASSWORD" | sudo chpasswd 2>>"$LOG_FILE"; then# ✅ 可选:强制用户首次登录修改密码(推荐用于真实环境)sudo passwd -e "$USERNAME" 2>>"$LOG_FILE"echo "✅ 用户 [$USERNAME] 创建成功,初始密码: $PASSWORD" | tee -a "$LOG_FILE"echo "$USERNAME : $PASSWORD" >> "$OUTPUT_FILE"elseecho "❌ 为 [$USERNAME] 设置密码失败!" | tee -a "$LOG_FILE"sudo userdel -r "$USERNAME" 2>/dev/null  # 回滚:删除用户fielseecho "❌ 创建用户 [$USERNAME] 失败!" | tee -a "$LOG_FILE"fidoneecho "=========================================="
echo "🎉 所有用户创建完成!"
echo "📁 账户信息文件:$(pwd)/$OUTPUT_FILE"
echo "📄 请妥善保管或分发后立即删除该文件!"
echo "=========================================="

5.服务器规划表(IP段10.0.0.0/24,等保三级要求内网隔离):

服务器角色IP地址用途关键配置安全要求生产事故教训
CA服务器10.0.0.10内网根CA签发openssl自建CA等保三级物理隔离2018年CA私钥被盗,全内网证书失效瘫痪4小时
Web服务器10.0.0.20对外HTTPS服务Let's Encrypt自动续期等保二级,证书有效期90天2021年证书过期未及时续期,客户投诉300+次
管理服务器10.0.0.30SSH管理入口密钥认证+IP白名单等保三级,禁止密码登录2019年密码登录被暴力破解,删了2台DB服务器
应用服务器10.0.0.40业务应用sudo最小权限等保二级,禁止root直连2022年运维误执行rm -rf /,全集群崩盘

二、怎么配?

1️⃣自签名证书

1.openssl加解密:

 openssl genrsa -out test.key -aes256 -passout pass:"123456"
root@D-3PGMZJ3-0948:/test/ca# ls
test.key
root@D-3PGMZJ3-0948:/test/ca# openssl rsa -in test.key -out test.key2
Enter pass phrase for test.key:
writing RSA key
root@D-3PGMZJ3-0948:/test/ca# ls
test.key  test.key2

2.openssl证书格式转换:

例如,PEM 格式的CRT证书转换为.pem格式。openssl x509 -in certificate.crt -outform PEM -out certificate.pem
例如,DER 格式的CRT证书转换为.pem格式。openssl x509 -inform DER -in certificate.crt -outform PEM -out 
certificate.pem例如,将PEM证书转换为CRT证书。openssl x509 -inform PEM -in certificate.pem -outform DER -out 
certificate.crt

3 内网CA配置(CA服务器 10.0.0.10)

#!/bin/bash
#
#********************************************************************
#Author:                zz_zjx
#Feature Description:   全自动创建企业级私有根 CA(Root Certificate Authority)
#Date:                  2025-09-15
#FileName:             create_root_ca.sh
#Copyright (C):         2025 All rights reserved
#********************************************************************
# 启用严格模式:
# -e:命令出错立即退出
# -u:引用未定义变量时报错
# -o pipefail:管道中任意命令失败则整体失败
set -euo pipefail# ========================
# 🧱 1. 定义基础变量
# ========================
CA_DIR="/root/ca"  # CA 根目录(所有文件存放位置)# ========================
# 📁 2. 创建标准 CA 目录结构
# ========================
echo "📁 正在创建 CA 目录结构..."
sudo mkdir -p "$CA_DIR"/{certs,crl,newcerts,private}
# 🔐 private 目录权限设为 700(仅 root 可访问)
sudo chmod 700 "$CA_DIR/private"
echo "✅ 目录结构创建完成"# ========================
# 🔑 3. 生成 CA 根私钥(4096位 RSA + AES256 加密)
# ========================
echo "🔐 正在生成 CA 根私钥(需输入密码)..."
# 生成 4096 位 RSA 私钥,使用 AES-256-CBC 加密保护
# ⚠️ 生产环境请使用高强度密码(16位以上,字母+数字+符号)
sudo openssl genrsa -aes256 -out "$CA_DIR/private/ca.key" 4096
# 🔐 设置私钥文件权限为 600(仅 root 可读写)
sudo chmod 600 "$CA_DIR/private/ca.key"
echo "✅ 私钥生成完成(已加密)"# ========================
# 📄 4. 创建 OpenSSL 配置文件(核心!)
# ========================
echo "📄 正在生成 OpenSSL 配置文件..."
sudo tee "$CA_DIR/openssl.cnf" > /dev/null <<'EOF'
# ============================================================
# OpenSSL 配置文件(用于根 CA 证书生成和后续签发)
# 注意:使用 'EOF' 禁止 Shell 变量展开,$dir 由 OpenSSL 自行解析
# ============================================================# [ req ] 段:控制证书请求/自签名证书生成行为
[ req ]
# 默认密钥长度(req 命令时)
default_bits        = 4096
# 指定 DN(Distinguished Name)字段配置段
distinguished_name  = req_distinguished_name
# 自签名时使用的 X.509 v3 扩展段
x509_extensions     = v3_ca
# 强制使用 UTF-8 编码
string_mask         = utf8only
# 关闭交互式提示(全自动,适合脚本)
prompt              = no# [ req_distinguished_name ] 段:定义证书主题信息(DN)
[ req_distinguished_name ]
# 国家代码(2字母)
countryName          = CN
# 省/州名称
stateOrProvinceName  = Sichuan
# 城市名称
localityName         = Chengdu
# 组织/公司名称
organizationName     = MyOrg
# 部门名称
organizationalUnitName = PKI Department
# 通用名称(最重要!显示在证书中)
commonName           = MyOrg Root CA# [ ca ] 段:指定默认 CA 配置段(用于后续 openssl ca 命令)
[ ca ]
default_ca = CA_default# [ CA_default ] 段:CA 默认配置(目录、文件、策略等)
[ CA_default ]
# 基础目录(所有路径基于此)
dir             = /root/ca
# 存放已签发证书
certs           = $dir/certs
# 存放证书吊销列表(CRL)
crl_dir         = $dir/crl
# 证书签发数据库(记录所有签发历史)
database        = $dir/index.txt
# 每次签发的证书副本(OpenSSL 自动保存)
new_certs_dir   = $dir/newcerts
# CA 根证书路径
certificate     = $dir/certs/ca.crt
# 证书序列号文件(每次签发递增)
serial          = $dir/serial
# CA 私钥路径
private_key     = $dir/private/ca.key
# 默认签发时使用的扩展段
x509_extensions = v3_ca
# 默认证书有效期(天)
default_days    = 3650
# 默认签名摘要算法
default_md      = sha256# [ v3_ca ] 段:X.509 v3 扩展(标识为 CA 证书)
[ v3_ca ]
# 用公钥生成唯一指纹(Subject Key Identifier)
subjectKeyIdentifier   = hash
# 包含签发者密钥 ID 和名称(Authority Key Identifier)
authorityKeyIdentifier = keyid:always,issuer
# 标记为 CA 证书,且为关键扩展(客户端必须识别)
basicConstraints       = critical, CA:true
# 密钥用途:可签发证书、签发 CRL、数字签名(关键扩展)
keyUsage               = critical, digitalSignature, cRLSign, keyCertSign
EOF
echo "✅ 配置文件生成完成"# ========================
# 🧮 5. 初始化 serial 和 index.txt(OpenSSL 必需)
# ========================
echo "🧮 正在初始化证书序列号和数据库..."
# 创建空数据库文件
sudo touch "$CA_DIR/index.txt"
# 初始化序列号从 1000 开始(避免与系统证书冲突)
echo 1000 | sudo tee "$CA_DIR/serial"
echo "✅ 初始化完成"# ========================
# 📜 6. 生成自签名根 CA 证书(有效期10年)
# ========================
echo "📜 正在生成自签名根 CA 证书..."
# 使用私钥 + 配置文件 + v3_ca 扩展生成证书
# 系统会提示输入私钥密码(因私钥是加密的)
sudo openssl req -new -x509 -days 3650 \-key "$CA_DIR/private/ca.key" \-out "$CA_DIR/certs/ca.crt" \-config "$CA_DIR/openssl.cnf" \-extensions v3_ca
echo "✅ 根证书生成完成"# ========================
# 🔐 7. 设置证书文件权限
# ========================
# 证书是公钥,设为 644(所有用户可读)
sudo chmod 644 "$CA_DIR/certs/ca.crt"# ========================
# 🎉 8. 输出完成信息
# ========================
echo "=========================================="
echo "🎉 根 CA 创建成功!"
echo "🔑 私钥路径:$CA_DIR/private/ca.key"
echo "   → 请立即备份并离线保存!生产环境中应从在线系统移除!"
echo "📜 证书路径:$CA_DIR/certs/ca.crt"
echo "   → 可分发到所有需要信任此 CA 的服务器"
echo "⚙️  配置文件:$CA_DIR/openssl.cnf"
echo "   → 后续签发证书时会用到"
echo "=========================================="
echo "不要白嫖我,好不好"

4 查看证书:

 openssl x509 -in /root/ca/certs/ca.crt -noout -text
Certificate:Data:Version: 3 (0x2)Serial Number:1b:30:e6:90:85:3a:3b:a5:07:8a:4d:df:ed:83:7e:fa:60:76:99:43Signature Algorithm: sha256WithRSAEncryptionIssuer: C = CN, ST = Sichuan, L = Chengdu, O = MyOrg, OU = PKI Department, CN = MyOrg Root CAValidityNot Before: Sep 15 09:32:50 2025 GMTNot After : Sep 13 09:32:50 2035 GMTSubject: C = CN, ST = Sichuan, L = Chengdu, O = MyOrg, OU = PKI Department, CN = MyOrg Root CASubject Public Key Info:Public Key Algorithm: rsaEncryptionPublic-Key: (4096 bit)Modulus:00:97:e7:e8:b9:c3:ca:06:06:eb:55:e2:99:69:40:

生产为什么这么干:CA私钥必须存物理隔离服务器,4096位密钥防暴力破解。2018年事故就是私钥存服务器,被黑客直接拿走。

5 证书分发:

#!/bin/bash# ============================ 配置与参数 ============================
# 默认值定义
DEFAULT_CERT="/root/ca/certs/ca.crt"
DEFAULT_USER="deploy"# 参数提示
echo " 参数说明(可选):"
echo "   参数1:SSH 登录用户名(默认: $DEFAULT_USER)"
echo "   参数2:本地 CA 证书路径(默认: $DEFAULT_CERT)"
echo # 读取参数,未传参则使用默认值
SSH_USER="${1:-$DEFAULT_USER}"
CERT_FILE="${2:-$DEFAULT_CERT}"# 目标服务器列表(按需修改)
SERVERS=("10.0.0.20" "10.0.0.30" "10.0.0.40")# 远程系统 CA 证书目录(Debian/Ubuntu 标准路径)
REMOTE_CA_DIR="/usr/local/share/ca-certificates"# 远程证书文件名(建议带描述性)
# 自动生成带日期的自签名内部根证书文件名
REMOTE_CERT_NAME="self-signed-internal-root-ca-$(date +%Y%m%d).crt"# ============================ 预检本地文件 ============================
if [ ! -f "$CERT_FILE" ]; thenecho "❌ 错误:本地证书文件不存在 → $CERT_FILE"echo "💡 请检查路径或通过参数1指定正确的证书路径。"exit 1
fiecho "✅ 使用证书文件: $CERT_FILE"
echo "✅ 使用 SSH 用户: $SSH_USER"
echo "✅ 目标部署目录: $REMOTE_CA_DIR"
echo "========================================"# ============================ 批量部署 ============================
for server in "${SERVERS[@]}"; doechoecho "🚀 开始部署到服务器: $server"# Step 1: 复制证书到远程临时文件if scp "$CERT_FILE" "$SSH_USER@$server:~/ca.crt.tmp"; thenecho "   ✅ 证书文件传输成功"# Step 2: 在远程执行部署命令(创建目录 + 复制 + 更新 + 清理)if ssh "$SSH_USER@$server" "# 创建目标目录(如不存在)sudo mkdir -p '$REMOTE_CA_DIR' &&# 复制并重命名证书sudo cp ~/ca.crt.tmp '$REMOTE_CA_DIR/$REMOTE_CERT_NAME' &&# 更新系统 CA 信任库sudo update-ca-certificates &&# 清理临时文件rm ~/ca.crt.tmp"; thenecho "   ✅ ✅ 部署成功:证书已安装并生效!"elseecho "   ❌ ❌ 部署失败:请检查远程 sudo 权限或系统兼容性。"fielseecho "   ❌ ❌ 证书传输失败:请检查网络、SSH 密钥或用户权限。"fi
doneecho
echo "🎉 所有服务器部署任务已完成!"

 2️⃣CA机构签名证书

Let's Encrypt配置(Web服务器 10.0.0.20)

1.通过let's encrypt 自动安装nginx 并自动续约

免费申请 DV ssl证书并自动续约,非国内云厂商版本_dv证书续约-CSDN博客

2.通过编译安装nginx,在安装证书并自动续约 脚本

待nginx编译安装篇链接

3️⃣ SSH密钥认证配置(管理服务器 10.0.0.30)

1.SSH配置解读:
root@D-3PGMZJ3-0948:~# ls /etc/ssh
moduli      ssh_config.d  sshd_config.d       ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  sshd_config   ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key          ssh_import_id解读:ssh_host_rsa_key 和 ssh_host_rsa_key.pub 这两对文件是SSH服务器用于RSA认证的密钥对。服务器使用私钥进行认证,而公钥则分发给希望连接服务器的客户端。ssh_host_ecdsa_key 和 ssh_host_ecdsa_key.pub这两对文件是SSH服务器用于ECDSA(椭圆曲线数字签名算法)认证的密钥对。ECDSA是一种较新的、更安全的算法,相对于RSA提供了更高的安全性。ssh_host_ed25519_key 和 ssh_host_ed25519_key.pub这两对文件是SSH服务器用于Ed25519认证的密钥对。Ed25519是一种基于椭圆曲线的公钥加密算法,以其高效和安全性而著称。moduli这个文件包含了用于Diffie-Hellman密钥交换算法的参数。Diffie-Hellman是一种安全协议,用于在不安全的通道上安全地交换密钥。ssh_config这是一个客户端配置文件,用于指定SSH客户端(如ssh命令)的行为。例如,你可以在这里设置默认的用户名、端口号、是否启用X11转发、是否启用压缩等。ssh_config.d/这是一个目录,用于存放额外的客户端配置文件。系统管理员或用户可以在这里添加额外的配置片段,这些配置会被ssh_config文件包含并应用。sshd_config这是一个服务器配置文件,用于指定SSH服务器(通常是sshd服务)的行为。包括允许哪些用户登录、监听哪些端口、是否允许密码认证或仅允许密钥认证、是否启用日志记录等。
2.用脚本实现公钥批量部署:
ssh-keygen -t ed25519 -C "2414421189@qq.com"
公钥生成
#!/bin/bash
#
#********************************************************************
#Author:                zz_zjx
#Feature Description:   功能描述
#Date:                  2025-09-16
#FileName:             ssh.sh
#Copyright (C):         2025 All rights reserved
#********************************************************************
# 登录用户名
LOGIN_USER='root'
# 目标主机列表(空格分隔)
HOST="172.20.15.91 10.0.0.20"
# 登录密码
PASS=123# 加载系统信息(用于判断发行版)
. /etc/os-release# 安装 sshpass 工具(根据系统类型)
pre_os () {if [[ $ID =~ ubuntu ]];thendpkg -l  sshpass &> /dev/null || { apt update; apt -y install sshpass; }elif [[ $ID =~ rocky|centos|rhel ]];thenrpm -q sshpass &>/dev/null || yum -y install sshpasselseecho "不支持当前操作系统"exitfi
}# 生成 ed25519 类型 SSH 密钥对(无密码,路径 ~/.ssh/id_ed25519)
create_sshkey(){yes | ssh-keygen -t ed25519 -P "" -f ~/.ssh/id_ed25519 &>/dev/null
}# 将公钥批量复制到目标主机,实现免密登录(并发执行)
scp_key_func(){for i in $HOST; do{echo "🔄 [$i] 正在部署公钥..."# 读取本地公钥内容,通过 sshpass + ssh 远程追加到 authorized_keysPUBKEY=$(cat ~/.ssh/id_ed25519.pub)sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 $LOGIN_USER@$i "mkdir -p ~/.sshchmod 700 ~/.sshecho '$PUBKEY' >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keysecho '公钥写入成功' > /dev/null" &>/dev/nullif [ $? -eq 0 ]; thenecho "✅ [$i] 部署成功"elseecho "❌ [$i] 部署失败"fi}&donewait
}# 主函数:依次执行环境准备、生成密钥、分发公钥
main(){pre_oscreate_sshkeyscp_key_funcecho "✅ SSH 免密配置完成"
}# 执行主函数
main

3.加固配置:
cat > /etc/ssh/sshd_config.d/99-security-hardening.conf << 'EOF'
# =============================================================================
# 文件名:/etc/ssh/sshd_config.d/99-security-hardening.conf
# 用途:SSH 服务安全加固配置(模块化加载)
# 修改时间:$(date '+%Y-%m-%d %H:%M:%S')
# 适用系统:OpenSSH >= 8.4p1
# 加载方式:主配置文件 /etc/ssh/sshd_config 中需包含:
#   Include /etc/ssh/sshd_config.d/*.conf
# =============================================================================# ==================== 基础安全加固 ====================
# 强制 IPv4(避免 IPv6 配置不全导致监听失败)
AddressFamily inet
# 强制使用 SSH 协议版本 2
Protocol 2
# 修改默认端口(防自动化扫描)
Port 22222
# 禁止 root 登录
PermitRootLogin no
# 禁用密码认证
PasswordAuthentication no
# 禁用空密码登录(纵深防御)
PermitEmptyPasswords no
# 禁用挑战响应认证
ChallengeResponseAuthentication no
# 禁用 PAM(如需 LDAP/2FA 请设为 yes)
UsePAM no
# 只允许指定用户登录(缩小攻击面)
AllowUsers adminuser# ==================== 连接与会话控制 ====================
# 客户端保活间隔(秒)
ClientAliveInterval 300
# 最大无响应次数(300*2=600秒断开)
ClientAliveCountMax 2
# 登录超时时间
LoginGraceTime 60
# 单次连接最大认证尝试次数
MaxAuthTries 3
# 每连接最大会话数(防滥用)
MaxSessions 2
# 未认证连接限制(start:rate:full)
MaxStartups 10:30:60# ==================== 功能限制 ====================
# 禁用 TCP 转发
AllowTcpForwarding no
# 禁用网关端口绑定
GatewayPorts no
# 禁用 X11 转发
X11Forwarding no
# 禁用隧道
PermitTunnel no
# 禁用压缩(防 CRIME 类攻击)
Compression no# ==================== 加密算法强化 ====================
# 使用 ed25519 主机密钥
HostKey /etc/ssh/ssh_host_ed25519_key
# 密钥交换算法
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
# 加密算法
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
# MAC 算法
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com# ==================== 日志与审计 ====================
# 详细日志级别
LogLevel VERBOSE
# 使用 AUTHPRIV 设施
SyslogFacility AUTHPRIV
# 不显示 MOTD(避免信息泄露)
PrintMotd no
# 显示上次登录时间(帮助发现异常)
PrintLastLog yes
# 禁止用户环境变量(防注入)
PermitUserEnvironment no
EOF
4.QA:

问:为什么第一次连接的时候有yes,后面就不会有了?
[root@rocky9 ~]# grep ask /etc/ssh/ssh_config#   StrictHostKeyChecking ask
问:不想连接的时候,输入yes,怎么办?
[root@rocky9 ~]# ssh -o StrictHostKeyChecking=no 10.0.0.12
首次连接之后,如果保存了远程主机的公钥,后续远程主机发生了改变,则会提示,如果远程主机确实发
生了改变,则可以删除本地~.ssh/know_host中的对应的公钥
ssh root@10.0.0.206@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that a host key has just been changed.The fingerprint for the ED25519 key sent by the remote host isSHA256:1eOK9Aygq1kbA+smlYjwRwRsx+ZdSRkDnNy5AFp3aPE.Please contact your system administrator.Add correct host key in /root/.ssh/known_hosts to get rid of this message.Offending ECDSA key in /root/.ssh/known_hosts:3remove with:ssh-keygen -f "/root/.ssh/known_hosts" -R "10.0.0.206"Host key for 10.0.0.206 has changed and you have requested strict checking.Host key verification failed.问: 如何多机互相打通
ABC 3机器 10.0.0.10 10.0.020 10.0.0.30
方法 1:使用 ssh-copy-id 工具
# 将公钥复制到 B (10.0.0.20)
ssh-copy-id user@10.0.0.20# 将公钥复制到 C (10.0.0.30)
ssh-copy-id user@10.0.0.30
替换 user 为目标机器的用户名(例如 centos 或 fedora)。
方法 2:手动复制公钥
如果未安装 ssh-copy-id,可以手动操作:# 在机器 A 上获取公钥内容
cat ~/.ssh/id_rsa.pub# 登录到 B (10.0.0.20)
ssh user@10.0.0.20
mkdir -p ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
exit# 登录到 C (10.0.0.30) 并重复上述操作
ssh user@10.0.0.30
mkdir -p ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
exit
步骤 3:验证 SSH 免密码登录
测试连接
bash
深色版本
# 从 A 登录到 B
ssh user@10.0.0.20# 从 A 登录到 C
ssh user@10.0.0.30
如果无需输入密码即可登录,则配置成功。
退出连接
输入 exit 返回机器 A。
步骤 4:确保单向互信
机器 B 和 C 无法免密码登录到 A
因为只在机器 A 上配置了到 B 和 C 的公钥,未在 B 或 C 上配置到 A 的公钥。

2.SCP命令:

命令格式:scp [选项] 源路径 目标路径注意:远程主机目标位置的表现样式: 用户名@主机名:路径
login_user@remote_addr:/path/to/target常用选项-r                                          #递归复制
一般选项-C                                          #压缩数据流-p                                          #保持原文件的属性信息-q                                          #静默模式-P PORT                                     #指定远程服务器的端口,默认22常用样式:将文件复制到远程主机:scp logs.tar.gz root@10.0.0.13:/tmp将目录复制到远程主机:scp -r syslog root@10.0.0.13:/tmp将文件从远程系统复制到本地系统:scp root@10.0.0.13:/root/passwd /tmp/将目录从远程主机复制到本地系统:scp -r root@10.0.0.13:/root/scripts /tmp/

3.文件同步rsync

全量与增量备份:rsync支持全量备份和增量备份。全量备份意味着每次都会复制所有文件,而增量备份则只复 制那些自上次备份以来已经改变的文件。

跨平台支持:rsync适用于Unix、Linux、Windows等多种操作系统平台,可以在不同平台之间进行数据同 步。

保持文件属性:rsync在复制文件时,可以保持文件的权限、时间戳、软硬链接、属主、组等属性不变。 高效传输:rsync使用独特的“quick check”算法,仅同步大小或最后修改时间发生变化的文件或目录,提高 了数据传输效率。

多种传输方式:rsync可以使用rcp、rsh、ssh等方式来配合进行隧道加密传输文件,也可以使用socket(进 程方式)传输文件和数据。

匿名或认证传输:rsync支持匿名传输,也支持通过用户认证进行传输,保证了数据的安全性。

排除指定文件或目录:rsync具有排除指定文件或目录同步的功能,类似于打包命令tar的排除功能。

定时备份:可以通过crond+rsync来实现定时备份,确保数据的定期同步和备份。

实时备份:可以通过inotify(sersync)+rsync来实现实时备份,当文件有任何变动时,就触发rsync同 步,解决了同步数据的实时性问题。

数据迁移:rsync可以用于在不同服务器之间迁移数据,支持远程同步,方便快捷。

镜像网站:rsync支持匿名传输,可以方便地用于网站镜像,使多个网站之间保持数据同步。

①.常用选项速查表

-a

--archive

归档模式(递归+保留权限/时间/链接/所有者等),最常用

✅✅✅

-v

--verbose

显示详细过程

✅✅

-z

--compress

启用压缩传输

✅✅

-h

--human-readable

人类可读单位(如 2.3M)

--progress

显示传输进度(百分比、速度、剩余时间)

✅✅

-r

--recursive

递归复制目录(-a已包含)

⚠️

-l

--links

保留软链接(-a已包含)

⚠️

-p

--perms

保留权限(-a已包含)

⚠️

-t

--times

保留修改时间(-a已包含)

⚠️

-g

--group

保留组(-a已包含)

⚠️

-o

--owner

保留所有者(需 root)(-a已包含)

⚠️

-D

--devices --specials

保留设备文件(-a已包含)

⚠️

--delete

删除目标端多余文件(同步后两端完全一致)

✅⚠️(慎用)

--exclude=PATTERN

排除匹配文件或目录(如*.log,node_modules/

✅✅

--include=PATTERN

包含匹配文件(常配合 exclude 使用)

--dry-run
-n

试运行:只显示操作,不执行(强烈推荐先测试)

✅✅✅

--partial

保留部分传输文件,支持断点续传

✅✅

--bwlimit=KBPS

限速传输(单位 KB/s)

-e "ssh -p PORT"

指定 SSH 命令或端口(如-e "ssh -p 2222"

✅✅

--stats

显示传输统计信息(文件数、字节数、速度等)

💡 推荐默认组合:-avz-avzh --progress

②、路径语义说明

dir/

同步目录内所有内容(不包含 dir 本身)

rsync -a dir/ dest/→ dest 中是 dir 的内容

dir

同步整个目录(包括 dir 本身)

rsync -a dir dest/→ dest 中出现dir子目录

/path/to/file

同步单个文件

rsync file user@host:/tmp/

user@host:path

远程路径(SSH)

rsync -a local/ user@host:/remote/

rsync://host/module

rsync daemon 模式

rsync -a src/ rsync://backup@host/backup/


③、使用场景速查表

📁 本地目录同步

rsync -av /src/ /dst/

保持目录结构和属性

➡️ 本地 → 远程

rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/

通过 SSH 推送

⬅️ 远程 → 本地

rsync -avz user@host:/remote/ /local/

从远程拉取文件

↔️ 远程 → 远程

rsync -avz -e ssh user1@host1:/path/ user2@host2:/path/

本地中转(默认)
或在 host1 上执行:ssh user1@host1 'rsync ...'

🧹 同步并删除多余文件

rsync -av --delete /src/ /dst/

⚠️ 操作前务必-n

🚫 排除特定文件

rsync -av --exclude='*.log' --exclude='temp/' /src/ /dst/

支持通配符和目录

📜 使用排除文件

rsync -av --exclude-from='exclude.txt' /src/ /dst/

适合复杂过滤规则

📊 显示进度+断点续传

rsync -avz --partial --progress /src/ /dst/

大文件推荐

🐢 限速传输

rsync -avz --bwlimit=1000 /src/ user@host:/dst/

1000 KB/s = 1MB/s

🔍 试运行预览

rsync -avn --delete /src/ /dst/

不实际执行,只显示将要操作


④、高级功能对比表

rsync daemon 模式

配置/etc/rsyncd.conf+rsync --daemon

rsync -av src/ user@host::module/

高频/大规模同步,内网专用

SSH 密钥认证

使用-e "ssh -i key"或配置~/.ssh/config

rsync -avz -e "ssh -i ~/.ssh/id_rsa" src/ user@host:/dst/

自动化脚本免密同步

时间/权限保留

-a(或-rlptgoD

rsync -a src/ dst/

备份、部署需保留元数据

增量同步

默认行为

无需额外参数

所有场景默认启用

压缩传输

-z

rsync -avz src/ dst/

网络慢或文本文件多时使用

日志记录

重定向输出或--log-file=FILE

rsync -av src/ dst/ >> backup.log 2>&1

自动化备份脚本

⑤注意事项 & 最佳实践

🔐 安全

优先使用 SSH 通道;daemon 模式需配置认证和访问控制

⚠️ 删除操作

使用--delete必须加 --dry-run 预览

🔄 路径写法

末尾/决定是否包含目录本身,务必写对!

💾 权限

保留所有者(-o)需 root 权限;远程用户需有写权限

🚦 网络中断

使用--partial+--progress,支持续传

🧪 测试先行

任何重要操作前加-n--dry-run)预演

📈 性能

压缩对已压缩文件无效;大量小文件可用--no-compress


⑥、与其他工具对比
工具是否增量是否断点续传是否压缩是否权限保留使用场景

cp

✅(-a部分)

本地快速复制

scp

✅(-C

✅(-p

一次性安全传输小文件

rsync

✅(--partial

✅(-z

✅(-a

备份、同步、部署首选


⑦、实用脚本模板
#!/bin/bash
# 自动备份脚本(带日志和错误处理)SRC="/data/app/"
DST="backup@nas:/backup/app/"
LOG="/var/log/backup_$(date +%Y%m%d).log"echo "=== Backup Start: $(date) ===" >> "$LOG"rsync -avz \--delete \--exclude='*.tmp' \--exclude='logs/' \--partial \--progress \--stats \"$SRC" "$DST" 2>&1 >> "$LOG"if [ $? -eq 0 ]; thenecho "✅ SUCCESS: Backup completed." >> "$LOG"
elseecho "❌ FAILED: Check log for details." >> "$LOG"exit 1
fiecho "=== Backup End: $(date) ===" >> "$LOG"

⑧、排错速查表
现象可能原因解决方案

Permission denied

目标路径无写权限

检查远程用户权限或使用sudo

No such file or directory

路径错误或不存在

检查路径拼写,加-v查看细节

传输慢

未压缩或网络差

-z,或--bwlimit限速测试

文件没同步

路径末尾/问题

检查源路径是否应加/

删除了不该删的

误用--delete

今后先用-n预览

SSH 端口不对

默认 22,实际非 22

-e "ssh -p 端口号"


⑨、终极口诀

“-avz 是黄金组合,--delete 前先 dry-run,路径斜杠别搞错,--exclude 过滤准,--partial 可续传,-e 指定 SSH 端口稳!”

4️⃣ sudo权限管理(应用服务器 10.0.0.40)

# 1. 创建普通用户(生产必须用非root用户)
sudo adduser --system --group --shell /bin/bash appuser# 2. 配置sudo权限(生产必须限制命令,别用ALL)
sudo visudo
# 添加:appuser ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# 为什么?避免执行rm -rf /等危险命令# 3. 验证权限(生产必须测试)
sudo -u appuser /usr/bin/systemctl restart nginx  # 成功才给权限

常见 sudoers 权限规则表

完全无密码ROOT权限(危险!)

username ALL=(ALL:ALL) NOPASSWD:ALL

用户username可在所有主机上,以任意用户身份,无密码执行所有命令。等同于直接给 root 密码。

⚠️ 高危

完全有密码ROOT权限(标准管理员)

username ALL=(ALL:ALL) ALL

用户username可执行所有命令,但每次需输入自己的密码确认。这是sudo组用户的默认权限。

✅ 中(推荐)

仅允许特定命令(无密码)

username ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx

用户可无密码重启 nginx,其他命令无权限。适合自动化脚本或受限运维。

✅ 高

允许一组相关命令(使用命令别名)

Cmnd_Alias APACHE = /usr/sbin/apache2ctl, /bin/systemctl reload apache2, /bin/systemctl status apache2
username ALL=(root) NOPASSWD: APACHE

先定义命令组别名APACHE,再授权给用户。便于管理,避免重复。

✅ 高

允许以特定用户身份执行命令

backupuser ALL=(postgres) /bin/su - postgres, /usr/bin/pg_dump

用户backupuser可切换到postgres用户执行备份命令,不能切换到 root 或其他用户。

✅ 高

仅允许查看系统状态类命令

monitoruser ALL=(root) NOPASSWD: /bin/df, /bin/du, /usr/bin/free, /usr/bin/top

授予只读监控权限,用于系统巡检,不涉及修改。

✅ 高

允许使用包管理器更新(有密码)

devuser ALL=(root) /usr/bin/apt update, /usr/bin/apt upgrade

开发者可自行更新系统包,但需输入密码,防止误操作。

✅ 中

禁止执行危险命令

username ALL=(ALL) ALL, !/usr/bin/passwd root, !/bin/rm -rf /

允许所有命令,但排除修改 root 密码或执行rm -rf /。⚠️ 注意:此方法不绝对安全,高级用户可绕过。

⚠️ 中低(不推荐依赖此方式)

按组授权(推荐批量管理)

%webadmins ALL=(root) NOPASSWD: /usr/bin/systemctl reload apache2

授权给用户组webadmins,组内所有成员自动获得权限。便于团队管理。

✅ 中高

限制在特定主机生效

username dbserver=(root) /usr/bin/mysqldump

仅当用户在dbserver这台主机上时,才允许执行mysqldump。适合分布式环境。

✅ 中


🔐 关键安全原则

  1. 最小权限原则:只给用户完成工作所必需的最小权限。
  2. 避免 NOPASSWD:ALL:除非是自动化服务账户,否则不要使用。
  3. 使用绝对路径:命令必须写完整路径(如 /usr/bin/systemctl),防止 PATH 劫持。
  4. 善用别名User_Alias, Host_Alias, Cmnd_Alias 可让配置更清晰、易维护。
  5. 分文件管理:将不同用户的权限写入 /etc/sudoers.d/username 文件,用 visudo -f /etc/sudoers.d/filename 编辑,避免主文件混乱。

最佳实践示例

# /etc/sudoers.d/web_deployer
Cmnd_Alias NGINX = /usr/bin/systemctl reload nginx, /usr/bin/systemctl status nginx
Cmnd_Alias GIT = /usr/bin/git pull, /usr/bin/git checkout%deployers ALL=(www-data) NOPASSWD: GIT
%deployers ALL=(root) NOPASSWD: NGINX

此配置允许 deployers 组的用户以 www-data 身份执行 git 命令,以 root 身份重载 nginx,权限清晰且安全。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/97924.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/97924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python解决阿里云DataWorks导出数据1万条限制的问题

【Python】Python解决阿里云DataWorks导出数据1万条限制的问题一、前言二、脚本功能概述三、核心代码解析**1. 环境配置与安全设置****2. 用户配置区****3. 数据清洗函数****4. 核心逻辑**四、完整代码演示五、总结一、前言 在日常数据分析工作中&#xff0c;团队经常需要从阿…

计算机网络(一)基础概念

本篇文章为计算机网络相关知识点整理及扩展 基于B站计算机网络课程&#xff1a;https://www.bilibili.com/video/BV1p69tYZEvN/?spm_id_from333.1007.top_right_bar_window_history.content.click 如有错误&#xff0c;还望大家不吝指正 URL&#xff08;统一资源定位符&…

Git的工作区域和文件结构

Git的工作区域和文件结构 1. Git的工作区域2. Git的文件结构 打开.git文件&#xff0c;.git的文件结构如下&#xff1a; objects 存放已经提交的文件&#xff0c;也就是使用 git commit 进行操作后的文件。 index 存放已暂存的文件&#xff0c;也就是使用了 git add 进行操作后…

前端开发易错易忽略的 HTML 的 lang 属性

前言本文主要记录&#xff1a;前端开发中&#xff0c;一个本人错了好几年&#xff0c;看似无关紧要的小错误&#xff1a;HTML 的 lang 属性设置。正文HTML 的 lang 属性在HTML中&#xff0c;lang属性用于指定文档的语言。这对于搜索引擎优化&#xff08;SEO&#xff09;、屏幕阅…

【GD32】 GPIO 超详细总结 (江科大风格课件版)

GD32 GPIO 超详细总结 (江科大风格课件版)第一部分&#xff1a;GPIO 是什么&#xff1f; 名称&#xff1a;GPIO General Purpose Input/Output (通用输入输出口)作用&#xff1a;MCU与外部世界交互的桥梁。通过程序控制引脚输出高、低电平&#xff0c;或者读取引脚的电平状态。…

《嵌入式硬件(八):基于IMX6ULL的点灯操作》

一、IMX6ULL启动代码.global _start_start:ldr pc, _reset_handlerldr pc, _undefine_handlerldr pc, _svc_handlerldr pc, _prefetch_abort_handlerldr pc, _data_abort_handlerldr pc, _reserved_handlerldr pc, _irq_handlerldr pc, _fiq_handler_undefine_handler:ldr pc, …

Spring Boot 调度任务在分布式环境下的坑:任务重复执行与一致性保证

前言在实际业务开发中&#xff0c;调度任务&#xff08;Scheduled Task&#xff09; 扮演着重要角色&#xff0c;例如&#xff1a;定时同步第三方数据&#xff1b;定时清理过期缓存或日志&#xff1b;定时发送消息或报告。Spring Boot 提供了非常方便的 Scheduled 注解&#xf…

剖析ReAct:当大模型学会“边想边做”,智能体的进化之路

你是否曾惊叹于大语言模型&#xff08;LLM&#xff09;强大的推理能力&#xff0c;却又对其“纸上谈兵”、无法真正与世界交互而感到遗憾&#xff1f;你是否好奇&#xff0c;如何让AI不仅能“说”&#xff0c;更能“做”&#xff0c;并且在做的过程中不断思考和调整&#xff1f…

小型无人机传感器仿真模型MATLAB实现方案

一、系统架构设计 无人机传感器仿真模型需集成多物理场建模与数据融合模块&#xff0c;典型架构包含&#xff1a; 动力学模型&#xff1a;六自由度刚体运动方程传感器模型&#xff1a;IMU/GNSS/视觉/气压计数学建模数据融合层&#xff1a;卡尔曼滤波/EKF算法实现环境交互模块&a…

hadoop集群

ssh-keygen -t rsassh-copyid 用户名远程服务器地址start-dfs.sh chown [选项] 新所有者[:新所属组] 目标文件/目录常用选项&#xff1a;-R&#xff1a;递归修改目录下所有文件和子目录的所有者&#xff08;处理目录时常用&#xff09;-v&#xff1a;显示修改过程的详细信息-c&…

大模型入门实践指南

大模型入门教程:从概念到实践 大模型(Large Language Model, LLM)是当前人工智能领域的核心技术,其本质是通过大规模数据训练、具备复杂语言理解与生成能力的深度学习模型。本教程将从基础概念出发,带你理解大模型的核心逻辑,并通过可直接跑通的代码示例,快速上手大模型…

猫头虎开源AI分享:一款CSV to Chat AI工具,上传CSV文件提问,它可以即时返回统计结果和可视化图表

猫头虎开源AI分享&#xff1a;一款CSV to Chat AI工具&#xff0c;上传CSV文件提问&#xff0c;它可以即时返回统计结果和可视化图表 摘要 本文将详细介绍一款开源工具——CSV to Chat AI&#xff0c;它允许用户上传CSV文件并通过自然语言提问&#xff0c;系统会即时返回统计…

洛谷P9468 [EGOI 2023] Candy / 糖果题解

[EGOI 2023] Candy / 糖果 思路 NNN 这么小基本就是瞎打的 DP 了。 设 dpi,jdp_{i,j}dpi,j​ 为操作 jjj 次后前 iii 项的和最大是多少。 考虑转移&#xff0c;我们可以枚举 iii 并考虑将其移动到 ppp 位置&#xff0c;总共操作 kkk 次&#xff0c;那么就有 dpp,kmin⁡(dpp,…

AI智能体(Agent)大模型入门【3】--基于Chailit客服端实现页面AI对话

目录 前言 安装chailint 创建中文语言环境 创建chailint页面客户端 前言 本篇章将会基chailit框架实现页面进行AI对话。 若没有自己的本地模型对话&#xff0c;需要查看专栏内的文章&#xff0c;或者点击链接进行学习部署 AI智能体&#xff08;Agent&#xff09;大模型入…

【高并发内存池——项目】定长内存池——开胃小菜

提示&#xff1a;高并发内存池完整项目代码&#xff0c;在主页专栏项目中 文章目录 提示&#xff1a;高并发内存池完整项目代码&#xff0c;在主页专栏项目中 先设计一个定长的内存池 一、为什么需要定长内存池&#xff1f; &#x1f3e2; 传统内存分配的痛点 &#x1f3ed; 内…

6-获取磁盘分区信息

观察文件 获取server端电脑里面存在哪些盘符 int MakeDriveInfo() { //1>A 2>B &#xff08;原本属于软盘的 &#xff09;3>C ... 26>Zstd::string result;for (int i 1; i < 26; i) { //让其循环if (_chdrive(i) 0) //改变当前的驱动,_chdrive函数(c和c中)应…

每天认识一个电子器件之LED灯

LED选型核心参数一览表参数类别关键参数说明 & 为什么重要基本电气参数正向电压 (Vf)LED正常发光时两端的电压降。必须匹配您的电路电压。红/黄光约1.8-2.2V&#xff0c;蓝/绿/白光约2.8-3.6V。正向电流 (If)LED正常发光时所需的电流。决定了LED的亮度&#xff0c;必须用电…

Spring Boot 集成 Flowable 7.1.0 完整教程

一、引言 在企业级应用开发中&#xff0c;工作流管理是不可或缺的一部分。从简单的请假审批到复杂的业务流程&#xff0c;工作流引擎能够显著提升系统的灵活性和可维护性。​​Flowable​​ 作为一个轻量级、基于 Java 的开源工作流引擎&#xff0c;完美支持 ​​BPMN 2.0​​…

uniapp离线打包安卓apk详细教程,从HbuilderX新建项目到Android Studio详细配置(一)

目录 一、基础离线打包&#xff0c;无引入模块&#xff0c;无原生插件 1. HbuilderX新建项目&#xff0c;开发者后台申请证书和离线key 2.HbuilderX生成本地包 二、Android Studio配置 1.下载离线SDK&#xff0c;解压&#xff0c;SDK版本需要和HbuilderX 版本一致&#xf…

蓝牙鼠标频繁卡顿?一招解决 Win10/11 的 USB 省电机制干扰问题

蓝牙鼠标频繁卡顿&#xff1f;一招解决 Win10/11 的 USB 省电机制干扰问题 问题背景 在使用蓝牙鼠标时&#xff0c;很多用户会遇到以下问题&#xff1a; 鼠标移动卡顿、延迟明显偶尔断连&#xff0c;需重新配对尤其在笔记本合盖或待机后恢复时更明显 这些问题在 Windows 10/11 …