感觉不妥

导航

 

本人操作环境为CentOS7虚拟机,初期是nginx+php7.3,若查看php7.3的安装及配置请前往另一篇:

不会的记得查看官方文档,好东西要用起来;

Nginx官方文档地址:https://docs.nginx.com (NGINX是开源版,NGINX Plus是商业版,文档都在一起的,通用)

Nginx官方下载地址:http://nginx.org/en/download.html (开源,社区版)

Mainline version:主线新版,不建议使用;

Stable version:稳定版本,建议使用;

Legacy versions:旧版本,有需求使用;

 

文档内容:

  --->nginx安装(yum安装 + 编译安装)

    |--->yum安装

    |--->编译安装(版本根据需要)

  --->nginx配置文件

    |--->1、添加 REQUEST_ID

  --->nginx日志滚动(轮滚)

  --->nginx相关安全配置(安全漏洞修复)

    |--->1、对站点下目录进行访问限制(例如禁止访问 .git 和 .svn 目录)

    |--->2、启用了TLS1.0,不被视为 PCI 数据安全标准,需要升级TLS版本(升级openssl)

    |--->3、远程主机支持具有弱或不安全特性的 TLS/SSL 密码套件

    |--->4、TLS/SSL Sweet32 攻击

    |--->5、host主机头攻击

    |--->6、配置WS/WSS(WebSocket或Web Socket Secure)

    |--->7、设置HttpOnly Secure SameSite 以解决 Cookie 跨域丢失问题

    |--->8、配置X-Frame-Options响应头信息

 

Nginx安装

 

1.yum安装

一种及其简单的方式是:

[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y nginx

当然,他不能选择版本,只是图方便;

 

官方的yum安装方法:http://nginx.org/en/linux_packages.html#RHEL-CentOS

[root@localhost ~]# yum install -y yum-utils

    ##添加yum源配置
[root@localhost ~]# vi /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

    ##如果要使用主线最新版,默认当前稳定版不需要执行该软命令
[root@localhost ~]# yum-config-manager --enable nginx-mainline

    ##安装
[root@localhost ~]# yum install -y nginx

    ##不执行上一条语句,我们安装的是1.18.0,是目前最新的稳定版,若执行上一条去获取主线最新版,则为1.19.8版本
[root@localhost ~]# nginx -V
nginx version: nginx/1.18.0

 

 

2.编译安装(版本根据需要)

官网tar包下载,当前的稳定版为 nginx-1.18.0 (http://nginx.org/download/nginx-1.18.0.tar.gz)

其次我们需要支持正则表达式,下载pcre,地址:https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz

    ##这是我下载的安装,pcre下的8.44,没有去下载pcre2;
    ##nginx是当前的稳定版本 1.18.0;
[root@localhost ~]# ls -lh *gz
-rw-r--r-- 1 root root 1016K Mar 27 18:39 nginx-1.18.0.tar.gz
-rw-r--r-- 1 root root  2.0M Mar 27 18:39 pcre-8.44.tar.gz

    ##下载安装相关的依赖软件
[root@localhost ~]# yum install -y pcre-devel openssl openssl-devel \
> zlib zlib-devel gcc gcc-c++ glibc glibc-devel nasm pkgconfig expat-devel \
> gettext-devel libtool perl-Digest-SHA1.x86_64 make cmake ruby ##创建nginx组和用户,用户为系统用户,不登录 [root@localhost ~]# groupadd -g 80 nginx [root@localhost ~]# useradd -u 80 -g 80 -s /sbin/nologin nginx ##编译安装pcre [root@localhost ~]# tar xvf pcre-8.44.tar.gz [root@localhost ~]# cd pcre-8.44 [root@localhost pcre-8.44]# ./configure && make && make install ##解压 [root@localhost ~]# tar xvf nginx-1.18.0.tar.gz ##修改Nginx Banner头部信息,并不用去掉"#" [root@localhost ~]# vi /root/nginx-1.18.0/src/core/nginx.h #define nginx_version 0000000 #define NGINX_VERSION "0.0.0" #define NGINX_VER "Web/" NGINX_VERSION ##编译nginx,注意 "--prefix=" 的路径根据实际情况定义,不过当你需要的时候再次编译安装也可以,重新编译安装只变更程序的文件,配置文件不会变动,但是以防万一,提前备份下之前配置好的配置文件 [root@localhost ~]# cd nginx-1.18.0 [root@localhost nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
> --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_sub_module \
> --with-http_gzip_static_module --with-http_realip_module --with-stream
[root@localhost nginx
-1.18.0]# make && make install ##启动nginx服务 [root@localhost ~]# /usr/local/nginx/sbin/nginx [root@localhost ~]# lsof -i :80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 10315 root 6u IPv4 51081 0t0 TCP *:http (LISTEN) nginx 10316 nginx 6u IPv4 51081 0t0 TCP *:http (LISTEN) ##访问以下,看下之前我们修改的Nginx Banner信息 [root@localhost ~]# curl -I 192.168.1.10 HTTP/1.1 200 OK Server: Web/0.0.0 Date: Sat, 27 Mar 2021 11:02:48 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Sat, 27 Mar 2021 11:01:02 GMT Connection: keep-alive ETag: "605f106e-264" Accept-Ranges: bytes

 

  

--返回目录--


 

 

Nginx配置文件

--返回目录--

 

配置文件是nginx的重点,服务的相关设置几乎全都是由配置文件定义的;

 

配置文件结构:

  全局:该模块的配置是对于nginx服务全局生效的,于配置文件最上面几行进行配置;
  events:nginx事件模块的配置,主要配置工作模式以及网络连接;
  http:可包含多个server模块;
  upstream:配置负载均衡相关;
  server:虚拟主机配置,可包含多个location模块;
  location:配置对页面的请求处理;

 

... ...
events {
    ... ...
}
http {
    ... ...
    upstream ... ...{
        ... ...
    }
    upstream ... ...{
        ... ...
    }
    server {
        ... ...
        location ... ... {
            ... ...
        }
    }
    server {
        ... ...
        location ... ... {
            ... ...
        }
        location ... ... {
            ... ...
        }
    }
}

 

 

 

当有更多需要的时候,可以前往官网:http://nginx.org/en/docs/   页面下方的 Modules reference 模块参考,有nginx全面的参数详解;

文档格式基本是下面这样的:

Syntax(使用语法): client_body_timeout time;
Default(默认值):
client_body_timeout 60s;
Context(作用域,语境): httpserverlocation

 Defines a timeout for reading client request body. The timeout ......(相关的用法及解释)

 

 

这里我改的一个模板,并注上相应的解释,是我当前对应PHP的一些设置;

黑色的是已经开启的设置,灰色是注释和一些没有开启的设置,还有很多配置没有写上,比如很多的优化,这个是基本保持运行,优化针对实际情况调整;

配置文件的整体,个人认为重点还是厘清 全局、http、server、location 之间的关系;掌握整体配置文件每个模块的作用和相互关系,再结合官方文档去填写调整配置选项;

    ##全局配置模块
#user  nobody;                          ##指定运行nginx的用户,一般都时默认的,或者是nginx
worker_processes  8;                    ##给nginx分配线程的数量,值要 <= 本机CPU的线程数
#worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;      ##为每个线程分配CPU
worker_rlimit_nofile 65535;             ##worker进程最大打开文件数
error_log  logs/error.log;              ##错误日志的路径,可以是绝对路路径,也可以相对路径,相对于nginx的根目录
#error_log  logs/error.log  notice;     ##错误日志级别,级别有[debug | info | notice | warn | error | crit | alert | emerg],设置的级别会包含本身及之上级别的日志信息
#pid        logs/nginx.pid;             ##进程号文件位置

    ##事件模块
events {
    use epoll;                          ##使用epoll的I/O多路复用模型,Linux用该选项
    worker_connections  10240;          ##每个线程处理的最大连接数
    multi_accept on;                    ##收到一个新连接通知后接受尽可能多的连接
}

    ##HTTP配置模块
http {
    include       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  logs/access.log  main;        ##访问日志的路径及格式,上面的log_format是其默认的格式,可以修改自己定义

    sendfile        on;                 ##高效文件传输模式
    #tcp_nopush     on;                 ##防止网络阻塞
    keepalive_timeout  300;             ##长连接的超时时间,单位为秒

    gzip on;                            ##开启传输压缩
    gzip_min_length 1k;                 ##允许压缩的页面最小字节数,若设置为0是所有页面都压缩,小于1k的时候会有负面影响
    gzip_buffers 4 16k;                 ##系统获取指定单位倍数的缓存用于gzip的压缩结果数据流,此设置含义为以16k为单位,4倍的值申请内存
    #gzip_http_version 1.0;             ##识别的http的协议版本,默认即可
    gzip_comp_level 2;                  ##gzip的压缩等级,1压缩率最小处理最快,9压缩率最大处理最慢
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;         ##压缩的类型,匹配MIME类型进行压缩
    #gzip_proxied off;                  ##设置后端服务器返回结果,默认关闭即可
    gzip_vary on;                       ##根据客户端的HTTP头信息判断是否需要压缩,适用于代理服务器使用
    gzip_disable "MSIE [1-6]\.";        ##设置IE6及以下版本浏览器禁用gzip功能,其他浏览器正常启用
    fastcgi_intercept_errors on;        ##是否传递4xx和5xx的错误信息到客户端,或使用error_page处理错误信息,必须明确的在error_page中指定处理方法才能生效
    server_names_hash_max_size 512;     ##设置服务器名称哈希表的最大大小
    server_names_hash_bucket_size 128;  ##设置服务器名称哈希表的存储桶大小

        ##虚拟主机配置
    server {
        listen 80;                     ##监听端口
        server_name  localhost;        ##访问域名
        access_log  /usr/local/nginx/logs/80_access.log;       ##指定此虚拟主机access日志的路径
        error_log   /usr/local/nginx/logs/80_error.log;        ##指定此虚拟主机error日志的路径
        return 403;                    ##返回的403,这里设置是访问默认的80端口会返回403页面
        charset koi8-r;                ##支持的字符集

        #access_log  logs/host.access.log  main;
        #error_page  404 403 500 502 503 504  /404.html;
        #location = /404.html {
        #root   /home/www-data/error/;
        #}

            ##定义此虚拟主机的根路径
        location / {
            ##nginx跨域设置,响应数据时告诉浏览器的头信息
            add_header 'Access-Control-Allow-Origin' '*';
            add_header 'Access-Control-Allow-Credentials' 'true';
            add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Requested-With';
            add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
            root   html;                              ##使用根目录的位置,相对于nginx安装根目录
            include /usr/local/nginx/proxy.conf;      ##该虚拟主机引用的其他配置文件,若时相对路径,是相对于nginx.conf的位置
            index  index.php index.html index.htm;
            client_max_body_size  50m;                ##客户端上传文件大小限制
        }

        #error_page  404              /404.html;      ##设置指定错误消息返回的URL页面

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;      ##设置指定错误消息返回的URL页面
        location = /50x.html {                        ##改location是设置50x.html的路径位置
            root   html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~* \.php$ {
            root            /test/dir1/;          ##指定php的根目录
            fastcgi_pass    127.0.0.1:9000;       ##代理fastcgi,php-fpm的默认端口是9000
            fastcgi_index   index.php;            ##fastcgi的索引页
            client_max_body_size  50m;
            include         fastcgi_params;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;          ##反向代理,使用proxy_set_header,通过X-Forwarded-For获得用户IP
            fastcgi_param   SCRIPT_FILENAME    /test/dir1$fastcgi_script_name;    ##脚本文件请求的路径
            fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;              ##脚本名称
            if ($fastcgi_script_name ~ \..*\/.*php){          ##防止恶意脚本传递给后端php解析,匹配到的请求返回403
                return 403;
            }
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {        ##匹配目录下指定的文件,开放或关闭对其的访问
        #    deny  all;            ##全部拒绝,也可以指定IP或者网段,allow是指定允许访问,设置规则和deny一样
        #}
    }

        ##虚拟主机ssl配置
    server {
        listen    443 ssl;                         ##开放监听端口,并开启ssl,即https
        server_name  www.443.com;
        access_log  /usr/local/nginx/logs/443_access.log;
        error_log   /usr/local/nginx/logs/443_error.log;
        root /test/dir2;
        ssl_certificate      /usr/local/nginx/conf/cert/filename.pem;    ##ssl证书pem文件的位置
        ssl_certificate_key  /usr/local/nginx/conf/cert/filename.key;    ##ssl证书key文件的位置
        ssl_session_cache    shared:SSL:1m;      ##设置存储session参数的缓存类型和大小
        ssl_session_timeout 5m;                  ##设置session重用会话缓存中ssl参数的过期时间
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;     ##使用的加密套件
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;     ##启用加密协议
        ssl_prefer_server_ciphers on;            ##设置协商加密算法时,优先使用服务端的加密套件
        location / {
            index  index.php index.html index.htm;
            try_files $uri $uri/ /index.php?$query_string;    ##重定向,支持CodeIgniter框架
        }
        
        location ~ \.php(.*)$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME /test/dir2/$fastcgi_script_name;
            fastcgi_split_path_info ^(.+\.php)(.*)$;          ##通过fastcgi_split_path_info来获取PATH_INFO的值
            fastcgi_param  PATH_INFO $fastcgi_path_info;      ##上面获取的值自动重新赋值给$fastcgi_path_info变量
            client_max_body_size  50m;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            include fastcgi_params;
        }
        location ~* \.(png|jpeg|jpg|bmp|gif|ico|js|css|scss){    ##静态文件读取硬盘,可以解决反向代理后静态资源无法加载的问题
            expires 3d;       ##资源缓存过期时间
        }
    }
    
        ##设置访问http强制跳转https
    server {
       listen 80;                                   ##对监听端口为80的 ↓
       server_name www.443.com;                     ##域名为www.443.com的 ↓
       rewrite ^(.*)$  https://$host$1 permanent;   ##http请求,重定向到https
    }

}

 

 

------------------------------------------------------------------------------------------------------------------------

 

1、添加 REQUEST_ID

  这里添加 REQUEST_ID 的目的十为了关联 nginx的请求,PHP日志以及SQL请求的日志,因为没有 REQUEST_ID 的时候分不清楚哪个请求和SQL是关联的,在查找日志的时候不能明确状况;

    ##主要涉及到一下两个配置文件
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# ls -l {nginx.conf,fastcgi_params}
-rw-r--r-- 1 root root 1054 Sep  5 22:20 fastcgi_params
-rw-r--r-- 1 root root 8622 Sep 13 17:04 nginx.conf
    ##在 fastcgi_params 配置文件中添加下面一行配置
[root@localhost conf]# vim fastcgi_params
    ... ...
fastcgi_param  HTTP_REQUEST_ID    $request_id
    ... ...
    ... ...


    ##在配置文件 nginx.conf 中 server虚拟主机模块中的 location添加配置
[root@localhost conf]# vim nginx.conf
    ... ...
http {
    ... ...
    ##日志格式要添加上 $http_x_forwarded_for - $request_id ,否则日志中不记录
    log_format  main  '$http_x_forwarded_for - $request_id $remote_addr - $remote_user [$time_local] "$request" '
    ... ...
    ... ...
    ##在要记录 request_id 的虚拟主机模块的 location 中添加
    server {
        ... ...
        location / {
            fastcgi_param   REQUEST_ID      $request_id;
            index  index.php index.html index.htm;
            ... ...
        }
    }
}

之后记得 /usr/local/sbin/nginx -t && /usr/loca/sbin/nginx -s reload 重载下配置文件;

 

 

--返回目录--


 

 

Nginx日志滚动(轮滚)

--返回目录--

 

如果你是yum安装,那么你就直接拥有一个日志滚动文件 /etc/logrotate.d/nginx ,但若是编译安装,就需要自己动手了;

不会写的话没问题,我们可以从测试的虚拟机中yum安装一个nginx,然后把现成的滚动文件拿过来,再进行修改;

[root@localhost ~]# vi /etc/logrotate.d/nginx
    ##日志位置,这是默认的yum安装路径,我们可以根据自己的配置文件来定义日志的路径
/var/log/nginx/*.log {
        daily                    ##日志滚动的周期,每天,选项还有weekly,monthly,yearly
        size 100M                ##日志超过指定大小时切换,单位K,M,G,优先级高于daily
        dateext                  ##日志文件切换以日期形式后缀命名
        dateformat -%Y-%m-%d     ##切换后的日志文件格式,可以不写,使用默认的
        missingok                ##如果日志文件丢了,也不进行报错,继续切换
        rotate 52                ##保存日志的滚动次数,超过时间进行删除,这里我们按照每天滚动,这么设置就是52天
        compress                 ##切换日志后压缩,另一个选项是nocompress,不进行压缩
        delaycompress            ##切换日志时对上次的日志文件进行压缩
        notifempty               ##日志为空时不进行切换,默认为ifempty
        create 640 nginx nginx   ##创建新日志文件的权限和用户
        sharedscripts            ##所有的文件切割之后只执行一次下面脚本
        postrotate
                ##下面nginx.pid的实际位置根据实际情况修改
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

 

正常情况下无需进行crontab定时任务配置,因为logrotate系统已经是设置好的;

之后我们可以尝试着,手动进行一次,看看是否可用:

[root@localhost ~]# cd /usr/local/nginx/logs/
[root@localhost logs]# ls
access.log  error.log  nginx.pid
[root@localhost logs]# /usr/sbin/logrotate /etc/logrotate.conf --force
[root@localhost logs]# ls
access.log  access.log-20210327  error.log  error.log-20210327  nginx.pid

 

--返回目录--


 

 

 

Nginx相关安全配置(安全漏洞修复)

--返回目录--

 

1、对站点下目录进行访问控制(例如禁止访问 .git 和 .svn 目录)

  该漏洞会造成网站下各个没有设置访问限制的目录及文件被下载,由于根目录下有代码管理工具,存在 git 和 svn 的信息泄露导致网站源码全部被下载,所以要对目录进行访问控制;

  方法是在 nginx.conf 中配置相关的路径权限;

    ##例如我们禁止所有隐藏目录的访问
    ##若不进行设置,目录被扫描后,访问指定文件,浏览器会下载该文件
    ##设置后 -s reload 重载配置文件,再次访问改目录,返回403
location ~ (/\.) {
    deny all;
}

 

------------------------------------------------------------------------------------------------------------------------

 

2、启用了TLS1.0,不被视为 PCI 数据安全标准,需要升级TLS版本(升级openssl)

  需要升级openssl并重新编译nginx,当然,若你是新安装Nginx,可以在安装前就处理掉这个问题;

  前往至我的另一篇随笔:升级openssl并重新编译Nginx - 感觉不妥 - 博客园 (cnblogs.com)

 

------------------------------------------------------------------------------------------------------------------------

 

3、远程主机支持具有弱或不安全特性的 TLS/SSL 密码套件

  处理该漏洞,我的是已经完成第2项的openssl升级,以支持TLS1.2和TLS1.3,因为我把所有密码套件都换成这两个版本所支持的;

  主要是对 nginx.conf 中的 ssl_ciphers 配置项进行调整

  首先完成:

    2、启用了TLS1.0,不被视为 PCI 数据安全标准,需要升级TLS版本(升级openssl)

    ##查看当前openssl所支持的所有密码套件
[root@kafka-test ~]# openssl ciphers -V | column -t
0x13,0x02  -  TLS_AES_256_GCM_SHA384         TLSv1.3  Kx=any       Au=any    Enc=AESGCM(256)             Mac=AEAD
0x13,0x03  -  TLS_CHACHA20_POLY1305_SHA256   TLSv1.3  Kx=any       Au=any    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0x13,0x01  -  TLS_AES_128_GCM_SHA256         TLSv1.3  Kx=any       Au=any    Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2C  -  ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2  Kx=ECDH      Au=ECDSA  Enc=AESGCM(256)             Mac=AEAD
0xC0,0x30  -  ECDHE-RSA-AES256-GCM-SHA384    TLSv1.2  Kx=ECDH      Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0x00,0x9F  -  DHE-RSA-AES256-GCM-SHA384      TLSv1.2  Kx=DH        Au=RSA    Enc=AESGCM(256)             Mac=AEAD
0xCC,0xA9  -  ECDHE-ECDSA-CHACHA20-POLY1305  TLSv1.2  Kx=ECDH      Au=ECDSA  Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xCC,0xA8  -  ECDHE-RSA-CHACHA20-POLY1305    TLSv1.2  Kx=ECDH      Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xCC,0xAA  -  DHE-RSA-CHACHA20-POLY1305      TLSv1.2  Kx=DH        Au=RSA    Enc=CHACHA20/POLY1305(256)  Mac=AEAD
0xC0,0x2B  -  ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2  Kx=ECDH      Au=ECDSA  Enc=AESGCM(128)             Mac=AEAD
0xC0,0x2F  -  ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2  Kx=ECDH      Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0x00,0x9E  -  DHE-RSA-AES128-GCM-SHA256      TLSv1.2  Kx=DH        Au=RSA    Enc=AESGCM(128)             Mac=AEAD
0xC0,0x24  -  ECDHE-ECDSA-AES256-SHA384      TLSv1.2  Kx=ECDH      Au=ECDSA  Enc=AES(256)                Mac=SHA384
0xC0,0x28  -  ECDHE-RSA-AES256-SHA384        TLSv1.2  Kx=ECDH      Au=RSA    Enc=AES(256)                Mac=SHA384
0x00,0x6B  -  DHE-RSA-AES256-SHA256          TLSv1.2  Kx=DH        Au=RSA    Enc=AES(256)                Mac=SHA256
0xC0,0x23  -  ECDHE-ECDSA-AES128-SHA256      TLSv1.2  Kx=ECDH      Au=ECDSA  Enc=AES(128)                Mac=SHA256
0xC0,0x27  -  ECDHE-RSA-AES128-SHA256        TLSv1.2  Kx=ECDH      Au=RSA    Enc=AES(128)                Mac=SHA256
0x00,0x67  -  DHE-RSA-AES128-SHA256          TLSv1.2  Kx=DH        Au=RSA    Enc=AES(128)                Mac=SHA256
0xC0,0x0A  -  ECDHE-ECDSA-AES256-SHA         TLSv1    Kx=ECDH      Au=ECDSA  Enc=AES(256)                Mac=SHA1
0xC0,0x14  -  ECDHE-RSA-AES256-SHA           TLSv1    Kx=ECDH      Au=RSA    Enc=AES(256)                Mac=SHA1
    ... ...
    ... ...

    ##修改 nginx.conf 配置
[root@kafka-test ~]# vim /usr/local/nginx/conf/nginx.conf

... ...

    ##禁止低版本的TLS,仅启用1.2和1.3版本
ssl_protocols TLSv1.2 TLSv1.3;

... ...

    ##修改 ssl_ciphers ,来指定使用的密码套件
  ssl_ciphers TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:TLS_CHACHA20_POLY
1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA
384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY13
05:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA25

6:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA
-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE:AES:HIGH:!aNULL:!e
NULL:!EXPORT:!DES:!MD5:!PSK:!RC4;

 

 

------------------------------------------------------------------------------------------------------------------------

 

4、TLS/SSL Sweet32 攻击

  在修复上面第2、3项后,该漏洞也随之修复;

  完成:

    2、启用了TLS1.0,不被视为 PCI 数据安全标准,需要升级TLS版本(升级openssl)

    3、远程主机支持具有弱或不安全特性的 TLS/SSL 密码套件

 

 

------------------------------------------------------------------------------------------------------------------------

 

5、host主机头攻击

  修改 nginx.conf 中 server_name 的配置;

    ## 80 端口设置
[root@kafka-test ~]# vim /usr/local/nginx/conf/nginx.conf
    ... ...
    ... ...
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 403;
    ... ...
    ... ...

    ## 443 端口设置
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    server_name _;
    ssl_certificate ***.pem;
    ssl_certificate_key ***.key;
    return 403;
    ... ...
    ... ...
server { listen 443 ssl; server_name www.web1.com; ssl_certificate ***.pem; ssl_certificate_key ***.key; ... ... ... ...

 

 

------------------------------------------------------------------------------------------------------------------------

 

6、配置WS/WSS(WebSocket或Web Socket Secure)

  该项配置在 location 模块中:

location / {
    #如果是指定的目录请修改 / 路径
    #这里的 proxy_pass 注释掉是本身我的这个目录是web页面,还需要访问
    #去掉注释,打开的话,访问改虚拟主机的地址会提示 WebSocket 相关,并不是配置的web页面
    #这里根据自己需求进行调整

    #proxy_pass https://172.17.0.10:7332;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    ... ...
    ... ...
            }

 

 

------------------------------------------------------------------------------------------------------------------------

 

7、设置HttpOnly Secure SameSite 以解决 Cookie 跨域丢失问题

  该项可配置在 http、server 和 location 模块中:

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cookie_path / "/; httponly; secure; SameSite=None";

 

 

------------------------------------------------------------------------------------------------------------------------

 

8、配置X-Frame-Options响应头信息

  需要在配置文件中添加 X-Frame-Options,在http、server、location均可进行配置;

  但不要重复配置,例如:在 http 中设置之后,又在 server 中进行设置,这样会出现2个信息;

  建议在 server 中进行设置;

#表示该页面不允许在frame中展示,全部禁用
add_header X-Frame-Options DENY

#表示该页面可以在相同域名页面的frame中展示,即相同域名下的页面均可
add_header X-Frame-Options SAMEORIGIN

#表示该页面可以在指定来源的frame中展示,即指定域名,其可以与 SAMEORIGIN 同时使用
add_header X-Frame-Options "ALLOW-FROM https://???.***.com";

 

 

------------------------------------------------------------------------------------------------------------------------

--返回目录--


 

posted on 2021-03-28 14:39  感觉不妥  阅读(481)  评论(0编辑  收藏  举报