前段时间,团队开放了组件库演示环境,由于存在一些小伙伴在外地办公(只能外网或者 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_basic
、auth_basic_user_file
作用域均为 http, server, location, limit_excep。
对于密码形式,其支持(具体可以查看参考链接 Nginx 相关模块信息):
crypt()
函数加密; 可以使用 Apache HTTP Server
发行版中的 “htpasswd” 实用程序或 “openssl passwd” 命令生成;这里使用 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 中的 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;
}
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;
}
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2704r1t8r6680