文档章节

nginx搭建及加固

php开源社区
 php开源社区
发布于 03/26 15:32
字数 2923
阅读 8.3K
收藏 39

attachments-2020-03-BLYGZg9y5e7c4564822a1.jpg

系统使用的是centos7

Nginx安装及配置

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

安装

我是用的环境是centos 7,系统默认的yum源没有nginx,找到一个使用nginx官方源地址

首先建立nginx的yum仓库,执行下面的命令

sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

v2-903249c8eb7812e70053b49529545168_720w.jpg

可以看到已经添加上了nginx的源,下面就是下载安装了

下载安装命令也很简单

sudo yum install -y nginx

v2-f633583832325e053022c892213728a4_720w.jpg

安装成功^_^

查看官方安装文档(https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)上的源不一样,不过都是一样的建立本地yum仓库

启动nginx服务

service nginx start

默认是80端口,但测试访问发现并不能进入欢迎页面,查了一下,centos默认是关闭80端口的,我们设置一下防火墙

开启80端口

sudo firewall-cmd --zone=public --permanent --add-service=http

v2-b1d2aa2d933eedcd01f336f9572dd935_720w.png

开启443端口

sudo firewall-cmd --zone=public --permanent --add-service=https

v2-7b5df9c405d5d6accf3020410daac37f_720w.png

必须要重新加载一下防火墙配置才行哦,下面我们再来访问一下

完美。

配置

默认的网站目录为: /usr/share/nginx/html

全局的配置文件为:/etc/nginx/nginx.conf

默认的配置文件为: /etc/nginx/conf.d/default.conf

日志文件目录为:/var/log/nginx/

我们查看具体的配置文件内容,发现其实nginx.conf是主要的配置文件,新增的都在/etc/nginx/conf.d/,nginx.conf将整个目录的配置文件都include了

配置结构

Nginx配置文件常见结构的从外到内依次是「http」「server」「location」等等,缺省的继承关系是从外到内,也就是说内层块会自动获取外层块的值作为缺省值。

Http

http {
    #文件扩展名与文件类型映射表
    include       /etc/nginx/mime.types;
    #默认文件类型
    default_type  application/octet-stream;
    #日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
    #
    access_log  /var/log/nginx/access.log  main;
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;
    #此选项允许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
    #tcp_nopush     on;
    #长连接超时时间,单位是秒
    keepalive_timeout  65;
    #开启gzip压缩输出
    #gzip  on;
    #导入其他配置
    include /etc/nginx/conf.d/*.conf;
}

整个配置文件结构其实大概是这样的

http {
    #全局的配置
    …………
    server{
        #虚拟主机的配置
        …………
        location  {
            #每个请求的处理,如请求转发、静态文件映射、负载均衡等
            …………
        }
    }
}

下面再具体了解一下每一层的配置

Server

接收请求的服务器需要将不同的请求按规则转发到不同的后端服务器上,在 nginx 中我们可以通过构建虚拟主机(server)的概念来将这些不同的服务配置隔离。不同的url会对应不同的server配置,而转发到相应的后端服务器上做处理。

server {
    listen       80;        #服务监听端口
    server_name  localhost; #服务的域名或IP
    root   html;            #指定服务的页面根目录
    index  index.html index.htm; #指定访问的默认首页地址
}

通常我们可以配置多个server,像这样

server {
    listen       80;
    server_name  host1;
    root   html;
    index  index.html index.htm;
}
server {
    listen       80;
    server_name  host2;
    root   /data/www/html;
    index  index.html index.htm;
}

我们可以将不同的服务在/etc/nginx/conf.d/目录下创建相应的conf以区分,方便管理,而nginx.conf会将这个目录下的conf全部引入的。

Location

每个 url 请求都会对应的一个服务,nginx 进行处理转发或者是本地的一个文件路径,或者是其他服务器的一个服务路径。而这个路径的匹配是通过 location 来进行的。我们可以将 server 当做对应一个域名进行的配置,而 location 是在一个域名下对更精细的路径进行配置。

location [匹配规则] {
        #具体处理配置,如转发、反向代理、负载均衡等
    }

location 匹配规则:

~      波浪线表示执行一个正则匹配,区分大小写
~*    表示执行一个正则匹配,不区分大小写
^~    ^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      进行普通字符精确匹配

匹配例子:

location  = / {
  # 只匹配"/".
  [ configuration A ] 
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会优先匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

请求:
/ -> 符合configuration A
/documents/document.html -> 符合configuration B
/images/1.gif -> 符合configuration C
/documents/1.jpg ->符合 configuration D

功能配置

主要的功能配置都是在location里面的,下面我们来学习不同功能的配置方法

静态文件映射

访问文件的配置主要有 root 和 alias

alias后跟的指定目录是准确的,并且末尾必须加 /。

location /c/ {
        alias /a/;
    }

如果访问站点http://location/c访问的就是/a/目录下的站点信息。

root后跟的指定目录是上级目录,并且该上级目录下要含有和location后指定名称的同名目录才行。

location /c/ {
        root /a/;
    }

这时访问站点http://location/c访问的就是/a/c目录下的站点信息。

配置起来很简单比如我要将所有的请求到转移到真正提供服务的一台机器的 8001 端口,只要这样:

location / {     proxy_pass 172.16.1.1:8001; }

这样访问host时,就都被转发到 172.16.1.1的8001端口去了。

负载均衡

#负载均衡服务器列表配置在http下面
upstream myserver {
    ip_hash;    
    server 172.16.1.1:8001;
    server 172.16.1.2:8002;
    server 172.16.1.3;
    server 172.16.1.4;
}
location / {
    proxy_pass http://myserver;
}

我们在 upstream 中指定了一组机器,并将这个组命名为 myserver,这样在 proxypass 中只要将请求转移到 myserver 这个 upstream 中我们就实现了在四台机器的反向代理加负载均衡。

负载均衡的模式

轮询:默认模式,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream bakend {
    server 192.168.0.14 weight=10;
    server 192.168.0.15 weight=10;
}

ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream bakend {
    ip_hash;
    server 192.168.0.14:88;
    server 192.168.0.15:80;
}

fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backend {
    server server1;
    server server2;
    fair;
}

url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

#例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
    server squid1:3128;
    server squid2:3128;
    hash $request_uri;
    hash_method crc32;
}

负载均衡设备的IP及设备状态

每个设备的状态设置为: 1.down表示单前的server暂时不参与负载 2.weight为weight越大,负载的权重就越大。 3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它所有的非back

up机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

upstream bakend{#定义负载均衡设备的Ip及设备状态}{
    ip_hash;
    server 127.0.0.1:9090 down;
    server 127.0.0.1:8080 weight=2;
    server 127.0.0.1:6060;
    server 127.0.0.1:7070 backup;
}

加固

隐藏服务器版本号

默认我们访问不存在的页面时,报错页面上会有nginx的版本信息,这会向黑客提供信息,以方便查找当前版本的漏洞,加以利用

v2-d36713aadbc9f5efc05ef51f46a601f3_720w.jpg

修改ngixn.conf,http层里面添加server_tokens off;

v2-fde49d02c85bf78f650b426de3a60f51_720w.jpg

我们访问不存在的页面试一下

这样没有版本信息了

禁止目录浏览

默认是不允许列出整个目录的,如果不是做下载服务器的,就不要打开这个,避免敏感信息暴露给黑客并下载

v2-f695fe7863b65e4e60f7325734c841ed_720w.jpg

如果开启了就会是下面这样的效果

配置关闭即可

autoindex off

限制访问敏感资源

有些资源我们可能不想对外开放,比如一些版本控制的备份文件,如.git/.svn等,这些暴露了可能会将整个项目的结构或是源代码都泄露了,

location /my/ { deny all; }

上面我设置了my这个目录下的所有资源都拒绝,效果如下

v2-29cb3eb89139c6fd3f3fb7de99a35a64_720w.jpg

所以要识别好公开的资源,限制敏感资源的访问

限制HTTP请求方法

关闭没必要的请求方法,一般都是get|post了

下面配置在server里面,预期之外的会返回500状态

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

这个要放到最前面

限制IP/域名访问

ngx_http_access_module 模块使有可能对特定IP客户端进行控制. 规则检查按照第一次匹配的顺序

location ~ .*my.html$ {
          root /usr/share/nginx/html;
          deny 192.168.0.105; #禁止ip
          allow 192.168.189.134; #允许ip
          deny all; #拒绝其他所有
    }

限制访问的ip,即限制了服务的客户,防止不允许的人访问,减少风险

控制超时时间

可以缓解dos攻击,避免黑客伪造用户访问服务,造成服务器压力过大,带宽占满,备份nginx.conf配置文件。

编辑配置文件,具体设置如下:

client_body_timeout 10; #设置客户端请求主体读取超时时间 client_header_timeout 10; #设置客户端请求头读取超时时间 keepalive_timeout 5 5; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间 send_timeout10; #指定响应客户端的超时时间

验证一下设置

v2-bafd20e2c051acd1489b8fc4fbdb84c1_720w.jpg

错误页面重定向

避免错误页面提供敏感信息,一般我们会定制一些通用的错误页面返回给客户端

我们在http段配置

error_page 500 502 503 504 /50x.html;

类似上面这种配置,将状态码500、502、503、504全部重定向到50x.html

nginx降权

如果发生入侵,获取了当前运行nginx的用户,则拥有该用户的全新了,我们应当使用最下权限运行ngixn,绝对禁止root用户运行!!!

备份nginx.conf配置文件。

  编辑配置文件,添加如下一行内容:

 user nobody;

保存,然后后重启nginx服务。

说明:nobody在linux中是一个不能登陆的帐号,一些服务进程如apache,aquid等都采用一些特殊的帐号来运行,比如nobody,news,games等等,这是就可以防止程序本身有安全问题的时候,不会被黑客获得root权限

 

attachments-2020-03-FIWWUXSP5e7c45df71609.jpg

 

© 著作权归作者所有

php开源社区
粉丝 1
博文 56
码字总数 73948
作品 0
长沙
技术主管
私信 提问
加载中

评论(8)

互联网技术到家
互联网技术到家
你好,我是微信公众号互联网技术到家的小编,读了你的文章收获很多,可否转载你的文章?
真爱
真爱
nginx的负载不能负担大流量的,A负载B,C,D服务器。带宽都要从A中转。
大盘
大盘
nginx安全加固,一定要升级openssl-1.1.1d的,要安装的快,最好是用RPM包方式,可以参考这个https://aq2.cn/173.html
php开源社区
php开源社区 博主
谢谢😌
其乐m
其乐m
额,我看怎么还有图没加载出来勒
php开源社区
php开源社区 博主
😳😳😳检查了一遍,好像木有发现
巴拉迪维
巴拉迪维
图片挂了不少,请博主修复一下吧!
php开源社区
php开源社区 博主
谢谢提醒,换了个其他浏览器才检查出这些问题,用常用的浏览器,我这边可能是缓存的原因 所以看到的都是正常的。然后代码刚刚也乱了。现在全部修复了 总之,谢谢!😏
web应用安全基线-nginx安全配置

Title:Linux-nginx安全配置 nginx 测试版本:nginx 1.x 0x00 Nginx简介 Nginx是一款轻量级的web服务器/反向代理服务器及电子邮件代理服务器。其特点是占用内存少,并发能力强。 Nginx漏洞查...

cyberzhang
2016/11/22
464
0
开源web应用防火墙--Naxsi

Naxsi是一个开放源代码、高效、低维护规则的Nginx web应用防火墙模块。Naxsi的主要目标是帮助人们加固他们的web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程文件包含漏洞。...

匿名
2011/11/13
7.8K
0
Nginx使用Naxsi搭建Web应用防火墙(WAF),防xss、防注入×××

Naxsi是一个开放源代码、高效、低维护规则的Nginx web应用防火墙(Web Application Firewall)模块。Naxsi的主要目标是加固web应用程序,以抵御SQL注入、跨站脚本、跨域伪造请求、本地和远程...

justin_peng
2018/08/04
0
0
安全狗聚焦服务器安全和代维服务

服务器安全是一个动态的过程,也是一个复杂的系统工程。如今互联网环境不断变化,网络安全威胁和隐患日益严重,攻击方式日新月异,广大企业和个人站长也面临着严峻的新安全挑战。同时,现成的...

小猪猪的风
2014/11/20
76
0
漏洞预警:Hadoop 未授权访问可导致数据泄露

近日,国外媒体报道全球Hadoop服务器因配置不安全导致海量数据泄露,涉及使用Hadoop分布式文件系统(HDFS)的近4500台服务器,数据量高达5120 TB (5.12 PB),经分析,这批数据泄露的近450...

妩媚的悟空
2017/06/15
3.7K
7

没有更多内容

加载失败,请刷新页面

加载更多

macOS 10.15.4 ssh无法连接解决办法

原文:macOS 10.15.4 ssh无法连接解决办法 今天早上醒来,发现Mac自动安装了最新版的macOS,也就是Catalina 10.15.4。上午用着挺好,没什么异常。下午登录服务器,发现无法连接。用"-v"选项查...

tlanyan
25分钟前
27
0
程序员无休止加班的真正原因!

来源:豆瓣网 www.douban.com/doulist/26838305 推荐去我的博客阅读更多: 1.Java JVM、集合、多线程、新特性系列教程 2.Spring MVC、Spring Boot、Spring Cloud 系列教程 3.Maven、Git、Ecl...

Java技术栈
31分钟前
28
0
MySQL:Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezon

时区错误,MySQL默认的时区是UTC时区,比北京晚了8个小时,所以要修改mysql的时长 window环境下: 打开cmd,进入到mysql安装目录下的bin目录 输入以下命令 mysql -hlocalhost -uroot -p 输入M...

那个猩猩很亮
32分钟前
24
0
协程

协程 协程 协程( coroutine )表示一种程序运行的方式,可以理解成 “协作的线程” 或 “协作的函数” 协程既可以用单线程实现:是一种特殊的子例程;也可以用多线程实现:是一种特殊的线程...

aHai366
32分钟前
28
0
搭建使用 AWS 的 Kubernetes EKS 服务

前面从无到有或是分别以 Docker Desktop, Minikube, kind 来搭建过 Kubernetes 集群。而如今各大云服务提供商基本都推出了各自的 Kubernetes 服务,例如: Google GKE - Google Kubernetes E...

YanbinQ
34分钟前
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部