Skip to content

安全相关

CountStarlight edited this page Nov 5, 2016 · 2 revisions

安全相关

第1步. 使用沙箱

确保你为 C/C++ 开启了沙箱,并且为java开启了java安全管理(Java Policy)。在这里你可以了解更多关于沙箱

第2步. 使用Shield

Shield 不是一款真正的保护工具,但总比没有的好!确保你为 C, C++ 和 Python 开启了Shield。你可以在这里了解更多关于Shield

第3步. 创建并使用一个非个人的用户

用非个人的用户运行提交的代码非常重要,非个人的用户是指对网络没有权限,不能改变任何文件,并且不能创建大量进程的用户。

PHP 运行的时候用户名为 www-data 。 创建一个新用户名为 restricted_user 并且为它设置一个密码 在终端里运行 sudo visudo 并且把下面这一行添加到文件 sudoers 的底部:

www-data ALL=(restricted_user) NOPASSWD: ALL

tester/runcode.sh 文件里做相应改动

if $TIMEOUT_EXISTS; then
	timeout -s9 $((TIMELIMITINT*2)) $CMD <$IN >out 2>err
else
	$CMD <$IN >out 2>err        
fi

to

if $TIMEOUT_EXISTS; then
	sudo -u restricted_user timeout -s9 $((TIMELIMITINT*2)) $CMD <$IN >out 2>err
else
	sudo -u restricted_user $CMD <$IN >out 2>err        
fi

并且去掉这一行的注释:

sudo -u restricted_user pkill -9 -u restricted_user

关闭用户 restricted_user 更改网络的权限

用户restricted_user 不能使用网络,你可以在linux里通过使用 iptables 来关闭一个用户的网络。 想了解更多请点击 这里 and here. 关闭网络之后,以restricted_user 身份来运行 ping ,测试是否能够访问网络。

关闭写权限

确保没有哪个目录或文件是用户 restricted_user可写的,检查你的目录或文件的权限。

限制进程数量

限制用户 restricted_user 的进程数量。 打开 /etc/security/limits.conf ,添加下面这几行:

restricted_user     soft    nproc   3
restricted_user     hard    nproc   5

我使用 3,5,你可以使用不同的软件和硬件限制。

可选方法: 使用两个服务器

使用一个服务器放置网页,另一个服务器用来运行提交的代码,来减小运行提交的代码的风险。你需要改变Online Judge的代码来实现这个功能,也许我之后会加入这个功能。