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

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

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

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

2.基于用户进行授权限制
基于用户的访问控制包含认证和授权。

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

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

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 分析系统,查看相应的分析报告,若输入的账号密码不匹配,将拒绝访问该分析系统。

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

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

演示效果图

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

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

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

修改 baidu 的文件

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

修改文件的所在组,复制 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 的文件中修改其配置;

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

重启 named 服务。


# service named stop
停止 named:. [确定]
# service named start
启动 named: [确定]

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

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

使用 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.com 和 www.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 “目录位置”> + 区域配置 </Directory> 为每个 web 主机的网站目录设置访问权限。
使用 NameVirtualHost 配置项指定提供虚拟主机服务的 IP 地址;
使用 <VirtualHost 监听地址> + 区域配置 </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 服务器。

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

测试连通性;

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

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

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

演示效果图

4.基于 IP 地址的虚拟主机
在 httpd 服务器上新添加一块虚拟接口并配置好 IP 地址;

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

对于基于 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 的页面则表示无误。

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

演示效果图

5.基于端口的虚拟主机
基于端口的虚拟主机只需要同一个 web 站点,其网站名称、IP 地址可不变,唯一不同的是 TCP 端口访问不同的网页内容。因此我们在浏览器中访问非 80 端口的 web 服务器时,需明确指出服务器的端口号。例如:http://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 站点内容,则表示无误。

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

演示效果图

针对目录来设定对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 服务的访问控制

如果在 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 服务

验证结果如下。

一文读懂 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 服务

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

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

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

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

演示效果图

用户名及密码不正确时的访问结果如下。
一文读懂 HTTPD 服务的访问控制

演示效果图

END

推荐阅读

1、详解 Linux 环境下部署 HTTPD 服务

猜你喜欢

转载自blog.51cto.com/15067236/2606147