欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Nginx 访问权限管理

程序员文章站 2024-03-19 13:39:46
...

前段时间,团队开放了组件库演示环境,由于存在一些小伙伴在外地办公(只能外网或者 vpn 到内网)。所以,为了安全考虑,设想是否可以通过 Nginx 做一些访问限制呢?当然,答案是肯定的。

诉求整理:

  • 内网:为了便利性,随意访问,不设限制;
  • 外网:通过指定的用户名和密码访问(当然,要求秘钥的保密性)。

增加认证

这个很简单,使用 Nginx 的 ngx_http_auth_basic_module 模块,即可完成。

ngx_http_auth_basic_module 模块允许通过使用“HTTP基本身份验证”协议验证用户名和密码来限制对资源的访问。

location / {
    auth_basic "请输入密码或联系IDSS-FE相关成员";			 # 提示
    auth_basic_user_file /usr/local/nginx/.passwd; # **文件
}

上述 auth_basicauth_basic_user_file 作用域均为 http, server, location, limit_excep

对于密码形式,其支持(具体可以查看参考链接 Nginx 相关模块信息):

  • crypt() 函数加密; 可以使用 Apache HTTP Server发行版中的 “htpasswd” 实用程序或 “openssl passwd” 命令生成;
  • 使用基于 MD5 的密码算法(apr1)的 Apache 变体进行散列;
  • RFC 2307 中描述的 “{scheme} data” 语法(1.0.3+)指定;

生成密码

这里使用 Apache 的 htpasswd 工具生成。

htpasswd - Manage user files for basic authentication

# [可选]安装 httpd-tools
$ yum install -y httpd-tools
# 生成**文件
$ htpasswd -c /usr/local/nginx/.passwd idss-fe
# 按提示输入密码、确认密码,即完成配置
  • - c 创建 passwd 文件。如果 passwdfile 已存在,则会重写并截断。此选项不能与 -n 选项组合使用。(具体可查看参考链接 Apach 相关文档)
  • idss-fe 为用户名,会添加到 .passwd 文件中

生成的内容,格式如下:

idss-fe:$apr111$d/Rw..nPddMiS...FSg0tho0

上述,整体处理完成,不要忘记 $ nginx -s reload

访问限制

只针对外网做限制。其中,这里实现的思路,是逆向的。外网的 IP,没办法穷举;但是我们部署的服务器,和我们自身的内网环境是属于同一个网段,我们放行该网段,同时禁止其他所有访问,也就达到了上述目的。

这里使用 Nginx 的核心模块 Module ngx_http_core_module 中的 satisfyngx_http_access_module 模块结合实现。

ngx_http_access_module模块允许限制对某些客户端地址的访问

location / {
    satisfy any;	# 下述 access 和 auth_basic 任意通过即可

    allow 192.168.1.0/32; # 只需求该网段,其他全部禁止
    deny  all;

    auth_basic "请输入密码或联系IDSS-FE相关成员";
    auth_basic_user_file /usr/local/nginx/.passwd;
}
  • satisfy all 全部或 satisfy any 下述任意一个 ngx_http_access_modulengx_http_auth_basic_modulengx_http_auth_request_modulengx_http_auth_jwt_module 模块允许访问,则允许访问。 作用域 http, server, location
  • allow 同时支持 IPv4/IPv6。allow 192.168.1.0/32; allow 2001:0db8::/32; 作用域 http, server, location, limit_except。(具体可查看参考链接 access module 相关文档)

附:完整配置

ocation / {
  satisfy any;
  
  allow 192.168.101.0/32;
  deny all;
  
  auth_basic "请输入密码或联系IDSS-FE相关成员";	
  auth_basic_user_file /usr/local/nginx/.passwd;
    
  root   /idss/demo-collection/dist;
  index  index.html index.htm;
  try_files $uri $uri/ /index.html;
}

参考地址