HTTP简介与访问控制

httpd是一种常用的HTTP服务程序,由美国国家超级计算机应用中心在上世纪90年代初研发,后来被发布到开源社区。到现在已经成为事实上的使用最为广泛的HTTP服务程序。其特点是高度的模块化,并且支持动态加载和卸载,且支持多路处理模块即MPM。

MPM工作模式

  1. prefork模型,多进程I/O模型,每个进程响应一个请求,是httpd的默认模型
    一个主进程:生成和回收n个子进程,创建套接字,不响应请求
    多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
  2. worker模型,复用的多进程I/O模型,多进程多线程, IIS使用此模型
    一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求: m*n
  3. event:事件驱动模型( worker模型的变种)
    一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
  • 在CentOS6中使用的httpd2.2版本中默认使用prefork模型,7中使用的2.4版本默认使用event模型

httpd2.4中的一些小变化

  1. 在新版本中不在使用不同的程序切换MPM工作模式,而是使用插件的方式,修改/etc/httpd/conf.modules.d/00-mpm.conf中的对应信息即可。

  2. 在新版中变更了基于IP的访问控制

    无明确授权的目录,默认拒绝

    允许所有主机访问: Require all granted

    拒绝所有主机访问: Require all denied

    控制特定的IP访问:

    ​ Require ip IPADDR:授权指定来源的IP访问

    ​ Require not ip IPADDR:拒绝特定的IP访问

    控制特定的主机访问:

    ​ Require host HOSTNAME:授权特定主机访问

    ​ Require not host HOSTNAME:拒绝

    HOSTNAME:

    ​ FQDN:特定主机

    ​ domin.tld:指定域名下的所有主机

    如:

    不能有失败,至少有一个成功匹配才成功,即失败优先

    <RequireAll>
         Require all granted
         Require not ip 172.16.1.1 拒绝特定IP
    </RequireAll>

    多个语句有一个成功, 则成功,即成功优先

    <RequireAny>
         Require all denied
         require ip 172.16.1.1 允许特定IP
    </RequireAny>  
    

httpd程序环境

  1. 配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
  1. 默认站点目录
/var/www/html
  1. 模块文件路径
/etc/httpd/modules
/usr/lib64/httpd/modules
  1. 主程序文件(2.4版本只有一个/usr/sbin/httpd主程序)
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event

访问控制

所谓访问控制,即网站目录的权限控制,由于网站通常都是出于公开状态,可以被任何人访问,但有些敏感信息我们还是希望可以不被用户看到,也就有了访问控制。

  1. 在服务器上基于某个目录进行控制
    在配置文件中使用如下字段对某个目录进行访问控制。如对于/var/www/html/mimi不希望被访问
<Directory "/var/www/html/mimi">
AllowOverride none
Require all denied
</Directory>

将上述信息添加到配置文件中,则用户在访问此目录的时候会被拒绝。提示信息如下:

# Forbidden

You don't have permission to access /mimi on this server.

使用Directory还可以实现基于源地址的访问控制,使用options后面跟上选项,使用+或-表示有或没有对应的权限,参照一下示例:

<Directory /var/www/html/mimi>
    options -Indexes FollowSymLinks
</Directory>

解释:设置中FollowSymLinks用来控制目录中是否支持软链接,-Indexes用来控制当目录中没有index.html文件的时候的返回结果,如果有则返回index.html中的内容,如果没有则提示没有权限。如果配置为Indexes那么访问目录会返回目录中的文件列表。
AllowOverride none用另一种方法来定义权限控制,后续再说。

  1. 基于文件进行访问控制

和对目录进行控制一样,只是在路径中将目录的路径变更为文件路径即可
在CentOS7也即httpd2.4版本中,一旦更换了主页目录则必须给与访问权限,否则403错误。如对网站目录下的test.txt进行控制,配置信息如下:

<Files "test.txt">
        Require all denied
</Files>

使用Files的时候可以在路径中使用通配符,还可以使用FileMatch使用正则表达式进行匹配。如下:

<Files "*.txt">
        Require all denied
</Files>
<Filesmatch ".*\.(txt|conf)$">
        Require all denied
</Filesmatch>

注意,使用Files进行的访问控制会对网站目录下的所有文件生效。不管在哪个文件夹中。如果需要对某个特定目录下的某些文件进行控制,可以将Files语句段包在Directory语句段中。

  1. 基于URL路径

如,还是针对mimi做控制,则还可以使用基于URL的控制,可以对目录或文件进行控制。

<location /mimi>
    Require all denied
    Require ip 192.168.11.1
</location>

location同样可以使用正则进行匹配,使用locationmatch关键字,使用方法和filematch相同

备注:经过测试发现,使用Files和Directory都可以对目录和文件进行控制。Filematch没有测试,但应该也是可以对文件和目录进行控制的。

  1. 使用.htaccess进行控制
    此种方法只针对目录有效。且可以和Directory语句进行配合使用。在需要进行控制的目录下创建此文件,以实现对目录的控制。并且可以在Directory语句中使用AllowOverride进行覆盖,覆盖支持三种模式如下:
AllowOverride All
AllowOverride None
AllowOverride Indexes AuthConfig

以上分别对应了,文件中的所有指令有效,所有指令无效,除了Indexes和AuthConfig其他指定都不生效。

  1. 定义安全域
    使用此种方法可以对网站目录下的某个目录基于用户密码进行授权。即访问此目录需要指定用户名和密码。如对网站目录下的mimi进行此种设定,配置如下:
    首先使用htpasswd工具创建对应的密码文件和密码,使用如下:
htpasswd [opt] /path/pass_file username
-c              自动创建文件,通常用于第一次使用
-p              明文密码
-d              Crypt加密,
-m              MD5加密
-D              删除指定用户
-s              sha加密

如这里创建一个user1用户密码000000,则命令如下:

htpasswd -c /var/www/html/mimi/accessuser user1

然后在主配置文件中添加如下内容:

<Directory /var/www/html/mimi>
    options none
    AuthType Basic
    AuthName "name"
    AuthUserFile "/var/www/html/mimi/accessuser"
    Require user user1
</Directory>

之后在访问网站的mimi目录则需要输入用户名密码才可以访问。
注意路径是自定义的。AuthName也是自定义内容,如果有多个用户使用空格分开即可,或者也可以使用Require valid-user对帐号文件中的所有用户进行授权。
除了针对用户,还可以设定组,对组的授权和帐号的授权类似,其中组文件不使用命令生成,是自己写的,路径自定义,内容格式是grp_name: user1 user2,使用组的配置内容如下:

<Directory /var/www/html/mimi>
    options none
    AuthType Basic
    AuthName "welcome"
    AuthUserFile "/var/www/html/mimi/accessuser"
    AuthGroupFile "/var/www/html/mimi/accessgroup"
    Require group grp_name
</Directory>
  1. 远程客户端和用户验证控制
    除了使用上面说的使用用户进行访问控制,我们还可以使用更为严格的控制方法,结合Allow和Deny来实现只对特定客户机开放访问。如下示例:
<Directory /var/www/html/mimi>
    options none
    AuthType Basic
    AuthName "name"
    AuthUserFile "/var/www/html/mimi/accessuser"
    Require user user1
        Order deny,allow
        Allow from 192.168.11.111
        Deny from all
        Satisfy all
</Directory>

使用Order定义allow和deny生效的次序,即排在后面的优先级会更高,使用allow和deny定义可以访问的IP地址,Satisfy定义allow,deny和用户控制的工作模式,all表示两者必须全部满足,或者使用any表示满足其中的一种即可。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!