自簽發、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
英文地址,請注明出處:http://en.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 …