之前在爆Zabbix漏洞的时候,在未进行漏洞升级修复的情况下,可以先对nginx的web入口加一个认证,这样就能很大程度上降低被黑的风险。同理在使用Nginx代理一些服务的时候,也可以用这种方法进行安全上的加固。做起来比较简单,却行之有效。Nginx上一般使用的认证方式有2种,分别是auth_basic(本机认证)及ngx_http_auth_request_module(第三方认证)

auth_basic(本机认证)配置

  • 如给web服务设置代理nginx配置文件如下
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    server {
            listen       7777;
            server_name  127.0.0.1;
            auth_basic "test-web";
            auth_basic_user_file /usr/local/nginx/testweb.db;
            location / {
                       proxy_pass http://11.11.11.5:80;
                       proxy_set_header Host $host:$server_port;
                       proxy_set_header X-Real-IP $remote_addr;
                       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                       proxy_redirect off;
              }       #charset koi8-r;
    }
    
  • 创建登录密码文件
    1
    2
    
    #可以使用htpasswd,或者使用openssl
     printf "taiyouxi:$(openssl passwd -crypt YourPassword)\n" >/usr/local/nginx/testweb.db
    
  • 设置说明:

开启认证– 默认值: auth_basic off; 语法: auth_basic string | off; 如使用auth_basic “test-web”;会在弹窗上显示test-web的字样 –密码文件说明– 语法: auth_basic_user_file file; 配置段: http, server, location, limit_except

ngx_http_auth_request_module(第三方认证)配置

由于这个模块并不属于内置模块,默认使用yum安装是不会带这个模块的,可以下载源码重新带上这个模块编译安装。

  • 原yum默认编译参数查看
1
2
[root@ip-10-222-0-85 nginx]# nginx -V
#结果太多不贴了,就是没有所需的这个模块,所以就再编一个测试
  • 先源码安装nginx
    1
    2
    3
    4
    5
    6
    7
    8
    
    yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
    wget http://nginx.org/download/nginx-1.10.3.tar.gz
    tar xvf  nginx-1.10.3.tar.gz
    git clone git://github.com/perusio/nginx-auth-request-module.git
    cd nginx-1.10.3
    ./configure --prefix=/usr/local/nginx --add-module=../nginx-auth-request-module
    make
    make install
    
  • 测试代码
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    server {
            listen       20010;
            server_name  127.0.0.1;
            location / {
                auth_request /auth;
                proxy_pass http://127.0.0.1:80;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_redirect off;
                #charset koi8-r;
            }
            location = /auth {
                proxy_pass http://127.0.0.1:80/passwd/HttpBasicAuthenticate.php;
                proxy_pass_request_body off;
                proxy_set_header Content-Length "";
                proxy_set_header X-Original-URI $request_uri;
            }
    }
    
  • php认证代码
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    #vim html/passwd/HttpBasicAuthenticate.php
    <?php
    
    if(isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])){
        $username = $_SERVER['PHP_AUTH_USER'];
        $password = $_SERVER['PHP_AUTH_PW'];
    
        if ($username == 'wang' && $password == '123456'){
            return true;
        }
    }
    
    header('WWW-Authenticate: Basic realm="Git Server"');
    header('HTTP/1.0 401 Unauthorized');
    
    ?>
    
  • 说明

用户访问server 弹出框中输入的用户名、密码保存在 $_SERVER 变量中 中间 if 段,只做演示用实际中应该是拿用户输入的用户名、密码跟数据库中的数据做比较 参考:http://www.cnblogs.com/wangxiaoqiangs/p/6184181.html