Apache安全configuration – Ubuntu 12

我在Ubuntu 12上运行LAMP堆栈,主要function是为基于PHP的API提供服务。

只有一个文件我想暴露给公众: api.php

它需要引用一个configuration文件,我在/cfg/api-config.php中包含db密码,这样API可以写入数据库等

所以我只希望api.php被apache“服务”并公开。

我放在/ cfg中的configuration文件必须可以被api.php读取,但任何可能访问该网站的人都不能读取。

我没有.htaccess ,只是一个httpd.confconfiguration如下。

 <VirtualHost *:44448> DocumentRoot "/api" ServerName localhost:44448 ServerAlias Server.local DirectoryIndex index.html CustomLog "/var/log/apache_access.log" combined ErrorLog "/var/log/apache_error.log" SetEnv APPLICATION_ENV development php_flag magic_quotes_gpc off <Directory "/api"> Options Indexes MultiViews FollowSymLinks AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> 

我的/cfg/api文件夹的权限是: drwxr-xr-x和我的敏感configuration文件的权限位于/cfg/api-config.php db密码是-rw-r--r--

我想知道是否有人可以告诉我,如果这是正确和安全的设置?

因此:

A)除/api/api.php以外的所有文件都不公开,并且不能访问我的服务器文件。

B)configuration文件的密码为db(对于api)也是不可读的访问该网站的任何人?

我试图通过在chmod 777 /cfg创build一个新的文件夹来testing这个,我似乎无法访问它,这很好!

你有两个文件(假设它们位于/ var / www)

  • /var/www/api/api.php
  • /var/www/cfg/api-config.php

首先,用apache限制对/ cfg的访问(这确保没有人可以从http访问它)并允许访问/ api:

 <Directory /var/www/api> Options None AllowOverride None Order allow,deny Allow from all <Directory> <Directory /var/www/cfg> Options None AllowOverride None Order allow,deny Deny from all <Directory> 

接下来,用open_basedir限制你的php:

 open_basedir = /var/www/api:/var/www/cfg 

(如果你需要,可以在这里添加/ tmp,session和其他目录)

接下来,改变/ var / www / cfg目录和/var/www/cfg/api-config.php文件的访问模式(假设你的apache用户是www-data):

  chown -Rv root:root /var/www/{cfg,api} chmod -v 711 /var/www/cfg chmod -v 755 /var/www/api chmod -v 644 /var/www/api/api.php /var/www/cfg/api-config.php 

通过在/ cfg上使用711 ,你可以确保没有人能够读取(列出)目录的内容,同时仍然可以读取api-config.php(你需要这个来读取PHP文件)

首先,我将更改您的cfg和其中驻留的文件的文件权限。 如果你存储了数据库设置,这是一个读访问和写 – 访问应该被删除。 让您的Apache HTTP守护进程安全设置是很好的,但这是另一个安全层。 你的PHP – 安装在你的HTTP Daemon的用户上下文中运行,所以我个人甚至会删除这个组的读访问权限。 我想知道你进行的testing。 cfg文件夹似乎不在你的DocumentRoot下面,所以你的HTTP服务器乍一看似乎是无法访问的。 但是试图打入你的装置的人不会依赖这种方法。 你有AllowOverride所有命令允许,拒绝所有在你的configuration允许,这只是意味着:根本没有访问控制。 您还声明了FollowSymLinks,它引入了其他安全影响。 所以这个安装远远落后于安全。 您可以通过在安装的DocumentRoot中放入一个.htaccess文件来保护您的cfg文件夹。 其中的条目可以powershell保护文件和目录访问,例如

<Files RELEASE_NOTES.txt>
命令允许,否认
否认所有
</ Files>(取自一个magento – 安装)

如果您想知道FollowSymLinks的安全影响:请记住,PHP正在Apache HTTP守护程序安装的上下文中运行,并且PHP可以在您的文件系统上执行写操作。 如果PHP代码插入到您的应用程序中,创build符号链接,以便有人可以通过创build符合您的系统部分的符号链接来监视您的文件系统。将一个简单的.htaccess文件放入您的cfg文件 – Order允许的目录,拒绝所有的拒绝将删除通过你的HTTP守护进程浏览这个目录的能力。 如果你的api.php是你的PHP – Installation / Webapp的前端控制器,你应该考虑使用Apache的mod_rewrite来重写所有请求指向你的api.php的URL,例如

RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteCond%{REQUEST_URI}!= / favicon.ico
RewriteRule ^ api.php [L]

在.htaccess文件中放入/ api目录,将所有请求路由到你的api.php。 例如localhost:44448 / someURL?id = 988会在内部成为请求localhost:44448 / api.php?id = 988。
要清除:
重写 – 规则不应该用于访问控制,它们主要的目的是改变处理请求的方式。
许多PHP框架或CMS使用RewriteRules有一个中央入口点的Web应用程序的应用程序组件被加载,路由组件可能会被调用,翻译从URL – 参数到内部结构执行。
例如,Symfony2将Query /和Post – 参数转换为更加面向对象的结构,将其封装到一个对象中。
Symfony2还通过在生成HTTP响应之前读取路由信息和configuration来利用安全性概念,例如,确保已执行身份validation或用户必须具有访问URLpath的正确用户angular色。

你似乎做了一件关键的事情,就是把/cfg/api-config.php放在你的DocumentRoot之外。 如果/cfg不在URL空间内,则网站用户无法阅读。 这是您可以采取的最基本的预防措施。

用户仍然可以读取该文件吗? 当然,如果你在别的地方破坏configuration(例如,通过设置一个AliasRewriteRule文件),或者如果应用程序做了一些愚蠢的输出文件的内容。 应用程序漏洞是真正令人担忧的问题:应用程序必须能够读取文件,应用程序越复杂,其中就越有可能存在隐藏的漏洞。 但是就Apacheconfiguration而言,我认为你已经完成了。

除了上面的build议,我build议删除您的apache用户拥有的DocumentRoot中的任何文件/文件夹的写入权限。 (比如你的api.php文件)这个假设api.php(或者它调用的任何东西)不需要向本地web服务器写任何东西。 这应该有助于防止将不需要的文件写入您的Web服务器