标签:虚拟主机 linux require 访问控制 httpd
Linux之Web服务(2)Httpd服务配置之三
前言
默认安装的Httpd服务一般只有默认的一个DocumentRoot节点配置,及一个站点文档资源存放根目录,但是在生产环境中需要有多种分类的资源,比如用于外部访问和内部访问,又或者是资源本身类型,比如分别用来存放一些文档、图片、单项加密算法文件等,为了更好分配站点管理的资源,Httpd服务提供了VirtualHost及虚拟主机的配置,可以在一个Httpd服务下模拟进行部署多个站点,这样不同的站点进行不同的配置,更方便进行分布式管理。
VirtualHost 虚拟主机配置格式介绍
主机标示方式:
IP不同
PORT不同
ServerName
一个IP:PORT配置例子:
<VirtualHost IP:PORT> #若写成 <VirtualHost *:80> ,则表示所有IP:80 端口 ServerName server.meng.com #站点完整主机名 Document /vhost/www1 #站点文档根目录 <Directory “/vhost/www1”> #站点文档根目录访问控制,必须配置,否则无法访问 Options None Require all granted </Diretory> ErrorLog “logs/www1_errorlog” #错误认知 Customlog “logs/www1_accesslog” common #访问日志 </VirtualHost>
补充:要在httpd-2.2版本使用基于ServerName的虚拟主机配置时,要使用专用的配置指令,及添加下面配置即可:
NameVirtualHost IP:PORT
Httpd2.4配置案例:
1、基于主机的配置:
#基于主机IP地址配置
<VirtualHost 10.1.249.223:80> DocumentRoot "/vhosts/baidu" <Directory "/vhosts/baidu.com"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
#基于主机名的配置,不过需要hosts档案文件或DNS服务解析
<VirtualHost *:80> ServerName www.meng.com DocumentRoot "/vhosts/meng" <Directory "/vhosts/baidu.com"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
#IP和Port以及完整主机名的混合使用
<VirtualHost 10.1.249.22:8080> ServerName www.google.com DocumentRoot "/vhosts/google" <Directory "/vhosts/google"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
基于用户认证的访问控制 Require
Require user USERLIST#基于用户
Require group GROUPLIST #基于用户组
认证的方式(AuthenType):
basic #基本base64算法
digest #单项加密内容摘要算法
http协议认证过程:
1、认证质询:
www-Authencate :响应码为401,拒绝客户端请求,并说明用户输入正确的账号和密码之后可访问;
2、认证:
Authorization:客户端输入账号和密码再次发送请求报文;认证通过,服务器发送响应内容。
配置案例:
1、基于指定用户的验证
<Directory "/var/www/html/admin">#对/var/www/html/admin/目录进行访问控制 Options None AllowOverride None AuthType Basic #使用级别算法认证 AuthName "Please amdin username and password login:" #配置认证的提示信息 AuthUserFile /var/www/html/.htpasswd #配置要使用的存放的单项加密的摘要文件 Require user tom hadoop #需要进行的用户,多个用空格隔开 </Directory>
2、基于指定用户组进行认证
<Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" AuthUserFile "/etc/httpd/conf/.htpasswd" AuthGroupFile "/etc/httpd/conf/.htgroup" Require group GRPNAME1 GRPNAME 2 </Directory>
提示:组账号文件格式:
每行定义一个组,如:
group_name: user1 user2 ...
3、账号及文件生成工具htpasswd 命令
命令格式:
htpasswd [options] “/PATH/TO/HT_PASSWD_FILE” username
-c:创建新文件,如果指令路径有将被覆盖
-m:md5加密算法生成内容摘要
-s:使用sha1算法
-D:删除指定用户
配置案例:
1、在服务根配置目录下(/etc/httpd/conf.d/)下创建一个配置文件authen.conf
[root@root ~]# vim /etc/httpd/conf.d/authen.conf <Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic #使用级别认证 AuthName "Please amdin username and password login:" #设置认证提示短语 AuthUserFile /var/www/html/.htpasswd #使用的认证内容摘要及密码 Require user tom hadoop #添加的用户tom、hadoop </Directory>
解析:这里的tom、hadoop用户不是/etc/passwd中创建的用户,而是Httpd服务中使用的用户,因此需要创建.htpasswd用户档案文件来记录对应的用户和密码用于验证。
2、构建配置目录结构
#在默认文档根目录/var/www/html下添加admin目录
[root@root ~]# [ ! -d "/var/www/html/admin/" ] && mkdir -p /var/www/html/admin
#为了测试显示,这里在admin目录下添加一个html文档
[root@root ~]# cat /var/www/html/admin/admin.html <html> <head><title>This is admin dir</title></head> <body> <div> <h1>Admin Page</h1> </div> </body> </html>
3、生成密钥,可以使用htpasswd命令
#使用htpasswd生成单项加密口令
[root@root ~]# htpasswd -cm "/var/www/html/.htpasswd" tom New password: Re-type new password: Adding password for user tom
注意:要创建为以.开头的隐藏文件。
#当然还有一个用户,可以使用命令再次添加
[root@root ~]# htpasswd -m "/var/www/html/.htpasswd" hadoop
说明:不过这次不要使用-c选项了,不然会覆盖.htpasswd文件的,不过在添加之前,可以先来看一下htpasswd -m的md5加密算法算出的是个什么格式的文件。
#查看生成的.htpasswd文件
[root@root ~]# cat /var/www/html/.htpasswd tom:$apr1$991zkDGC$oz6fhL9n992o2xy75fzh7/
解析:这里发现,此格式以 : 为分割符分为两列,第一列为验证的用户名,而第二列为加密的密码。并且密码也是有规律的,这里有3个$符号,那么以每个$后面的字符又有不同的含义吧,猜想第一个$后面的为一种加密算法的标示,而第二个$后面有8个字符,好像类似随意生成字符,没什么规律,而第三个$后面好想才是真正密码加密的生成的口令。
4、根据上面的猜想,可以使用一些其它的加密工具命令openssl来验证上面的结果
1、使用openssl生成一个8位的随机字符
[root@root ~]# openssl rand -base64 8 VhBGjczh+Ic=
2、使用openssl来接收一个重定向并使用-apr及apache专用加密算法生成密码
[root@root ~]# echo "123456" | openssl passwd -apr1 -stdin $apr1$jvDpJ./u$D4HDqiqJniPjwV/eA2N4z0
解析:这里发现生成的密文只有2个$符号,而少了一个,当然passwd 子命令是由一个选项-salt及给口令加盐,防止密码被反推的。
3、再次使用passwd -salt给密码加盐生成口令
[root@root ~]# echo 123456 | openssl passwd -apr1 -salt ‘**‘ -stdin $apr1$**$ST9n6tfQeeHScnBbeAQfj/
解析:这里发现了出现了3个$符号,原来第2个$符号是用来安全给口令加盐的。
4、根据上面的结论那么通过重定向就可以直接生成想要的密码了
#直接使用openssl重定向米密码,并添加用户名输出到文件
[root@root ~]# echo "123456" | openssl passwd -apr1 -salt "`openssl rand -base64 8`" -stdin | sed ‘s/.*/hadoop:&/‘ > pass.log [root@root ~]# cat pass.log hadoop:$apr1$EgZjb9Va$o3tt8Qy7CxrEpaZtlFrrv/
说明:通过htpasswd命令生成档案文件来看,用户名和密码之间用 : 来隔开,那么使用sed命令在生成的密文前面添加拼接上一个用户名即可,并跟 :符号与密码隔开。
#通常查看刚才的文件和开始htpasswd命令生成文件
[root@root ~]# cat pass.log /var/www/html/.htpasswd hadoop:$apr1$EgZjb9Va$o3tt8Qy7CxrEpaZtlFrrv/ tom:$apr1$991zkDGC$oz6fhL9n992o2xy75fzh7/
说明:是不是一样,感觉差不多,那么测试一下能否通此密钥登录。
#将刚才密文追加到.htpasswd文件中
[root@root ~]# cat ./pass.log >> /var/www/html/.htpasswd
#测试配置并重载httpd服务
[root@root ~]# httpd -t Syntax OK [root@root ~]# systemctl reload httpd.service
#进行访问,出现了登录验证界面
说明:注意了了右上角的状态码了吗?401,没错,前面说的Httpd的认证机制在接受到请求时就响应此状态表示需要通过用户验证机制,出现了一个登陆界面,这里的提示信息就是刚才设置的AuthenName对应的提示字符。
#下面输入使用刚才的tom用户和对应密码进行登录
说明:这里输入后直接回车即可,不要在选择OK去点回车,否则会显示301。
#下面退出,使用图形浏览器,然后再次访问并使用hadoop用户登录
说明:这里发现了其实加密就是通过一些口令进行验证,与/etc/passwd和/etc/shadow验证的机制都是调用了Pam模块机制,当然,这是不灵活的,当然可以编写一些用户验证机制模块来自定义验证满足需求。前面讲到Directory中的Options选项时有一个参数为Indexes这个选择,如果指定目录没有默认主页,则列出所有文件,去掉则不显示文件列表。前面见到使用隐藏文件和去到读权限来保证资源的安全,在这里使用验证机制直接就完整了上面的一堆麻烦事,为什么呢?,请看下面的操作:
#同样使用curl去抓尝试抓取admin.html资源原代码
[root@root ~]# curl http://10.1.249.223/admin/admin.html
解析:这时发现,抓取的源代码是一个401及验证状态码,这里这就进行了数据资源响应的一层拦截,如果没有输入密码进行验证,是无法获取成功的响应信息的。也验证了开始的验证机制的两条说明。验证通过才会收到服务端的响应报文。当然前面的用法也不是没有用处,在处理多个文件访问还是有用的。
本文出自 “孟天霸-IT的垃圾回收站” 博客,转载请与作者联系!
标签:虚拟主机 linux require 访问控制 httpd
原文地址:http://mengzhaofu.blog.51cto.com/10085198/1860338