阅读 1156

一文带你读懂 HTTPD 服务的访问控制!

这是我参与更文挑战的第 20 天,活动详情查看:更文挑战


一名致力于在技术道路上的终身学习者、实践者、分享者,一位忙起来又偶尔偷懒的原创博主,一个偶尔无聊又偶尔幽默的少年。

欢迎各位掘友们微信搜索「杰哥的IT之旅」关注!

原文链接:一文读懂 HTTPD 服务的访问控制

前言

在前两篇《详解 Linux 环境下部署 HTTPD 服务》和《AWStats 分析系统监控 Web 站点,yyds!!!》的文章,我们详细讲解了在 Linux 环境下 HTTPD 服务和 AWStats 分析系统的部署及相关配置等,在访问 AWStats 分析系统是无需账户密码即可访问 Web 站点,同时这也给服务器带来了一些安全隐患。

为了更好的控制对网站资源的访问,可以为特定网站目录添加访问授权,本篇文章将给大家介绍 HTTPD 服务的访问控制,主要针对:基于客户端地址限制、基于用户进行限制、基于域名的虚拟主机限制、基于 IP 地址、端口的虚拟主机限制。

一、基于客户端地址限制

Deny from 和 Allow from 配置项用于设置具体限制内容,使用 Deny from 和 Allow from 配置项时,需设置客户端地址等来进行限制策略,address1 / 2 可以是 IP 地址、网络地址、主机名和域名,通常情况下,网站服务器是对所有用户开放的,网页文档目录也未做任何限制,因此可使用“all”来表示拒绝或允许所有任意地址的访问等;

Deny from address1 address2 ...
Allow from address1 address2 ...
复制代码

Order 配置项可以设置“allow,deny”或“deny,allow”来决定主机应用“允许”或“拒绝”策略的先后顺序。

  • “allow,deny”:先“允许”后“拒绝”默认拒绝所有未明确允许的客户端地址。
  • “deny,allow”:先“拒绝”后“允许”默认允许所有未明确拒绝的客户端地址。
<Directory "/usr/local/httpd/htdocs">
......                  # 省略部分内容
Order allow,deny
Allow from all
</Directory>
复制代码

使用“仅允许”的限制策略时,将按处理顺序改为“allow,deny”,并明确设置允许策略,只允许一部分主机进行访问。若只希望 IP 地址为:192.168.3.123 的终端能够访问 AWStats 分析系统,则针对 AWStats 分析系统的目录区域配置以下部分;

<Directory "/usr/local/awstats/wwwroot">
Options None
AllowOverride None
Order allow,deny
Allow from 192.168.3.123         # 允许 192.168.3.123 地址访问
</Directory>
复制代码

使用“仅拒绝”的限制策略时,将按处理顺序改为“deny,allow”,并明确设置拒绝策略,只拒绝一部分主机进行访问。若只希望 192.168.3.0/24 该网段的终端能够访问 AWStats 分析系统,但允许其他任何终端访问,则针对 AWStats 分析系统的目录区域配置以下部分;

<Directory "/usr/local/awstats/wwwroot">
Options None
AllowOverride None
Order deny,allow
deny from 192.168.3.0/24         # 拒绝 192.168.3.0/24 网站的地址访问
</Directory>
复制代码

该上述配置好后,可通过浏览器访问将会显示如下报错页面。

图片

二、基于用户进行授权限制

基于用户的访问控制包含认证和授权。

认证:指用户身份的过程;

授权:指允许特定用户访问特定目录区域;

httpd 的基本认证是通过校验用户名、密码组合来判断是否允许用户访问。授权访问的用户账号需要先建立,并保存在固定的数据文件中。

可使用工具:htpasswd,来创建授权用户数据文件,并进行维护其中的用户账号。必须指定用户数据文件的位置,结合参数“-c”选项来表示新建立此文件。

新建数据文件 /usr/local/httpd/conf/.awspwd ,webjacktian 和 webjacktian1 为用户信息。

# cd /usr/local/httpd/
# bin/htpasswd -c /usr/local/httpd/conf/.awspwd webjacktian
New password:                        # 设置密码
Re-type new password:
Adding password for user webjacktian
# cat /usr/local/httpd/conf/.awspwd
webjacktian:u5Mq.qjrDfsvA
复制代码

若不使用“-c”选项,指定的用户数据文件已存在,用户添加新的用户或修改现有的用户密码。

# bin/htpasswd /usr/local/httpd/conf/.awspwd webjacktian1
New password:
Re-type new password:
Adding password for user webjacktian1
# cat /usr/local/httpd/conf/.awspwd             # 确认用户数据文件
webjacktian:1.wTyxw9/pItY
webjacktian1:zG4sQXO/HveOc
复制代码

授权用户账号后,需修改 httpd.conf 配置文件,在特定的目录区域中添加授权配置,并启用基本认证设置允许哪些用户可进行访问。

vi /usr/local/httpd/conf/httpd.conf
......                             # 省略部分内容
<Directory "/usr/local/awstats/wwwroot">
Options None
AllowOverride None
Order deny,allow
deny from 192.168.3.124
AuthName "http web"                       # 定义受保护的领域名称,将在浏览器弹出的认证对话框中显示。
AuthType Basic                         # 设置认证的类型,Basic表示基本认证。
AuthUserFile /usr/local/httpd/conf/.awspwd           # 设置用于保存用户账号、密码的认证文件路径。
require valid-user                       # 只有认证文件中的合法用户才能访问,valid-user表示所有合法用户,若只授权单个用户,可改为指定的用户名。比如:webjacktian / webjacktian1
</Directory>
# /usr/local/httpd/bin/apachectl restart            # 重启服务将新配置进行生效。
复制代码

验证用户授权访问 AWStats 分析系统,浏览器会弹出如下对话框,这里只需要输入正确的用户名密码即可登录 AWStats 分析系统,查看相应的分析报告,若输入的账号密码不匹配,将拒绝访问该分析系统。

图片

图片

三、基于域名的虚拟主机访问

基于域名:为每个虚拟主机使用不同的域名,但其对应的 IP 地址是一样的。

例如:www.baidu.comwww.taobao.com 的 IP 地址都是 192.168.3.123,这是最普遍类型的 web 主机类型。基于域名的访问需搭建 DNS 服务来提供 web 站点访问,关于 DNS 服务的部署,详细请参考:《Linux环境下DNS域名解析服务》搭建成功后,需在主配置文件 named.conf 中添加 baidu.com 和 taobao.com 两个区域的配置,如下图所示。

图片

修改 baidu 的文件

图片

修改文件的所在组,复制 baidu.jack 文件的 /var/named/ 下,名字修改为 taobao.jack

# chgrp named /var/named/baidu.jack             # 修改文件的所在组
# cp -v /var/named/baidu.jack /var/named/taobao.jack      # 复制 baidu.jack文 件的 /var/named/ 下,名字修改为 taobao.jack,-p:保留文件原有权限
# ll /var/named/                       # 查看 baidu.jack 和 taobao.jack 文件是否都已经创建成功
总用量 40
-rw-r--r--. 1 root named 149 7月 28 16:10 baidu.jack
drwxr-x---. 6 root named 4096 7月 28 03:42 chroot
drwxrwx---. 2 named named 4096 7月 28 07:04 data
drwxrwx---. 2 named named 4096 7月 28 16:10 dynamic
-rw-r-----. 1 root named 1892 2月 18 2008 named.ca
-rw-r-----. 1 root named 152 12月 15 2009 named.empty
-rw-r-----. 1 root named 152 6月 21 2007 named.localhost
-rw-r-----. 1 root named 168 12月 15 2009 named.loopback
drwxrwx---. 2 named named 4096 8月 27 2013 slaves
-rw-r--r--. 1 root root 307 7月 28 06:56 taobao.jack
复制代码

进入 taobao.jack 的文件中修改其配置;

图片

重启 named 服务。

# service named stop
停止 named:. [确定]
# service named start
启动 named: [确定]
复制代码

修改 nameserver 配置项,指向DNS服务器地址;

图片

使用 nslookup 命令来进行解析所配置的两个域名是否成功;

[root@Mr-tian named]# nslookup www.baidu.com         # 使用 nslookup 进行验证域名是否成功
Server: 192.168.3.123
Address: 192.168.3.123#53

Name: www.baidu.com
Address: 192.168.3.123

[root@Mr-tian named]# nslookup www.taobao.com
Server: 192.168.3.123
Address: 192.168.3.123#53

Name: www.taobao.com
Address: 192.168.3.123
复制代码

为每个虚拟 web 主机准备网站目录及网页文档,并为每个虚拟 web 主机提供包含不同内容的首页文件。在 /usr/local/httpd/htdocs 目录下创建两个子文件夹 baidu 和 taobao,分别作为 www.baidu.comwww.taobao.com 的网站根目录来测试网页文件。

# mkdir /usr/local/httpd/htdocs/baidu                            # 在虚拟主机下准备网页文档
# mkdir /usr/local/httpd/htdocs/taobao
# ls /usr/local/httpd/htdocs/                                # 查看刚建立的 baidu 和 taobao 目录是否已建立好
abc.html baidu index.html taobao
# echo "<h1>www.baidu.com</h1>" > /usr/local/httpd/htdocs/baidu/index.html         # 分别在 baidu 和 taobao 目录下创建 index.html 文件
# echo "<h1>www.taobao.com</h1>" > /usr/local/httpd/htdocs/taobao/index.html
# cat /usr/local/httpd/htdocs/baidu/index.html                       # 验证是否已经创建成功
<h1>www.baidu.com</h1>
# cat /usr/local/httpd/htdocs/taobao/index.html
<h1>www.taobao.com</h1>
复制代码

添加虚拟主机配置,需在 httpd 服务器的主配置文件中,启用基于域名的虚拟 web 主机。

  • 使用 <Directory “目录位置”> + 区域配置  为每个 web 主机的网站目录设置访问权限。
  • 使用 NameVirtualHost 配置项指定提供虚拟主机服务的 IP 地址;
  • 使用 <VirtualHost 监听地址> + 区域配置  为每个虚拟 web 主机建立独立的配置内容,主要包括:网页根目录的路径,虚拟主机的网站名称,访问日志等相关配置项;
# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf         # 创建独立的配置文件
# <Directory "/var/www/html">                    # 设置目录访问权限
# Order allow,deny
# Allow from all
# </Directory>

NameVirtualHost 192.168.3.123:80                  # 设置虚拟主机监听地址

<VirtualHost 192.168.3.123:80>                   # 设置 baidu 虚拟站点区域
DocumentRoot "/usr/local/httpd/htdocs/baidu"
ServerName www.baidu.com
ErrorLog "logs/www.baidu.com-error_log"
CustomLog "logs/www.baidu.com-access_log" common
</VirtualHost>

<VirtualHost 192.168.3.123:80>                   # 设置 taobao 虚拟站点区域
DocumentRoot "/usr/local/httpd/htdocs/taobao"
ServerName www.taobao.com
ErrorLog "logs/www.taobao.com-error_log"
CustomLog "logs/www.taobao.com-access_log" common
</VirtualHost>
复制代码

当虚拟 web 主机的数量较多时,可使用独立的虚拟主机配置文件,在 httpd.conf 中添加 Include conf/extra/httpd-vhosts.conf 来加载配置。

# vim /usr/local/httpd/conf/httpd.conf
<Directory "/usr/local/awstats/wwwroot">
Options None
AllowOverride None
Order deny,allow
deny from 192.168.3.124
AuthName "http web"
AuthType Basic
AuthUserFile /usr/local/httpd/conf/.awspwd
require valid-user
</Directory>
Include conf/extra/httpd-vhosts.conf         # 在文末添加此行配置来加载独立的配置文件
复制代码

重启 HTTPD 服务

# service httpd restart                # 重启 httpd 服务
复制代码

在客户端配合同网段的 IP 地址,并将 DNS 指向 httpd 服务器。

图片

测试连通性;

图片

在客户端浏览器中,使用网站名称分别访问不同的虚拟 web 主机,来进行确认看到的页面是否不同,若无法查看页面显示的结果,则需要检查两个站点的首页文件,或根据其他配置进行排查。

图片

四、基于 IP 地址的虚拟主机

在 httpd 服务器上新添加一块虚拟接口并配置好 IP 地址;

图片

对于基于 IP 地址的虚拟主机,每个虚拟 web 主机将使用不同的 IP 地址,都将通过同一台 httpd 服务器来对外提供服务,配置基于 IP 地址的虚拟 web 主机时,不在使用 NameVirtualHost 配置项来指定监听服务的 IP 地址,只需要在每个虚拟 web 主机的 VirtualHost 配置项中指定各域名所对应的 IP 地址即可。

站点:www.baidu.com 的 IP 地址为:192.168.3.123,站点:www.taobao.com 的 IP 地址为:192.168.3.126,实现基于 IP 地址的虚拟 web 主机,则将以下配置项配在 httpd 服务器上即可。

# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf
......                           # 省略部分内容
NameVirtualHost 192.168.3.123:80               # 此 www.baidu.com 区域的配置保持不变

<VirtualHost 192.168.3.123:80>
DocumentRoot "/usr/local/httpd/htdocs/baidu"
ServerName www.baidu.com
ErrorLog "logs/www.baidu.com-error_log"
CustomLog "logs/www.baidu.com-access_log" common
</VirtualHost>

<VirtualHost 192.168.3.126:80>               # 将 www.taobao.com 区域的配置将 VirtualHost IP:端口号,IP 改为添加的虚拟接口 eth1:0 的 IP 地址
DocumentRoot "/usr/local/httpd/htdocs/taobao"
ServerName www.taobao.com
ErrorLog "logs/www.taobao.com-error_log"
CustomLog "logs/www.taobao.com-access_log" common
</VirtualHost>
复制代码

配置加载独立的配置文件;

# vi /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-vhosts.conf           # 加载独立的配置文件
复制代码

重启 httpd 服务;

# service httpd restart                  # 重启 httpd 服务
复制代码

在客户端浏览器地址栏中输入 http://192.168.3.123 将显示 www.baidu.com 的页面,输入 http://192.168.3.126 将显示 www.taobao.com 的页面则表示无误。

图片

演示效果图

五、基于端口的虚拟主机

基于端口的虚拟主机只需要同一个 web 站点,其网站名称、IP 地址可不变,唯一不同的是 TCP 端口访问不同的网页内容。因此我们在浏览器中访问非 80 端口的 web 服务器时,需明确指出服务器的端口号。例如:www.taobao.com:81/ 在配置基于端口的虚拟 web 主机时,不需要使用 NameVirtualHost 配置项,只需通过多个监听配置项来指定 TCP 的端口号,每个虚拟 web 主机的 VirtualHost 配置项中应指定 IP 地址和端口号。

若实现通过 80 端口来访问 www.baidu.com 站点时,则显示的结果为 baidu 站点内容,当通过 81 端口来访问 www.taobao.com 站点时,则显示的结果为 taobao 站点内容。

# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf

NameVirtualHost 192.168.3.123:80

<VirtualHost 192.168.3.123:80>         # www.baidu.com 虚拟站点区域的配置保持不变
DocumentRoot "/usr/local/httpd/htdocs/baidu"
ServerName www.baidu.com
ErrorLog "logs/www.baidu.com-error_log"
CustomLog "logs/www.baidu.com-access_log" common
</VirtualHost>

<VirtualHost 192.168.3.123:81>         # 设置 www.taobao.com 虚拟站点区域的端口号为:81
DocumentRoot "/usr/local/httpd/htdocs/taobao"
ServerName www.taobao.com
ErrorLog "logs/www.taobao.com-error_log"
CustomLog "logs/www.taobao.com-access_log" common
</VirtualHost>
复制代码

原加载的独立配置文件和 80 端口保持不变,需新添加一条监听 www.taobao.com 的虚拟站点端口。

# vi /usr/local/httpd/conf/httpd.conf
......                     # 省略部分内容
40 Listen 80                  # 原有的 80 端口不变
41 Listen 81                  # 新添加一条监听端口

# service httpd restart # 重启 httpd 服务
复制代码

验证结果:在客户端浏览器中输入:http://192.168.3.123 将显示 baidu 站点内容,输入 http://192.168.3.123:81 将显示 taobao 站点内容,则表示无误。

图片

演示效果图

针对目录来设定对baidu来做基于客户地址的访问控制,修改虚拟主机配置文件并配置关于 Directory 部分的配置项,配置无误后,检查语法并重启服务。

# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf

NameVirtualHost 192.168.3.123:80

<VirtualHost 192.168.3.123:80>             # 对 baidu 来做访问控制(基于客户地址的访问控制)修改虚拟主机配置文件
DocumentRoot "/usr/local/httpd/htdocs/baidu"
ServerName www.baidu.com
ErrorLog "logs/www.baidu.com-error_log"
CustomLog "logs/www.baidu.com-access_log" common
<Directory "/usr/local/httpd/htdocs/baidu">       # 在www.baidu.com里添加
order allow,deny
allow from 192.168.3.125 # 访问端 IP 地址
</Directory>
</VirtualHost>

<VirtualHost 192.168.3.123:81>
DocumentRoot "/usr/local/httpd/htdocs/taobao"
ServerName www.taobao.com
ErrorLog "logs/www.taobao.com-error_log"
CustomLog "logs/www.taobao.com-access_log" common
</VirtualHost>

# httpd -t                       # 检查语法
Syntax OK

# service httpd restart                # 重启 httpd 服务
复制代码

根据以上配置项,只允许 IP 地址为:192.168.3.125 的主机进行访问,所以当你在非 IP 地址为:192.168.3.125 的客户端中进行访问,将显示如下拒绝显示。

图片

如果在 httpd-vhosts.conf 配置文件中设置 allow from 192.168.3.0/24 网段的配置,则说明该网段下的所有主机都可以访问;

# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf
......                          # 省略部分内容
<Directory "/usr/local/httpd/htdocs/baidu">
order allow,deny
allow from 192.168.3.0/24
</Directory>

# service httpd restart                  # 重启 httpd 服务
复制代码

验证结果如下。

图片

用户授权限制访问

创建用户  -c:第一次创建用户时使用,第二次则不需要添加,并查看用户的文件;

# htpasswd -c /usr/local/httpd/conf/.user jacktian     # 创建用户
New password:                        # 设置密码
Re-type new password:
Adding password for user jacktian
You have new mail in /var/spool/mail/root
# cat /usr/local/httpd/conf/.user              # 查看用户文件
jacktian:Kga/Hy/OZ2Bnw
复制代码

修改虚拟机主机配置文件需在 www.baidu.com 里添加 AuthName 配置部分;

# vi /usr/local/httpd/conf/extra/httpd-vhosts.conf     # 修改虚拟机主机配置文件

NameVirtualHost 192.168.3.123:80

<VirtualHost 192.168.3.123:80>
DocumentRoot "/usr/local/httpd/htdocs/baidu"
ServerName www.baidu.com
ErrorLog "logs/www.baidu.com-error_log"
CustomLog "logs/www.baidu.com-access_log" common
<Directory "/usr/local/httpd/htdocs/baidu">
order allow,deny
allow from 192.168.3.0/24
AuthName "baidu login"                   # 在 www.baidu.com 里添加用户授权设置配置项
AuthType Basic
AuthUserFile /usr/local/httpd/conf/.user
Require valid-user
</Directory>
</VirtualHost>

<VirtualHost 192.168.3.123:81>
DocumentRoot "/usr/local/httpd/htdocs/taobao"
ServerName www.taobao.com
ErrorLog "logs/www.taobao.com-error_log"
CustomLog "logs/www.taobao.com-access_log" common
</VirtualHost>

# httpd -t                         # 检查语法
Syntax OK

# service httpd restart                   # 重启 httpd 服务
复制代码

验证结果:在客户端浏览器输入 www.baidu.com 时,将弹出如下对话框输入用户名密码即可登录;

图片

用户名及密码正确时的访问结果如下。

图片

演示效果图

用户名及密码不正确时的访问结果如下。

图片

演示效果图

推荐阅读

Nginx系列教程(一)| 手把手教你在Linux环境下搭建Nginx服务

Nginx系列教程(二)| 一文带你读懂Nginx的正向与反向代理

Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡

Nginx系列教程(四)| 一文带你读懂Nginx的动静分离

Nginx系列教程(五)| 利用 Nginx+Keepalived 实现高可用技术

Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署一套系统

详解 Linux 环境下部署 HTTPD 服务!

AWStats 分析系统监控 Web 站点,yyds!!!


原创不易,如果你觉得这篇文章对你有点用的话,麻烦你为本文点个赞、评论或转发一下,因为这将是我输出更多优质文章的动力,感谢!

对了,掘友们记得给我点个免费的关注哟!防止你迷路下次就找不到我了。

我们下期再见!

文章分类
后端