前言 在前两篇《详解 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>
该上述配置好后,可通过浏览器访问将会显示如下报错页面。
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 分析系统,查看相应的分析报告,若输入的账号密码不匹配,将拒绝访问该分析系统。
演示效果图
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 两个区域的配置,如下图所示。
修改 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.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 "www.baidu.com" > /usr/local/httpd/htdocs/baidu/index.html # 分别在 baidu 和 taobao 目录下创建 index.html 文件
# echo "www.taobao.com" > /usr/local/httpd/htdocs/taobao/index.html
# cat /usr/local/httpd/htdocs/baidu/index.html # 验证是否已经创建成功
www.baidu.com
# cat /usr/local/httpd/htdocs/taobao/index.html
www.taobao.com
添加虚拟主机配置,需在 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 服务器。
测试连通性;
在客户端浏览器中,使用网站名称分别访问不同的虚拟 web 主机,来进行确认看到的页面是否不同,若无法查看页面显示的结果,则需要检查两个站点的首页文件,或根据其他配置进行排查。
演示效果图
4.基于 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 的页面则表示无误。
演示效果图
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 站点内容,则表示无误。
演示效果图
针对目录来设定对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 服务
验证结果:在客户端浏览器输入 http://www.baidu.com 时,将弹出如下对话框输入用户名密码即可登录;
用户名及密码正确时的访问结果如下。
演示效果图
用户名及密码不正确时的访问结果如下。
演示效果图
▲
END
推荐阅读
1、详解 Linux 环境下部署 HTTPD 服务