[nginx]安全优化

nginx编译安装

- 下载
cd /usr/local/src/
wget http://nginx.org/download/nginx-1.12.2.tar.gz 

tar -xf nginx-1.12.2.tar.gz

- 准备环境
useradd -s /sbin/nologin -M www
yum install perl-devel openssl-devel gcc -y

- 编译安装
cd /usr/local/src/nginx-1.12.2
./configure --prefix=/usr/local/nginx-1.12.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /usr/local/nginx-1.12.2 /usr/local/nginx
cd /usr/local/nginx/conf
egrep -v '^$|#' nginx.conf.default > nginx.conf

echo "PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile
source /etc/profile

- 管理命令
nginx -t #检查语法
nginx -s stop
nginx -s reload

nginx安全优化

改软件名
改版本号
限制访问(dir/file/扩展名)
限制访问方法
限制上传大小
防盗链
防爬虫
防非法解析

目录安全
使用普通用户运行
www运行worker

错误页优化

改软件名

- 查看下jd的,竟然是JDWS/2.0
[[email protected] conf]# curl -I www.jd.com 

HTTP/1.1 302 Moved Temporarily
Server: JDWS/2.0

- 1.修改内核(头部信息)
[[email protected] nginx-1.12.2]# vim /usr/local/src/nginx-1.12.2/src/core/nginx.h
...
13 define NGINX_VERSION      "7.0"
14 define NGINX_VER          "MTWS/" NGINX_VERSION
...

- 2.修改头部
[[email protected] nginx-1.12.2]# vim  src/http/ngx_http_header_filter_module.c
49 static u_char ngx_http_server_string[] = "Server: MTWS" CRLF;

- 3.修改错误页(response header)
[[email protected] nginx-1.12.2]# vim src/http/ngx_http_special_response.c
22 "<hr><center>MTWS</center>" CRLF
...
29 "<hr><center>MTWS</center>" CRLF
...
36 "<hr><center>MTWS</center>" CRLF

- 修改结果检查
[[email protected] src]# grep -nir mtws .
./core/nginx.h:14:#define NGINX_VER          "MTWS/" NGINX_VERSION
./core/nginx.h:22:#define NGINX_VAR          "MTWS"
./http/ngx_http_header_filter_module.c:49:static u_char ngx_http_server_string[] = "Server: MTWS" CRLF;
./http/ngx_http_special_response.c:22:"<hr><center>MTWS</center>" CRLF
./http/ngx_http_special_response.c:29:"<hr><center>MTWS</center>" CRLF
./http/ngx_http_special_response.c:36:"<hr><center>MTWS</center>" CRLF

- 然后编译安装(清理下之前的环境),测试
[[email protected] ~]# curl -I 192.168.2.11 

HTTP/1.1 200 OK
Server: MTWS/7.0.0

- 重新编译
nginx -s stop
rm -rf /usr/local/nginx*
cd /usr/local/src/nginx-1.12.2
./configure --prefix=/usr/local/nginx-1.12.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module
make && make install
ln -s /usr/local/nginx-1.12.2 /usr/local/nginx

改版本号

- 默认有版本号
[[email protected] ~]# curl -I 192.168.2.11 

 #获取的是响应头信息
HTTP/1.1 200 OK
Server: **nginx/1.12.2**
...

- 修改nginx.conf
http{
    ...
    server_tokens off;
    ...
}

- 再次测试,发现没版本号了
[[email protected] ~]# curl -I 192.168.2.11 

HTTP/1.1 200 OK
Server: MTWS  #这里的版本号没了
...

限制访问(dir/file/扩展名)

站点目录及文件访问控制

http -> server -> location
location匹配 dir/file/扩展名 来通过ip 阻断
                                   重定向到相应页面

[location语法](http://www.cnblogs.com/iiiiher/p/8545244.html)

限制访问方法

利用Nginx限制HTTP的请求方法

#Only allow these request methods

    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 501;
    }

#Do not accept DELETE,SEARCH and other methods

限制上传大小

上传文件大小的限制(动态应用)
nginx限制客户端上传附件的大小

防盗链(HTTP referer)

盗链和防盗链场景模拟实现 针对方法1做了改善.
1) 根据HTTP referer实现防盗链, 利用referer,并且针对扩展名rewrite重定向,下面的代码为利用referer且针对扩展名rewrite重定向,即实现防盗链的Nginx配置。
2) 根据cookie防盗链
3) 通过加密变换访问路径实现防盗链
4) 在所有网站资源上添加网站信息,让盗链人员帮你做推广宣传

  • 设置expires的方法如下:
    server {
        listen            80;
        server_name        www.maotai.com;
        root        html/www;
        index        index.html index.htm;
        access_log    logs/www_access.log main;

        #Preventing hot linking of images and other file types
        location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
            valid_referers none blocked server_names *.maotai.com maotai.com;
            if ($invalid_referer){
                rewrite ^/ http://www.maotai.com/img/nolink.jpg;
            }
            access_log off;
            root html/www;
            expires 1d;
            break;
        }
    }

防爬虫

范例1:阻止下载协议代理,命令如下:

    ## Block download agents ##
    if ($http_user_agent ~* LWP::Simple|BBBike|wget)
    {
        return 403;
    }

范例2:添加内容防止N多爬虫代理访问网站,命令如下:

这些爬虫代理使用“|”分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:

    if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo!Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot")
    {
        return 403;
    }

防非法解析

禁止非法域名解析到本网站

  • 第一种方式:配置一个server虚拟主机区块,放置在所有server区块最前面
    server {
        listen 80;
        server_name - ;
        return 501;
    }

  • 第二种方式:将计就计,通过你的域名访问时候,自动跳转到我的域名上
    server {
        listen 80 default_server;
        server_name _;
        rewrite ^(.*) http://www.maotai.com/$1 permanent;
    }
    if ($host !~ ^www\.maotai\.com$)
    {
        rewrite ^(.*) http://www.maotai.com/$1 permanent;
    }

目录安全

Nginx站点目录文件及目录权限优化

使用普通用户启动nginx

1、切换到普通用户家目录下,创建nginx所需文件

[[email protected] ~]$ mkdir -p blog/{conf,logs,html}
[[email protected] ~]$ cd blog/
[[email protected] blog]$ cp /usr/local/nginx/conf/nginx.conf.default  ./conf/
[[email protected] blog]$ grep -vE "^$|#" conf/nginx.conf.default  >  conf/nginx.conf
[[email protected] blog]$ cp /usr/local/nginx/conf/mime.types conf/

2、编写配置文件

worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_rlimit_nofile 65535;
error_log  /home/nginx/blog/logs/error.log;
user inca inca;
pid       /home/nginx/blog/logs/nginx.pid;
events {
    use epoll;
    worker_connections  1024;
}
http {
    include      mime.types;
    default_type  usr/local/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    server {
        listen       8080;
        server_name  www.maotai.com;
        root   /home/nginx/blog/html;
        location / {
            index  index.html index.htm;
        }
        access_log  /home/nginx/blog/logs/web_blog_access.log  main;
    }
}

注意:普通用户不能使用知名端口,需要使用其他端口启动服务

3、检查配置文件语法,并启动nginx服务

/usr/local/nginx/sbin/nginx -t -c /home/nginx/blog/conf/nginx.conf
或
/usr/local/nginx/sbin/nginx -c /home/nginx/blog/conf/nginx.conf &>/dev/null &

注意:忽略一些不正确的输出信息          

worker进程以www用户运行

[[email protected] nginx]# ps -ef|grep nginx
root      12067      1  0 09:01 ?        00:00:00 nginx: master process nginx
**www**       12152  12067  0 09:04 ?        00:00:00 nginx: worker process

- 方法1: 编译时候指定
useradd -s /sbin/nologin -M www
./configure --prefix=/usr/local/nginx-1.12.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module 

方法2: 修改nginx.conf
user  www www;  # 用户名,用户组

错误页优化

NGINX错误页面友好显示

范例1:对错误代码403实行本地页面跳转,命令如下:

    server {
        listen       80;
        server_name  www.maotai.com;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
        error_page  403  /403.html;    #<==当出现403错误时,会跳转到403.html页面  /403.html是相对于站点根目录html/www的。
    }

范例2:50x页面放到本地单独目录下,进行优雅显示。

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /data0/www/html;
    }

范例3:改变状态码为新的状态码,并显示指定的文件内容,命令如下:

    error_page 404 =200 /empty.gif;
    server {
        listen       80;
        server_name www.maotai.com;
        location / {
            root   /data0/www/bbs;
            index  index.html index.htm;
            fastcgi_intercept_errors on;
            error_page  404 =200    /ta.jpg;
            access_log  /app/logs/bbs_access.log  commonlog;
        }
    }

范例4:错误状态码URL重定向,命令如下:

    server {
        listen       80;
        server_name www.maotai.com;
        location / {
            root   html/www;
            index  index.html index.htm;
            error_page   404  https://clsn.cnblogs.com;
            #<==当出现404错误时,会跳转到指定的URL https://clsn.cnblogs.com页面显示给用户,这个URL一般是企业另外的可用地址
            access_log  /app/logs/bbs_access.log  commonlog;
        }
    }

原文地址:https://www.cnblogs.com/iiiiher/p/8550830.html

时间: 2024-10-18 06:36:37

[nginx]安全优化的相关文章

nginx基本优化

1.1   隐藏nginx header里版本号信息 1.2   更改源码隐藏软件名称及版本号 1.3   更改掉nginx默认用户及用户组(worker进程服务用户优化) 1.4   配置nginx worker进程个数 1.5   根据cpu核数进行nginx进程优化 1.6   nginx事件处理模型优化 1.7   调整nginx worker单个进程允许的客户端最大连接数 1.8   配置nginx worker进程最大打开文件数 1.9   开启高效的文件传输模式 1.10  设置连

nginx 配置优化的几个参数

nginx 配置优化的几个参数 2011-04-22 本文地址: http://blog.phpbean.com/a.cn/7/ --水平有限欢迎指正-- -- 最近在服务器上搞了一些nginx 研究了一下 总结总结Sleep nginx配置文件里面需要注意的一些参数 worker_processes 8 nginx要开启的进程数 一般等于cpu的总核数 其实一般情况下开4个或8个就可 我开2个 以了 多了没有太多用 每个nginx进程消耗的内存10兆的模样 worker_cpu_affinit

nginx + SSL优化配置

nginx + SSL优化配置: 1 #http段添加如下配置项: 2 3 http { 4 5 ssl_prefer_server_ciphers on; #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件. 6 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #协议安全设置 7 ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #加密套件 ssl_ciph

Nginx性能优化配置(三)

Nginx性能优化配置(三)  本文主要介绍Nginx的性能优化配置,文章的层次架构如图所示. 1.Nginx的工作进程优化 1.worker_processes 作用:worker进程的数量:通常应该等于小于当前主机的cpu的物理核心数:auto表示根据CPU的物理核心数自动调整工作进程数.使用lscpu或或者cat /proc/cpuinfo | grep 'processor' | wc -l 可以查看CPU的物理核心数. 配置:worker_processes auto: 配置段:mai

企业级Web Nginx 服务优化(1)

企业级Web Nginx 服务优化 总结配置文件: nginx.conf httpd.conf httpd-vhosts httpd-mpm.conf my.cnf php.ini php-fpm.conf 1.1nginx.conf 配置文件基本参数优化 1.1.1 隐藏nginx header 内版本号信息 一些特定的系统及服务漏洞一般都和热定的软件及版本号有关,我们应尽量隐藏服务器的敏感信息(软件名称及版本等信息),这样黑客无法猜到有漏洞的服务是否是对应服务的版本,从而确保web服务器最大

企业级nginx.conf优化参考模板

以下是我整理的非常实用的企业级nginx.conf优化参考模板,整个配置并不一定适合各种环境,所以需要大家按各自需求选取部分功能配置到自己的nginx配置文件中. user nginx;     #Nginx服务的默认用户 worker_processes 4;     #一般为CPU核个数 worker_cpu_affinity 001 0010 0100 1000;  #绑定不同Nginx进程到不同CPU上 worker_rlimit_nofile 6535;     #worker进程最大

高并发下 Nginx的 优化

过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用apt-get,yum或是make命令安装的时候它就已经进行了最佳优化. (注意那些库经常过期,Wiki的安装页面上通常有

Nginx配置文件优化详解

Nginx配置文件优化详解 对nginx进行优化是重点也是难点,这里给出一些常用的优化措施,以及相关参数的所代表的意思.有些参数需要结合公司服务器进行设置. 全局变量的优化: #定义Nginx运行的用户和用户组user  www  www: #启动进程,通常设置成和cpu的数量相等 worker_processes  8: #为每个进程分配cpu. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 

二、nginx模块优化和进程管理

博客:http://lijinhuan.blog.51cto.com/ 微博:http://weibo.com/lijinhuanexperience 代码:https://github.com/lijinhuan 一.模块管理 1.nginx是模块化结构,但是它和apache不一样,它的模块不能动态加载或者卸载. 它是一种静态模块系统,如果想要卸载或者安装新的模块,必须重新编译指定 2.编译时./configure --help 查看所有模块:--without--xx表示默认安装,--wit

Nginx 配置优化

1.隐藏nginx header版本号 [[email protected] tmp]# curl -I 192.168.56.102:1983 HTTP/1.1 200 OK Server: nginx/1.12.1 Date: Thu, 20 Jul 2017 06:41:49 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Wed, 19 Jul 2017 07:46:59 GMT Connection: kee