LAMP环境

Wesley13
• 阅读 745

11.28 限定某个目录禁止php解析

本节内容应用于对静态文件目录或可写的目录进行优化设置,通过限制解析/访问权限来避免别恶意攻击,提高安全性。

编辑虚拟主机配置文件:

[root@adailinux 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@adailinux 111.com]# mkdir upload
……
[root@adailinux 111.com]# ls upload/
123.php  abc.jpg  baidu.png

测试:

[root@adailinux 111.com]# curl -x192.168.8.131:80 'http://111.com/upload/123.php' 
<?php
echo "welcom to 123file";
?>

[root@adailinux 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@adailinux 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@adailinux 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@adailinux 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@adailinux 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@adailinux 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@adailinux 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@adailinux 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参数

  1. 设定时区

    date.timezone

  2. 一些功能选项:

“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=
  1. 日志相关
  • display_errors=On/Off :设定是否显示错误原因,需要注意的是,此处设置为off(防止用户看到)后必须设置错误日志,设定保存路径,和错误日志级别,否则将无法查找错误原因 。

  • log_errors=On/Off 开启/关闭错误日志

  • “error_log=/tmp/” 设定错误日志的保存路径。如果定义好路径后无法生产日志,此时需要检查日志文件所在目录是否有写(w)权限

  • “error_reporting =” 设定错误日志级别,级别有:E_ ALL 、E_ NOTICE 、E_ STRICT 、~E_DEPRECATED(可以自由组合)。生产环境使用: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)
  1. 安全参数“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@adailinux 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后配置文件变更

  1. 访问控制

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
  1. 设定log记录方式改变

RewriteLogLevel 指令改为 logLevel。
eg:

LogLevel warn rewrite: warn
  1. NameVirtualhost被移除

  2. 模块组:

  • 网站压缩,除了使用mod_ deflate,Apache2.4中还要mod_filter。
  • 使用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机构),验证服务器身份后颁发,部署在服务器上,具有网站身份验证和加密传输双重功能。

  1. 安装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。

  1. 让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  
  1. 生成证书
  • 创建私钥
    在创建证书请求之前,您需要首先生成服务器证书私钥文件。

    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,等待证书的签发。服务器证书密钥对必须配对使用,私钥文件丢失将导致证书不可用。

  1. 安装证书
  • 获取服务器证书中级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
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这