openwrt nginx

如何查看nginx 安装了哪些模块,及其nginx安全模块安装使用。
nginx的安全模块ngx_http_secure_link_module,想查看下,发现这个无非是当时编译时的那些参数,但也给我们提供了升级重新编译的线索喔,还是安一个吧,免得会有人注入,拿Webserver权限。
注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.

看下示例:


自己加入安全模块的编译选项:

编译:


配置nginx.conf:
ngx_http_secure_link_module.

下面是一个简单的配置示例:

location /p/ {
    secure_link_secret   some_secret_word;
    if ($secure_link = "") {
        return 403;
    }
}

注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.

下面是说明:

syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location

使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.
看了下俄文翻译的结果,晕忽忽,不太懂......
也许是因为才加入的新特性的缘故(0.7.18+),使用方法写得不是很详细,需要自己去摸索. !
希望这个模块能够对那些安全高手有作用!

思路来自下面:



最后配置并测试:

测试后缀是PHP的文件:
'http://c.justwinit.cn/login/login.php?un=union  出现:
403 Forbidden
nginx/1.1.1
对error_page的知识补充:
Nginx做404在网上有两种方式:
1:
error_page 404 http://www.252300.net/?page-error.html; 

这样写发现不能正常转跳,看来Nginx不能自动转义,加上转义后还是不能转
就来个直接点的 在下面再加个rewrite,让rewrite来做这事

error_page 404 http://www.252300.net/page-error;  
location /page-error {  
rewrite ^(.*) http://www.252300.net/?page-error.html permanent;  

一步是用rewrite来完成的,下面来说第二种
2:需如下几步:

 创建自己的404.html页面 

 更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 

 更改nginx.conf(或单独网站配置文件,例如在nginx -> sites-enabled下的站点配置文件 )

中在server 区域加入: error_page 404 = /404.html  或者 error_page 404 = http://www.252300.net/404.html

4.更改后重启nginx,,测试nginx.conf正确性: /opt/nginx/sbin/nginx –t 

#502 等错误可以用同样的方法来配置。  

error_page  500 502 503 504 = /50x.html; 

注意:
必须要添加:fastcgi_intercept_errors on; 如果这个选项没有设置,即使创建了404.html和配置了error_page也没有效果。
fastcgi_intercept_errors 语法: fastcgi_intercept_errors on|off 默认: fastcgi_intercept_errors off 添加位置: http, server, location 默认情况下,nginx不支持自定义404错误页面,只有这个指令被设置为on,nginx才支持将404错误重定向。这里需要注意的是,并不是说设置了 fastcgi_intercept_errors on,nginx就会将404错误重定向。在nginx中404错误重定向生效的前提是设置了fastcgi_intercept_errors on,并且正确的设置了error_page这个选项(包括语法和对应的404页面)
自定义的404页面必须大于512字节,否则可能会出现IE默认的404页面。例如,假设自定义了404.html,大小只有11个字节(内容为:404错误)
















error_page 519 /519.html;
        if ($request_uri ~* "(cost\()|(concat\()") {
                return 519;
        }
        if ($request_uri ~* "[+|( )]union[+|( )]") {
                return 519;
        }
        if ($request_uri ~* "[+|( )]and[+|( )]") {
                return 519;
        }
        if ($request_uri ~* "[+|( )]select[+|( )]") {
                return 519;
        }

基本sql注入原理:
通过union all 联合查询获取其他表的内容(如user表的用户密码)

防御原理:
1. 通过以上配置过滤基本的url中的注入关键字;
2. 当然,数据库中的用户密码得加密存放 ;
3. php程序进行二次过滤,过滤GET和POST变量中的关键字;
4. 生产环境关闭PHP和MySQL的错误信息。


一、Nginx的安全配置:
在Nginx的俄文站点上看到,从0.7.18版开始,Nginx有了自己的安全检查模块:

ngx_http_secure_link_module.

下面是一个简单的配置示例:

location /p/ {
    secure_link_secret   some_secret_word;
    if ($secure_link = "") {
        return 403;
    }
}

注意:要使用到这个模块,需要在configure的时候,加入--with-http_secure_link_module选项.

下面是说明:

syntax: secure_link_secret (后跟字词)
default: 不包含在默认的编译选项中
context: location

使用规定的加密字串来验证连结.完整的URL加密参考:
/prefix/hash/一个hash示例:
md5(路径(或连接), 参数(或选项));
注:前缀可以有任意行,但不包括斜线.

当然如果不想安装安全检测模块,解决方法是在conf文件加入以下代码:

error_page 444 /block_ip.html;
        if ($request_uri ~* "(cost\()|(concat\()") {
                return 444;
        }
        if ($request_uri ~* "[+|( )]union[+|( )]") {
                return 444;
        }
        if ($request_uri ~* "[+|( )]and[+|( )]") {
                return 444;
        }
        if ($request_uri ~* "[+|( )]select[+|( )]") {
                return 444;
        }

二、apache的的安全配置:
    安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以
图片服务器建议不要用apache,用nginx会更好。

apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。

    DOSHashTableSize    10000  
    DOSPageCount        2
    DOSSiteCount        50
    DOSPageInterval     1
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSEmailNotify      webmaster@xxx.com
    DOSLogDir           /var/log/mod_dosevasive.log


apache防sql注入攻击的配置,需要安装mod_security模块

    SecFilterEngine On
    SecFilterCheckURLEncoding On
    SecFilterForceByteRange 32 126
    SecFilterCheckUnicodeEncoding On
    SecServerResponseToken Off
    SecAuditEngine RelevantOnly
    SecAuditLog logs/audit_log
    SecFilterDebugLog logs/modsec_debug_log
    SecFilterDebugLevel 0
    SecFilterDefaultAction "deny,log,status:406"
    SecFilter /etc/*passwd
    SecFilter /bin/*sh
    SecFilter "\.\./"
    SecFilter "<( |\n)*script"
    SecFilter "<(.|\n)+>"
    SecFilter "delete[[:space:]]+from"
    SecFilter "insert[[:space:]]+into"
    SecFilter "select.+from"
    SecFilter "union[[:space:]]+from"
    SecFilter "drop[[:space:]]"
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"



于5.20日下午6点发布了一个关于nginx的漏洞通告,由于该漏洞的存在,使用nginx+php组建的网站只要允许上传图片就可能被黑客入侵,直到5.21日凌晨,nginx尚未发布修复该漏洞的补丁;已经有一些网站被黑了,管理员速修复!


根据Netcraft的统计,直到2010年4月,全球一共有1300万台服务器运行着nginx程序;非常保守的估计,其中至少有600万台服务器运行着nginx并启用了php支持;继续保守的估计,其中有1/6,也就是100万台服务器允许用户上传图片。有图有真相。

没错,重申一次,由于nginx有漏洞,这100万台服务器可能通过上传图片的方法被黑客轻易的植入木马。植入木马的过程也非常简单,就是把木马改成图片上传就是了,由于危害非常大,就不说细节了。

发一个小道消息,据说黑客已经在行动了;安全人员、系统管理人员、行动起来吧,赶紧修复该漏洞;最好不要有侥幸心理,否则下一个被黑客入侵的可能就是你的网站。根据test安全公告的描述,临时修复方法如下,可3选其一。

1、设置php.ini的cgi.fix_pathinfo为0,重启php。最方便,但修改设置的影响需要自己评估。

2、给nginx的vhost配置添加如下内容,重启nginx。vhost较少的情况下也很方便。

if ( $fastcgi_script_name ~ \..*\/.*php ) {
return 403;
}

3、禁止上传目录解释PHP程序。不需要动webserver,如果vhost和服务器较多,短期内难度急剧上升;建议在vhost和服务器较少的情况下采用。

漏洞介绍:nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PHP的运行。test发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的nginx服务器。


漏洞分析:nginx默认以cgi的方式支持php的运行,譬如在配置文件当中可以以


location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}

的方式支持对php的解析,location对请求进行选择的时候会使用URI环境变量进行选择,其中传递到后端Fastcgi的关键变量SCRIPT_FILENAME由nginx生成的$fastcgi_script_name决定,而通过分析可以看到$fastcgi_script_name是直接由URI环境变量控制的,这里就是产生问题的点。而为了较好的支持PATH_INFO的提取,在PHP的配置选项里存在cgi.fix_pathinfo选项,其目的是为了从SCRIPT_FILENAME里取出真正的脚本名。
那么假设存在一个http://www.test.com/test.jpg,我们以如下的方式去访问

将会得到一个URI

/test.jpg/test.php

经过location指令,该请求将会交给后端的fastcgi处理,nginx为其设置环境变量SCRIPT_FILENAME,内容为

/scripts/test.jpg/test.php

而在其他的webserver如lighttpd当中,我们发现其中的SCRIPT_FILENAME被正确的设置为

/scripts/test.jpg

所以不存在此问题。
后端的fastcgi在接受到该选项时,会根据fix_pathinfo配置决定是否对SCRIPT_FILENAME进行额外的处理,一般情况下如果不对fix_pathinfo进行设置将影响使用PATH_INFO进行路由选择的应用,所以该选项一般配置开启。Php通过该选项之后将查找其中真正的脚本文件名字,查找的方式也是查看文件是否存在,这个时候将分离出SCRIPT_FILENAME和PATH_INFO分别为

/scripts/test.jpg和test.php

最后,以/scripts/test.jpg作为此次请求需要执行的脚本,攻击者就可以实现让nginx以php来解析任何类型的文件了。

http://www.test.com/test.jpg/test.php

POC: 访问一个nginx来支持php的站点,在一个任何资源的文件如robots.txt后面加上/test.php,这个时候你可以看到如下的区别:

访问http://www.test.com/robots.txt

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:05:30 GMT
Content-Type: text/plain
Content-Length: 18
Last-Modified: Thu, 20 May 2010 06:26:34 GMT
Connection: keep-alive
Keep-Alive: timeout=20
Accept-Ranges: bytes

访问访问http://www.test.com/robots.txt/test.php

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Thu, 20 May 2010 10:06:49 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
X-Powered-By: PHP/5.2.6

其中的Content-Type的变化说明了后端负责解析的变化,该站点就可能存在漏洞。

apache的一些配置和技巧。 
    安装apache时根据情况带几个参数,网上也有其他优化参数,但估计性能差不了多少,如下 
./configure --prefix=/usr/local/apache2.2.10 --enable-so --enable-deflate --enable-rewrite --enable-expires  
我做过测试,apache自带的mod_mem_cache不太好使,最大使用内存不到200M时就会有问题,内存使用量突然下降,所以 
图片服务器建议不要用apache,用lighttpd或者nginx会更好。lighttpd+memcached的方式我就没配成功过,nginx+memcached能从缓存 
里获取,但不能set到缓存,所以我用的是lighttpd+mod_mem_cache(需要把lighttpd打个补丁),稍后作详细介绍。 

apache简单防DDOS攻击的配置,需要从网上找一个mod_evasive20模块,用/usr/local/apache/bin/apxs -cia mod_evasive20.c安装,一般情况下没有必要配置这玩意。 
 
    DOSHashTableSize    10000   
    DOSPageCount        
    DOSSiteCount        50 
    DOSPageInterval    
    DOSSiteInterval    
    DOSBlockingPeriod   10 
    DOSEmailNotify      webmaster@xxx.com 
    DOSLogDir           /var/log/mod_dosevasive.log 
 

apache防sql注入攻击的配置,需要安装mod_security模块 
 
    SecFilterEngine On 
    SecFilterCheckURLEncoding On 
    SecFilterForceByteRange 32 126 
    SecFilterCheckUnicodeEncoding On 
    SecServerResponseToken Off 
    SecAuditEngine RelevantOnly 
    SecAuditLog logs/audit_log 
    SecFilterDebugLog logs/modsec_debug_log 
    SecFilterDebugLevel 0 
    SecFilterDefaultAction "deny,log,status:406" 
    SecFilter /etc/*passwd 
    SecFilter /bin/*sh 
    SecFilter "\.\./" 
    SecFilter "<( |\n)*script" 
    SecFilter "<(.|\n)+>" 
    SecFilter "delete[[:space:]]+from" 
    SecFilter "insert[[:space:]]+into" 
    SecFilter "select.+from" 
    SecFilter "union[[:space:]]+from" 
    SecFilter "drop[[:space:]]" 
    SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$" 
 

加大apache最大连接数的配置,如果选择的是preworker工作方式。preworker和worker的区别就不讲了。apache2.0以上直接设置ServerLimit即可,apache2.0以前还要修改源代码才能使修改 
的ServerLimit生效,建议应用服务器用apache2.0吧,性能差不了多少。 

 
    ServerLimit           20000  #ServerLimit据说要放第一行 
    StartServers          50 
    MinSpareServers       50 
    MaxSpareServers       100 
    MaxClients            10000 
    MaxRequestsPerChild   10000 
 

压缩传输的配置,这个做为网站来说非常重要,它是不压缩传输大小的20%左右,也就是说用户访问一个网站速度快了5倍,不配置不行,但是图片不能做压缩了。 

 
SetOutputFilter DEFLATE 
DeflateCompressionLevel 3  
DeflateFilterNote Input instream 
DeflateFilterNote Output outstream 
DeflateFilterNote Ratio ratio 
LogFormat '"%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" "%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate 
# Netscape 4.x has some problems... 
BrowserMatch ^Mozilla/4 gzip-only-text/html 
# Netscape 4.06-4.08 have some more problems 
BrowserMatch ^Mozilla/4\.0[678] no-gzip 
# MSIE masquerades as Netscape, but it is fine 
#BrowserMatch \bMSIE !no-gzip !gzip-only-text/html 
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48 
# the above regex won't work. You can use the following 
# workaround to get the desired effect: 
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 
# Don't compress images, java scripts and style sheets 
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|js|css)$ no-gzip dont-vary 

# Make sure proxies don't deliver the wrong content 
# this needs mod_headers but it's very important 
# so I don't add a IfModule around it 
#Header append Vary User-Agent env=!dont-vary 
#CustomLog logs/deflate_log.log deflate 
#CustomLog "|/usr/local/cronolog/sbin/cronolog /usr/local/apache2.0.59_2/logs/www.shedewang.com.access.log.%Y%m%d" deflate env=!IMAG 
 

apache配置mod_mem_cache,这个模块不太好使,建议不用 
 
#CacheForceCompletion 100 
CacheDefaultExpire 3600 
CacheMaxExpire 86400 
CacheLastModifiedFactor 0.1 
CacheIgnoreNoLastMod on 
         
                CacheEnable mem / 
                MCacheSize 2000000 
                MCacheMaxObjectCount 10000 
                MCacheMinObjectSize 1000 
                MCacheMaxObjectSize 512000 
                MCacheRemovalAlgorithm LRU 
         
 

CacheEnable: 启动 mod_cache,其后接两个参数。第一个参数指定快取的种类,应设为 mem (记忆体快取) 或 disk (磁碟快取) 之其一;第二个参数指定使用快取的 URI 路径,如果对整个网站 (或虚拟主机) 进行快取,简单指定为根目录(/) 即可。 
CacheForceCompletion: 这个值指定当 HTTP request 被取消时,内容的产生动作要完成的百分比;预设是 60(%)。 
CacheDefaultExpire: 指定快取的预设过期秒数;预设值是一小时 (3600)。 
CacheMaxExpire: 指定快取最大的过期秒数;预设值是一天 (86400)。 
CacheLastModifiedFactor: 用来从回应里 Last Modified 资讯算出 expire date。 
计算方式是:expire period (过期时距) = 最后更新后至今的时间间距 * CacheLastModifiedFactor 
而expire date = 目前时间 + expire period 
不过无论如何,过期时间不能超过 CacheMaxExpire 的设定值。 


配置mod_expires模块 

mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求,这一点特别实用在图片服务器上。 

mod_expires的安装配置: 
 
  # turn on the module for this directory 
  ExpiresActive on 

  # cache common graphics for 3 days 
  ExpiresByType image/jpg "access plus 365 days" 
  ExpiresByType image/gif "access plus 365 days" 
  ExpiresByType image/jpeg "access plus 365 days" 
  ExpiresByType image/png "access plus 365 days" 

 



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wanghao72214/archive/2009/01/15/3788891.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为在OpenWrt上配置Nginx以实现公网访问,您可以按照以下步骤进行操作: 1. 首先,在OpenWrt的防火墙设置中进行端口转发配置。根据引用的描述,您可以配置两个转发规则:一个用于HTTP请求,将外部的端口映射到OpenWrt的80端口;另一个用于HTTPS请求,将外部的端口映射到OpenWrt的443端口。 2. 接下来,您需要启动一个内网应用程序。根据引用和引用的描述,您需要将这个内网应用程序部署在OpenWrt的某个服务器上,并确保其监听在适当的端口(例如80端口或443端口)。 3. 配置Nginx。您需要编辑Nginx的主配置文件nginx.conf。根据引用和引用的描述,您需要配置Nginx来反向代理到您的内网应用程序。具体来说,您需要添加一个代理配置,将外部的HTTP请求(通过转发规则映射到OpenWrt的80端口)转发到内网应用程序的对应端口(例如8003端口)。另外,您还需要配置Nginx来支持HTTPS请求,将外部的HTTPS请求(通过转发规则映射到OpenWrt的443端口)转发到内网应用程序的对应端口。 验证配置是否成功,请您通过在本地网络中访问OpenWrt的公网地址(可能是您的路由器的公网IP地址)和相应的端口来测试访问您的内网应用程序。确保通过HTTP和HTTPS均可以成功访问您的应用程序,并且没有出现任何错误。 请注意,具体的配置步骤可能会因您的网络环境和需求而有所不同。请仔细阅读OpenWrt和Nginx的文档,以确保正确配置和安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [openwrt内网端口转发,内部使用nginx反代,外部使用https安全访问的方案](https://blog.csdn.net/weixin_40294053/article/details/119859936)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值