本章讲解什么是 Web 服务程序以及 Web 服务程序的用处,通过对比当前主流的 Web 服务来更好地理解其各自的优势及特点;对其中 httpd 服务程序中
“全局配置参数”“区域配置参数”及“注释信息”的理论讲解和实战部署。
还会讲解 SELinux 服务的作用、3 种工作模式以及策略管理方法,理解 SELinux 域和 SELinux 安全上下文的配置方法,并依次完成多个基于 httpd 服务程序的实用功能的部署实验,其中包括 httpd 服务程序的基本部署、个人用户主页功能和密码加密认证方式的实现,以及分别基于 IP 地址、主机名(域名)、端口号部署虚拟主机网站功能。
10.1 网站服务程序
1970 年作为互联网前身的 ARPANET(阿帕网)已初具雏形,并开始向非军用部门开放,许多大学和商业机构开始陆续接入。虽然当时阿帕网的规模只有 4 台主机联网运行,但不影响其为 web 技术的进步打下了扎实的基础。
我们平时访问的各种网站就是
Web 网络服务,一般是指允许用户通过浏览器访问互联网中各种资源的服务;Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或 HTTPS(安全超文本传输协议)把请求的内容传送给用户。
目前主流的 Web 网络服务的程序有 IIS、Nginx 和 Apache 等。其中,IIS(Internet
Information Service,互联网信息服务)是 Windows 系统中默认的 Web 服务程序,这是一款图形化的网站管理工具,不仅可以提供 Web 网站服务,还可以提供 FTP、NMTP、SMTP 等服务。IIS 默认只能在 Windows 系统中使用。
2004 年 10 月 4 日,为俄罗斯知名门户站点而开发的 Web 服务程序 Nginx 横空出世。Nginx
程序作为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领 Web 服务市场;但
Nginx 最被认可的还是其系统资源消耗低且并发能力强的特性,因此得到了国内诸如新浪、网易、腾讯等门户网站的青睐。(第 20 章学习 Nginx 服务程序)。
Apache 程序是目前拥有很高市场占有率的 Web 服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的 API 扩展。它的名字取自美国印第安人的土著语,寓意为“拥有高超的作战策略和无穷的耐性”。Apache
服务程序可以运行在 Linux ()系统、UNIX 系统甚至是 Windows 系统中,它支持基于 IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全 Socket 层(SSL),能够实时监视服务状态与定制日志消息,并支持各类丰富的模块。
下面安装 Apache 服务程序,需要注意的是 Apache 服务的软件包名称为 httpd;首先要配置好软件仓库 (见第4章) ,带-y 参数安装过程无需再确认。
启用 httpd 服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供 Web 服务。在浏览器(这里以 Firefox 浏览器为例)的地址栏中输入 http://127.0.0.1 并按回车键,就可以看到用于提供 Web 服务的默认页面了。
10.2 配置服务文件参数
在 Linux 系统中配置服务,其实就是修改服务的配置文件。首先需要知道这些配置文件的所在位置以及用途,主配置文件中保存的是最重要的服务参数,一般会被保存到/etc 目录中以软件名称命名的一个文件夹之中,名字为“服务名称.conf”,例如这里的“/etc/httpd/conf/httpd.conf”。httpd 服务程序的主要配置文件及存放位置如图。
首次打开 httpd 服务程序的主配置文件后,末行模式输入set number (启用行号显示) 竟然有 356 行!但是几乎在所有配置文件中以井号(#)开始的行都是注释行,其目的是对服务程序的功能或某一行参数进行介绍,我们不需要逐行研究这些内容。
在 httpd 服务程序的主配置文件中,存在 3 种类型的信息:注释行信息、全局配置、区域配置如图。
全局配置参数就是一种全局性的配置参数,应用于所有的子站点,有效降低频繁写入重复参数的工作量。区域配置参数则是单独针对每个独立的子站点生效,就像在食堂里面打饭,食堂负责打饭的人员先给我们米饭(全局配置),然后再根据不同人的具体要求盛他们想吃的菜(区域配置)。在 httpd 服务程序主配置文件中,最为常用的参数如图。
上图中 DocumentRoot 参数用于定义网站数据的保存路径,其路径的默认值是/var/www/html,而当前网站普遍的首页名称是
index.html;我们可以向/var/www/html/index.html 文件中写入一段内容,替换掉 httpd 服务程序的默认首页内容,该操作会立即生效。然后打开 Firefox 浏览器或点刷新页面,可以看到首页内容已经变成了自定义写入的英文。
如果想把默认网站数据的目录修改为 /home/www 目录,该怎么操作呢?首先创建网站数据的保存目录及首页文件;然后 vim 打开 httpd 服务程序的主配置文件,将约第 122 行用于定义网站数据保存路径的参数 DocumentRoot 修改为/home/www,同时还需要将约第 127 行与第 134 行用于定义目录权限的参数 Directory 后面的路径也修改为/home/www。配置文件修改完毕后即可保存并退出。
systemctl 重启 httpd 服务程序并验证效果,打开浏览器或刷新页面后,提示权限不足了?这是因为 SELinux 没有允许修改后的网站目录。
10.3 SELinux 安全子系统
SELinux(Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。Linux 系统使用 SELinux
技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
SELinux 安全子系统能够从多方面监控违规行为,对服务程序的功能进行限制(SELinux 域限制可以确保服务程序墨守成规);对文件资源的访问进行限制(SELinux 安全上下文确保文件资源只能被其所属的服务程序进行访问)。但是 SELinux 服务配置比较复杂,导致很多服务器在部署好 Linux
系统后运维工程师直接将 SELinux 禁用了。SELinux 服务有如下 3 种配置模式。
➢ enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
➢ permissive:遇到服务越权访问时,只发出警告而不强制拦截。
➢ disabled:对于越权的行为不警告也不拦截。
SELinux 服务的主配置文件 /etc/selinux/config,默认定义 SELinux 为运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用 getenforce 命令获得当前 SELinux
服务的运行模式。
为了确认 httpd 目录权限不足是因为 SELinux 而导致的,可以用 setenforce [0|1] 命令修改
SELinux 当前的运行模式(0 为禁用,1 为启用)。但是这种修改只是临时的,在系统重启后就会失效;关闭后再次刷新网页,就会看到正常的网页内容了。
httpd 服务程序的功能是允许用户访问网站内容,SELinux 肯定会默认放行用户对网站的请求操作,但是我们将网站数据的默认保存目录修改为 /home/www,这就产生问题了。/home 目录是用来存放普通用户的家目录数据,被改后 httpd 提供的网站服务却要去获取普通用户家目录中的数据,这显然违反了 SELinux 的监管原则。
把 SELinux 服务恢复到强制启用安全策略模式,然后分别查看原始网站数据的保存目录与当前网站数据的保存目录,对比是否有不同的 SELinux 安全上下文值。在下面 ls 命令中,-Z 参数用于查看文件的安全上下文值,-d 参数表示对象是目录文件夹。
SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。用户段 system_u 代表系统进程的身份,角色段 object_r 代表文件目录的角色,类型段 httpd_sys_content_t 代表网站服务的系统文件。针对当前这种情况只需要使用 semanage 命令,将当前网站目录/home/www 的SELinux 安全上下文修改为跟原始网站目录的一样就行了。
semanage 命令
semanage 命令用于管理 SELinux 的策略,英文全称为“SELinux manage”,语法格式为
“semanage [参数] [文件]”。semanage 命令不仅能够像传统的 chcon 命令那样设置文件、目录的策略,还能够管理网络端口、消息接口。使用 semanage 命令时,经常用到的几个参数如图。
向修改过的网站数据目录中新添加 SELinux 安全上下文,-t 参数上下文类型,让这个目录以及里面的所有文件能够被 httpd 服务程序访问到。还需要使用 restorecon 命令将设置好的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上-Rv 参数对指定的目录进行递归操作,以及显示 SELinux 安全上下文的修改过程。最后再次打开浏览器或刷新页面,就可以正常看到网页内容了。
10.4 个人用户主页功能
如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。但这个工作会让管理员苦不堪言(尤其是用户数量很庞大时),httpd 服务程序提供的个人用户主页功能完全可以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站。
httpd 服务默认没有开启个人用户主页功能,需要编辑配置文件 vim /etc/httpd/conf.d/userdir.conf,把第 17 行的 UserDir disabled 参数加注释(#),表示让 httpd 服务程序开启个人用户主页功能;再把第 24 行的 UserDir public_html 参数前面的注释(#)去掉(UserDir 参数表示网站数据在用户家目录中,即 public_html 目录)。
然后在用户家目录中建立 public_html 网站数据的目录及首页面文件,把家目录的权限修改为 755,保证其他人也有权限读取里面的内容。
重新启动 httpd 服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的~ 号是必需的,而且网址、~ 号、用户名之间没有空格)。这时再次显示报错页面,这一定还是 SELinux 惹的祸。
这次报错的原因是什么?httpd 服务程序在提供个人用户主页功能时,该用户的网站数据目录本身就应该是存放到与这位用户对应的家目录中的,所以应该不需要修改家目录的 SELinux 安全上下文;但是 SELinux 域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。在 httpd 服务中开启个人用户主页功能到底有没有被 SELinux 域默认允许呢?使用 getsebool 命令查询并过滤出所有与 HTTP 协议相关的安全策略。其中 off
为禁止状态,on 为允许状态。
看到这么多的 SELinux 域安全策略规则,没有必要逐个理解它们,只要能通过名字大致猜测出相关的策略用途就足够了;想要开启 httpd 服务的个人用户主页功能,用到的 SELinux 域安全策略应该是 httpd_enable_homedirs 可以用
setsebool 命令来修改 SELinux 策略中各条规则的布尔值。加上-P 参数让修改后的 SELinux 策略规则永久且立即生效。再次刷新网页正常显示了。
如果网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户看到里面的内容,这时就可以在网站中添加密码功能了。
先使用 htpasswd 命令生成密码数据库及访问用户(该用户不必是系统中已有的本地账户),-c 参数表示第一次生成。
再修改配置文件 /etc/httpd/conf.d/userdir.conf 分别添加密码数据库的存放文件,以及验证要用到的用户名称。把参数信息修改成下图标记内容 wq 保存退出,重启 httpd 服务程序即可生效。
完成后当用户再想访问某个用户的个人网站时,就必须输入账户和密码才能正常访问了。注意验证用户和本地用户同名时验证时密码是上面 htpasswd 命令生成的专门用于网站登录的密码,而不是系统本地的账户和密码。
10.5 虚拟主机功能
在虚拟专用服务器(Virtual Private Server,VPS)与云计算技术诞生以前,IDC 服务供应商为了能够更充分地利用服务器资源,同时也为了降低购买门槛,纷纷启用了虚拟主机功能;利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是无法实现目前云主机技术的硬件资源隔离,而只能让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。
Apache 的虚拟主机功能是基于用户请求的不同 IP 地址、主机域名或端口号,提供多个网站可同时被访问服务的技术。即用户请求的资源不同,最终获取到的网页内容也不相同。下面搭建出实验环境并实验效果,先将虚拟机还原到最初始的状态,以免多个实验之间产生冲突。
10.5.1 基于 IP 地址
如果一台服务器有多个 IP 地址,而且每个 IP 地址与服务器上部署的每个网站一一对应,这样当用户请求访问不同的 IP 地址时,会访问到不同网站的页面资源。
用于配置网络的方法有多种,这次用第9章配置过 nmtui ,需要配置的 IP 地址如 nmtui 图所示。在配置完毕并重启网络服务,首先得检查网络的连通性,确保 3 个 IP 地址均可正常访问。
虚拟机在快照恢复后有可能出现网络不通,重启真实机可解决。
分别在 /home/www 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站的内容信息,以防验证不清晰各自网站的首页内容。
从 httpd 服务的配置文件 /etc/httpd/conf/httpd.conf 大约第 132 行处开始,分别追加写入 3 个基于 IP 地址的虚拟主机网站参数,然后保存并退出。需要重启 httpd 服务配置才生效。
由于当前的/home/www 目录及里面的网站数据目录的 SELinux 安全上下文与网站服务不吻合,因此 httpd 服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的 SELinux 安全上下文设置正确(见前文的实验),并使用 restorecon 命令让新设置的 SELinux 安全上下文立即生效,最后还要检查一下防火墙,添加允许 http 的访问(见第8章);这样就可以立即看到网站的访问效果了。
10.5.2 基于主机域名
可以让 Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。只需要保证服务器上有一个可用的 IP 地址(这里以 192.168.187.128 为例)就可以了。由于当前还没有介绍如何配置 DNS 解析服务,因此需要手动定义 IP 地址与域名之间的对应关系。/etc/hosts 是 Linux 系统中用于把某个主机域名解析到指定 IP 地址的配置文件。
下面编辑配置文件 /etc/hosts 让域名能解析到对应的 IP ,保存并退出后立即生效,注意此操作针对的是客户端,如果用 Windows 访问配置文件路径则是 C:WindowsSystem32driversetchosts 。可以通过分别 ping 这些域名来验证域名是否已经成功解析为 IP 地址。前面2行为默认的条目可以无视。
分别在/home/www 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便稍后能更直观地检查效果。
从 httpd 服务的配置文件 /etc/httpd/conf/httpd.conf 大约第 132 行处开始,分别追加写入 3 个基于主机名的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务配置才生效。
由于当前的网站数据目录还是在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用
restorecon 命令让新配置的 SELinux 安全上下文立即生效,这样就可以立即访问到虚拟主机网站了,效果如图
10.5.3 基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用 Apache 配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。因此我们不仅要考虑 httpd 服务程序的配置因素,还需要考虑到 SELinux 服务对新开设端口的监控。一般来说,使用 80、443、8080 等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到 SELinux 服务的限制。
下面分别在/home/www 中创建用于保存不同网站数据的 3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便稍后能更直观地检查效果。
在 httpd 服务配置文件 /etc/httpd/conf/httpd.conf 的第 46 行~48 行分别添加用于监听 6100、6200 和 6300 端口的参数;
继续在第 134 行处开始,分别追加写入 3 个基于端口号的虚拟主机网站参数,然后保存并退出。需要重启 httpd 服务配置才生效。
同上我们把网站数据目录存放在/home/wwwroot 目录中,因此还是必须正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用
restorecon 命令让新配置的 SELinux 安全上下文立即生效。
在妥当配置 httpd 服务程序和 SELinux 安全上下文并重启 httpd 服务后,竟然出现报错信息。这是因为 SELinux 服务检测到 6100、6200 和 6300 端口原本不属于 Apache 服务应该需要的资源,但现在却以 httpd 服务程序的名义监听使用了,所以 SELinux 会拒绝使用
Apache 服务使用这 3 个端口。可以使用 semanage 命令查询并过滤出所有与 HTTP 协议相关且 SELinux 服务允许的端口列表。
SELinux 允许的与 HTTP 协议相关的端口号中默认没有包含 6100、6200 和 6300,因此需要将这 3 个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。设置好后重启 httpd 服务程序,然后就可以看到网页内容了。
10.6 Apache 的访问控制
Apache 可以基于源主机名、源 IP 地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过 Allow 指令允许某个主机访问服务器上的网站资源,通过 Deny 指令实现禁止访问。在允许或禁止访问网站资源时,还会用到 Order 指令,这个指令用来定义 Allow
或 Deny 指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
下面在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含 Successful 单词的首页文件。
打开 httpd 服务的配置文件,大约在第 159 行后面添加 5 行来限制源主机的访问。这段规则的含义是允许使用 Firefox 浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。设置好后重启 httpd 服务程序。
用360急速浏览器访问被拒绝;
用Firefox火狐浏览器访问成功。
除了匹配源主机的浏览器特征之外,还可以匹配源主机的 IP 地址进行访问控制。例如只允许 IP 地址为 192.168.187.135 的主机访问网站,那么就可以在 httpd 服务配置文件的上面添加的5行进行下修改。这样在重启 httpd 服务程序后即使用本机(即服务器, IP 地址为 192.168.187.128)来访问网站的首页时也会提示访问被拒绝。
服务器租用托管,机房租用托管,主机租用托管,https://www.e1idc.com