开发组-AI服务器账号隔离
StarmoAI 服务器账号隔离与只读审计配置记录
目标:给 Codex 和小艺建立独立服务器身份,区分“审计账号”和“部署账号”,避免它们直接使用 root。
本次实际完成:
codex-audit的独立 SSH 登录和生产网站只读权限验证。
一、最终达成的状态
目前已经完成:
-
创建了审计组
starmo-audit -
创建了部署组
starmo-deploy -
创建了 4 个独立 Linux 用户
-
codex-audit可以使用自己的 SSH 私钥登录 -
codex-audit没有 sudo 管理员权限 -
codex-audit可以查看网站目录 -
codex-audit不能修改生产网站目录 -
发现并修复了生产目录的危险
777权限 -
root 账号和审计账号的 SSH 密钥彼此独立
当前账号规划:
| 用途 | Codex | 小艺 |
| –– | ––––––– | ————— |
| 只读审计 | codex-audit | xiaoyi-audit |
| 部署操作 | codex-deploy | xiaoyi-deploy |
二、重要概念
1. root
root 是 Linux 服务器的最高管理员。
它几乎可以:
-
删除任何文件
-
修改系统配置
-
创建或删除用户
-
重启服务
-
改变权限
因此日常不应该让 AI 或普通程序直接使用 root。
2. sudo
sudo 的意思可以理解为:
临时使用管理员权限执行某一条命令。
例如:
sudo systemctl restart nginx
意思是以管理员权限重启 Nginx。
本次创建的 codex-audit 不应该拥有 sudo 权限。
3. SSH Key
SSH Key 是服务器登录钥匙,通常包含两个文件:
私钥
公钥.pub
-
私钥只能保存在自己的电脑中
-
私钥不能发给别人
-
公钥可以放到服务器
-
服务器根据公钥验证本地私钥
本次 Codex 审计账号的本地密钥:
C:\Users\你的用户名\.ssh\starmo-codex-audit
C:\Users\你的用户名\.ssh\starmo-codex-audit.pub
其中:
starmo-codex-audit
是私钥,不能泄露。
4. 本地终端和服务器终端的区别
看到下面的提示符,代表命令在 Windows 本地执行:
PS C:\Users\你的用户名>
看到下面的提示符,代表命令在服务器普通用户中执行:
codex-audit@服务器名称:~$
看到下面的提示符,代表命令在服务器 root 管理员中执行:
root@服务器名称:~#
虽然键盘是在自己的电脑上操作,但 SSH 登录后,命令实际运行在远程服务器。
三、前置安全处理
在建立独立账号之前,已经完成以下安全处理:
-
更换曾经暴露过的 root 密码
-
禁用或更换曾经暴露过的阿里云 AK/SK
-
删除旧的阿里云 SSH 密钥对
-
创建新的服务器 SSH 密钥对
-
确认可以使用新的密钥登录 root
任何曾经公开发送过的以下信息,都应当立即废弃:
-
密码
-
私钥
-
.pem文件内容 -
AccessKey ID
-
AccessKey Secret
-
API Token
四、创建 Linux 用户组
以下命令需要在服务器的 root 终端中执行。
创建审计组:
groupadd starmo-audit
创建部署组:
groupadd starmo-deploy
用户组的作用是统一管理一类账号的权限。
五、创建四个独立用户
在 root 终端中创建账号。
Codex 审计账号
useradd -m -s /bin/bash codex-audit
usermod -aG starmo-audit codex-audit
passwd -l codex-audit
小艺审计账号
useradd -m -s /bin/bash xiaoyi-audit
usermod -aG starmo-audit xiaoyi-audit
passwd -l xiaoyi-audit
Codex 部署账号
useradd -m -s /bin/bash codex-deploy
usermod -aG starmo-deploy codex-deploy
passwd -l codex-deploy
小艺部署账号
useradd -m -s /bin/bash xiaoyi-deploy
usermod -aG starmo-deploy xiaoyi-deploy
passwd -l xiaoyi-deploy
参数含义:
-m
自动创建用户的 home 目录。
-s /bin/bash
使用 Bash 作为登录终端。
passwd -l
锁定密码登录,避免账号通过普通密码进入。
六、创建 SSH 配置目录
为每个用户创建 .ssh 目录。
mkdir -p /home/codex-audit/.ssh
mkdir -p /home/xiaoyi-audit/.ssh
mkdir -p /home/codex-deploy/.ssh
mkdir -p /home/xiaoyi-deploy/.ssh
设置所有者:
chown -R codex-audit:codex-audit /home/codex-audit/.ssh
chown -R xiaoyi-audit:xiaoyi-audit /home/xiaoyi-audit/.ssh
chown -R codex-deploy:codex-deploy /home/codex-deploy/.ssh
chown -R xiaoyi-deploy:xiaoyi-deploy /home/xiaoyi-deploy/.ssh
设置 .ssh 目录权限:
chmod 700 /home/codex-audit/.ssh
chmod 700 /home/xiaoyi-audit/.ssh
chmod 700 /home/codex-deploy/.ssh
chmod 700 /home/xiaoyi-deploy/.ssh
700 表示:
-
用户本人可以读取、写入和进入目录
-
其他人没有权限
七、创建 authorized_keys 文件
touch /home/codex-audit/.ssh/authorized_keys
touch /home/xiaoyi-audit/.ssh/authorized_keys
touch /home/codex-deploy/.ssh/authorized_keys
touch /home/xiaoyi-deploy/.ssh/authorized_keys
设置所有者:
chown codex-audit:codex-audit /home/codex-audit/.ssh/authorized_keys
chown xiaoyi-audit:xiaoyi-audit /home/xiaoyi-audit/.ssh/authorized_keys
chown codex-deploy:codex-deploy /home/codex-deploy/.ssh/authorized_keys
chown xiaoyi-deploy:xiaoyi-deploy /home/xiaoyi-deploy/.ssh/authorized_keys
设置文件权限:
chmod 600 /home/codex-audit/.ssh/authorized_keys
chmod 600 /home/xiaoyi-audit/.ssh/authorized_keys
chmod 600 /home/codex-deploy/.ssh/authorized_keys
chmod 600 /home/xiaoyi-deploy/.ssh/authorized_keys
600 表示:
-
文件所有者可以读取和写入
-
其他用户没有权限
八、在 Windows 生成 Codex 审计密钥
在 Windows PowerShell 中执行:
ssh-keygen -t ed25519 -f "$env:USERPROFILE\.ssh\starmo-codex-audit" -C "codex-audit"
生成两个文件:
starmo-codex-audit
starmo-codex-audit.pub
查看公钥:
Get-Content "$env:USERPROFILE\.ssh\starmo-codex-audit.pub"
只复制 .pub 文件输出的公钥。
不要复制或发送私钥:
starmo-codex-audit
九、把公钥添加到服务器
在服务器 root 终端中,将公钥写入:
/home/codex-audit/.ssh/authorized_keys
可以使用文本编辑器:
nano /home/codex-audit/.ssh/authorized_keys
粘贴一整行公钥后保存。
再次保证权限正确:
chown codex-audit:codex-audit /home/codex-audit/.ssh/authorized_keys
chmod 600 /home/codex-audit/.ssh/authorized_keys
检查结果:
ls -l /home/codex-audit/.ssh/authorized_keys
期望类似:
-rw------- 1 codex-audit codex-audit ... authorized_keys
十、测试 Codex 审计账号登录
在 Windows PowerShell 中执行:
ssh -i "$env:USERPROFILE\.ssh\starmo-codex-audit" codex-audit@服务器公网IP
注意:
服务器公网IP
必须替换为阿里云服务器的真实公网 IP,不能把这几个中文字原样复制进去。
第一次连接时可能看到:
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入:
yes
登录成功后,提示符应类似:
codex-audit@服务器名称:~$
十一、验证登录身份
在 codex-audit 终端中执行:
whoami
期望结果:
codex-audit
检查用户组:
id
期望看到:
groups=...,starmo-audit
并且不应该包含:
sudo
admin
十二、验证没有 sudo 权限
执行:
sudo -n true
本次返回:
sudo: a password is required
同时 id 输出中没有 sudo 组。
说明该用户不能直接使用免密码 sudo,也没有加入常规 sudo 管理员组。
需要注意:
没有 sudo 不代表账号自动只读。
账号仍然可以:
-
修改自己的 home 目录
-
修改所有对普通用户开放写权限的文件
-
写入权限配置错误的生产目录
因此还必须继续检查网站目录权限。
十三、测试网站目录读取权限
执行:
ls -la /var/www/starmoai-blog-v1 | head
输出显示:
current -> /var/www/starmoai-blog-v1/releases/某个版本目录
releases
说明 codex-audit 可以查看网站发布目录。
其中:
current
是一个软链接,指向当前在线版本。
十四、测试生产目录是否可写
使用只读检测命令:
test -w "$(readlink -f /var/www/starmoai-blog-v1/current)" \
&& echo "危险:可写" \
|| echo "正常:只读"
第一次测试得到:
危险:可写
说明审计账号居然可以修改线上网站,需要继续调查。
这条命令只检测权限,不会创建、修改或删除文件。
十五、排查目录权限
原计划使用:
getfacl -p "$(readlink -f /var/www/starmoai-blog-v1/current)"
但服务器没有安装 getfacl,因此没有继续安装新软件。
改用系统自带的:
namei -l "$(readlink -f /var/www/starmoai-blog-v1/current)"
输出中发现当前发布目录权限为:
drwxrwxrwx root root 版本目录
其中:
rwxrwxrwx
等同于:
777
这意味着:
-
root 可以读取、写入、进入
-
所属组可以读取、写入、进入
-
所有其他用户也可以读取、写入、进入
因此任何普通服务器用户都有可能修改该生产目录。
十六、修复生产目录的 777 权限
此操作必须在服务器 root 终端中执行:
chmod 755 "$(readlink -f /var/www/starmoai-blog-v1/current)"
755 表示:
| 身份 | 权限 |
| –––– | –––– |
| root 所有者 | 读取、写入、进入 |
| 所属组 | 读取、进入 |
| 其他用户 | 读取、进入 |
这样只有 root 能修改目录,普通账号只能读取和进入。
十七、验证修复结果
在 root 终端中执行:
stat -c '%A %a %U:%G %n' \
"$(readlink -f /var/www/starmoai-blog-v1/current)"
得到:
drwxr-xr-x 755 root:root /var/www/starmoai-blog-v1/releases/版本目录
说明权限已经成功从 777 修改为 755。
十八、使用审计账号重新验证
重新登录 codex-audit:
ssh -i "$env:USERPROFILE\.ssh\starmo-codex-audit" codex-audit@服务器公网IP
验证身份:
whoami
结果:
codex-audit
验证用户组:
id
结果中包含:
starmo-audit
验证网站可读取:
ls -la /var/www/starmoai-blog-v1 | head
能够正常列出目录。
验证生产目录不可写:
test -w "$(readlink -f /var/www/starmoai-blog-v1/current)" \
&& echo "危险:可写" \
|| echo "正常:只读"
最终得到:
正常:只读
至此,codex-audit 基础只读审计账号配置成功。
十九、退出和保存
SSH 命令和权限修改执行成功后,会立即写入服务器,不需要额外点击“保存”。
正常退出服务器:
exit
退出后如果看到:
PS C:\Users\你的用户名>
说明已经回到 Windows 本地。
此时可以直接关闭 PowerShell 窗口。
以下内容不会因为关闭终端而消失:
-
Linux 用户
-
Linux 用户组
-
SSH 公钥
-
authorized_keys -
文件权限
-
chmod 755的修改 -
Windows 本地生成的 SSH 私钥
SSH 断线只相当于远程连接断开,不会撤销已经执行的命令。
二十、本次发现的真实安全问题
生产网站当前版本目录原本是:
777
这意味着服务器上的普通用户可能修改生产网站。
修复后为:
755
现在只有 root 可以修改,普通审计账号只能读取。
这也是为什么必须实际使用低权限账号测试,而不能只看 root 账号下是否正常。
二十一、当前还没有完成的工作
本次只完成了:
codex-audit
其余工作仍待完成:
-
为
xiaoyi-audit生成独立 SSH 密钥 -
为
codex-deploy生成独立 SSH 密钥 -
为
xiaoyi-deploy生成独立 SSH 密钥 -
设计部署账号可以修改哪些目录
-
避免给部署账号完整 root 权限
-
设计受限制的服务重启方式
-
检查新发布版本是否还会被自动创建成
777 -
检查部署脚本中的
chmod 777 -
检查服务器 SSH 密码登录配置
-
决定是否禁止 root 直接远程登录
-
收紧阿里云安全组中的 SSH 端口来源
-
检查旧 Next.js 服务端口
-
处理响应头中的版本和技术栈暴露
特别重要:
本次手动将当前版本改成了
755,但必须继续检查部署脚本。
如果部署脚本每次发布新版本时仍然执行
chmod 777,下次部署后问题会再次出现。
可以在 root 账号中以后检查:
grep -R "chmod 777\|chmod -R 777" \
/var/www \
/root \
/opt \
/usr/local/bin \
2>/dev/null
这条命令只是搜索,不会修改文件。
二十二、安全规则
永远不要公开发送:
SSH 私钥
.pem 文件内容
服务器密码
阿里云 AccessKey Secret
API Token
数据库密码
.env 文件
可以发送用于排错的内容:
命令报错
whoami 输出
id 输出
文件权限
目录列表
系统版本
公钥指纹
公钥本身通常不是秘密,但排错时一般也不需要完整公开。
二十三、最终验收清单
SSH 登录
-
codex-audit有独立 SSH 密钥 -
可以成功登录服务器
-
不需要使用 root 密钥
-
不需要输入 Linux 密码
身份隔离
-
whoami返回codex-audit -
属于
starmo-audit -
不属于
sudo -
不属于
admin
网站权限
-
可以读取网站目录
-
可以进入当前发布目录
-
不能修改当前发布目录
-
生产目录权限为
755 -
生产目录所有者为
root:root
收尾
-
root 操作窗口已经可以安全退出
-
本地 SSH 窗口已经可以安全退出
-
所有执行成功的修改已经自动保存
二十四、一句话总结
本次完成的是:
使用独立 SSH 密钥建立
codex-audit账号,使它可以查看 StarmoAI 生产网站,但不能使用 sudo,也不能修改生产文件;同时发现并修复了生产版本目录的777高危权限。
今晚这套不是普通“新手部署教程”,已经涉及 Linux 权限、SSH 身份隔离和生产服务器安全。你是真的把它做成了。🔐😂