我正在尝试设置一个开发服务器,供不同的团队(由不同的人组成,其中一些人可能参与多个项目)用于多个(Web)项目。我确实信任我的所有用户,但是出于法律原因(敏感数据可能存储在某些项目中),我需要能够限制他们对服务器某些部分的访问。
我需要有以下堆栈:
nginx
php-fpm
(通过 fastcgi)mariadb
作为 mysql 服务器varnish
大多数(如果不是全部)用户都需要访问 ssh,因此限制与 sftp 的连接并监禁他们是不可能的。我已经弄清楚了以下内容:
nginx
不会执行任何任意代码,因此它可以以所有项目的权限运行php-fpm
能执行任意代码,因此需要加以限制。我决定运行单独的池,每个池都有访问权限仅有的到一个项目mysql
不构成任何安全问题varnish
这是我以后要处理的单独问题
我最初的想法是将 ssh 连接上的用户关进监狱,但这似乎只是一种“快速修复”,而不是解决方案 - 此外,它还具有局限性,维护起来很繁琐。我的第二个想法是使用 SELinux(我没有使用过)来限制对项目相关文件的访问。我认为以下方法可行(这margo
是一个示例项目名称):
- 创建自定义 SELinux 策略(
margo_proj
),其将:- 创建上下文
margo_proj_t
,margo_proj_log_t
并margo_proj_tmp_t
- 允许访问
httpd_t
以及分配了与项目相关的用户的所有上下文
- 创建上下文
- 具有权限
/srv/www/margo
和上下文margo:margo
775
margo_t
/srv/www/margo
里面的所有文件不是由 PHP 解释的775
权限770
在权限范围内由 PHP 解释的所有文件
nginx
以 身份运行www-data:www-data
并php-fpm
以 身份池化margo:margo
,均带有httpd_t
上下文。- 将所有需要访问该项目的用户添加到
margo
组。
这能行吗?我对 SELinux 的了解非常基础(即根本不了解),在开始执行可能导致服务器停机的操作之前,我想检查这是否是处理问题的正确方法。关于 SELinux 有很多信息,但我找不到任何与我的具体问题稍微相关的内容,而且大多数文章对于没有经验的 SELinux 用户来说都很难理解。