插件窝 干货文章 Nginx反向代理中基于用户认证的ACL配置

Nginx反向代理中基于用户认证的ACL配置

Nginx user 认证 htpasswd 734    来源:    2025-04-20

Nginx反向代理中基于用户认证的ACL配置

在Nginx反向代理中,可以通过用户认证结合访问控制列表(ACL)来实现更精细的访问控制。以下是详细的配置方法:

1. 基本HTTP认证配置

首先设置基本的HTTP认证:

server {
    listen 80;
    server_name example.com;

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 创建密码文件

使用htpasswd工具创建密码文件:

sudo htpasswd -c /etc/nginx/.htpasswd username1
sudo htpasswd /etc/nginx/.htpasswd username2

3. 基于用户名的ACL控制

方法1:使用map指令

map $remote_user $is_allowed {
    default 0;
    "username1" 1;
    "username2" 1;
    "admin" 2;  # 更高权限级别
}

server {
    # ... 其他配置

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        if ($is_allowed = 0) {
            return 403;
        }

        proxy_pass http://backend_server;
    }

    location /admin {
        if ($is_allowed != 2) {
            return 403;
        }
        proxy_pass http://backend_admin;
    }
}

方法2:使用geo模块

geo $allowed_user {
    default 0;
    "username1" 1;
    "username2" 1;
    "admin" 2;
}

server {
    # ... 其他配置

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        if ($allowed_user = 0) {
            return 403;
        }

        proxy_pass http://backend_server;
    }
}

4. 结合IP地址和用户认证的ACL

geo $valid_ip {
    default 0;
    192.168.1.0/24 1;
    10.0.0.0/8 1;
}

map "$valid_ip:$remote_user" $access_granted {
    default 0;
    "~^1:.+" 1;  # 允许来自信任IP的任何认证用户
    "~^0:admin" 1; # 允许admin用户从任何IP访问
}

server {
    # ... 其他配置

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        if ($access_granted = 0) {
            return 403;
        }

        proxy_pass http://backend_server;
    }
}

5. 使用变量和正则表达式的高级ACL

map $remote_user $user_group {
    default "guest";
    "~^admin" "admin";
    "~^dev_" "developer";
    "~^ops_" "operator";
}

server {
    # ... 其他配置

    location / {
        auth_basic "Restricted Area";
        auth_basic_user_file /etc/nginx/.htpasswd;

        if ($user_group = "guest") {
            return 403;
        }

        proxy_pass http://backend_server;
    }

    location /api {
        if ($user_group != "admin" && $user_group != "developer") {
            return 403;
        }
        proxy_pass http://backend_api;
    }
}

6. 使用Lua模块实现动态ACL(需要安装ngx_http_lua_module)

location / {
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    access_by_lua_block {
        local user = ngx.var.remote_user
        local path = ngx.var.uri

        -- 这里可以连接数据库或读取配置文件实现动态ACL
        if user == "admin" then
            return  -- 允许访问
        elseif path:match("^/admin") then
            ngx.exit(ngx.HTTP_FORBIDDEN)
        end
    }

    proxy_pass http://backend_server;
}

最佳实践建议

  1. 将认证和ACL逻辑放在单独的配置文件中,使用include指令引入
  2. 定期审计和更新密码文件
  3. 对于高安全需求,考虑使用证书认证替代基础认证
  4. 结合日志记录所有认证和访问控制事件
  5. 考虑使用Nginx Plus的商业版功能,如JWT认证和更精细的ACL控制

通过以上配置,您可以在Nginx反向代理中实现基于用户认证的精细访问控制。