① 从零到“零信任”SSH:新建管理员、密钥登录、sudoers 片段与安全基线

适用环境:CentOS/Alma/OpenCloudOS/RHEL 系家族

目标:摆脱“只用 root+密码”的高风险模式,完成 admin 普通账号 + 密钥登录 + 免密 sudo(受控) 的基线改造,并理解每一步背后的原理。

注:文中使用占位符,如 SERVER_IPyour_nameexample.com。请替换为你自己的信息。


一、目标设计(为什么要这样做)

  • root 禁止密码登录:暴力破解和撞库的首要入口就是 SSH/22 的口令。

  • 普通账号 admin:日常运维走最小权限,临时提权才用 sudo。

  • 密钥登录:用 Ed25519 密钥对替代口令,抗暴力、抗钓鱼。

  • sudoers 片段(/etc/sudoers.d/90-admin):用文件片段替代直接改主文件,安全、可回滚。

  • 回环+反代(预埋理念):后端服务尽量只监听 127.0.0.1,对外统一走 443/80(Nginx)。


二、实操清单

1)登录与准备

首次可能只能用 root 密码登录(后面我们会收紧):

ssh root@SERVER_IP
# Mac/Linux 默认端口 22;Windows 用 PowerShell 或终端亦可

确保安装常用编辑器(OpenCloudOS 通常自带 vi,如需 nano):

# 安装 nano(可选)
# dnf:RHEL/Alma/OpenCloudOS 的包管理器(类似 apt/yum)
dnf install -y nano

2)新建 admin 账号 + 初始化家目录/默认 Shell

# useradd:新增用户
# -m:创建 home(家目录),例如 /home/admin
# -s:登录后使用的 shell
useradd -m -s /bin/bash admin

# (可选)为 admin 设置本地口令,作为应急回退
passwd admin

术语解释

  • 家目录(home):每个用户的私人工作区(如 /home/admin),SSH 公钥也放这里。

  • /bin/bash:常见的交互式 Shell。


3)为 admin 配置 SSH 公钥免密登录

在你自己的电脑上(Mac/Linux)生成 Ed25519 密钥对:

# ssh-keygen:生成密钥对
# -t ed25519:算法类型
# -C "your_name@device":注释,便于识别
ssh-keygen -t ed25519 -C "your_name@laptop"

# 过程中会询问保存路径(默认 ~/.ssh/id_ed25519)
# 建议设置一个“密钥保护口令”,丢失设备时更安全

公钥推到服务器 admin 账户:

# 方式A:用 ssh-copy-id(最省心)
ssh-copy-id -i ~/.ssh/id_ed25519.pub admin@SERVER_IP

# 方式B:手动复制(当 A 不可用时)
# 1) 本机查看公钥:
cat ~/.ssh/id_ed25519.pub
# 2) 服务器端用 admin 身份创建授权文件(先用 root 切到 admin):
su - admin
mkdir -p ~/.ssh && chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys   # 粘贴公钥,一行一个
chmod 600 ~/.ssh/authorized_keys

验证免密:

ssh -i ~/.ssh/id_ed25519 admin@SERVER_IP
# 如能直接进 admin shell,说明密钥生效

常见坑

  • 权限不正确(.ssh 需 700,authorized_keys 需 600)会导致“还是要密码”。

  • 公钥/私钥搞反;authorized_keys 放公钥.pub),私钥永远保存在本机。


4)给 admin 开启“受控”免密 sudo(sudoers 片段)

不要直接改 /etc/sudoers 主文件。我们用片段方式,安全、可回滚:

# visudo:专门编辑 sudoers 的工具,带语法校验
# -f:指定片段路径
visudo -f /etc/sudoers.d/90-admin

在打开的编辑器里写入一行(根据需求二选一):

  • 强管控版(推荐):每次 sudo 仍需输入 admin 自己的密码

admin ALL=(ALL) ALL
  • 真正免密版(已评估风险后可用)

admin ALL=(ALL) NOPASSWD:ALL

保存后务必设置权限为只读:

chmod 440 /etc/sudoers.d/90-admin
# 0o440:owner/group 只读,防止被意外修改

最后做语法自检:

visudo -c
# 输出 “parsed OK” 即通过

验证:

su - admin
sudo -v            # -v:validate,仅校验授权,不执行命令
sudo id            # 查看提权后的身份(应看到 uid=0(root))

常见坑

  • 把配置写到主文件末尾、或文件权限错了 → sudo 报错或拒绝执行。

  • 片段命名建议加序号 90-xxx,与系统默认片段解耦,便于排序与维护。


5)收紧 SSH:禁止 root 密码,保留密钥登录

编辑 SSH 服务配置:

sudo nano /etc/ssh/sshd_config

确认或设置(建议值):

# 只允许协议版本2(现代安全默认)
Protocol 2

# root 不允许用密码,但允许密钥
PermitRootLogin prohibit-password

# 全局口令登录是否允许(如你已全面改为密钥登录,可设为 no)
# PasswordAuthentication no

重启 SSH 服务:

sudo systemctl restart sshd

测试矩阵(都要过一遍):

  • 本机用 admin 密钥能登录 ✅

  • 本机用 root 密钥能登录(如果你确实配了 root 的公钥)✅

  • root 密码登录应该被拒绝 ✅

“We trust you have received the usual lecture…”

这是 sudo 的标准提示,强调审慎。看到它说明 sudo 正常在工作。


6)本地

~/.ssh/config

:为常用主机起别名

在你的电脑上编辑 SSH 配置,之后登录更顺手:

nano ~/.ssh/config

# 示例:为 admin 起别名
Host ops-admin
    HostName SERVER_IP
    User admin
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# (可选)为 root 起别名
Host ops-root
    HostName SERVER_IP
    User root
    Port 22
    IdentityFile ~/.ssh/id_ed25519

现在只需:

ssh ops-admin
# 或 ssh ops-root

7)私钥“加密备份”与保管建议

永远不要把私钥明文丢进网盘或任何公共位置。建议本机加密后再备份到可信服务(你已部署密码库是很棒的选择):

cd ~/.ssh
# zip --encrypt:对压缩包加密(会提示输入加密口令)
zip --encrypt admin_ssh_key.zip id_ed25519
# 生成 admin_ssh_key.zip,放入你的密码库或受信任位置

提醒

  • 公钥可以随意传播;私钥只能存放在你可控的地方(或加密后的备份)。

  • 如果使用了“密钥口令”(生成时输入的 passphrase),即使私钥文件被拿到,也需要口令才可使用。


三、踩坑与解法(真实场景摘录)

  1. root is not in the sudoers file

    你用 root 执行了 sudo(没必要),或误删了 sudoers 配置。解决:用 root 直接运行命令(不加 sudo)或修复 /etc/sudoers/片段并 visudo -c 校验。

  2. nano: command not found

    服务器未安装 nano。解决:dnf install -y nano;或临时用 vi

  3. Permission denied (publickey) / 仍提示口令

    授权文件权限不对或公钥未生效。检查:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R admin:admin /home/admin/.ssh
  1. 并确认粘贴的是公钥.pub)。

  2. Could not resolve hostname eastsun-admin

    本地 ~/.ssh/config 未保存或条目与命令不一致。Host 名称需与 ssh HostName 命令中的别名一致。


四、扩展:为什么我们要用 sudoers 片段与“回环思维”

  • sudoers 片段:系统默认把包管理安装的配置放在 /etc/sudoers.d/;我们自己也用片段,避免与主文件混在一起。坏了删片段即可回退。

  • 回环(127.0.0.1)+ 反向代理:把后台服务只监听本机回环,外部统一走 443/80(Nginx/宝塔反代)。你减少了开放端口的数量,避免“后端直连”被扫描,同时集中做 TLS/证书/限流/审计。


五、核对清单(交付标准)

  • admin 存在且可登录(密钥)

  • adminsudo -v / sudo id

  • /etc/sudoers.d/90-admin 存在、权限 440、visudo -c 通过

  • root 密码登录被拒绝;如有 root 公钥则可密钥登录

  • 本机 ~/.ssh/config 可用别名直连

  • 私钥已做加密备份(或保存在安全的密码库中)


六、后续衔接

在此基线之上,我们继续完成了 三层防火墙与反代策略Docker/Compose 部署(FreshRSS/RSSHub)Syncthing(直连与 QUIC 调优)Uptime Kuma 告警主页导航(Homer) 等。

下一篇将系统讲清“云防火墙 & 宝塔 & 系统 firewalld & Nginx 反代 的协同与取舍”,以及为什么关闭一部分端口后服务仍可访问。

发表回复

Your email address will not be published. Required fields are marked *.

*
*

Copyright © 2025 十两东日的随想. All Rights Reserved.

鄂ICP备2025140583号-1 | 鄂公网安备42011102005804号