Linux就该这么学第10章 使用Apache服务部署静态网站简述 本章节先会为读者们科普介绍什么是Web服务程序,以及Web服务程序有何用处,然后通过对比当前主流的Web服务程序来帮助同学们更好理解各个服务程序的优势及特点,最终通过对httpd服务程序中的“全局配置参数”、“区域配置参数”及“注释信息”的理论讲解和实战部署,不仅让您学会Web服务程序的配置方法,更能真正掌握在Linux系统中配置服务的技巧所在。 刘遄老师还会去讲解SELinux服务的作用、三种工作模式以及策略管理方法,分别掌握对SELinux域和SELinux安全上下文的配置方法,从而顺利的完成多个httpd服务程序的实用演练课程,包括有对httpd服务程序的基本部署、实现个人用户主页功能和口令加密验证方式,以及分别基于IP地址、主机名(域名)、端口号来部署虚拟主机网站功能,让同学们把httpd服务程序与SELinux服务技术结合在一起反复学习,为今后生产工作环境打下坚实的基础。
本章目录结构 10.1.网站服务程序 10.2.配置服务文件参数 10.3.SELinux安全子系统 10.4.个人用户主页功能 10.5.虚拟网站主机功能 10.5.1.基于IP地址 10.5.2.基于主机域名 10.5.3.基于端口号 10.6.Apache的访问控制
10.1.网站服务程序 最初在1970年前后,互联网技术仅仅是处在雏形阶段的一种构想,经过多年发展然后才慢慢逐步向非军方或科研部门外开始接入使用,虽然那时“互联网”的规模还不如现在局域网成熟,但依然为网络应用技术爆发式增长打下了扎实的基础。您最开始也应该是通过访问网站而正式接触到互联网的吧,而咱们平时访问的网站服务就是Web网络服务也叫WWW万维网(World Wide Web),一般是指能够让用户通过浏览器访问到互联网中文档等资源的服务。如图10-1所示,Web网站服务是一种被动访问的服务程序,即只有接收到互联网中其他计算机发出的请求后才会响应,最终Web服务器会通过HTTP(超文本传输协议)或HTTPS(超文本安全传输协议)把指定文件传送到客户机的浏览器上。
图10-1 网站服务器响应用户请求 目前能够提供WEB网络服务的程序有Apache、Nginx或IIS等等,在Windows系统中默认Web服务程序是IIS互联网信息服务(Internet Information Services),这是一款图形化的网站管理工具,IIS程序不光能提供Web网站服务,还能够提供FTP、NMTP、SMTP等服务功能,但只能在Windows系统中使用,所以就不在咱们这本《Linux就该这么学》书籍的学习范围内了。2004年10月4日为俄罗斯知名门户站点而开发的Web服务程序Nginx出世了,Nginx程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场,但最最最被认可的还当属是低系统资源、占用内存少且并发能力强,目前国内如新浪、网易、腾讯等门户站均使用,这款服务程序刘遄老师将会在第20章节时为您讲解。Apache程序是目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展,如图10-2所示为Apache服务基金会的著名Logo,它的名字取自美国印第安人土著语,寓意着拥有高超的作战策略和无穷的耐性,在红帽RHEL5、6、7系统中一直作为着默认的Web服务程序而使用,并且也一直是红帽RHCSA和红帽RHCE的考试重点内容。Apache服务程序可以运行在Linux系统、Unix系统甚至是Windows系统中,支持基于IP、域名及端口号的虚拟主机功能、支持多种HTTP认证方式、集成有代理服务器模块、安全Socket层(SSL)、能够实时监视服务状态与定制日志消息,并有着各类丰富的模块支持。
图10-2 Apache软件基金会著名的Logo 总结来说Nginx程序作为Web服务软件界的后起之秀已经通过自身的努力与优势赢得了大批站长的信赖,例如咱们书籍《Linux就该这么学》在线学习站点就是基于Nginx服务程序部署的,不得不说真的很棒!但是Apache程序作为老牌的Web服务软件因其卓越的稳定性与安全性成为了红帽RHEL7系统中默认的网站服务软件,当前依然占有了绝大部分的Web服务软件市场,并且同样也是红帽RHCSA与RHCE考试认证中避不开的考题,因此同学们有必要好好学习一下Apache服务程序的部署,并深入挖掘其可用的丰富功能。 第1步:把光盘设备中的系统镜像挂载到/media/cdrom目录: [root@linuxprobe ~]# mkdir -p /media/cdrom [root@linuxprobe ~]# mount /dev/cdrom /media/cdrom mount: /dev/sr0 is write-protected, mounting read-only 第2步:使用Vim文本编辑器创建Yum仓库的配置文件,下列具体参数含义可参考4.1.4小节: [root@linuxprobe ~]# vim /etc/yum.repos.d/rhel7.repo [rhel7] name=rhel7 baseurl=file:///media/cdrom enabled=1 gpgcheck=0 第3步:接下来就要试试动手安装Apache服务程序啦,需要注意使用yum命令安装软件时后面写的是服务程序的名字,而apache服务的软件包名称叫做httpd,直接执行yum install apache命令则是会报错误的。 [root@linuxprobe ~]# yum install httpd Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分输出信息……………… Dependencies Resolved Package Arch Version Repository Size Installing: httpd x86_64 2.4.6-17.el7 rhel 1.2 M Installing for dependencies: apr x86_64 1.4.8-3.el7 rhel 103 k apr-util x86_64 1.5.2-6.el7 rhel 92 k httpd-tools x86_64 2.4.6-17.el7 rhel 77 k mailcap noarch 2.1.41-2.el7 rhel 31 k Transaction Summary Install 1 Package (+4 Dependent packages) Total download size: 1.5 M Installed size: 4.3 M Is this ok [y/d/N]: y Downloading packages: ………………省略部分输出信息……………… Complete! 第4步:把httpd服务程序启动并加入到开机启动项中,让Web服务程序能够随系统开机而启动运行: [root@linuxprobe ~]# systemctl start httpd [root@linuxprobe ~]# systemctl enable httpd ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service' 当各位同学们打开火狐浏览器后键入http://127.0.0.1,如图10-3所示,然后就可以看到httpd服务网站的默认页面啦。 [root@linuxprobe ~]# firefox
图10-3 httpd服务网站的默认页面
10.2.配置服务文件参数 先慢着别激动!!刚刚学会的安装和运行只是学习httpd服务程序成功路上的一小步而已,对于Linux系统中服务的配置就是在修改其配置文件,因此还需要知道这些配置文件分别干什么用的,以及存放到了什么位置: 服务目录-/etc/httpd 主配置文件-/etc/httpd/conf/httpd.conf 网站数据目录-/var/www/html 访问日志-/var/log/httpd/access_log 错误日志-/var/log/httpd/error_log 初次打开httpd服务程序的主配置文件后一定会被吓一跳,竟然有353行呢!这不用一个礼拜时间是看不完的吧,但其实只要仔细看一下就会发现刘遄老师是在吓唬大家呢,因为所有以#(井号)开始的都叫做注释行,这些是对httpd服务程序的功能或某一行参数的介绍而已,咱们不需要逐行去研究这些东西~如图10-4所示,httpd服务程序的配置文件内容大致可以分为三个类型:“注释行信息”,“全局配置”,“区域配置”。
图10-4 httpd服务配置文件内容的用处 学习过第4章Shell脚本课程的同学应该对注释信息并不陌生,主要需要讲解的是全局配置参数与区域配置参数的区别,全局配置参数顾名思义就是一种全局性的配置参数,这些全局配置参数对所有的子站点都是都是生效的,既保证了子站点的正常访问,还有效减少了频繁写入重复参数的工作量,而区域配置参数则是针对于每个独立子站点进行的特殊参数设置,就像以前在大学食堂里面打饭,食堂阿姨不必多言,先给每位同学来一碗标准大小的白饭,然后具体想吃的菜可以由同学们自己指定要求。在httpd服务程序主配置文件中最为常用的参数包括有: ServerRoot-服务目录 ServerAdmin-管理员邮箱 User-运行服务的用户 Group-运行服务的用户组 ServerName-网站服务器的域名 DocumentRoot-网站数据目录 Listen-监听的IP地址与端口号 DirectoryIndex-默认的索引页页面 ErrorLog-错误日志文件 CustomLog-访问日志文件 Timeout-网页超时时间,默认为300秒. Include-需要加载的其他文件 从上面参数中可以得知DocumentRoot正是用于定义网站数据保存路径的参数,其参数的默认值是把网站数据存放到了/var/www/html目录中的,而网站首页的名称应该叫做index.html,因此可以手动的向这个目录中写入一个文件来替换掉httpd服务程序的默认网页,这种操作是立即生效的,因此再刷新页面后会看到网页内容已经变了,如图10-5所示。 [root@linuxprobe ~]# echo "Welcome To LinuxProbe.Com" > /var/www/html/index.html [root@linuxprobe ~]# firefox
图10-5 网页内容已经被修改 这样一试果然成功了,原来真的不是很难,信心大涨!默认的网站数据是保存在了/var/www/html目录中,而如果想把网站数据目录修改定义为/home/wwwroot目录,该如何操作呢。 第1步:建立网站数据保存目录,并创建网页首页文件: [root@linuxprobe ~]# mkdir /home/wwwroot [root@linuxprobe ~]# echo "The New Web Directory" > /home/wwwroot/index.html 第2步:打开httpd服务程序的主配置文件,找到大约在119行附近的DocumentRoot参数以及大约在123行附近的,修改后记得保存: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113 114 # 115 # DocumentRoot: The directory out of which you will serve your 116 # documents. By default, all requests are taken from this directory, bu t 117 # symbolic links and aliases may be used to point to other locations. 118 # 119 DocumentRoot "/home/wwwroot" 120 121 # 122 # Relax access to content within /var/www. 123 # 124 <Directory "/home/wwwroot"> 125 AllowOverride None 126 # Allow open access: 127 Require all granted 128 </Directory> ………………省略部分输出信息……………… [root@linuxprobe ~]# 第3步:重新启动httpd服务程序后便可验证效果啦,如图10-6所示,但是好奇怪!!为什么看到了默认页面?一般只有在网站首页文件不存在或权限不足的情况才会显示httpd服务程序默认页面的,当咱们试试进一步访问到http://127.0.0.1/index.html页面时更会惊讶的发现,页面中会提醒说“Forbidden,You don't have permission to access /index.html on this server.”,访问操作是没有被允许的,而这正是SELinux在“捣乱”呢。 [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox
图10-6 httpd服务程序默认页面
10.3.SELinux安全子系统 SELinux全称为Security-Enhanced Linux是美国国家安全局在Linux开源社区帮助下开发的一个MAC强制访问控制的安全子系统,在红帽RHEL7系统中启用SELinux技术的目的是为了让各个服务进程都受到约束,仅能获取到服务本应获取到的资源。例如您在自己的电脑上下载了一个美图软件,正在全神贯注得把自己P瘦点的时候,这款软件却在后台默默监听着浏览器中输入的密码信息,这显然不应该是这款美图软件本应做的事情(即便是访问电脑中的图片资源都情有可原),SELinux安全系统就是为了杜绝此类情况而设计的,它能够从多方面进行违法行为监控,首先是对服务进程进行功能限制,SELinux域限制技术让服务程序做不了出格的事情,其次还能够对文件进行资源限制,SELinux安全上下文让文件只能被所属于的服务程序所获取到。 刘遄老师经常会把SELinux域和SELinux安全上下文比喻成双管齐下,系统内的服务程序只能规规矩矩的拿到自己所应该获取的资源,这样即便黑客入侵了咱们的系统也毫无办法,但非常可惜的是由于SELinux服务比较复杂,配置起来的难度也较高,加之很多运维人员对这项技术理解不深,导致SELinux服务在很多服务器部署系统后就被直接禁用了,但这绝对不是明智的选择。SELinux服务有三种模式分别为:enforcing - 安全策略强制启用模式,将会拦截服务的不合法请求,permissive - 遇到服务越权访问只会发出警告而不强制拦截,disabled - 对于越权的行为不警告,也不拦截。在您手中这本《Linux就该这么学》一书中的所有实验都是在SELinux服务强制启用模式下进行的,虽然关闭了SELinux服务后确实能够减少服务报错几率,但这在生产环境中极其的不安全,同学们可以手工检查下SELinux服务主配置文件中定义的默认状态是什么,如果发现是permissive或disabled的话就赶紧改过来吧: [root@linuxprobe ~]# vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection. SELINUXTYPE=targeted SELinux服务的主配置文件定义的是默认运行状态,您也可以理解成是系统重启后的状态,并不是当前立即生效的,要想获得当前SELinux服务的运行模式可以使用getenforce命令: [root@linuxprobe ~]# getenforce Enforcing 原来如此,为了确认是这个讨厌的SELinux服务在“捣乱”,咱们可以用setenforce [0|1]命令来修改下当前服务的运行模式(0为禁用,1为启用),但这种修改只是临时的,重启后就会失效: [root@linuxprobe ~]# setenforce 0 [root@linuxprobe ~]# getenforce Permissive 这样再刷新网页后就会看到正常的网页内容了,果然问题是出在了SELinux服务上面,如图10-7所示: [root@linuxprobe wwwroot]# firefox
图10-7 正常看到网页内容 那么回忆下刚刚的操作中到底哪里做错了呢?httpd服务程序的功能就是让用户能够访问到网站内容,因此让SELinux对网页访问功能肯定是默认允许的,但刚刚把保存网站数据的默认路径修改为了/home/wwwroot目录,这似乎就产生问题了,因为前面在第6章6.1小节中学习过/home目录是用来存放普通用户家目录数据的地方,也就是说现在httpd提供的网站服务却要去获取普通用户家目录中的数据了,这个行为触犯SELinux服务的监管项目。既然已经找出问题所在了,就先把SELinux服务恢复到强制启用模式吧,然后分别查看下原始网站数据目录与当前网站数据目录在SELinux安全上下文值上是否有不同呢: [root@linuxprobe ~]# setenforce 1 [root@linuxprobe ~]# ls -Zd /var/www/html drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html [root@linuxprobe ~]# ls -Zd /home/wwwroot drwxrwxrwx. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot 在文件上面设置的SELinux安全上下文是由用户段、角色段以及类型段等等多个信息项目共同组成的,用户段中system_u代表系统进程身份,角色段object_r代表文件目录角色,类型段httpd_sys_content_t代表是网站服务系统文件。由于SELinux服务实在过于复杂,因此现在您只需要简单熟悉SELinux服务的作用就可以,刘遄老师会在进阶篇书籍中单独拿出一个章节来仔细讲解SELinux服务的。现在这种情况的解决办法就是把当前网站目录/home/wwwroot的SELinux安全上下文修改为跟原始网站目录的一样就可以啦。 semanage命令用于查询与修改SELinux的安全上下文,格式为:“semanage [选项] [文件]”。 SELinux服务极大的增强了Linux系统的安全性,将用户权限牢牢地锁在笼子里,semanage命令不仅能够像传统chcon命令一样对文件、目录进行策略设置,而且还能够对网络端口、消息接口等等进行管理,这些新特性咱们会在本章中慢慢感受。在使用semanage命令的时候有几个比较常用的参数,-l参数用于查询、-a参数用于添加、-m参数用于修改、-d参数用于删除等等,例如可以向新的网站数据目录中新增加一条SELinux安全上下文,让这个目录以及里面的所有文件能够被httpd服务程序所获取到: [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/* 不过仅仅是这样设置完还不能让网站立即恢复访问,还需要使用restorecon命令来让刚刚设置的SELinux安全上下文立即生效,可以加上-Rv参数指定进行对目录的递归操作以及显示SELinux安全上下文的修改过程,最后再来刷新一下页面就能正常看到网页内容了,如图10-8所示。 [root@linuxprobe ~]# restorecon -Rv /home/wwwroot/ restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox
图10-8 正常看到网页内容 真可谓是一波三折,原本认为只要把httpd服务程序配置妥当就可以大功告成,结果却反复遭受到了SELinux安全上下文的限制,看来真是要细心才行,而且SELinux服务并没有大家想象中的那么难吧。 因为在红帽RHCSA、RHCE或RHCA考试后都要重启您的实验机再执行判分脚本。 所以请读者在日常工作中也要记得将需要的服务加入到开机启动项中:"systemctl enable httpd"。
10.4.个人用户主页功能 如果想为系统中每位用户都建立一个独立的网站,通常的方法只能是基于虚拟网站主机功能来部署出多个网站,但这未免会让管理员感觉到很麻烦,而且在用户管理自己网站的时候还可能碰到种种权限的限制,产生出很多不必要的工作。其实如果只是想为每位用户建立独立的网站,不妨试试httpd服务程序提供的个人用户主机功能吧,这项功能可以让系统内所有的用户在自己的家目录中管理个人的网站,访问起来也非常容易。 第1步:httpd服务程序中的个人用户主页功能默认是没有被开启的,咱们需要编辑下面的配置文件,然后第17行左右的UserDir disabled参数前面加上#(井号),这样代表让httpd服务程序开启个人用户主页功能,同时再把第23行左右的UserDir public_html参数前面的#(井号)去掉,该参数代表网站数据在用户家目录中的保存目录名称(即public_html目录),最后一定要记得保存下哦: [root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 1 # 2 # UserDir: The name of the directory that is appended onto a user's home 3 # directory if a ~user request is received. 4 # 5 # The path to the end user account 'public_html' directory must be 6 # accessible to the webserver userid. This usually means that ~userid 7 # must have permissions of 711, ~userid/public_html must have permissions 8 # of 755, and documents contained therein must be world-readable. 9 # Otherwise, the client will only receive a "403 Forbidden" message. 10 # 11 <IfModule mod_userdir.c> 12 # 13 # UserDir is disabled by default since it can confirm the presence 14 # of a username on the system (depending on home directory 15 # permissions). 16 # 17 # UserDir disabled 18 19 # 20 # To enable requests to /~user/ to serve the user's public_html 21 # directory, remove the "UserDir disabled" line above, and uncomment 22 # the following line instead: 23 # 24 UserDir public_html 25 </IfModule> 26 27 # 28 # Control access to UserDir directories. The following is an example 29 # for a site where these directories are restricted to read-only. 30 # 31 <Directory "/home/*/public_html"> 32 AllowOverride FileInfo AuthConfig Limit Indexes 33 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec 34 Require method GET POST OPTIONS 35 </Directory> 第2步:在用户家目录中建立用于保存网站数据的目录及首页文件,另外需要把家目录的权限修改为755,保证其他人也可以有权限读取里面的网页内容: [root@linuxprobe home]# su - linuxprobe Last login: Fri May 22 13:17:37 CST 2017 on :0 [linuxprobe@linuxprobe ~]$ mkdir public_html [linuxprobe@linuxprobe ~]$ echo "This is linuxprobe's website" > public_html/index.html [linuxprobe@linuxprobe ~]$ chmod -Rf 755 /home/linuxprobe 第3步:重新启动httpd服务程序,打开浏览器中输入网址后加上~用户名,理论上来讲就可以看到用户的个人主页网站,不过不出所料的依然是报错页面,一定还是SELinux在跟咱们“捣鬼”啦,如图10-9所示:
图10-9 访问个人用户主页被禁止 第4步:首先需要先思考下这次报错的原因是什么,httpd服务程序提供个人用户主页功能的网站数据目录本身就应该是存放到每个用户家目录中的,所以对于文件上面的SELinux安全上下文应该是不需要修改,但除此之外还有个Linux域,这个是负责管理让服务程序不能做违规的动作,只能本本分分的为用户服务,但突然开启的这项个人用户主页功能到底有没有被默认允许呢?咱们可以用getsebool命令来查询并过滤出所有跟http服务相关的安全策略,off为禁止状态,on为允许状态: [root@linuxprobe ~]# getsebool -a | grep http httpd_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_connect_ftp --> off httpd_can_connect_ldap --> off httpd_can_connect_mythtv --> off httpd_can_connect_zabbix --> off httpd_can_network_connect --> off httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> off httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> off httpd_dbus_sssd --> off httpd_dontaudit_search_dirs --> off httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_graceful_shutdown --> on httpd_manage_ipa --> off httpd_mod_auth_ntlm_winbind --> off httpd_mod_auth_pam --> off httpd_read_user_content --> off httpd_run_stickshift --> off httpd_serve_cobbler_files --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_sys_script_anon_write --> off httpd_tmp_exec --> off httpd_tty_comm --> off httpd_unified --> off httpd_use_cifs --> off httpd_use_fusefs --> off httpd_use_gpg --> off httpd_use_nfs --> off httpd_use_openstack --> off httpd_use_sasl --> off httpd_verify_dns --> off named_tcp_bind_http_port --> off prosody_bind_http_port --> off 对于如此多的SELinux域功能策略,实在没有必要逐个去理解它们,只要能通过名字大致猜测出相关的策略作用就足够了。比如想开启httpd服务的个人用户主页功能,那么用到的SELinux策略应该是httpd_enable_homedirs吧?大致确定后就可以用setsebool命令来修改SELinux策略中各项规则的布尔值了,同学们一定要记得加上-P参数让修改过后的SELinux布尔值策略项目永久生效这样操作后也会是立即生效的,随后刷新下网页看看效果把,如图10-10所示: [root@linuxprobe ~]# setsebool -P httpd_enable_homedirs=on [root@linuxprobe ~]# firefox
图10-10 正常看到个人用户主页中的网页内容 当把个人用户网站功能实现之后也会遇到一个很尴尬的显示——或许用户们并不希望直接就把网页内容显示出来,或者只想让部分读者看到里面的内容,这时就可以给网站上面加上口令验证功能啦,给网页内容增加一道安全防护吧。 第1步:需要先用htpasswd命令来生成密码数据库,-c参数代表第一次生成的意思,后面再分别追加上要生成到哪个文件中,以及验证要用到的用户名称即可(该用户不必是系统中已有的帐户) [root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe New password: Re-type new password: Adding password for user linuxprobe 第2步:需要再回去编辑一下个人用户主页功能的配置文件,把原本大约31-35行的参数信息修改成下列内容,其中#(井号)开头的内容为刘遄老师添加的注释信息,您无需照抄进去,保存退出后重启httpd服务程序即可生效。 [root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf # # Control access to UserDir directories. The following is an example # for a site where these directories are restricted to read-only. # <Directory "/home/*/public_html"> AllowOverride all #刚刚生成出来的密码验证文件保存路径 authuserfile "/etc/httpd/passwd" #当用户尝试访问个人用户网站时的提示信息 authname "My privately website" authtype basic #用户进行帐号口令登陆时需要验证的用户名称 require user linuxprobe </Directory> [root@linuxprobe ~]# systemctl restart httpd 此时用户再想访问某个用户的个人网站时,就必须要输入密码后才能正常访问了,另外验证时候的帐号和密码是用htpasswd命令生成的专门用于网站登陆的口令密码,而不是咱们系统中的用户密码,这一定不要搞混了哦,登陆界面如图10-11所示:
图10-11 网站提示需要口令验证才能进入
10.5.虚拟网站主机功能 如果在每台Linux系统的服务器上面只能运行着一个网站,那么人气低流量小的草根站长就要反而承担着高昂的服务器租用费了,这显然也会造成很大硬件资源浪费,于是在VPS与云计算技术诞生以前,IDC服务供应商们为了能够让服务器资源更充分被合理的使用,也为了降低购买门槛,于是便纷纷使用了虚拟主机功能。虚拟主机就是把一台运行着的物理服务器上面分割出多个“虚拟的服务器”,但这项技术不能够实现目前云主机技术的硬件资源隔离,而是让这些网站共同使用服务器的硬件资源,一般供应商只会去限制硬盘的使用空间大小,这种服务器资源供应方式目前还有企业在使用着。Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号实现提供多个网站同时为外部提供访问服务的技术,如图10-12所示,用户请求的资源不同,因此最终获取到的网页内容也就各不相同了,没有亲身做过网站的同学们或许还不太了解其中的原理,待会搭建出了实验环境后看到效果,您一定就会明白了,刘遄老师再次提醒同学们,在做每个实验之前请先还原下虚拟机到最初始状态,以免多个实验之间产生冲突。
图10-12 用户请求网站资源
10.5.1.基于IP地址 当一台服务器上面拥有多个IP地址,用户通过请求访问不同的IP地址时会取得不同的网站页面资源,另外让每个网站都拥有一个独立IP地址对搜索引擎SEO优化也有很大的好处,因此这种虚拟主机的提供方式不仅是最常见的,也是更受站长朋友欢迎的。刘遄老师在第4章、第9章分别教给同学们配置网卡的两种方法,实验和工作中用任何一种方法都是可以的,配置IP地址如图10-13所示,并在重启网卡服务后如图10-14所示一样进行网络连通性检查,保证三个IP地址均可正常访问(这项很重要,一定要测试好再进行下一步!):
图10-13 使用nmtui命令配置网卡参数
图10-14 分别检查3个IP地址的连通性 第1步:分别在/home/wwwroot中创建三个用于保存不同网站数据的目录,并向其中分别写入网站的首页文件,每个首页文件中应有明确区分不同网站内容的字样信息,方便咱们稍后能更直观的检查效果: [root@linuxprobe ~]# mkdir -p /home/wwwroot/10 [root@linuxprobe ~]# mkdir -p /home/wwwroot/20 [root@linuxprobe ~]# mkdir -p /home/wwwroot/30 [root@linuxprobe ~]# echo "IP:192.168.10.10" > /home/wwwroot/10/index.html [root@linuxprobe ~]# echo "IP:192.168.10.20" > /home/wwwroot/20/index.html [root@linuxprobe ~]# echo "IP:192.168.10.30" > /home/wwwroot/30/index.html 第2步:在httpd服务的配置文件中大约113行处,分别追加写入三个基于IP地址的虚拟主机网站参数,保存退出文件后记得要重启httpd服务才能生效哦: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… <VirtualHost 192.168.10.10> DocumentRoot /home/wwwroot/10 ServerName www.linuxprobe.com <Directory /home/wwwroot/10 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.10.20> DocumentRoot /home/wwwroot/20 ServerName bbs.linuxprobe.com <Directory /home/wwwroot/20 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.10.30> DocumentRoot /home/wwwroot/30 ServerName tech.linuxprobe.com <Directory /home/wwwroot/30 > AllowOverride None Require all granted </Directory> </VirtualHost> ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd 第3步:此时同学们尝试访问网站会看到默认页面,那么思考一下很快就会反应过来还是SELinux在“捣乱”吧,由于当前的/home/wwwroot目录及里面的网站数据目录的SELinux安全上下文与网站服务不吻合,因此httpd服务程序当前获取不到这些网站数据文件,需要手动把新的网站数据目录的SELinux安全上下文像刚刚一样设置好,最后记得使用restorecon命令让新设置的SELinux安全上下文立即生效,您便可以立即看到网站的访问效果了,如图10-15所示: [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/10 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/10/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/20 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/20/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/30 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/30/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox
图10-15 基于IP地址访问虚拟主机网站效果检验
10.5.2.基于主机域名 当服务器无法为每个网站都分配一个独立IP地址的时候,可以试试让apache自动识别用户请求的域名网址,从而根据这些不同的域名请求来传输不同的网页内容。这种情况配置起来更加的简单,生产环境中只需要保证服务器上面有一个可用的IP地址(192.168.10.10)就可以了,但是由于当前咱们还没有学习过配置DNS解析服务,因此现在还需要手工定义下IP地址与域名的对应关系,/etc/hosts文件是Linux系统的配置文件,它用于强制把某个主机域名解析到指定的IP地址上面,简单来说,只要配置对了这个文件,即便网卡参数中没有DNS参数信息也依然能够将域名网址解析到某个IP地址上面。 第1步:手工定义IP地址与域名网址的对应关系文件,保存退出后会立即生效,您可以通过分别ping这些域名来检验是否已经解析好: [root@linuxprobe ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.10 www.linuxprobe.com bbs.linuxprobe.com tech.linuxprobe.com [root@linuxprobe ~]# ping -c 4 www.linuxprobe.com PING www.linuxprobe.com (192.168.10.10) 56(84) bytes of data. 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.070 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.077 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.061 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.069 ms --- www.linuxprobe.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.061/0.069/0.077/0.008 ms [root@linuxprobe ~]# 第2步:分别在/home/wwwroot中创建三个用于保存不同网站数据的目录,并向其中分别写入网站的首页文件,每个首页文件中应有明确区分不同网站内容的字样信息,方便咱们一会更直观的检查效果: [root@linuxprobe ~]# mkdir -p /home/wwwroot/www [root@linuxprobe ~]# mkdir -p /home/wwwroot/bbs [root@linuxprobe ~]# mkdir -p /home/wwwroot/tech [root@linuxprobe ~]# echo "WWW.linuxprobe.com" > /home/wwwroot/www/index.html [root@linuxprobe ~]# echo "BBS.linuxprobe.com" > /home/wwwroot/bbs/index.html [root@linuxprobe ~]# echo "TECH.linuxprobe.com" > /home/wwwroot/tech/index.html 第3步:在httpd服务的配置文件中大约113行处,分别追加写入三个基于主机名的虚拟主机网站参数,保存退出文件后记得要重启httpd服务才能生效哦: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… <VirtualHost 192.168.10.10> DocumentRoot "/home/wwwroot/www" ServerName "www.linuxprobe.com" <Directory "/home/wwwroot/www"> AllowOverride None Require all granted </directory> </VirtualHost> <VirtualHost 192.168.10.10> DocumentRoot "/home/wwwroot/bbs" ServerName "bbs.linuxprobe.com" <Directory "/home/wwwroot/bbs"> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.10.10> DocumentRoot "/home/wwwroot/tech" ServerName "tech.linuxprobe.com" <Directory "/home/wwwroot/tech"> AllowOverride None Require all granted </directory> </VirtualHost> ………………省略部分输出信息……………… 第4步:因为当前的网站数据目录还是在/home/wwwroot中,因此还是必须要把网站数据目录文件上面的SELinux安全上下文设置好,让文件上面的SELinux安全上下文与网站服务功能相吻合,最后还是要记得用restorecon命令让新配置的SELinux安全上下文立即生效呢,这样虚拟主机网站就可以立即被访问到了,如图10-16所示: [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/www context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/www/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/bbs context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/bbs/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/tech context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/tech/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox
图10-16 基于主机域名访问虚拟主机网站效果检验
10.5.3.基于端口号 基于端口号的虚拟主机功能可以让用户通过访问服务器上面指定的端口号来找到想要访问的网站资源,而用apache配置虚拟主机功能中最复杂的也莫过于是基于端口号的了,因为不光需要考虑到httpd服务程序的配置因素,还需要考虑到SELinux服务对于新开设端口号的监控,占用服务器中80、443、8080类似的端口号是网站服务比较合理的请求,但再去占用其他的端口号就会遭受到SELinux服务的限制了,因此接下来的实验中既要考虑到文件上面SELinux安全上下文的限制,还要考虑到SELinux域对httpd网站服务程序功能的管控。 第1步:分别在/home/wwwroot中创建两个用于保存不同网站数据的目录,并向其中分别写入网站的首页文件,每个首页文件中应有明确区分不同网站内容的字样信息,方便稍后能更直观的检查效果: [root@linuxprobe ~]# mkdir -p /home/wwwroot/6111 [root@linuxprobe ~]# mkdir -p /home/wwwroot/6222 [root@linuxprobe ~]# echo "port:6111" > /home/wwwroot/6111/index.html [root@linuxprobe ~]# echo "port:6222" > /home/wwwroot/6222/index.html 第2步:在httpd服务的配置文件中大约43行后追加上监听6111和6222端口号的参数: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 33 # 34 # Listen: Allows you to bind Apache to specific IP addresses and/or 35 # ports, instead of the default. See also the <VirtualHost> 36 # directive. 37 # 38 # Change this to Listen on specific IP addresses as shown below to 39 # prevent Apache from glomming onto all bound IP addresses. 40 # 41 #Listen 12.34.56.78:80 42 Listen 80 43 Listen 6111 44 Listen 6222 ………………省略部分输出信息……………… 第3步:在httpd服务的配置文件中大约114行处,分别追加写入两个基于端口号的虚拟主机网站参数,保存退出文件后记得要重启httpd服务才能生效哦: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… <VirtualHost 192.168.10.10:6111> DocumentRoot "/home/wwwroot/6111" ServerName www.linuxprobe.com <Directory "/home/wwwroot/6111"> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.10.10:6222> DocumentRoot "/home/wwwroot/6222" ServerName bbs.linuxprobe.com <Directory "/home/wwwroot/6222"> AllowOverride None Require all granted </Directory> </VirtualHost> ………………省略部分输出信息……………… 第4步:还是因为把网站数据目录存放在了/home/wwwroot中,因此还是必须要把网站数据目录文件上面的SELinux安全上下文设置好,让文件上面的SELinux安全上下文与网站服务功能相吻合,最后还是要记得用restorecon命令让新配置的SELinux安全上下文立即生效呢: [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot/ restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6111 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6111/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6222 context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6222/index.html context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# systemctl restart httpd Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details. 什么?在把httpd服务程序和SELinux安全上下文都配置妥当后,重启服务为什么会竟然出现报错信息呢?这是因为SELinux服务检测到6111和6222端口原本不属于apache应该需要的服务资源,但现在却被以httpd服务程序的名义监听使用了,便会直接拒绝掉了,咱们可以用semanage命令查询并过滤出所有与http协议相关的端口号SElinux允许列表: [root@linuxprobe ~]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 第5步:SELinux允许http协议使用的端口号中默认没有包含咱们的6111和6222,因此需要手动的添加进去就可以了,操作会立即生效,且重启过后依然有效,因此设置后再重启一下httpd服务程序就能看到网页内容了,如图10-17所示: [root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111 [root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222 [root@linuxprobe ~]# semanage port -l| grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox
图10-17 基于端口号访问虚拟主机网站效果检验
10.6.Apache的访问控制 网站访问控制是可以基于来源主机名、IP地址或客户端浏览器特征等信息元素进行的网页资源控制,通过Allow或Deny指令实现允许或禁止某个主机访问服务器网站资源,其中Order指令用于定义Allow或Deny指令起作用的顺序,匹配原则是按顺序匹配规则并执行,若为匹配成功则执行后面的默认指令,比如说Order Allow,Deny代表先将客户端与允许规则进行对比,若匹配成功则允许请求,反而则会直接拒绝访问请求。 第1步:例如可以先在服务端网站数据目录中新建一个子目录,并向目录中写入一段内容的网页文件: [root@linuxprobe ~]# mkdir /var/www/html/server [root@linuxprobe ~]# echo "Successful" > /var/www/html/server/index.html 第2步:打开httpd服务程序的配置文件找到大约第129行左右,追加以下限制客户端访问的规则,含义是匹配所有浏览器为火狐(Firefox)的主机并允许他们访问,而除此之外的所有用户请求都将被拒绝,因此用火狐浏览器访问效果如图10-18所示: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… <Directory "/var/www/html/server"> SetEnvIf User-Agent "Firefox" ff=1 Order allow,deny Allow from env=ff </Directory> ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox
图10-18 火狐浏览器成功访问 除了匹配客户端的浏览器标识,咱们还可以通过匹配客户端的来源IP地址进行访问控制,例如想只允许来自于192.168.10.20的主机访问Web网站资源,那么就可以把刚刚的参数修改成如下所示,这样重启httpd服务程序后再用本机(服务端IP地址为192.168.10.10)来访问网站的子目录就会提示访问被拒绝了,很有意思吧~如图10-19所示: [root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf <Directory "/var/www/html/server"> Order allow,deny Allow from 192.168.10.20 Order allow,deny Allow from env=ie </Directory> [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox
图10-19 因IP地址不符合要求而被拒绝访问
本章节的复习作业 1:简述下Web网络服务的功能定义是什么? 答案:一种能够让用户通过浏览器访问到互联网中文档等资源的服务。 2:对于Nginx与Apache两款Web服务程序,Apache服务程序最大的优势是什么? 答案:主要体现在Apache服务程序的安全性、稳定性和跨平台性。 3:若httpd网站服务程序没有检查到首页文件,则会提示报错信息吗? 答案:并不会,未找到网站首页文件或SELinux策略限制时会展示给访客一个默认页面。 4:简述下Apache服务主配置文件中的“全局配置参数”、“区域配置参数”和“注释信息”的作用。 答案:全局配置参数是对全局性设置的参数,是对所有的子站点都有效力的参数,区域配置参数一般是针对于某个特定网站设置的参数,而注释信息一般是对服务功能或某一条参数进行解释说明的内容。 5:简述下SELinux服务的作用是什么? 答案:让各个服务进程都受到约束,仅能获取到服务本应获取到的资源。 6:使用getenforce命令查看到当前SELinux服务模式是Permissive,代表强制开启模式吗。 答案:绝对的错误,强制开启模式是"enforcing",当前是只警告而不禁止的运行模式。 7:使用semanage命令修改了文件上面SELinux安全上下文后还需要执行什么命令? 答案:需要再执行下restorecon命令,作用是让文件上面新的SELinux安全上下文参数立即生效。 8:要想查询并过滤出所有与http相关的SELinux域策略有那些,应该怎么做呢? 答案:可以结合管道符来实现,即执行getsebool -a | grep http命令。 9:对于Apache服务来讲,咱们可以基于那些资源来创建虚拟主机网站呢? 答案:可以基于IP地址、主机名(域名)或者端口号创建虚拟主机网站。 10:对于IP地址、主机名(域名)来讲的虚拟主机网站来讲,基于端口号的虚拟主机网站在配置过程中有哪些特点? 答案:在配置基于端口号的虚拟主机网站时首先必须要考虑到SELinux域中对服务器端口号资源的控制策略,其次还要在httpd服务程序的主配置文件中使用Listen参数来开启监听的端口号码。 |