作为HTTP服务,有些请求不适合暴露在公网上,那么就需要配置访问限制来提高安全性,此时可以通过Nginx来限制后台或内部的接口。
要对IP地址的访问进行限制,首先需要了解allow和deny这两个指令,allow和deny指令的说明见表3-1。
表3-1 allow和deny指令的说明
指令allow和deny都可以在多个指令块中配置,图3-4是指令deny在不同指令块中的配置效果,allow的配置亦是如此。
图3-4 指令deny在不同指令块中的配置效果
举个例子,对访问某个location块的IP地址进行限制,代码如下:
通过对访问的IP地址进行限制,可以阻挡可疑IP地址对服务的攻击,也可以确保内部接口只被内网访问。
指令allow和deny基于IP地址来配置访问限制,除此之外,还可以通过密码验证的方式对访问进行限制,即通过配置auth_basic来设置用户须输入指定的用户名和密码才能访问相关资源。这样做既不用限制用户的IP地址,又在一定程度上保证了资源的安全。
相关指令说明如下。
指令:auth_basic
语法:auth_basic string/off;
默认值:auth_basic off;
环境:http、server、location、limit_except
含义:其中string指的是字符串信息,是用户自定义的内容。如果设置为off,表示禁用此功能;如果不设置为off,则会在浏览器访问时看到string 字符串的内容被输出。
指令:auth_basic_user_file
语法:auth_basic_user_file file;
默认值:无
环境:http、server、location、limit_except
含义:file指的是文件名,该文件存放的是登录用户名和密码,形式类似于testuser:$1$XlKs2P mC$xfxImYPQPMTloK5J7dar.1。
其中密码并不是明文显示的,而是加密过的。加密工具可以用htpasswd或OpenSSL。OpenSSL是进行HTTPS加密、解密时常用的工具,它也可以用来对密码进行加密,以账号testuser、密码Pass123为例,执行加密命令如下:
得到的加密后的内容是testuser:$1$DRCZTLTx$dRBMISe3SBnw/VZdBfhCg1,把它存放到file文件中,这样密码就更加安全了。重启Nginx,打开浏览器输入IP地址进行访问就会显示如图3-5所示的界面。
图3-5 打开浏览器后显示的界面
注意: 对于配置了密码加密的文件,一定要确保在Nginx进程中用户有可读权限,否则会出现的403错误。
如果auth_basic使用统一的账号和密码会让请求无法对访问的用户进行区分,这对安全性要求较高的服务,还是不够安全,特别是当用户流动性较大时。此时,可以使用更精确的账号管理接口。常用的接口是LDAP(Lightweight Directory Access Protocol,即轻量目录访问协议),LDAP最基础的功能就是让每个用户都使用自己的账号和密码。通过配置LDAP认证,可以提升Nginx权限配置的灵活性。
首先,需要让Nginx能够读取LDAP的内容:
然后,添加对LDAP的支撑,在编译Nginx时,添加模块编译参数:
安装完成后,在Nginx的http块内配置如下内容:
最后,在server块中配置如下内容:
配置了LDAP认证,就可以在人员变更后,快速更新用户的账号和密码,并可以定期通知使用者更新密码,加强安全管理。当然这不在本书讲解范围内,故不做深入介绍。
那么,如果希望在公司时不用输入账号和密码就能直接登录,该怎么办呢?很简单,加入satisfy指令,satisfy指令可以提供二选一的逻辑判断,配置如下:
上述配置的作用是当请求的IP地址在192.168.0.0/16和10.10.10.10/32 网段内时,不需要使用LDAP认证即可直接登录;如果IP地址不在这两个网段内,则需要通过LDAP认证进行登录。如此,鱼与熊掌可以兼得。