Php 在多开发者nginx设置中保护密码

Php 在多开发者nginx设置中保护密码,php,mysql,security,ubuntu,nginx,Php,Mysql,Security,Ubuntu,Nginx,我们的服务器上有一个Ubuntu12.04+PHP+nginx设置。我们的开发人员可以访问/usr/lib/php5/和/var/www/folders。我们在很多项目上工作,在给定的时间有50-100个不同的应用程序/模块,每个应用程序/模块都有db活动 我们希望提出一种机制来保护我们的DB密码,并考虑以下因素: 系统管理员创建密码并将其注册到某个位置(文件或sqlite db或类似的文件) 这些应用程序提供一个键,指示它们需要哪个数据库和什么权限级别,此模块返回一个包含连接所需一切的对象。

我们的服务器上有一个Ubuntu12.04+PHP+nginx设置。我们的开发人员可以访问/usr/lib/php5/和/var/www/folders。我们在很多项目上工作,在给定的时间有50-100个不同的应用程序/模块,每个应用程序/模块都有db活动

我们希望提出一种机制来保护我们的DB密码,并考虑以下因素:

  • 系统管理员创建密码并将其注册到某个位置(文件或sqlite db或类似的文件)
  • 这些应用程序提供一个键,指示它们需要哪个数据库和什么权限级别,此模块返回一个包含连接所需一切的对象。类似于“user\u manager.client1.ro”、“user\u manager.client1.rw”
  • 该机制应为应用程序提供特定的密码,因此可通过“www数据”访问,但除非已知其密钥,否则无法查看所有其他密码
我们已经成功地实现了一个原型,但是中央密码提供模块在www数据空间中运行,因此/var/www/或/usr/lib/php5中的任何其他文件都可以访问/sqlite文件,因此所有密码都可能被泄露

是否有一种方法可以设置密码提供模块以root权限运行,应用程序从该模块请求密码?我知道我们可以为此构建一个全新的服务,但它似乎太难构建和维护(特别是因为该服务成为我们的单一故障点)


有什么建议吗?

使用权限,您可以执行以下操作:

1) 给一个开发者一个用户

2) 将/var/www/下的每个文件夹浏览到用户www数据,以及该站点的特定组,例如: /var/www/site-a www数据组-a /var/www/site-b www-data-group-b 等等

3) chmod每个目录(以及所有带有-R的子目录和文件)到770


4) 将每个开发人员添加到他实际开发的每个组中。

正如我在A中提到的,不同的方法是 当应用程序请求时,通过API提供加密密钥

然后,您的strusted开发人员将使用唯一的密钥查询API以获取相关凭证。密钥可以映射到一组凭据(对于多个项目上的开发人员)


如果您通过a或IP过滤来保护API,您将降低数据泄漏的风险(如果访问密钥丢失,您仍然需要位于正确的网络中或拥有访问API的证书)。如果您信任开发人员(根据您的评论),我倾向于使用证书。

最简单的解决方案是运行管理凭据的应用程序,并从Web服务器的不同实例(显然是在不同的端口上侦听)将其交给开发人员然后,您可以作为其他用户运行该实例,并收紧权限,以便只有该用户才能访问其所需的机密文件

但是创建一个额外的用户,不要以root用户身份运行它


在apache下,我会指向suexec或suPHP。但是,由于您不使用apache,因此这不是您的选择。

只是为了更好地理解您的问题:模块是用PHP编写的吗?您想要一个完全使用此模块的解决方案,还是可以只使用文件权限?每个开发人员都必须维护对所有文件的访问权限吗?中央密码提供模块目前使用PHP,只是一个普通的PHP类。我们对想法持开放态度,因此任何具有文件权限的内容都可以。对于能够访问所有文件的开发人员——考虑到我们是一个小团队,每个开发人员都戴着多顶帽子,分离访问权限将非常困难——因此我不会妥协。如果您希望每个开发人员访问所有文件并阻止他们访问数据库,我想这是无法解决您的问题的。您正在授予他们访问具有该访问权限的内容(即代码)的权限,以便他们能够访问数据库。例如,他们可以编写一行代码读取密码并将其保存在隐藏文件中。。。我相信问题本身有问题,不是真的。可以将密码嵌入到连接对象中,这样密码本身就不可见,但仍然可以获得连接-即使print\u r或var\u dump没有显示它(我用一个原型对此进行了测试)更大的问题是,如果提供凭据的模块和访问它的模块都在同一个进程空间中,那么开发人员最终可以编写代码来访问原始密码,但是防止由于开发人员的密码被泄露或诸如此类的事情而导致意外泄漏。