我可以在运行时限制CGI脚本中允许的文件夹吗?

问题描述 投票:0回答:1

我正在为我的网站编写cgi程序(所有程序都使用一个lighttpd服务托管)。程序读取它们各自所在的子文件夹中的目录和文件。它们使用网络服务器的用户ID运行。

我想确保没有搞砸,这可能导致我的程序在他们想要的工作区之外阅读。我想在运行时在我的cgi程序顶部附近添加一行代码如下:

restrict_io(".");

如果他们做了一些时髦的事情,比如试图从/ usr / bin运行任意内容或打开../other_website/stuff中的文件,那么该行之后的任何内容都会出现访问错误。

有什么简单的解决方案吗?我浏览了各种解决方案,但他们似乎都需要我的大量投资才能了解他们是否真的可以做我想做的事情。

chroot(2)doc说“它既不是用于任何安全目的,也不是用于完全沙箱化进程,也不用于限制文件系统系统调用”它还需要Web用户没有的功能或root权限。它也可能过于复杂,因为我怀疑你需要仔细准备新的“/”。

seccomp(2)doc非常冗长乏味。听起来它确实做了很多,但目前还不清楚它是否可以做我想要的。

pledge(2)只是BSD,我的服务器是Linux的味道,我想保持这种方式,因为我使用的机器不仅仅是虚拟主机。再说一次,我不确定承诺是否符合我的要求。

LXC,还没有读过它。

Docker看起来像某个公司的产品。我还没看过它是免费的,开源的。

如果你还没有在线之间阅读,那么C解决方案将是最好的,但如果不是C,也不要犹豫,也可以提供答案。代码片段胜过千言万语。

linux security cgi sandbox
1个回答
0
投票

我发现AppArmor(Linux内核的一部分)完全符合我的要求。

在代码中调用aa_change_profile(const char * profile)。该配置文件首先以root用户身份在CLI util apparmor_parser中注册。您可能需要启用带有内核参数的apparmor,然后启动服务:

linux ... apparmor=1 security=apparmor

sudo systemctl启用apparmor

示例cgi.armor:

profile restricted_cgi {
  deny network,
  /home/pi/website1/** r,
}

sudo apparmor_parser -a cgi.armor

使用-lapparmor编译的示例my_program.c:

#include <sys/apparmor.h>
...
int armor = aa_change_profile("restricted_cgi");
if(armor) {
  printf("Armor error: %s\n", strerror(errno));
  return 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.