Nginx系列之2:安全

Stella981
• 阅读 579

基础安全

先说一些基本安全设置,由开始发展到现在,其实nginx的安全做得比以前已经好不少,不过有些还是要强调一下。

Nginx默认是不允许列出整个目录的,不过,我们为了安全,最好还是确认这个真的关闭了,不然代码被拉走了就悲剧了。

http {
autoindex off;
}
 
nginx默认是会在返回的数据包中显示版本号,原本这个并不是大问题,但是被别有用心的人专门攻击这个版本的话,那就不好了,所以,我们还是隐藏好一点。

http {
server_tokens off;
}

IP安全

白名单高度安全配置(适用于授权IP较少的情况,其余全部deny封锁),可配置在http、server、location中

location / {
allow 192.168.1.1;
deny all;
}

黑名单配置(适用于授权IP较多的情况,allow其余),可配置在http、server、location中

location / {
deny 192.168.1.1;
allow all;
}

连接安全


设置https连接的模块
1. ssl on | off;
是否开启ssl连接
2. ssl_certificate file;
当前虚拟主机使用PEM格式的证书文件;
3. ssl_certificate_key file;
当前虚拟主机上与其证书匹配的私钥文件;
4. ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
支持ssl协议版本,默认为后三个;
5. ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
builtin[:size]:使用OpenSSL内建的缓存,此缓存为每worker进程私有;
[shared:name:size]:在各worker之间使用一个共享的缓存;
6. ssl_session_timeout time;
客户端一侧的连接可以复用ssl session cache中缓存 的ssl参数的有效时长;

先自建一个CA,创建证书和私钥文件

在CA证书服务器生成自签证书
[root@C711 ~]# cd /etc/pki/CA/
[root@C711 CA]# ls
certs crl newcerts private
[root@C711 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...........+++
......+++
e is 65537 (0x10001)
[root@C711 CA]# ll private
总用量 4
-rw------- 1 root root 1675 7月 9 23:02 cakey.pem
[root@C711 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pm
[root@C711 CA]# touch index.txt
[root@C711 CA]# echo 01 > serial

在nginx服务器上:
[root@C712 ~]# mkdir /etc/nginx/ssl #创建ssl目录
[root@C712 ~]# cd /etc/nginx/ssl
[root@C712 ssl]# (umask 077; openssl genrsa -out nginx.key 2048) #创建秘钥
[root@C712 ssl]# ll #查询
总用量 4
-rw------- 1 root root 1679 7月 9 23:19 nginx.key
[root@C712 ssl]# openssl req -new -key nginx.key -out nginx.csr #创建私钥
[root@C712 ssl]# ll #查询
总用量 8
-rw-r--r-- 1 root root 989 7月 9 23:22 nginx.csr
-rw------- 1 root root 1679 7月 9 23:19 nginx.key
[root@C712 ssl]# scp nginx.csr 192.168.1.11:/tmp/#传输到CA服务器上

在CA服务器上认证
[root@C711 CA]# openssl ca -in /tmp/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365
[root@C711 CA]#scp certs/nginx.crt 192.168.1.12:/etc/nginx/ssl #传送回nginx服务器

回到nginx服务器上
[root@C712 ~]# cd /etc/nginx
[root@C712 nginx]# cp conf.d/vhost1.conf conf.d/vhost1_ssl.conf 
[root@C712 nginx]# vim conf.d/vhost1_ssl.conf

server{
listen 443 ssl; #修改监听端口
server_name www.ilinux.io;
root /data/nginx/vhost1;
access_log /var/log/nginx/vhost1_ssl_access.log main;

ssl on; #开启ssl
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols sslv3 tlsv1 tlsv1.1 tlsv1.2;#支持哪些协议
ssl_session_cache shared:sslcache:20m;#指明缓存大小,1M能够缓存4000个会话

location ~* ^/(admin|login){
auth_basic "admin area or login url";
auth_basic_user_file /etc/nginx/.ngxpasswd;
}
}
[root@C712 ~]# nginx -s reload

HTTPS SSL

    server {
        listen       6003;
        server_name  localhost;

        client_max_body_size 2000m;

        ssl on;

        ssl_certificate      /usr/local/nginx/conf/cert/server.crt;
        ssl_certificate_key  /usr/local/nginx/conf/cert/server.key;
        ssl_client_certificate /usr/local/nginx/conf/cert/ca.crt;

        ssl_verify_client on;
        ssl_session_cache    shared:SSL8:1m;
        ssl_session_timeout  2h;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;


        location / {
            proxy_pass   http://11.8.130.167;
            proxy_redirect default;
        }
      location /xmpptalk {        
            proxy_pass   http://11.8.130.168:8080/xmpptalk;
            proxy_redirect default;
        }

    }

如果是建立类似xmpp之类的双向ssl,可以参考客户端配置:

https://www.cnblogs.com/starcrm/p/9705276.html

TCP SSL

相关的nginx服务器反向代理设置为tcp结点,对xmpp的5222端口进行ssl反向代理。

tcp {
timeout 1d;
proxy_read_timeout 10d;
proxy_send_timeout 10d;
proxy_connect_timeout 30;
upstream nytalk_im {
server 11.8.130.166:5222;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 6001;
so_keepalive on;
proxy_pass nytalk_im;
tcp_nodelay on;
#ssl on;

ssl_certificate /usr/local/nginx/conf/cert/server.crt;
ssl_certificate_key /usr/local/nginx/conf/cert/server.key;
ssl_client_certificate /usr/local/nginx/conf/cert/ca.crt;

ssl_verify_client on;
ssl_session_cache shared:SSL2:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}

upstream nytalk_file {
server 11.8.130.167:80;
check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 6002;
so_keepalive on;
proxy_pass nytalk_file;
ssl on;

ssl_certificate /usr/local/nginx/conf/cert/server.crt;
ssl_certificate_key /usr/local/nginx/conf/cert/server.key;
ssl_client_certificate /usr/local/nginx/conf/cert/ca.crt;

ssl_verify_client on;
ssl_session_cache shared:SSL2:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}

upstream nytalk_ssl {
server 11.8.130.166:5223;
check interval=3000 rise=2 fall=5 timeout=1000;
}
点赞
收藏
评论区
推荐文章
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
皕杰报表之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年前
4. Nginx模块
Nginx官方模块1.ngx\_http\_stub\_status\_modulehttp://nginx.org/en/docs/http/ngx\_http\_stub\_status\_module.html。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
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
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之前把这