为什么使用Basic Auth插件

Nginx使用Basic Auth插件的主要目的是提供一种简单而有效的身份验证机制,用于保护您的网站、应用程序或特定的目录免受未经授权的访问。

下面是一些使用Basic Auth插件的原因和优势:

  1. 简单实现:Basic Auth是一种基于HTTP标准的简单身份验证方法。Nginx的Basic Auth插件提供了一种轻量级、易于实施的方式来验证用户身份,而无需复杂的身份验证系统。

  2. 快速部署:使用Basic Auth插件,您可以快速地为您的网站或应用程序添加基本的用户认证功能。只需简单地配置Nginx并创建一个密码文件,就能够在几分钟内实现基本的身份验证。

  3. 兼容性:Basic Auth是一种广泛支持的身份验证方法,几乎所有的浏览器和HTTP客户端都支持它。这意味着您的用户可以使用各种设备和浏览器来进行身份验证,而无需额外的插件或特殊配置。

  4. 轻量级:Basic Auth插件对服务器资源的需求较低,不会对服务器的性能产生显著影响。这使得它非常适合在资源有限的环境中使用,或者需要快速实现基本身份验证的场景。

  5. 独立性:使用Basic Auth插件,您不需要依赖外部的身份验证系统或第三方服务。所有的用户凭据都存储在本地的密码文件中,您可以轻松地管理和控制访问权限。

尽管Basic Auth具有一些优点,但也存在一些限制。例如,它仅提供了基本的用户名和密码验证,没有额外的安全性措施,例如双因素身份验证、会话管理等。对于更高级的身份验证需求,可能需要考虑使用其他身份验证方法或基于插件的解决方案。

一般流程

在Nginx中,可以使用ngx_http_auth_basic_module模块来实现基本认证(Basic Auth)。该模块允许您通过用户名和密码对访问您的网站或某个特定的目录进行认证。

以下是使用Basic Auth插件的基本步骤:

  1. 启用ngx_http_auth_basic_module模块:首先,确认您的Nginx已经编译并启用了ngx_http_auth_basic_module模块。您可以通过运行nginx -V命令来查看编译配置,确保该模块已包含在列表中。

  2. 创建密码文件:使用Apache的htpasswd工具或类似的工具,创建一个密码文件,其中包含了经过加密的用户名和密码信息。每个用户名和密码需要存储在单独的行上。例如,创建一个名为passwords的密码文件,并将用户名和密码添加到文件中:

    username1:password1
    username2:password2
    

    注意:密码文件中的密码需要使用htpasswd等工具进行加密。

  3. 配置Nginx:编辑Nginx的配置文件,并在适当的位置添加以下代码块,配置Basic Auth:

    location / {
        auth_basic "Restricted Content";  # 设置Basic Auth的提示信息
        auth_basic_user_file /path/to/passwords;  # 指定密码文件的路径
        # 其他的配置指令...
    }
    

    在上述配置中,auth_basic指令用于设置用户在访问该区域时看到的提示信息,而auth_basic_user_file指令用于指定密码文件的路径。

  4. 重新加载或重启Nginx:保存配置文件后,通过运行以下命令重新加载或重启Nginx,使配置生效:

    nginx -s reload  # 重新加载配置
    # 或
    service nginx restart  # 重启Nginx
    

现在,当用户访问配置了Basic Auth的区域时,Nginx将提示用户输入用户名和密码。只有提供正确的凭据才能访问受保护的内容。

实战

使用htpasswd生成账号和密码

htpasswd -bc htpasswd admin admin

# htpasswd 文件名称
# 账号:admin 
# 密码:admin

修改/etc/nginx/nginx.conf配置文件

# nginx.conf
user  nginx;
worker_processes  auto;

error_log  /etc/nginx/logs/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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  /etc/nginx/logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;

    #gzip  on;

    # include /etc/nginx/conf.d/*.conf;
    server { 
        location / {
            auth_basic           "closed site"; # 启动basic auth
            auth_basic_user_file /etc/nginx/conf/htpasswd; # 密码文件
        }
    }
}

启动测试Demo

docker run \
    --name nginx \
    -p 80:80 \
    -d \
    -v ${PWD}/conf/nginx.conf:/etc/nginx/nginx.conf \
    -v ${PWD}/logs:/etc/nginx/logs \
    -v ${PWD}/conf/htpasswd:/etc/nginx/conf/htpasswd \
    demo:v1

访问http://localhost:80,这时必须需要输入密码才能继续访问

参考链接