Nginx用户认证配置( Basic HTTP authentication)

nginx_http_auth_basic_module模块实现让访问着,只有输入正确的用户密码才允许访问web内容。

web上的一些内容不想被其他人知道,但是又想让部分人看到,nginx的http auth模块以及Apache http auth都是很好的解决方案。

默认情况下nginx已经安装了ngx_http_auth_basic_module模块,如果不需要这个模块,可以加上 --without-http_auth_basic_module 

nginx basic auth指令

语法:     auth_basic string | off;

默认值:     auth_basic off;

配置段:     http, server, location, limit_except

默认表示不开启认证,后面如果跟上字符,这些字符会在弹窗中显示。

语法:     auth_basic_user_file file;

默认值:     —

配置段:     http, server, location, limit_except

用户密码文件,文件内容类似如下:

user1:password1

user2:password2:comment

 

nginx认证配置实例

server{
      server_name www.mimvp.com, mimvp.com;
 
       index  index.html index.php;
       root   /data/site/www.ttlsa.com;      
 
       location/
       {
               auth_basic"nginx basic http test for mimvp.com";
               auth_basic_user_file  conf/htpasswd;
               autoindex on;
       }
}

备注:一定要注意 auth_basic_user_file 路径,否则会不厌其烦的出现403(禁止访问)

生成密码,可以使用htpasswd,或者使用openssl

# printf "user01:$(openssl passwd -crypt 123456)\n" >>conf/htpasswd
# cat conf/htpasswd
user01:xyJkVhXGAZ8tM

账号:user01

密码:123456

重启nginx使配置生效:

# /usr/local/nginx/sbin/nginx -s reload

效果如下:

 

 

HTTP使用BASIC认证的原理及实现方法

一、 BASIC认证概述

在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,当一个客户端向HTTP服务器进行数据请求时,如果客户端未被认证,则HTTP服务器将通过基本认证过程对客户端的用户名及密码进行验证,以决定用户是否合法。

客户端在接收到HTTP服务器的身份认证要求后,会提示用户输入用户名及密码,然后将用户名及密码以BASE64加密,加密后的密文将附加于请求信息中, 如当用户名为 user01,密码为:123456时,客户端将用户名和密码用“:”合并,并将合并后的字符串用BASE64加密为密文,并于每次请求数据时,将密文附加于请求头(Request Header)中。HTTP服务器在每次收到请求包后,根据协议取得客户端附加的用户信息(BASE64加密的用户名和密码),解开请求包,对用户名及密码进行验证,如果用户名及密码正确,则根据客户端请求,返回客户端所需要的数据;否则,返回错误代码或重新要求客户端提供用户名及密码。

 

二、BASIC认证的过程

1.客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证(即header中不带正确的Authorization字段),则客户端提供如下请求至服务器:

Get /index.html HTTP/1.0

Host:www.mimvp.com

2.服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:

HTTP/1.0 401 Unauthorised

Server: SokEvo/1.0

WWW-Authenticate: Basic realm="mimvp.com"

Content-Type: text/html

Content-Length: xxx

3.当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。

4.用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容(即在header中自动加入Authorization字段):

Get /index.html HTTP/1.0

Host:www.mimvp.com

Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

注:xxxx....表示加密后的用户名及密码。

5.服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端:

 

三、BASIC认证的缺点

HTTP基本认证的目标是提供简单的用户验证功能,其认证过程简单明了,适合于对安全性要求不高的系统或设备中,如大家所用路由器的配置页面的认证,几乎都采取了这种方式。

其缺点:

1)没有灵活可靠的认证策略,如无法提供域(domain或realm)认证功能,

2)BASE64的加密强度非常低,直接把header中的Authorization字段拿去base64解密即可,可以说仅能防止初级的搜索把它搜到了。

3)当然,HTTP基本认证系统也可以与SSL或者Kerberos结合,实现安全性能较高(相对)的认证系统

 

四、BASIC认证的JAVA实现代码

HttpSession session=request.getSession();
String user=(String)session.getAttribute("user");
String pass;

if(user==null) {
     try {
        response.setCharacterEncoding("GBK");
        PrintWriter ut=response.getWriter();
        String authorization=request.getHeader("authorization");
        if(authorization==null||authorization.equals("")){
            response.setStatus(401);
            response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
            out.print("对不起你没有权限!!");
            return;
        }

        String userAndPass=new String(new BASE64Decoder().decodeBuffer(authorization.split(" ")[1]));
        if(userAndPass.split(":").length<2){
            response.setStatus(401);
            response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
            out.print("对不起你没有权限!!");
            return;
        }

        user=userAndPass.split(":")[0];
        pass=userAndPass.split(":")[1];
        if(user.equals("111")&&pass.equals("111")){
            session.setAttribute("user",user);
            RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
            dispatcher.forward(request,response);
        }else{
            response.setStatus(401);
            response.setHeader("WWW-authenticate","Basic realm=\"请输入管理员密码\"");
            out.print("对不起你没有权限!!");
            return;
        }
     }catch(Exception ex){
        ex.printStackTrace();
     }
}else{
    RequestDispatcher dispatcher=request.getRequestDispatcher("index.jsp");
    dispatcher.forward(request,response);
}

 

 

Nginx 配置文件添加 http 授权

1、nginx.conf 配置文件内容


#user  nobody;
worker_processes  1;
 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
 
#pid        logs/nginx.pid;
 
events {
  worker_connections  1024;
}
 
 
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;
 
  sendfile        on;
  #tcp_nopush     on;
 
  #keepalive_timeout  0;
  keepalive_timeout  65;
 
  #gzip  on;
  upstream kibana{
    server xxxxx:xxxx weight=1;
  }
  server {
    listen 83;
    server_name localhost;
    location / {
      auth_basic "auth for kibana";
      auth_basic_user_file /etc/nginx/htpasswd;
      proxy_pass http://kibana;
    }
  }
}

 

2、使用openssl 生成密码

printf "admin:$(openssl passwd -crypt 123456)\n" >> ./htpasswd

 

3、拷贝用户名密码文件到/etc/nginx 下

cp ./htpasswd /etc/nginx/

 

4、刷新nginx配置

/usr/local/nginx/sbin/nginx -s reload

 

 

Nginx 简单用户鉴权

当使用nginx搭建web服务,需要限制访问,又没有构建用户系统的必要,可使用nginx进行简单配置

1、nginx.conf 配置文件

auth_basic 以及用户数据库

ocation / {
        ...    
        auth_basic "secret";
        auth_basic_user_file /etc/nginx/db/passwd.db;
        ...
    }

2、安装Http密码工具

centos # yum install httpd-tools

Ubuntu # sudo apt-get install apache2-utils

3、配置Nginx的密码库

1)先创建密码库目录

cd /etc/nginx/

mkdir db

2)创建用户及密码

htpasswd -c /etc/nginx/db/passwd.db usrname

根据提示,输入usrname用户的密码

4、重载nginx配置

/usr/local/nginx/sbin/nginx -s reload

 

 

参考推荐

认证(authentication)和授权(authorization)的几种方式总结

Nginx 反向代理和负载均衡部署

正向代理、反向代理、透明代理的图文详解

Nginx 反向代理及示例

nginx 反向代理转发邮件的配置

自建服务器解决外网访问内网的端口穿透映射

匿名、透明、HTTP、SSL、SOCKS代理的区别

拨号VPS 服务器商家列表汇总

TCP/IP 协议详解

TCP/IP 数据报格式

TCP/IP 协议头部结构体

X-Forwarded-For 和 X-Real-IP 的区别

IPv4 保留地址、私有地址、运营商级IP地址