实际生产项目中,大多数时候我们会将后端的 http 接口通过前置 nginx 进行反向代理,对互联网用户提供服务。往往我们后端服务所能提供的接口服务是大于互联网用户侧的实际请求的接口地址数量的(例如后端服务一共有100个api接口,经过前置 nginx 对外提供的接口是给微信小程序使用的,而微信小程序中需要调用的实际接口只有40个)。鉴于此,从系统安全架构角度来讲,我们必须应该在前置的 Nginx 中,白名单限定对外提供服务的具体 http 接口 URI 地址。
本文以具体配置示例的方式,演示在 Nginx 中如何实现白名单 Uri 的拦截配置。
1、配置白名单 URI 配置文件
我们为了更好的管理白名单地址,所以讲配置白名单的配置文件独立出来,然后使用 nginx 的 include 导入。
我的配置文件 ./nginx/conf.d/map_whitelist_uri.conf
内容如下:
map $uri $allowed_uri {
default 0;
# 精确匹配(推荐尽可能使用精确匹配,这样利于管理)
/api/v1/cs/configs 1;
/exact/path1 1;
/exact/path2 1;
# 正则表达式匹配
~^/demo/.+\.(css|js|ttf|woff|woff2|svg|git|jpg|jpeg|png)$ 1;
~/regex/path/[0-9]+ 1;
~/another/regex.* 1;
# 更多的路径...
}
主配置文件 ./nginx/nginx.conf
中使用 include
导入扩展的配置文件,可以通配符导入,也可以精确导入。
http {
// 省略其他配置
// 导入conf.d中的所有配置,你可以导入具体的配置文件
include ./conf.d/*.conf;
}
2、使用白名单map配置
在 server
块的 location
块中配置条件拦截。
server {
// 省略其他配置
location / {
// 不在白名单URI中的,直接响应403结束
if ($allowed_uri = 0) {
return 403;
}
}
// 省略其他配置
}
(END)