Nginx 常见基础配置—获取client ip,访问控制(allow/deny,auth身份验证指令,LDAP服务)

获取请求的 IP地址

Nginx会将客户端的 IP地址信息存放在 $ remote_ addr变量中,但在生产环境下往往会有各种代理,让获取真实的 IP地址变得困难重重。

获取用户的真实 IP地址

大部分互联网公司的反向代理都会用到下图所示的 CDN加速代理流程图。用户的请求并不直接和 Nginx打交道,而是由 CDN( Content Delivery Network,即内容分发网络)或WAF 等其他网元设备 传递给 Nginx。所以在默认情况下, Nginx看到的客户端 IP地址是经过 CDN处理后的 IP地址,这对日志的记录和分析、后端服务的业务逻辑都可能产生不良的影响。如果需要获取用户的真实 IP地址,就要用到 realip模块。


使用realip模块需要执行withhttp_realip_module命令,并在Nginx的http块中配置如下代码:

  • set_ real_ ip_ from:设置可信任的 IP地址,即白名单,之后会使用 real_ ip_ header从这些 IP地址中获取请求头信息。
  • real_ ip_ header:从指定的请求头中获取客户端的 IP地址, IP地址是通过请求头传递给 Nginx的,请求头可能包括多个 IP地址(以逗号分隔),此时只会获取最左边的 IP地址并赋值给 $ remote_ addr(客户端地址),此请求头一般会用到 X-Forwarded-For。
  • real_ ip_ recursive:如果设置为 on,则表示启用递归搜索, realip_ module在获取客户端地址时,会在 real_ ip_ header指定的请求头信息中逐个匹配 IP地址,最后一个不在白名单中的 IP地址会被当作客户端地址。默认为 off,表示禁用递归搜索,此时,只要匹配到白名单中的 IP地址,就会把它作为客户端地址。由此,可以获取到用户的真实 IP地址,如果希望获取 CDN的节点 IP地址(有助于排查和 CDN有关的问题),可以使用 $ realip_ remote_ addr。

防止 IP地址伪造

X-Forwarded-For请求头已经是业界的通用请求头,有些恶意攻击会伪造这个请求头进行访问,通过混淆服务器的判断来掩藏攻击者的真实 IP地址。但如果在 Nginx之前还有一个 CDN的话,可以使用如下方案解决这个问题。

  • 和 CDN厂商确定约束规范,使用一个新的秘密的请求头,如 X_ Cdn_ Ip。
  • 在 CDN代理客户端请求时,要求 CDN传递用户的 IP地址,并且在建立连接的过程中,通过 CDN清除伪造的请求头,避免透传到后端。

Nginx 常见基础配置—获取client ip,访问控制(allow/deny,auth身份验证指令,LDAP服务)_第1张图片

注意:如果没有使用 CDN,客户端的请求会直接和 Nginx打交道。 Nginx可以使用自定义的请求头传递用户的 IP地址,如 proxy_ set_ header X-Real-IP $ remote_ addr。

后端服务器对 IP地址的需求

有时后端服务器也要用到用户的客户端 IP地址,在这种情况下,研发团队需要在 IP地址的获取上制定统一的规范,从规定的请求头信息中获取客户端 IP地址。请求头中的 IP地址可能有多个(经过了多次代理),它们以逗号分隔,其中第一个 IP地址就是客户端 IP地址。

管理请求的行为

作为 HTTP服务,有些请求不适合暴露在公网上,那么就需要配置访问限制来提高安全性,此时可以通过 Nginx来限制后台或内部的接口。

限制 IP地址的访问

要对 IP地址的访问进行限制,首先需要了解 allow和 deny这两个指令, allow和 deny指令的说明见下表:


allow和 deny都可以在多个指令块中配置,图 3-4是指令 deny在不同指令块中的配置效果, allow的配置亦是如此。
Nginx 常见基础配置—获取client ip,访问控制(allow/deny,auth身份验证指令,LDAP服务)_第2张图片
举个例子,对访问某个 location块的 IP地址进行限制,代码如下:

Nginx 常见基础配置—获取client ip,访问控制(allow/deny,auth身份验证指令,LDAP服务)_第3张图片

通过对访问的 IP地址进行限制,可以阻挡可疑 IP地址对服务的攻击,也可以确保内部接口只被内网访问。

auth身份验证指令

allow和 deny基于 IP地址来配置访问限制,除此之外,还可以通过密码验证的方式对访问进行限制,即通过配置 auth_ basic来设置用户须输入指定的用户名和密码才能访问相关资源。这样做既不用限制用户的 IP地址,又在一定程度上保证了资源的安全。

利用 LDAP服务加强安全

如果 auth_ basic使用统一的账号和密码会让请求无法对访问的用户进行区分,这对安全性要求较高的服务,还是不够安全,特别是当用户流动性较大时。此时,可以使用更精确的账号管理接口。常用的接口是 LDAP( Lightweight Directory Access Protocol,即轻量目录访问协议), LDAP最基础的功能就是让每个用户都使用自己的账号和密码。通过配置 LDAP认证,可以提升 Nginx权限配置的灵活性。

你可能感兴趣的:(云计算,运维,Linux,Virtual,Network,运维,负载均衡,Nginx,基础配置)