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设置的行为验证

FileETagETag(未指定)”220-529841bdd9a78″MTime Size”220-529841bdd9a78″All”905069-220-529841bdd9a78″INode”905069″MTime”529830adcea90″Size”220″

公式参考值仍然被标记为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&nbsp;MTime&nbsp;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 响应头可以指示浏览器是否允许将页面显示在 或者

广告
将在 10 秒后关闭
bannerAds