11.28 限定某个目录禁止 php 解析
本节内容应用于对静态文件目录或可写的目录进行优化设置, 通过限制解析 / 访问权限来避免别恶意攻击, 提高安全性
编辑虚拟主机配置文件:
- [root@centos-01inux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
- <Directory /data/wwwroot/111.com/upload>
- php_admin_flag engine off
- </Directory>
创建相应的目录:
- [root@centos-01inux 111.com]# mkdir upload
- [root@centos-01inux 111.com]# ls upload/
- 123.php abc.jpg baidu.png
测试:
- [root@centos-01inux 111.com]# curl -x192.168.8.131:80 http://111.com/upload/123.php
- <?php
- echo "welcom to 123file";
- ?>
- [root@centos-01inux 111.com]# curl -x192.168.8.131:80 http://111.com/upload/baidu.png -I
- HTTP/1.1 200 OK
- Date: Thu, 03 Aug 2017 04:47:16 GMT
- Server: Apache/2.4.27 (Unix) PHP/5.6.30
- Last-Modified: Thu, 03 Aug 2017 04:25:26 GMT
- ETag: "e7a-555d1c5172a6c"
- Accept-Ranges: bytes
- Content-Length: 3706
- Content-Type: image/png
说明: 在此访问 123.php 文件时直接显示源代码, 即无法进行 PHP 解析, 访问其他类型的文件没问题
添加 PHP 访问限制
添加参数< FilesMatch (.)\ .php(. ) > :
- [root@centos-01inux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
- <Directory /data/wwwroot/111.com/upload>
- php_admin_flag engine off
- <FilesMatch (.*)\.php(.*)>
- Order Allow,Deny
- Deny from all
- </FilesMatch>
- </Directory>
说明: 如果只设置禁止 PHP 解析, 用户访问 PHP 文件时会显示源代码, 添加该参数可以避免用户看到服务器 PHP 源码, 进一步提升安全性
测试:
- [root@centos-01inux 111.com]# curl -x127.0.0.1:80 111.com/upload/123.php -I
- HTTP/1.1 403 Forbidden
- Date: Thu, 03 Aug 2017 04:28:49 GMT
- Server: Apache/2.4.27 (Unix) PHP/5.6.30
- Content-Type: text/html; charset=iso-8859-1
- [root@centos-01inux 111.com]# curl -x127.0.0.1:80 111.com/upload/baidu.png -I
- HTTP/1.1 200 OK
- Date: Thu, 03 Aug 2017 04:29:25 GMT
- Server: Apache/2.4.27 (Unix) PHP/5.6.30
- Last-Modified: Thu, 03 Aug 2017 04:25:26 GMT
- ETag: "e7a-555d1c5172a6c"
- Accept-Ranges: bytes
- Content-Length: 3706
- Content-Type: image/png
说明: 此时访问 123.php 的状态码为 403, 即无法访问!
11.29 限制 user_agent
user_agent(用户代理): 是指浏览器 (搜索引擎) 的信息包括硬件平台系统软件应用软件和用户个人偏好
需求背景:
有时候网站受到 CC 攻击, 其原理是: 攻击者借助代理服务器 (肉机) 生成指向受害主机的合法请求, 实现 DDOS 和伪装 CC 攻击的一个特点就是其 useragent 是一致的, 所以, 可以通过限制攻击者 useragent 的方法来阻断其攻击
编辑虚拟主机配置文件:
- [root@centos-01inux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
- <IfModule mod_rewrite.c>
- RewriteEngine on
- RewriteCond %{HTTP_USER_AGENT} .curl. [NC,OR]
- RewriteCond %{HTTP_USER_AGENT} .baidu.com. [NC]
- RewriteRule .* - [F]
- </IfModule>
说明: NC 表示忽略大小写, OR 选项表示或者 (不加任何选项表并且) 连接下一个条件, F=forbidden 禁止
检测:
- [root@centos-01inux 111.com]# curl -x192.168.8.131:80 http://111.com/123.php -I
- HTTP/1.1 403 Forbidden
- Date: Thu, 03 Aug 2017 06:59:14 GMT
- Server: Apache/2.4.27 (Unix) PHP/5.6.30
- Content-Type: text/html; charset=iso-8859-1
- [root@centos-01inux 111.com]# curl -A "aminglinux aminglinux" -x192.168.8.131:80 http://111.com/123.php -I
- HTTP/1.1 200 OK
- Date: Thu, 03 Aug 2017 07:01:01 GMT
- Server: Apache/2.4.27 (Unix) PHP/5.6.30
- X-Powered-By: PHP/5.6.30
- Content-Type: text/html; charset=UTF-8
- [root@centos-01inux 111.com]# curl -A "aminglinux aminglinux" -x192.168.8.131:80 http://111.com/123.php
- welcom to 123file
说明: curl -A 指定 useragent
11.30 PHP 相关配置
查看 PHP 配置文件:
/usr/local/php/bin/php -i|grep -i "loaded configuration file"
PHP 参数
设定时区
date.timezone
一些功能选项:
eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,passthru,exec,system,chroot,scandir,chgrp,chown,escapeshellcmd,escapeshellarg,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,popen,proc_open,proc_close,phpinfo
以上功能选项可以通过 disable_function 来限制, 以达到提高网站安全性的目的:
disable_function=
日志相关
display_errors=On/Off : 设定是否显示错误原因, 需要注意的是, 此处设置为 off(防止用户看到)后必须设置错误日志, 设定保存路径, 和错误日志级别, 否则将无法查找错误原因
log_errors=On/Off 开启 / 关闭错误日志
error_log=/tmp/ 设定错误日志的保存路径如果定义好路径后无法生产日志, 此时需要检查日志文件所在目录是否有写 (w) 权限
errorreporting = 设定错误日志级别, 级别有: E ALL ~E NOTICE ~E STRICT ~EDEPRECATED(可以自由组合)生产环境使用: E ALL & ~E_ NOTICE 就可以
官方说明:
- E_ALL (Show all errors, warnings and notices including coding standards.)
- E_ALL & ~E_NOTICE (Show all errors, except for notices)
- E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
- E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
安全参数 open_basedir
- open_basedir, if set, limits all file operations to the defined directory
- ; and below. This directive makes most sense if used in a per-directory
- ; or per-virtualhost web server configuration file.
译: 如果设置了 open_basedir 选项, 将会把所有关于文件的操作限制在指定目录及其子目录
将该指令设定在每个目录或者虚拟主机 web 服务器配置文件中非常重要
说明: php.ini 文件中的内容是针对所有虚拟主机进行的配置
问题: 一台服务器运行着不止一台虚拟主机, 所以在该文件下设置该选项并不合适那么, 该如何设定该配置呢?
办法: 分别在每个虚拟主机的配置文件进行相关设置
- [root@centos-01inux 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
- php_admin_value open_basedir "/data/wwwroot/111.com:/tmp/"
说明: php_admin_value 可以定义 php.ini 中的参数使用该办法分别在每个虚拟主机设定相关的 open_basedir 即可!
在此开放 / tmp / 目录是为了使临时文件能正常写入
扩展:
apache 开启压缩功能
这里的压缩并不是对网站的图片压缩, 而是对普通的静态文件, 诸如 html, js, CSS 等元素压缩, 通过压缩节省带宽资源
配置
检查本地 Apache 是否支持压缩功能
/usr/local/apache2/bin/apachectl -l
在此查看是否有 mod_deflate 模块, 如果没有, 继续查看:
ls /usr/local/apache2/modules/
在此查看有没有 mod_deflate.so 这个文件, 如果这里也没有, 那说明你的 apache 不支持压缩, 需要重编译一下, 或者扩展形式安装, 或者重新编译 apache, 需要在编译的时候, 加上 --enable-deflate=shared
添加完成 deflate 这个模块后开始进行配置:
编辑 Apache 配置文件 httpd.conf:
- LoadModule deflate_module modules/mod_deflate.so
- DeflateCompressionLevel 5
- AddOutputFilterByType DEFLATE text/html text/plain text/xml
- AddOutputFilter DEFLATE js css
其中 DeflateCompressionLevel 是指压缩程度的等级, 从 1 到 9,9 是最高等级
apache2.2 到 2.4 后配置文件变更
访问控制
- Apache2.2 configuration:
- Order deny,allow
- Deny from all
- Apache2.4 configuration:
- Require all denied
常用配置有:
- Require all denied
- Require all granted
- Require host xxx.com
- Require ip 192.168.1 192.168.2
- Require local
设定 log 记录方式改变
RewriteLogLevel 指令改为 logLevel
- eg:
- LogLevel warn rewrite: warn
NameVirtualhost 被移除
模块组:
网站压缩, 除了使用 mod_ deflate,Apache2.4 中还要 modfilter
使用 ssl 凭证, 除了使用 mod ssl,Apache2.4 中还需要 mod_socache _shmcb
Apache 参数(options)
指令控制了在特定目录中将使用哪些服务器特性 Options 属性有一个非常特别的功能: 如果你没有用 + 或者 - 来增加或者减少一个功能的时候, 每个之前定义的 Options 的所有功能都会被取消, 直到你又为它指定一些功能所以 options 属性在整体设置和虚拟主机设置的是不相关的, 互相不起作用, 因为他们在特定的范围内被重载了 如果要在虚拟主机里面使用在整体设置中的 Options 的设置, 那么就不要在虚拟主机设置中指定 Options 属性如果要增加或者减少功能, 那么用 + 或者 - 符号来实现 Options 指令控制了在特定目录中将使用哪些服务器特性 可选项能设置为 None , 在这种情况下, 将不启用任何额外特性或设置为以下选项中的一个或多个:
All:
除 MultiViews 之外的所有特性, 这是默认设置
ExecCGI: 允许执行 CGI 脚本
FollowSymLinks:
服务器会在此目录中使用符号连接
注意: 即便服务器会使用符号连接, 但它不会改变用于匹配配置段的路径名 如果此配置位于配置段中, 则此设置会被忽略
Includes : 允许服务器端包含
IncludesNOEXEC:
允许服务器端包含, 但禁用 #exec 命令和 #exec CGI(通用网关接口, 是用于初始化软件服务的服务器方接口)但仍可以从 ScriptAliase 目录使用 #include 虚拟 CGI 脚本
CGI(Common Gateway Interface)通用网关接口, 它是一段程序, 运行在服务器上, 提供同客户端 HTML 页面的接口, 通俗的讲 CGI 就像是一座桥, 把网页和 WEB 服务器中的执行程序连接起来, 它把 HTML 接收的指令传递给服务器, 再把服务器执行的结果返还给 HTML 页; 用 CGI 可以实现处理表格, 数据库查询, 发送电子邮件等许多操作, 最常见的 CGI 程序就是计数器 CGI 使网页变得不是静态的, 而是交互式的
Indexes:
如果一个映射到目录的 URL 被请求, 而此目录中又没有 DirectoryIndex(例如: index.html), 那么服务器会返回一个格式化后的目录列表
MultiViews: 允许内容协商的多重视图
SymLinksIfOwnerMatch:
服务器仅在符号连接与其目的目录或文件拥有者具有同样的用户 id 时才使用它
注意: 如果此配置出现在配置段中, 此选项将被忽略一般来说, 如果一个目录被多次设置了 Options, 则最特殊的一个会被完全接受, 而各个可选项的设定彼此并不融合然而, 如果所有施用于 Options 指令的可选项前都加有 + 或 - 符号, 此可选项将被合并所有前面加有 + 号的可选项将强制覆盖当前可选项设置, 而所有前面有 - 号的可选项将强制从当前可选项设置中去除
eg: 如果没有任何 + 和 - 符号:
- Options Indexes FollowSymLinks
- Options Includes
则只有 Includes 设置到 / web/docs/spec 目录上然而如果第二个 Options 指令使用了 + 和 - 符号:
- Options Indexes FollowSymLinks
- Options +Includes -Indexes
那么就会有 FollowSymLinks 和 Includes 设置到 / web/docs/spec 目录上
apache 禁止 trace 或 track 防止 xss 攻击
TRACE 和 TRACK 是用来调试 web 服务器连接的 HTTP 方式支持该方式的服务器存在跨站脚本漏洞, 通常在描述各种浏览器缺陷的时候, 把 "Cross-Site-Tracing" 简称为 XST 攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息
禁用 trace: 使用 rewrite 功能
- RewriteEngine On
- RewriteCondi %{REQUEST_METHOD} ^TRACE
- RewriteRule .* - [F]
或者还可以直接在 apache 的配置文件中配置相应参数
TraceEnable off
apache 配置 https 支持 ssl
??SSL(Secure Sockets Layer 安全套接层)协议, 及其继任者 TLS(Transport Layer Security 传输层安全)协议, 是为网络通信提供安全及数据完整性的一种安全协议 TLS 与 SSL 在传输层对网络连接进行加密, 用于保障网络数据传输安全, 利用数据加密技术, 确保数据在网络传输过程中不会被截取及窃听 SSL 协议已成为全球化标准, 所有主要的浏览器和 WEB 服务器程序都支持 SSL 协议, 可通过安装 SSL 证书激活 SSL 协议
??SSL 证书就是遵守 SSL 协议的服务器数字证书, 由受信任的证书颁发机构(CA 机构), 验证服务器身份后颁发, 部署在服务器上, 具有网站身份验证和加密传输双重功能
安装 openssl
apache2.0 建议安装 0.9 版本, 我曾经试过 2.0.59 对 openssl-1.0 编译不过去下载 Openssl:http://www.openssl.org/source/
- tar -zxf openssl-0.9.8k.tar.gz
- # 解压安装包
- cd openssl-0.9.8k
- # 进入已经解压的安装包
- ./configure
- # 配置安装推荐使用默认配置
- make && make install
- # 编译及安装
openssl 默认将被安装到 / usr/local/ssl
让 apache 支持 ssl
编译的时候, 要指定 ssl 支持
静态
--enable-ssl=static --with-ssl=/usr/local/ssl
动态
--enable-ssl=shared --with-ssl=/usr/local/ssl
其中第二种方法会在 module/ 目录下生成 mod_ssl.so 模块, 而静态不会有, 当然第二种方法也需要在 httpd.conf 中加入:
LoadModule ssl_module modules/mod_ssl.so
生成证书
创建私钥
在创建证书请求之前, 您需要首先生成服务器证书私钥文件
- cd /usr/local/ssl/bin
- # 进入 openssl 安装目录
- openssl genrsa -out server.key 2048
- # 运行 openssl 命令, 生成 2048 位长的私钥 server.key 文件
- # 如果您需要对 server.key 添加保护密码, 请使用 -des3 扩展命令 Windows 环境下不支持加密格式私钥, Linux 环境下使用加密格式私钥时, 每次重启 Apache 都需要您输入该私钥密码
- #(例: openssl genrsa -des3 -out server.key 2048)
- cp server.key /usr/local/apache/conf/ssl.key/
生成证书请求 (CSR) 文件
- openssl req -new -key server.key -out certreq.csr
- Country Name: // 您所在国家的 ISO 标准代号, 中国为 CN
- State or Province Name: // 您单位所在地省 / 自治区 / 直辖市
- Locality Name: // 您单位所在地的市 / 县 / 区
- Organization Name: // 您单位 / 机构 / 企业合法的名称
- Organizational Unit Name: // 部门名称
- Common Name: // 通用名, 例如: www.itrus.com.cn 此项必须与您访问提供 SSL 服务的服务器时所应用的域名完全匹配
- Email Address: // 您的邮件地址, 不必输入, 直接回车跳过
- "extra"attributes // 以下信息不必输入, 回车跳过直到命令执行完毕
备份私钥并提交证书请求
请将证书请求文件 certreq.csr 提交给天威诚信, 并备份保存证书私钥文件 server.key, 等待证书的签发服务器证书密钥对必须配对使用, 私钥文件丢失将导致证书不可用
安装证书
获取服务器证书中级 CA 证书
为保障服务器证书在客户端的兼容性, 服务器证书需要安装两张中级 CA 证书(不同品牌证书, 可能只有一张中级证书), 从邮件中获取中级 CA 证书:
将证书签发邮件中的从 BEGIN 到 END 结束的两张中级 CA 证书内容 (包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----) 粘贴到同一个记事本等文本编辑器中, 中间用回车换行分隔修改文件扩展名, 保存为 conf/ssl.crt/intermediatebundle.crt 文件(如果只有一张中级证书, 则只需要保存并安装一张中级证书)
获取 EV 服务器证书
将证书签发邮件中的从 BEGIN 到 END 结束的服务器证书内容(包括 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----) 粘贴到记事本等文本编辑器中, 保存为 ssl.crt/server.crt 文件
配置 Apache2.0
编辑配置文件 httpd.conf, 添加如下内容:
- Listen 443
- NameVirtualHost *:443
- DocumentRoot "/data/web/www"
- ServerName aaa.com:443
- ErrorLog "logs/error.log"
- CustomLog "logs/access.log" combined
- SSLEngine on
- SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt
- SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key
- SSLCertificateChainFile /usr/local/apache/conf/ssl.crt/intermediatebundle.crt
LAMP 环境 - 限定 PHP 解析 useragentPHP 相关配置 Apache 相关配置
来源: http://www.bubuko.com/infodetail-2519619.html