Android Root Atlas/教程库/服务器与运维

Linux / Unix Root 与系统管理 / 服务器与运维

第一次管理 Linux 服务器:不用直接登录 root 的 SSH、sudo 与 systemd 工作流

在自己的测试 VM 上验证普通管理员公钥登录,再用可回滚的 SSH drop-in 禁止直接 root 登录并核验生效配置。

本篇完成任务

保留控制台与现有会话,在第二个会话验证普通管理员账户后,安全禁用 SSH 直接 root 登录并完成回滚演练。

服务器文档里的 root 是远程 Linux 主机的管理员账户,不是 Android Root;SSH 密钥、sudo 和 systemd 也不会修补手机启动镜像。本篇只在你拥有且有控制台的测试 VM 上完成一个任务:验证普通管理员通道后,禁止 SSH 直接登录 root,并保留明确回滚点。

你会完成什么#

  • 读取 SSH 当前的“生效配置”,而不是只看某一行文件。
  • 在第二个终端验证普通账号的公钥登录和 sudo 权限。
  • 用独立 drop-in 禁止直接 root 登录,并在 reload 前检查语法。
  • 用新会话核验结果,同时保持旧会话与控制台可用。
  • 理解 SSH、sudo 与 systemd 专用服务账户在最小权限中的分工。

先看结论#

当前条件是否继续原因
有 VM 控制台、普通管理员公钥可登录、第二会话可用即使 SSH 配错也有恢复路径
只有一个 root SSH 会话修改后可能把自己锁在主机外
普通账号只能密码登录暂停先按云厂商/发行版文档配置并测试公钥
sshd -t 报错绝不 reload 有语法错误的配置
README 写 “root cause”与本篇无关它说故障根因,不是 root 账户

心智模型#

管理员电脑 ──公钥──> 普通运维账号 ──sudo 单任务──> 必要的系统变更
                                      └─ systemd ─> 专用低权限服务账号
回滚护栏:云/VM 控制台 + 保持的旧会话 + 配置备份 + sshd -t

工具清单#

工具角色什么时候用来源与注意
OpenSSH sshd接受远程 SSH 连接查看、验证和 reload 服务端策略PermitRootLogin 有多个值;以 sshd -T 为准
ssh从客户端建立第二/第三会话每次配置变更前后明确 <admin-user><host> 与密钥,避免连错主机
sudo / sudoers让普通账户执行必要管理命令登录成功后按任务提权不给宽泛 NOPASSWD: ALL
systemd管理守护进程并设定 User= 等边界SSH reload 和后续服务降权服务名可能是 sshsshd
Ansible become多主机重复执行已验证的变更手工流程稳定后先用 check/diff;不是新手首次改 SSH 的救援工具
Cockpit可选的 Web 管理入口环境已正式部署并受 polkit 控制时不能替代控制台与 SSH 回滚计划

项目全景:服务器与运维的 8 个项目,一个不漏#

这 8 个项目适合写成一条从系统安装与管理员训练,到 Kubernetes 工作负载,再到事故根因分析的入门运维路线。

技术路线项目数处理等级在主题任务中的位置
系统管理学习与基线2候选路线用 Born2beRoot 和管理员脚本练习账户、服务、日志和最小权限,只在虚拟机中操作并保留快照。
多发行版部署与可恢复启动1候选路线围绕离线安装、ZFS root、黄金镜像和 WireGuard 建立部署前检查、回滚引导环境与配置证据。
Kubernetes 工作负载与集群信任2候选路线以在线评测系统和自定义 CA 注入器说明工作负载部署、证书分发与权限边界,不把仓库名中的 root 当成超级用户。
事故调查、RCA 与 ChatOps3边界复核把告警证据、只读诊断、根因假设和人工批准修复串成闭环;AI/MCP 输出只作线索,不能直接获得生产写权限。

1. 系统管理学习与基线 · 2#

用 Born2beRoot 和管理员脚本练习账户、服务、日志和最小权限,只在虚拟机中操作并保留快照。

本组共 2 项:2 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。

项目上游定位与识别信号状态与采用前检查
kneutron/ansitest主题用途:将 kneutron/ansitest 纳入「系统管理学习与基线」候选路线,根据 Shell 核对功能、平台与版本适配。 上游自述(保留原文):ansible test stuff and root/bin bash scripts for Linux / OSX admins未归档源项目 · ★ 361 · 协议未声明 · 2026-05-26。活跃候选:先核对 README、最新 Release、目标版本与已知问题。
Vikingu-del/Born2beRoot主题用途:将 Vikingu-del/Born2beRoot 纳入「系统管理学习与基线」候选路线,根据 Shell 核对功能、平台与版本适配。 上游自述(保留原文):"Born to be Root" is a comprehensive guide aimed at empowering individuals who are new to system administration, specifically focusing on mastering the Linux environment.未归档源项目 · ★ 45 · MIT · 2024-04-11。活跃候选:先核对 README、最新 Release、目标版本与已知问题。

2. 多发行版部署与可恢复启动 · 1#

围绕离线安装、ZFS root、黄金镜像和 WireGuard 建立部署前检查、回滚引导环境与配置证据。

本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。

项目上游定位与识别信号状态与采用前检查
kldload/kldload主题用途:将 kldload/kldload 纳入「多发行版部署与可恢复启动」候选路线,根据 arch-linux · centos · debian · Shell 核对功能、平台与版本适配。 上游自述(保留原文):7 distros, one USB, ZFS on root. CentOS, Debian, Ubuntu, Fedora, Rocky, RHEL, Arch. Offline install, boot environments, WireGuard, eBPF. Free.未归档源项目 · ★ 36 · BSD-3-Clause · 2026-07-09。边界命中:先读 README,确认它确实属于当前任务,再决定是否使用。

3. Kubernetes 工作负载与集群信任 · 2#

以在线评测系统和自定义 CA 注入器说明工作负载部署、证书分发与权限边界,不把仓库名中的 root 当成超级用户。

本组共 2 项:2 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。

项目上游定位与识别信号状态与采用前检查
Judge-Girl/Judge-Girl主题用途:将 Judge-Girl/Judge-Girl 纳入「Kubernetes 工作负载与集群信任」候选路线,根据 clean-architecture · judge-girl · kubernetes · Java 核对功能、平台与版本适配。 上游自述(保留原文):Incubated Judge-Girl's (A Cloud-Native Online Judge System) root project. With powerful CMS features (e.g., dry-run / compilation-script generation / Continuous Problem Integration & Delivery) and educational features like exam and assignments. Judge Girl is carefully designed of its plugin-like structure easily supporting various judge-policies and code-quality inspectors in the future.未归档源项目 · ★ 73 · Apache-2.0 · 2022-01-19。活跃候选:先核对 README、最新 Release、目标版本与已知问题。
microcumulus/ca-injector主题用途:将 microcumulus/ca-injector 纳入「Kubernetes 工作负载与集群信任」候选路线,根据 certificate · certificate-authority · injector · Go 核对功能、平台与版本适配。 上游自述(保留原文):Painlessly use off-the-shelf images (and your own) in your k8s cluster, with custom root CAs.未归档源项目 · ★ 32 · MIT · 2025-05-21。活跃候选:先核对 README、最新 Release、目标版本与已知问题。

4. 事故调查、RCA 与 ChatOps · 3#

把告警证据、只读诊断、根因假设和人工批准修复串成闭环;AI/MCP 输出只作线索,不能直接获得生产写权限。

本组共 3 项:3 个源项目、0 个 Fork,其中 0 项已归档。它们的平台、用途或分类存在边界,只作逐项核验,不当作默认安装候选。

项目上游定位与识别信号状态与采用前检查
Arvo-AI/aurora主题用途:将 Arvo-AI/aurora 作为「事故调查、RCA 与 ChatOps」边界条目,通过 ai-agents · aiops · automation · Python 核对它实际是否属于本教程。 上游自述(保留原文):Aurora — Open source AI-powered agentic incident management & root cause analysis for SREs. LangGraph agents investigate across AWS, Azure, GCP, Kubernetes. Integrates with PagerDuty, Datadog, Grafana, Slack and More. Apache 2.0.未归档源项目 · ★ 371 · Apache-2.0 · 2026-07-16。边界条目:先核对实际平台、用途和分类理由,不作为默认安装源。
rootlyhq/rootly-mcp-server主题用途:将 rootlyhq/rootly-mcp-server 作为「事故调查、RCA 与 ChatOps」边界条目,通过 Python 核对它实际是否属于本教程。 上游自述(保留原文):Rootly MCP server未归档源项目 · ★ 44 · Apache-2.0 · 2026-07-17。边界条目:先核对实际平台、用途和分类理由,不作为默认安装源。
yindia/rootcause主题用途:将 yindia/rootcause 作为「事故调查、RCA 与 ChatOps」边界条目,通过 aws-mcp · containers · helm · Go 核对它实际是否属于本教程。 上游自述(保留原文):RootCause is a local-first MCP server that turns natural-language requests into evidence-backed incident analysis, Kubernetes diagnostics, and safer operations.未归档源项目 · ★ 41 · MIT · 2026-05-31。边界条目:先核对实际平台、用途和分类理由,不作为默认安装源。

开始前#

仅使用可销毁的测试 VM。确认你能打开虚拟化平台或云厂商控制台,记录 VM 名称、IP、发行版和 OpenSSH 版本。把 <admin-user><host><service> 当作必须替换的占位符;<service> 在 Debian/Ubuntu 常为 ssh,部分系统为 sshd,用 systemctl status sshdsystemctl status ssh 只读判断。不要关闭当前 root/管理员会话。

操作步骤#

1. 记录生效配置和回滚材料#

在现有会话运行 whoamihostnamectl,确认目标。执行 sudo sshd -T | grep -i '^permitrootlogin ' 记录全局生效值;有 Match 规则时,应按 sshd 手册使用 -C 提供目标 user/host/address 再核对。运行 sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.before-root-login-change 保存主文件元数据;如果系统已有 /etc/ssh/sshd_config.d,同时列出其内容并截图/记录。备份只用于本次测试,完成后按组织策略归档。

2. 在第二会话验证普通管理员#

从客户端新开终端,执行 ssh <admin-user>@<host>。确认服务器指纹来自控制台或既有可信记录,不因“host key changed”就删除 known_hosts。登录后运行 idsudo -l,再执行只读的 sudo id。保持这个会话打开;只有公钥登录和 sudo 都成功,才进入下一步。

3. 写入最小 drop-in 并安全 reload#

若发行版支持 sshd_config.d,用 sudoedit /etc/ssh/sshd_config.d/60-disable-root-login.conf 创建只含 PermitRootLogin no 的文件;若不支持 include,停止并查该发行版官方文档,不盲改主文件。运行 sudo sshd -t,再用 sudo sshd -T | grep -i '^permitrootlogin ' 确认解析值是 no。之后执行 sudo systemctl reload <service>;reload 保留现有连接。若任何命令失败,不继续,按下一步回滚。

4. 用第三会话验证并演练回滚#

再开一个全新终端,确认 ssh <admin-user>@<host> 仍可用。若组织允许做负向测试,可运行 ssh root@<host>,预期认证被拒绝;不要反复猜密码。回滚时,在仍打开的普通管理员会话中先核对文件路径,再执行 sudo rm /etc/ssh/sshd_config.d/60-disable-root-login.conf,运行 sudo sshd -t 并 reload <service>。若曾直接改主文件,则用备份经 sudoedit 对比恢复,不做未经检查的覆盖。正式保留新策略时,不执行回滚,只记录文件与生效值。

验证#

  • 至少一个新开的普通管理员公钥会话在变更后成功登录。
  • sudo sshd -t 无输出且退出码为零。
  • sudo sshd -T 显示 permitrootlogin no,与目标策略一致。
  • 直接 root SSH 认证被拒绝,而现有会话没有中断。
  • 控制台、备份路径、drop-in 路径与回滚动作都已记录。

排错#

现象常见原因安全处理
sshd -T 与文件中的行不同Include、Match 或后续指令改变了生效值查完整配置和 -C 上下文,不重复添加相互冲突的行
reload 后普通账号不能新登录公钥、目录权限或 AllowUsers/Match 规则问题保持旧会话,用控制台查看日志并回滚 drop-in
Unit sshd.service not found发行版服务名是 sshsystemctl status 只读确认,不猜测重启
host key 警告IP 被复用、主机重装或可能遭中间人攻击从控制台核对指纹,未核对前停止
sudo 不允许 reload账户授权范围不足让管理员完成变更,不扩大 sudoers 规则

完成清单#

  • 我确认这是测试 VM,不是 Android 设备或生产服务器。
  • 我保留了控制台、旧会话和可识别的配置备份。
  • 我在变更前后都验证了普通管理员公钥与 sudo。
  • 我运行了 sshd -t,并记录 sshd -T 的生效值。
  • 我知道如何移除唯一的 drop-in 并安全 reload 回滚。

一手资料#