一、Apache的访问控制


  • 可对特定的网站目录添加访问授权,对客户机地址限制、用户授权做限制;两种控制方式都应用与httpd.conf配置文件中的虚拟目录区域
<Directory 目录位置>
		目录相关的配置参数和指令
</Directory>

*每个Diretory段以<Diretory>开始,以</Diretory>结束,段作用于<Diretory>中制定的目录及其里面的所有文件和子目录。在段中可设置与目录相关的参数和指令,包括访问控制和认证,控制方法主要有基于ip地址、域名、http方法、用户等。

1.客户机地址限制

  • 通过配置项Order、Deny from、Allow from,根据客户机的主机名或IP地址决定是否允许客户端访问;其中Order配置项用于设置限制顺序,Deny from和Allow from用于设置具体限制内容

Apache-2.2.x

  • Allow,deny:先“允许”后“拒绝”,默认拒绝所有未明确允许的客户机地址

  • Deny,allow:先“拒绝”后“允许”,默认允许所有未明确拒绝的客户机地址

  • 使用Allow from和Deny from配置项时,需要设置客户机地址以构成完整的限制策略,地址的形式可以是IP地址、网络地址、主机名或域名,使用名称“all”时表示任意地址。限制策略格式如下 Deny from address1 address2 ... Allow from address1 address2 ...

  • 通常情况,网站服务器对所有客户机开放,网页文档未作任何限制,因此使用的是“Allow from all”的策略,表示允许从任何客户机访问,策略格式如下

<Directory “/usr/local/httpd/htdocs”>
  ..    //省略部分内容
  Order Allow,deny
  Allow from all
</Directory>
  • 需要使用“仅允许”的限制策略时,应将处理顺序改为“allow,deny”,并明确设置允许策略,只允许一部分主机访问。例如,若只希望IP地址为173.17.17.173的网管工作用机能够访问AWStats系统,则针对AWStats系统的目录区域做如下设置
<Directory “/usr/local/awstats/wwwroot:”>
  ...  //省略部分内容
  Order allow,deny				//先允许后拒绝
  Allow from 173.17.17.173			//只允许此IP访问
</Directory>
  • 反之,需要使用“仅拒绝”的限制策略时,应将处理顺序改为“deny,allow”,并明确设置拒绝策略,只禁止一部分主机访问。例如,若只希望禁用来自两个内网网段192.168.0.0/24和192.168.1.0/24的主机访问,但允许其它任何主机访问,可以使用如下限制策略
<Directory “/usr/local/awstats/wwwroot”>
  ...  //省略部分内容
  Order deny,allow
  Deny from 192.168.0.0/24 192.168.1.0/24
</Directory>

当通过未被授权的客户机访问网站目录时,将会被拒绝访问

Apache-2.4.x (1)允许所有

    Require all granted

(2)拒绝所有

    Require all denied

(3)只允许指定IP访问

    Require ip <允许的IP地址>

(4)只拒绝指定IP访问

    <RequireAll>
      Require all granted
      Require not ip xxx		
    </RequireAll>

例:

  • 允许所有人访问/usr/local/httpd/htdocs/ <Directory “/usr/local/httpd/htdocs”> Require all granted </Directory>
  • 拒绝所有人访问/usr/local/httpd/htdocs/ <Directory “/usr/local/httpd/htdocs”> Require all denied </Directory>
  • 只允许192.168.1.10主机访问/usr/local/httpd/htdocs/,相当于白名单 <Directory “/usr/local/httpd/htdocs”> Require ip 192.168.1.10 </Directory>
  • 拒绝192.168.1.10主机访问/usr/local/httpd/htdocs/,其余主机全部允许,相当于黑名单 <Directory “/usr/local/httpd/htdocs”> <RequireAll> Require all granted Require not ip 192.168.1.10 </RequireAll> </Directory>

2.用户授权限制

  • httpd服务器支持使用摘要认证(Digest)和基本认证(Basic)两种方式。使用摘要认证需要在编译httpd之前添加“--enable-auth-digest”选项,但并不是所有的浏览器都支持摘要认证。而基本认证是httpd服务的基本功能,不需要预先配置特别选项
  • 基于用户的访问控制包括认证(Authentication)和授权(Authorization)两个过程。认证是指识别用户身份的过程,授权是指允许特定用户访问特点目录区域的过程

(1)创建用户认证数据文件

  • httpd的基本认证通过校验用户名、密码组合来判断是否允许用户访问。授权访问的用户账号需要事先建立,并保存在固定的数据文件中。使用专门的htpasswd工具程序,可以创建授权用户数据文件,并维护其中的用户账号。
  • 使用htpasswd时,必须指定用户数据文件的位置,添加“-c”选项表示新建立此文件。例如,执行以下操作可以新建数据文件/usr/local/httpd/conf/.awspwd,其中包含一个名为webadmin的用户信息
cd /usr/local/httpd    //进入httpd安装目录方便执行命令
bin/htpasswd -c /usr/local/httpd/conf/.awspwd webadmin    //创建用户账号webadmin(只能用于登录web界面)
cat /usr/local/httpd/conf/.awspwd    //查看用户账号数据文件
  • 若省略“-c”选项,则表示指定的用户数据文件已经存在,用于添加新的用户或修改现有用户的密码。例如,需要向.awspwd数据文件中添加一个新用户tsengyia时,可以执行以下操作
bin/htpasswd /usr/local/httpd/conf/.awspwd tsengyia
cat /usr/local/httpd/conf/.awspwd

(2)添加用户授权配置

  • 有授权用户账号以后,还需修改httpd.conf配置文件,在特定的目录区域中添加授权配置,以启用基本认证并设置允许哪些用户访问。例如,若只允许.awspwd数据文件中的任一用户访问AWStats系统,可以执行以下操作
vim /usr/local/httpd/conf/httpd.conf
<Directory "/usr/local/awstats/wwwroot">
···
    AuthName "AWStats Directory"
    AuthType Basic
    AuthUserFile /usr/local/httpd/conf/.awspwd
    require valid-user
</Directory>

注释 AuthName:定义受保护的领域名称,该内容将在浏览器弹出的认证对话框中显示 AuthType:设置认证的类型,Basic表示基本认证 AuthUserFile:设置用户保存用户账号、密码的认证文件路径 required valid-user:要求只有认证文件中的合法用户才能访问。其中valid-user表示所有合法用户,若只授权给单个用户,可改为指定的用户名(如require user webadmin) (3)验证用户访问授权

  • 再次访问AWStats系统时,浏览器会首先弹出认证对话框。只有输入正确的用户名和密码后才能查看日志分析报告,否则将拒绝访问

二、构建虚拟Web主机


  • 虚拟Web主机指的是在同一台服务器中运行多个Web站点。其中的每个站点实际上并不独立占用整个服务器,因此被称为“虚拟Web主机”,通过虚拟Web主机服务可以充分利用服务器的硬件资源,降低网络构建及运行程序
  • 基于域名:为每个虚拟主机使用不同的域名,但是对应IP地址相同;同IP、同端口、不同域名
  • 基于IP地址:为每个虚拟主机使用不同的域名,且各自对应的IP地址也不相同,需要为服务器配置多个网络接口;不同IP、同端口、不同域名
  • 基于端口:不使用域名、IP来区分不同站点内容,使用不同TCP端口号;同域名、同IP、不同端口

1.基于域名的虚拟主机

(1)为虚拟主机提供域名解析(搭建DNS,测试使用)

yum -y install bind bindg -chroot bind-utils    //安装bind软件包
vim /etc/named.conf    //修改named服务主配置文件
cp /var/named/named.empty /var/named/hiahia.org.zone    //拷贝模板文件
vim /var/named/hiahia.org.zone    //编辑正向解析文件
chown named:named /var/named/hiahia.org.zone    //设置文件属主和属组为named
/etc/init.d/named start && 8mchkconfig --level 35 named on

(2)为虚拟主机准备网页文档 每个虚拟Web主机准备网站目录及网页文档。

mkdir -p /usr/local/httpd/htdocs/www
mkdir -p /usr/local/httpd/htdocs/blog
echo "www.xueluo.org">/usr/local/httpd/htdocs/www/index.html
echo "blog.xueluo.org">/usr/local/httpd/htdocs/blog/index.html

(3)添加虚拟主机配置

  • 监听地址:使用NameVirtualHost配置项指定提供虚拟主机服务的IP地址,也就是进行域名查询时各虚拟Web主机的IP地址
  • 虚拟主机区域:使用<VirtualHost 监听地址>...</VirtualHost>区域配置,为每一个虚拟Web主机建立独立的配置内容。其中至少应包含虚拟主机的网站名称、网页根目录的配置项
  • 目录权限:使用<Directory 目录位置>...</Directory>区域配置,为每一个虚拟Web主机的网站目录设置访问权限;目录访问可继承其父目录的授权许可
vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
<Directory "/usr/local/httpd/htdocs/">
    Order allow,deny
    Allow from all
    (httpd2.4.x这里的两行换成Require all granted)
</Directory>
<VirtualHost 192.168.1.151>
    DocumentRoot "/usr/local/httpd/htdocs/www"
    ServerName www.hiahia.com
    ErrorLog "logs/www.hiahia.com_error_log"
    CustomLog "logs/www.hiahia.com_access_log" common
</VirtualHost>
<VirtualHost 192.168.1.151>
    DocumentRoot "/usr/local/httpd/htdocs/blog"
    ServerName blog.hiahia.com
    ErrorLog "logs/blog.hiahia.com_error_log"
    CustomLog "logs/blog.hiahia.com_access_log" common
</VirtualHost>
vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-vhosts.conf    //删除开头#号,读取虚拟主机配置文件
/etc/init.d/httpd restart

(4)客户机中访问虚拟Web主机

2.基于IP地址的虚拟主机

(1)添加虚拟接口IP或新增加网卡配置IP地址

(2)添加虚拟主机配置

vim /var/named/xueluo.org.zone    //修改dns正向解析文件,更改其中一个IP地址为新增网卡IP
/etc/init.d/named restart    //重启namd服务
vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
<Directory "/usr/local/httpd/htdocs/">
    Order allow,deny
    Allow from all
		(httpd2.4.x这里的两行换成Require all granted)
</Directory>
<VirtualHost 192.168.1.151>
    DocumentRoot "/usr/local/httpd/htdocs/www"
    ServerName www.hiahia.com
    ErrorLog "logs/www.hiahia.com_error_log"
    CustomLog "logs/www.hiahia.com_access_log" common
</VirtualHost>
<VirtualHost 192.168.1.152>
    DocumentRoot "/usr/local/httpd/htdocs/blog"
    ServerName blog.hiahia.com
    ErrorLog "logs/blog.hiahia.com_error_log"
    CustomLog "logs/blog.hiahia.com_access_log" common
</VirtualHost>
vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-vhosts.conf    //删除开头#号,读取虚拟主机配置文件
/etc/init.d/httpd restart    //重启httpd服务

(3)客户机访问虚拟Web

3.基于端口的虚拟主机

(1)添加虚拟主机配置

vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
<Directory "/usr/local/httpd/htdocs/">
    Order allow,deny
    Allow from all
		(httpd2.4.x这里的两行换成Require all granted)
</Directory>
<VirtualHost 192.168.1.100:80>
    DocumentRoot "/usr/local/httpd/htdocs/www"
    ServerName www.xueluo.org
    ErrorLog "logs/www.xueluo.org_error_log"
    CustomLog "logs/www.xueluo.org_access_log" common
</VirtualHost>
<VirtualHost 192.168.1.200:81>
    DocumentRoot "/usr/local/httpd/htdocs/blog"
    ServerName blog.xueluo.org
    ErrorLog "logs/blog.xueluo.org_error_log"
    CustomLog "logs/blog.xueluo.org_access_log" common
</VirtualHost>

(2)加载额外配置文件,并设置监听端口

vim /usr/local/httpd/conf/httpd.conf
  Listen 192.168.1.151:999
	Listen 192.168.1.152:888
vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-vhosts.conf    //删除开头#号,读取虚拟主机配置文件
/etc/init.d/httpd restart

(3)客户机访问虚拟Web