1.飞网Nginx网络认证扩展连接器
这是一个使用飞网身份验证和 NGINX 作为反向代理的工具。它可以帮助已经在内部的NGINX服务器上托管大量服务的用户并将这些服务地址指向NGINX服务器的飞网IP,然后无缝使用飞网进行无密码身份验证。通过该“连接器”访问Nginx代理的业务系统时,用户无需登录即可访问授权页面(即:无密码身份验证);如果应用系统需要对不同访问用户提供个性化的展示内容时,可以直接提取请求HTTP报文头中相应字段获取用户标识,无需关心上下文,无需使用Seesion,Cookie或JWT等,该用户标识通过网络层飞网连接器安全赋值,用户无法覆盖或篡改。
![](/assets/nginx-auth-21711e20.png)
仅需简单的配置,无需二次开发,即可实现下面的效果:
1.1 未通过“连接器”允许的网络访问Nginx提示“需要授权”
![](/assets/without-gmzta-nginx-connector-b0090ba8.png)
1.2 通过“连接器”允许的网络访问Nginx可以正常访问,并获取到用户的身份信息
注:这里仅是Nginx代理应用的一个示例,该示例仅将请求的HTTP报文头直接返回给浏览器。您可以看到请求HTTP报文头中的用户标识信息。您可以基于此开发或改造现有的应用系统,以最小化的开发成本为您的应用附带网络层的安全保障。
![](/assets/with-gmzta-nginx-connector-4df45695.png)
Header | 示例值 | 描述 |
---|---|---|
X-Webauth-Gmztalogin | llbef1 | 连接此设备的登录名称 |
X-Webauth-Gmztaname | ll | 连接此设备的设备名 |
X-Webauth-Gmztanet | llbef1.weixin.gmzta.com | 连接此设备的网络名称 |
X-Webauth-Gmztauser | llbef1 | 连接此设备的飞网用户名(可能由user@host组成) |
2.下载、安装“飞网Nginx网络认证扩展连接器”
注:需要在安装飞网后使用
根据您的操作系统类型和CPU架构选择并安装飞网Nginx网络认证扩展连接程序文件:
wget -N https://pkgs.gmzta.com/deb/gmzta-nginx-connector-amd64.deb
sudo apt install ./gmzta-nginx-connector-amd64.deb
wget -N https://pkgs.gmzta.com/rpm/gmzta-nginx-connector-amd64.rpm
sudo yum install ./gmzta-nginx-connector-amd64.rpm
3.配置Nginx,开启无密码身份验证
注:若未安装Nginx,请自行安装Nginx。
3.1 修改nginx配置文件
vi /etc/nginx/nginx.conf
location /auth {
internal; # 内部定位,只能被Nginx内部请求访问
proxy_pass http://unix:/run/gmzta.nginx-connector.sock; # 代理到飞网Nginx网络认证扩展连接器
proxy_pass_request_body off; # 关闭请求主体的代理
# 设置代理请求头,传递一些关键信息给认证服务器
proxy_set_header Host $http_host;
proxy_set_header Remote-Addr $remote_addr;
proxy_set_header Remote-Port $remote_port;
proxy_set_header Original-URI $request_uri;
}
location / {
satisfy any; # 允许任何满足下面条件的请求通过
allow 172.19.0.0/16; # 允许指定IP范围的请求通过 可选
deny all; # 其他请求拒绝访问
auth_request /auth; # 使用认证请求/auth进行身份验证
# 使用认证请求/auth进行身份验证
auth_request_set $auth_user $upstream_http_gmzta_user;
auth_request_set $auth_name $upstream_http_gmzta_name;
auth_request_set $auth_login $upstream_http_gmzta_login;
auth_request_set $auth_gmztanet $upstream_http_gmzta_gmztanet;
auth_request_set $auth_profile_picture $upstream_http_gmzta_profile_picture;
# 将认证信息设置为HTTP头,以便应用系统使用
proxy_set_header X-Webauth-GmztaUser "$auth_user";
proxy_set_header X-Webauth-GmztaName "$auth_name";
proxy_set_header X-Webauth-GmztaLogin "$auth_login";
proxy_set_header X-Webauth-GmztaNet "$auth_gmztanet";
proxy_set_header X-Webauth-Gmzta-Profile-Picture "$auth_profile_picture";
proxy_pass http://localhost:3002; # 代理到本地应用系统
}
上述配置使用了Nginx的一个特性:基于子请求结果的身份认证。Nginx和Nginx Plus可以通过外部服务器或外部服务对网站的每个请求进行身份验证。为了执行身份验证,NGINX向外部服务器发出一个HTTP子请求,并在那里对该子请求进行身份验证。如果子请求返回一个2xx响应代码,表示身份验证成功则允许继续访问;如果子请求返回401或者403,表示身份验证失败则拒绝访问。这种类型的身份验证可以实现各种身份验证方案,例如多因素身份验证,或者实现LDAP或OAuth身份验证。
更多资料访问:https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-subrequest-authentication/
3.2 重启nginx
nginx -s reload
3.3 开启gmzta-nginx-connector
// 开启服务
systemctl start gmzta.nginx-connector.socket
systemctl start gmzta.nginx-connector.service
// 配置开机自启
systemctl enable gmzta.nginx-connector.socket
systemctl enable gmzta.nginx-connector.service
- gmzta.nginx-connector使用systemd套接字激活(socket activation),systemd套接字激活可以使服务按需启动,好处是可以节约资源,提高可靠性,且对客户端透明,在不丢失连接的情况下支持自动重启。
- 完成上述操作即可快速开启“飞网Nginx网络认证扩展连接器”。
- 具体效果请参考:“提取网络层身份信息”