当前位置: 首页 > news >正文

内网安全:自签名、CA机构签发与SSH、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.加固配置:

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

2.操作脚本:

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  # 成功才给权限


文章转载自:

http://xMxZCE5z.wwznd.cn
http://zl1RmyoM.wwznd.cn
http://GAxrw1P4.wwznd.cn
http://ZTUtqRsw.wwznd.cn
http://f6wxIXRu.wwznd.cn
http://mCPWhCn1.wwznd.cn
http://uuIScAHC.wwznd.cn
http://hrPvmJsd.wwznd.cn
http://vyFXM6Km.wwznd.cn
http://EY23hthk.wwznd.cn
http://anpdyQql.wwznd.cn
http://UOVr9QHB.wwznd.cn
http://PLhHhGgx.wwznd.cn
http://52MMVPJK.wwznd.cn
http://boKmNmjO.wwznd.cn
http://rElEa91A.wwznd.cn
http://mbdN7KCT.wwznd.cn
http://eEn0hjeb.wwznd.cn
http://qYGds5Lh.wwznd.cn
http://GRZyjCCD.wwznd.cn
http://m8H2Txki.wwznd.cn
http://a9utQg6o.wwznd.cn
http://9H0g61RT.wwznd.cn
http://FsXkbiXF.wwznd.cn
http://I7PqLZvj.wwznd.cn
http://yllwAXZb.wwznd.cn
http://xbUQiitq.wwznd.cn
http://D8aoSRev.wwznd.cn
http://YPlJJJ9Q.wwznd.cn
http://Q7aVlYdg.wwznd.cn
http://www.dtcms.com/a/385373.html

相关文章:

  • 深度学习-计算机视觉-风格迁移
  • 机器学习面试题:请介绍一下你理解的集成学习算法
  • C2000基础-GPIO介绍及使用
  • 【CTF-WEB】Web基础工具的使用(burpsuit抓包并修改数值)
  • 重学前端015 --- 响应式网页设计 CSS变换
  • Spring Boot + MyBatis 报 Invalid bean definition 如何排查解决
  • 从 APP 界面设计到用户体验优化:如何让你的应用脱颖而出?
  • RabbitMQ 高可用与集群机制
  • 迎中秋庆国庆,易天假期安排通知
  • IFNet.py代码学习 自学
  • 深度学习之PyTorch基本使用(一)
  • Python 异常处理与文件操作全解析
  • 记一次神通数据库的链接不释放问题
  • FLASK 框架 (关于Flask框架的简单学习和项目实战)
  • Flutter学习项目
  • Linux中报错记录以及libRadtran的安装—Ubuntu
  • 仓颉编程语言青少年基础教程:enum(枚举)类型和Option类型
  • 124.stm32故障:程序下载不能运行,stlink调试时可以正常运行
  • 3.DSP学习记录之GPIO按键输入
  • OpenCV:图像拼接(SIFT 特征匹配 + 透视变换)
  • 基于大语言模型的有人与无人驾驶航空器协同作战框架
  • 差分: 模板+题目
  • 解读IEC62061-2021
  • SQL数据库操作语言
  • UE4工程启动卡很久如何在运行时进行dump查看堆栈
  • Day24_【深度学习—广播机制】
  • 【试题】传输专业设备L1~L3实操考题
  • CSP认证练习题目推荐(4)
  • nginx如何添加CSP策略
  • 计算机网络(一些知识与思考)