一、為什么?
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.30 | SSH管理入口 | 密鑰認證+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支持匿名傳輸,可以方便地用于網站鏡像,使多個網站之間保持數據同步。
①.常用選項速查表
|
| 歸檔模式(遞歸+保留權限/時間/鏈接/所有者等),最常用 | ??? |
|
| 顯示詳細過程 | ?? |
|
| 啟用壓縮傳輸 | ?? |
|
| 人類可讀單位(如 2.3M) | ? |
| — | 顯示傳輸進度(百分比、速度、剩余時間) | ?? |
|
| 遞歸復制目錄( | ?? |
|
| 保留軟鏈接( | ?? |
|
| 保留權限( | ?? |
|
| 保留修改時間( | ?? |
|
| 保留組( | ?? |
|
| 保留所有者(需 root)( | ?? |
|
| 保留設備文件( | ?? |
| — | 刪除目標端多余文件(同步后兩端完全一致) | ???(慎用) |
| — | 排除匹配文件或目錄(如 | ?? |
| — | 包含匹配文件(常配合 exclude 使用) | ? |
| — | 試運行:只顯示操作,不執行(強烈推薦先測試) | ??? |
| — | 保留部分傳輸文件,支持斷點續傳 | ?? |
| — | 限速傳輸(單位 KB/s) | ? |
| — | 指定 SSH 命令或端口(如 | ?? |
| — | 顯示傳輸統計信息(文件數、字節數、速度等) | ? |
💡 推薦默認組合:
-avz
或-avzh --progress
②、路徑語義說明
| 同步目錄內所有內容(不包含 dir 本身) |
|
| 同步整個目錄(包括 dir 本身) |
|
| 同步單個文件 |
|
| 遠程路徑(SSH) |
|
| rsync daemon 模式 |
|
③、使用場景速查表
📁 本地目錄同步 |
| 保持目錄結構和屬性 |
?? 本地 → 遠程 |
| 通過 SSH 推送 |
?? 遠程 → 本地 |
| 從遠程拉取文件 |
?? 遠程 → 遠程 |
| 本地中轉(默認) |
🧹 同步并刪除多余文件 |
| ?? 操作前務必 |
🚫 排除特定文件 |
| 支持通配符和目錄 |
📜 使用排除文件 |
| 適合復雜過濾規則 |
📊 顯示進度+斷點續傳 |
| 大文件推薦 |
🐢 限速傳輸 |
| 1000 KB/s = 1MB/s |
🔍 試運行預覽 |
| 不實際執行,只顯示將要操作 |
④、高級功能對比表
rsync daemon 模式 | 配置 |
| 高頻/大規模同步,內網專用 |
SSH 密鑰認證 | 使用 |
| 自動化腳本免密同步 |
時間/權限保留 |
|
| 備份、部署需保留元數據 |
增量同步 | 默認行為 | 無需額外參數 | 所有場景默認啟用 |
壓縮傳輸 |
|
| 網絡慢或文本文件多時使用 |
日志記錄 | 重定向輸出或 |
| 自動化備份腳本 |
⑤注意事項 & 最佳實踐
🔐 安全 | 優先使用 SSH 通道;daemon 模式需配置認證和訪問控制 |
?? 刪除操作 | 使用 |
🔄 路徑寫法 | 末尾 |
💾 權限 | 保留所有者( |
🚦 網絡中斷 | 使用 |
🧪 測試先行 | 任何重要操作前加 |
📈 性能 | 壓縮對已壓縮文件無效;大量小文件可用 |
⑥、與其他工具對比
工具 | 是否增量 | 是否斷點續傳 | 是否壓縮 | 是否權限保留 | 使用場景 |
---|---|---|---|---|---|
| ? | ? | ? | ?(-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"
⑧、排錯速查表
現象 | 可能原因 | 解決方案 |
---|---|---|
| 目標路徑無寫權限 | 檢查遠程用戶權限或使用 |
| 路徑錯誤或不存在 | 檢查路徑拼寫,加 |
傳輸慢 | 未壓縮或網絡差 | 加 |
文件沒同步 | 路徑末尾 | 檢查源路徑是否應加 |
刪除了不該刪的 | 誤用 | 今后先用 |
SSH 端口不對 | 默認 22,實際非 22 | 加 |
⑨、終極口訣
“-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權限(危險!) |
| 用戶 | ?? 高危 |
完全有密碼ROOT權限(標準管理員) |
| 用戶 | ? 中(推薦) |
僅允許特定命令(無密碼) |
| 用戶可無密碼重啟 nginx,其他命令無權限。適合自動化腳本或受限運維。 | ? 高 |
允許一組相關命令(使用命令別名) |
| 先定義命令組別名 | ? 高 |
允許以特定用戶身份執行命令 |
| 用戶 | ? 高 |
僅允許查看系統狀態類命令 |
| 授予只讀監控權限,用于系統巡檢,不涉及修改。 | ? 高 |
允許使用包管理器更新(有密碼) |
| 開發者可自行更新系統包,但需輸入密碼,防止誤操作。 | ? 中 |
禁止執行危險命令 |
| 允許所有命令,但排除修改 root 密碼或執行 | ?? 中低(不推薦依賴此方式) |
按組授權(推薦批量管理) |
| 授權給用戶組 | ? 中高 |
限制在特定主機生效 |
| 僅當用戶在 | ? 中 |
🔐 關鍵安全原則
- 最小權限原則:只給用戶完成工作所必需的最小權限。
- 避免 NOPASSWD:ALL:除非是自動化服務賬戶,否則不要使用。
- 使用絕對路徑:命令必須寫完整路徑(如
/usr/bin/systemctl
),防止 PATH 劫持。 - 善用別名:
User_Alias
,Host_Alias
,Cmnd_Alias
可讓配置更清晰、易維護。 - 分文件管理:將不同用戶的權限寫入
/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,權限清晰且安全。