Linux创建受限用户实现Web C++编译器安全编译方案问询
首先处理cc1plus找不到的报错——这是因为www-data用户的环境变量PATH未包含gcc组件的执行路径。
定位cc1plus的位置
执行以下命令找到cc1plus的绝对路径:find / -name cc1plus示例输出可能是:
/usr/lib/gcc/x86_64-linux-gnu/11/cc1plus,记录下该路径的父目录(比如/usr/lib/gcc/x86_64-linux-gnu/11)。检查www-data的PATH配置
切换到www-data用户查看当前PATH:su - www-data -s /bin/bash echo $PATH确认是否包含上一步记录的父目录。
添加PATH到www-data的环境变量
- 临时测试方案:在PHP调用g++前手动设置PATH:
shell_exec('export PATH=$PATH:/usr/lib/gcc/x86_64-linux-gnu/11 && g++ main.cpp -o compiled.exe'); - 永久生效方案:创建或编辑
www-data的bash配置文件:
添加以下内容(替换为你的cc1plus父目录):nano /home/www-data/.bashrc
保存后执行export PATH=$PATH:/usr/lib/gcc/x86_64-linux-gnu/11source /home/www-data/.bashrc使配置生效。
- 临时测试方案:在PHP调用g++前手动设置PATH:
验证配置
切换到www-data用户,直接执行g++ --version,若正常输出版本信息,再编译一段测试代码确认无报错。
通过受限shell、环境变量和目录权限,实现用户仅能访问指定目录并使用g++编译。
创建用户并指定主目录
useradd -d /var/www/site/builds/1 -m coder-1-d指定用户主目录,-m自动创建该目录。设置受限shell
将用户shell改为rbash(受限bash),限制用户切换目录、执行危险命令:usermod -s /bin/rbash coder-1限制用户PATH仅包含g++
编辑用户主目录下的.bashrc文件:nano /var/www/site/builds/1/.bashrc添加以下内容(先用
which g++确认g++的绝对路径):export PATH=/usr/bin/g++这样用户只能执行g++,无法调用其他系统命令。
设置目录权限
确保主目录仅对coder-1可访问:chown coder-1:coder-1 /var/www/site/builds/1 chmod 700 /var/www/site/builds/1验证受限效果
切换到coder-1用户:su - coder-1- 尝试切换到其他目录(如
cd /root),应提示权限不足; - 执行
g++ --version应正常输出; - 执行其他命令(如
ls)会提示"command not found"。
- 尝试切换到其他目录(如
PHP切换到coder-1执行编译
修改sudoers文件,允许www-data无需密码切换到coder-1执行g++:visudo添加以下内容:
www-data ALL=(coder-1) NOPASSWD: /usr/bin/g++保存后,PHP中即可安全调用:
shell_exec('sudo -u coder-1 g++ main.cpp -o compiled.exe');
- 对用户提交的代码进行静态分析,过滤
system、exec、popen等危险函数调用; - 若要进一步提升安全性,可考虑使用Docker容器隔离编译环境,每个用户的编译过程在独立容器中执行,避免影响主机系统。
内容的提问来源于stack exchange,提问作者EvaldasL

