HTTP简介与访问控制
httpd是一种常用的HTTP服务程序,由美国国家超级计算机应用中心在上世纪90年代初研发,后来被发布到开源社区。到现在已经成为事实上的使用最为广泛的HTTP服务程序。其特点是高度的模块化,并且支持动态加载和卸载,且支持多路处理模块即MPM。
MPM工作模式
- prefork模型,多进程I/O模型,每个进程响应一个请求,是httpd的默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个 - worker模型,复用的多进程I/O模型,多进程多线程, IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求: m*n - event:事件驱动模型( worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
- 在CentOS6中使用的httpd2.2版本中默认使用prefork模型,7中使用的2.4版本默认使用event模型
httpd2.4中的一些小变化
在新版本中不在使用不同的程序切换MPM工作模式,而是使用插件的方式,修改/etc/httpd/conf.modules.d/00-mpm.conf中的对应信息即可。
在新版中变更了基于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程序环境
- 配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
- 默认站点目录
/var/www/html
- 模块文件路径
/etc/httpd/modules
/usr/lib64/httpd/modules
- 主程序文件(2.4版本只有一个/usr/sbin/httpd主程序)
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
访问控制
所谓访问控制,即网站目录的权限控制,由于网站通常都是出于公开状态,可以被任何人访问,但有些敏感信息我们还是希望可以不被用户看到,也就有了访问控制。
- 在服务器上基于某个目录进行控制
在配置文件中使用如下字段对某个目录进行访问控制。如对于/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用另一种方法来定义权限控制,后续再说。
- 基于文件进行访问控制
和对目录进行控制一样,只是在路径中将目录的路径变更为文件路径即可
在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语句段中。
- 基于URL路径
如,还是针对mimi做控制,则还可以使用基于URL的控制,可以对目录或文件进行控制。
<location /mimi>
Require all denied
Require ip 192.168.11.1
</location>
location同样可以使用正则进行匹配,使用locationmatch关键字,使用方法和filematch相同
备注:经过测试发现,使用Files和Directory都可以对目录和文件进行控制。Filematch没有测试,但应该也是可以对文件和目录进行控制的。
- 使用.htaccess进行控制
此种方法只针对目录有效。且可以和Directory语句进行配合使用。在需要进行控制的目录下创建此文件,以实现对目录的控制。并且可以在Directory语句中使用AllowOverride进行覆盖,覆盖支持三种模式如下:
AllowOverride All
AllowOverride None
AllowOverride Indexes AuthConfig
以上分别对应了,文件中的所有指令有效,所有指令无效,除了Indexes和AuthConfig其他指定都不生效。
- 定义安全域
使用此种方法可以对网站目录下的某个目录基于用户密码进行授权。即访问此目录需要指定用户名和密码。如对网站目录下的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>
- 远程客户端和用户验证控制
除了使用上面说的使用用户进行访问控制,我们还可以使用更为严格的控制方法,结合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 协议 ,转载请注明出处!