Nginx 访问权限管理

前段时间,团队开放了组件库演示环境,由于存在一些小伙伴在外地办公(只能外网或者 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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券