Apache安全配置
综述
总结了可以在Apache配置中通用的安全设置及其各个项目。
设定示例。
必须设置
cat << _EOF_ > /etc/httpd/conf.d/security.conf
# バージョン情報の隠蔽
ServerTokens Prod
Header unset "X-Powered-By"
# httpoxy 対策
RequestHeader unset Proxy
# クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
# XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
# XST対策
TraceEnable Off
<Directory /var/www/html>
# .htaccess の有効化
AllowOverride All
# ファイル一覧出力の禁止
Options -Indexes
# Apache 2.2以前の対策
<IfVersion < 2.3>
# バージョン情報の隠蔽
ServerSignature Off
# ETagのinode情報の隠蔽
FileETag MTime Size
</IfVersion>
</Directory>
<Directory "/var/www/cgi-bin">
<IfVersion < 2.3>
ServerSignature Off
FileETag MTime Size
</IfVersion>
</Directory>
_EOF_
cat /dev/null > /etc/httpd/conf.d/autoindex.conf ;
cat /dev/null > /etc/httpd/conf.d/welcome.conf ;
请注意这些事项
-
- 外部サイトからiframeで呼び出しできなくなる
-
- Apache 2.2 の場合 ServerSignature は Directory ディレクティブ内で指定しないと上書きされない。
-
- 現状の上記設定では Apache 2.2 で以下が上書きされない
Options -Indexes
<Directory “/var/www/cgi-bin”>
隨意設定
cat << _EOF_ > /etc/httpd/conf.d/security-strict.conf
# DoS 攻撃対策
LimitRequestBody 10485760
LimitRequestFields 50
# slowloris 対策
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
# HTTPメソッドの制限
<Directory /var/www/html>
<IfVersion > 2.4>
Require method GET POST
</IfVersion>
<IfVersion < 2.3>
<Limit GET POST>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST>
Order deny,allow
Deny from all
</LimitExcept>
</IfVersion>
</Directory>
<Directory "/var/www/cgi-bin">
<IfVersion > 2.4>
Require all denied
</IfVersion>
<IfVersion < 2.3>
Order allow,deny
Deny from all
</IfVersion>
</Directory>
_EOF_
请注意的事项
-
- GET/POST 以外使えなくなる
-
- cgi-bin が使えなくなる
- 現状の上記設定では Apache 2.2 で <Directory “/var/www/cgi-bin”> が上書きされない
希望设定一个环境
本文主要是关于使用CentOS的Yum安装Apache的信息,假设进行适当的环境调整。目标Apache版本为当前支持的2.4和2.2.有关详细信息,请参考Apache HTTP Server的支持期限。
默认值验证的环境信息
-
- CentOS 7.2.1511 (CentOS-7-x86_64-Minimal-1511.iso)
-
- Apache 2.4.6 (yum install httpd)
- PHP 5.4.16 (yum install php)
政策
-
- Yum によるパッケージ管理
ソースからコンパイル?そんなものウチにはないよ。
デフォルトの設定ファイルに極力手を入れない
コストパフォーマンス優先
成立の可能性が低い脆弱性への対応で汎用性やシンプルさが失われるような設定は避ける
设定项目
隐藏情报
关于隐藏版本等信息的讨论,大致存在与安全措施的有效性相关的争论。
版本信息(ServerTokens)
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Apache 2.23 / 2.44的ServerTokens指令的默认值都是Full,因此在HTTP头中会输出Apache的版本信息如上所示。
ServerTokens Prod
通过在 ServerTokens 指令中设置为 Prod 或 ProductOnly,可以隐藏 Apache 的版本信息,如下所示。
Server: Apache
服务器签名
Apache/2.2.15 (CentOS) Server at 192.168.56.101 Port 80
ServerSignature指令用于配置服务器在生成文档(错误消息、mod_proxy中的FTP目录列表、mod_info的输出等)的最后一行添加上述输出。
ServerSignature Off
Apache 2.25 / 2.46 的默认值均为关闭状态,但是 CentOS 6.x 上的 Apache 2.2 根据发行版的设置而默认为开启,因此需要进行修改。
如果没有更改 httpd.conf 的设置,那么在 <Directory “/var/www/html”> 中未指定则无法工作。
禁用TRACE方法(XST保护)
TraceEnable Off
对于结合了XSS和TRACE方法的XST(跨站跟踪)攻击的防范措施。
虽然存在泄漏基本认证ID和密码等的危险,但攻击成立条件受限于支持已终止的旧操作系统等情况,仅限于特定情况7 8。
另外,TRACE方法无法通过或指令加以限制。9
实体标签(ETag)
由于过去的 Apache 在输出到 HTTP 头中的 ETag 中强制使用 inode 号,因此存在从 ETag 头获取文件 inode 号的风险。
然而,经验证和调查发现,从 Apache 2.4.0 开始,MTime Size 成为默认的值,因此在 2.4 系列中,对于安全性方面,不需要担心此设置。
对于 2.2 系列,建议指定 FileETag MTime Size 或 FileETag None。
如果删除ETag并使用Last-Modified标头,HTTP标头的大小会相应减少。不输出ETag的设置如下:
FileETag None
如果在上述设置中ETag无法正常消除,也可以通过以下方式消除。
Header unset ETag
文件ETag设置的行为验证
公式参考值仍然被标记为FileETag INode MTime Size,但在验证环境中验证时,默认为MTime Size。这可能是由于参考值的更新遗漏,或者可能是在发布软件包中更改了默认值。在Hatebu上有人提到了这一点,所以我查看了源代码,发现Apache本体的默认值从2.4.0开始已经改变,看来确实是参考值的更新遗漏。(根据@matuu的说法,英文版本已经正确修复)
-<default>FileETag INode MTime Size</default>
+<default>FileETag MTime Size</default>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context>
</contextlist>
<override>FileInfo</override>
+<compatibility>The default used to be "INode MTime Size" in 2.3.14 and
+earlier.</compatibility>
-#define ETAG_BACKWARD (ETAG_MTIME | ETAG_INODE | ETAG_SIZE)
#define ETAG_ALL (ETAG_MTIME | ETAG_INODE | ETAG_SIZE)
+/* This is the default value used */
+#define ETAG_BACKWARD (ETAG_MTIME | ETAG_SIZE)
if (ctx->finfo.filetype != APR_NOFILE) {
return apr_psprintf(ctx->pool, "\"%" APR_UINT64_T_HEX_FMT "-%"
- APR_UINT64_T_HEX_FMT "-%" APR_UINT64_T_HEX_FMT "\"",
+ APR_UINT64_T_HEX_FMT "\"",
- (apr_uint64_t) ctx->finfo.inode,
(apr_uint64_t) ctx->finfo.size,
(apr_uint64_t) ctx->finfo.mtime);
}
X-Powered-By 所提供的动力
X-Powered-By: PHP/5.4.16
如果在HTTP请求头中输出了像PHP版本之类的信息,可以通过以下方式在Apache端强制删除该请求头。
Header unset X-Powered-By
在PHP的情况下,可以通过在php.ini文件中设置expose_php指令为14来隐藏PHP版本信息,但是在Apache服务器上统一强制删除可能更好,这样可以避免配置遗漏的风险。
expose_php = Off
选项 -Indexes
<Directory /var/www/html>
Options -Indexes
</Directory>
Apache 2.0/2.2/2.4 的 Options 默认值都是 All。
当在目录中没有指定由 DirectoryIndex 指令所设定的文件(如 index.html)时,mod_autoindex 会整理并返回目录中的文件列表。
自动索引配置文件。
cp /dev/null /etc/httpd/conf.d/autoindex.conf
或者
> /etc/httpd/conf.d/autoindex.conf
尽管记录了有关icons的配置等信息,但为了不显示目录列表,原则上不使用,因此删除它。如果删除文件本身,则在更新时会重新创建,因此将其变为空文件。
欢迎设置
cp /dev/null /etc/httpd/conf.d/welcome.conf
又或者
> /etc/httpd/conf.d/welcome.conf
如果在文档根目录中没有index.html文件或出现权限问题等导致被禁止访问时,CentOS欢迎页面会显示出来。但由于这是多余的信息,需要删除。如果像删除autoindex.conf一样删除它,会在更新时重新生成,所以需要将其置为空文件。
安全设置
允许覆盖
<Directory /var/www/html>
AllowOverride All
</Directory>
只有在 /etc/httpd/conf.d/userdir.conf 的 <Directory “/home/*/public_html”> 中指定的 AllowOverride 以外都被设置为 None,所以为了使用 .htaccess,需要单独允许文档根目录下的内容。
限制HTTP方法
<Directory /var/www/html>
Require method GET POST
</Directory>
<Directory /var/www/html>
<Limit GET POST>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST>
Order deny,allow
Deny from all
</LimitExcept>
</IfVersion>
点击劫持防护(X-Frame-Options)
Header always append X-Frame-Options SAMEORIGIN
X-Frame-Options HTTP 响应头可以指示浏览器是否允许将页面显示在 或者
DENY
SAMEORIGIN
ALLOW-FROM uri
对于支持X-Frame-Options的浏览器版本,需为IE8及以上、Firefox 3.6.9及以上、Chrome 4.1.249.1042及以上、Safari 4及以上、Opera 10.50及以上。18岁。
在谷歌、推特、Yahoo! JAPAN等网站上,已经指定了SAMEORIGIN。而在Facebook上,则指定了DENY。
X-XSS-Protection(跨站脚本攻击防护)
Header always set X-XSS-Protection "1; mode=block"
X-XSS-Protection 是用于控制浏览器的 XSS 过滤器功能的响应头。
0 表示禁用,1 表示启用(部分修改),1; mode=block 表示启用(完全停止显示)。
如果网站的 XSS 防护没有问题,并且希望消除误报,建议指定为 0;如果不是这种情况,则指定为 1;mode=block 是理想选择,而默认状态的 1 并不理想。 19
在谷歌、Twitter、Yahoo! JAPAN等平台上设定了这个参数。
而在 Facebook 上,设定为0。
X-内容-类型-选项
Header always set X-Content-Type-Options nosniff
当将 X-Content-Type-Options 响应头设置为 nosniff 并发送时,可防止Internet Explorer通过MIME Sniffing功能绕过content-type声明。20
在Facebook、Twitter、Yahoo! JAPAN等平台上指定了。
内容安全策略 (CSP)
对于新手来说,我不建议使用。 (https://content-security-policy.com/ and http://blog.hash-c.co.jp/2013/12/Content-Security-Policy-CSP.html)
httpoxy保护措施
当我发送一个名为 “Bar” 的头部时,根据CGI的规范,它会将其转换为 HTTP_Foo = Bar。然而,如果我发送一个名为 “PROXY: xxx” 的头部,它可能会被修改为 HTTP_PROXY,这就是所谓的HTTPOXY脆弱性。你可以使用HTTPOXY漏洞检测工具进行测试。
下面的软件受到影响。
-
PHP (CVE-2016-5385)
GO (CVE-2016-5386)
Apache HTTP Server (CVE-2016-5387)
Apache Tomcat (CVE-2016-5388)
HHVM (CVE-2016-1000109)
Python (CVE-2016-1000110
限制请求体大小
此指令用于指定请求主体允许的字节数。
可以在指令所位于的上下文(服务器整体、目录、文件、位置)内限制允许的HTTP请求消息主体的大小。
默认值为0,即无限制。上限为2147483647(2GB)。
LimitRequestBody 10485760
如果想要限制为10MiB,请按照以上的方式进行描述。这对于防止 DoS 攻击在参考文献中是有效的。
另外,由于PHP默认设置了以下数值,您也可以一并确认一下。
memory_limit = 128M
post_max_size = 8M
upload_max_filesize = 5M
限制请求字段
这个指令用于指定在HTTP请求中允许的请求头字段数。默认值为100。
LimitRequestFields 50
在参考文献中写道:”请求头字段的数量很少会超过 20 个。 ” 23。此外,这也被视为有效地避免 DoS 攻击。
另外,有一份报告称,如果将值设定为20,则在特定的网页上,使用Chrome浏览器时会返回Bad Request错误。而且根据所参考的网页和浏览器的不同,行为也有可能会有所不同。
请求读取超时
RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500
在2.2.15版本之后实施的对抗Slowloris攻击的mod_reqtimeout模块中可以使用的指令。
在2.3.15版本之后默认启用。
如果使用AWS的ELB,如果ELB的Connection Settings: Idle Timeout的值大于Apache的RequestReadTimeout header的最低值,将会在Apache的错误日志中大量记录408错误消息,所以请注意。26
安全测试
在CentOS 7.2.1511上使用yum安装Apache并未进行配置更改的情况下进行了测试,并得出了结果。
[root@localhost program]# perl ./nikto.pl -h 127.0.0.1
- ***** SSL support not available (see docs for SSL install) *****
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP: 127.0.0.1
+ Target Hostname: 127.0.0.1
+ Target Port: 80
+ Start Time: 2016-01-16 10:00:00 (GMT9)
---------------------------------------------------------------------------
+ Server: Apache/2.4.6 (CentOS) PHP/5.4.16
+ Server leaks inodes via ETags, header found with file /, fields: 0x220 0x529841bdd9a78
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ PHP/5.4.16 appears to be outdated (current is at least 5.6.9). PHP 5.5.25 and 5.4.41 are also current.
+ Apache/2.4.6 appears to be outdated (current is at least Apache/2.4.16). Apache 2.2.31 is also current for the 2.x branch.
+ Allowed HTTP Methods: GET, HEAD, POST, OPTIONS, TRACE
+ OSVDB-877: HTTP TRACE method is active, suggesting the host is vulnerable to XST
+ Retrieved x-powered-by header: PHP/5.4.16
+ OSVDB-3092: /test.php: This might be interesting...
+ 8225 requests: 0 error(s) and 10 item(s) reported on remote host
+ End Time: 2016-01-16 10:00:11 (GMT9) (11 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested
Apache 相关文章
-
Apacheセキュリティ設定
Apache HTTP Server のサポート期限
Apache のログをコマンドラインで集計する
Apache の情報をコマンドラインで取得する
IPアドレスから国や都市を判別する (GeoIP)
Apache チューニング スクリプト