Nginx 访问权限管理
閱讀本文約花費: 4 (分鐘)
前段时间,团队开放了组件库演示环境,由于存在一些小伙伴在外地办公(只能外网或者 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; # 密钥文件 } 1234
上述 auth_basic
、auth_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 # 按提示输入密码、确认密码,即完成配置 12345
- c
创建 passwd 文件。如果 passwdfile 已存在,则会重写并截断。此选项不能与 -n 选项组合使用。(具体可查看参考链接 Apach 相关文档)idss-fe
为用户名,会添加到.passwd
文件中
生成的内容,格式如下:
idss-fe:$apr111$d/Rw..nPddMiS...FSg0tho0 1
上述,整体处理完成,不要忘记 $ nginx -s reload
访问限制
只针对外网做限制。其中,这里实现的思路,是逆向的。外网的 IP,没办法穷举;但是我们部署的服务器,和我们自身的内网环境是属于同一个网段,我们放行该网段,同时禁止其他所有访问,也就达到了上述目的。
这里使用 Nginx 的核心模块 Module ngx_http_core_module 中的 satisfy 和 ngx_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; } 123456789
satisfy all
全部或satisfy any
下述任意一个ngx_http_access_module
,ngx_http_auth_basic_module
,ngx_http_auth_request_module
或ngx_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; } 12345678910111213