简介
本章主要介绍Apache Web服务程序以及通过对httpd服务程序中“全局配置参数”、“区域配置参数”及“注释信息”的理论讲解和实战部署Web服务程序的配置方法,同时讲解SELinux服务的作用、三种工作模式以及策略管理方法,多个基于httpd服务程序实用功能的部署实验,其中包括httpd服务程序的基本部署、个人用户主页功能和口令加密认证方式的实现,以及分别基于IP地址、主机名(域名)、端口号部署虚拟主机网站功能。
详情可参考:https://www.linuxprobe.com/chapter-10.html
命令行详解可参考:https://www.linuxcool.com
在Linux中,一切都是文件;配置系统服务就是修改对应服务的配置文件;
然后重启服务;还要将修改写入对应的配置文件去保证服务重启能够生效.
网站服务程序
Web网络服务指允许用户通过浏览器访问到互联网中各种资源的服务。
Web网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的Web服务器会通过HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户。
Web网络服务的程序:
Apache:跨平台,安全稳定并拥有快速、可靠、简单的API扩展
Nginx:轻量级,稳定,功能丰富,系统资源消耗低且并发能力强
Apache:网络服务程序
http:通信协议
httpd:网络通讯服务
Yum仓库安装httpd服务:
vim /etc/yum.repos.d/rhel7.repo
[rhel7]
name=rhel7
baseurl=file:///media/cdrom
enabled=1
gpgcheck=0
yum install httpd
启用httpd服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供Web服务:
sytemctl start httpd
systemctl enable httpd
firefox
配置服务文件参数
httpd服务程序的主要配置文件:
服务目录 /etc/httpd
主配置文件 /etc/httpd/conf/httpd.conf
网站数据目录 /var/www/html
访问日志 /var/log/httpd/access_log
错误日志 /var/log/httpd/error_log
全局配置参数与区域配置参数的区别:
全局配置参数就是一种全局性的配置参数,可作用于对所有的子站点,既保证了子站点的正常访问,也有效减少了频繁写入重复参数的工作量。
区域配置参数则是单独针对于每个独立的子站点进行设置的。
配置httpd服务程序时最常用的参数以及用途描述:
ServerRoot 服务目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 网站数据目录
Listen 监听的IP地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为300秒
DocumentRoot参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html目录中
当前网站普遍的首页面名称是index.html,因此可以向/var/www/html目录中写入一个文件,替换掉httpd服务程序的默认首页面,该操作会立即生效。
替换当前网站的首页:
echo "Welcom" > /var/www/html/index.html
firefox
在默认情况下,网站数据是保存在/var/www/html目录中,而如果想把保存网站数据的目录修改为/home/wwwroot目录,怎么操作呢?
# 建立首页文件
echo "The New Web Directory" > /home/wwwroot/index.html
# 修改网站数据保存路径
vim /etc/httpd/config/httpd.conf
DocumentRoot "/home/wwwroot" #/var/www/html改为/home/wwwroot
<Directory "/home/wwwroot"> #/var/www/html改为/home/wwwroot
# 重启服务并刷新浏览器
systemctl restart httpd
firefox
----SELinux权限问题
SELinux安全子系统
SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。
RHEL 7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
SELinux安全子系统双保险:
对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情);
对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。
SELinux服务有三种配置模式:
enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
permissive:遇到服务越权访问时,只发出警告而不强制拦截。
disabled:对于越权的行为不警告也不拦截。
SELinux服务主配置文件路径:/etc/selinux/config #重启后的状态
vim /etc/selinux/config
SELINUX=enforcing
可以使用getenforce命令获得当前SELinux服务的运行模式:
getenforce
Enforcing
setenforce 0 #临时修改方案
现在,我们来回忆一下前面的操作中到底是哪里出问题了呢?
httpd服务程序的功能是允许用户访问网站内容,因此SELinux肯定会默认放行用户对网站的请求操作。但是,我们将网站数据的默认保存目录修改为了/home/wwwroot,而这就产生问题了。
/home目录是用来存放普通用户的家目录数据的,而现在httpd提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了SELinux安全上下文的监管原则。
把SELinux服务恢复到强制启用安全策略模式,然后分别查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的SELinux安全上下文值:
setenforce 1
# ls -Z:print any SELinux security context of each file
# ls -d:list directory entries instead of contents, and do not dereference symbolic links
ls -Zd /var/www/html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
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代表网站服务的系统文件。
将当前网站目录/home/wwwroot的SELinux安全上下文修改为跟原始网站目录的一样就可以了。
semanage命令用于管理SELinux的策略
格式为“semanage [选项] [文件]”
SELinux服务极大地提升了Linux系统的安全性,将用户权限牢牢地锁在笼子里。
semanage命令常用的几个参数及其功能:
option:
fcontext Manage file context mapping definitions
-l参数用于查询;
-a参数用于添加;
-m参数用于修改;
-d参数用于删除。
-t参数代表修改类型段
# 路径不能写为/home/wwwroot/
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
# 使用restorecon命令将设置好的SELinux安全上下文立即生效
# -Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程
restorecon -Rv /home/wwwroot/
个人用户主页功能
httpd服务程序提供的个人用户主页功能:
该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。
vim /etc/httpd/conf.d.userdir.conf
17 # UserDir disabled #表示让httpd服务程序开启个人用户主页功能
24 UserDir public_html #UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录
su - linuxprobe #切换为linuxprobe用户
mkdir public_html #创建网络诗句保存目录
# 创建网络数据首页
echo "This is linuxprobe's website" > public_html/index.html
# 使其他用户也有读取权限
chmod -Rf 755 /home/linuxprobe
systemctl restart httpd
# 浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格)
192.168.10.10/~linuxprobe #页面中显示“Forbidden,You don't have permission to access /index.html on this server.”
#getsebool命令查询并过滤出所有与HTTP协议相关的安全策略
#off为禁止状态,on为允许状态
getsebool -a | grep http
#-P参数代表永久生效
setsebool -P httpd_enable_homedirs=on
firefox
#使用htpasswd命令生成密码数据库
htpasswd -c /etc/httpd/passwd linuxprobe
#编辑个人用户主页功能的配置文件/etc/httpd/conf.d/userdir.conf
vim /etc/httpd/conf.d/userdir.conf
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 all
#刚刚生成出来的密码验证文件保存路径
33 authuserfile "/etc/httpd/passwd"
#当用户尝试访问个人用户网站时的提示信息
34 authname "My privately website"
35 authtype basic
#用户进行账户密码登录时需要验证的用户名称
36 require user linuxprobe
37 </Directory>
#重启httpd服务程序
systemctl restart httpd
虚拟网站主机功能
虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。该技术无法实现目前云主机技术的硬件资源隔离,让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。
Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。
基于IP地址
如果一台服务器有多个IP地址,而且每个IP地址与服务器上部署的每个网站一一对应,这样当用户请求访问不同的IP地址时,会访问到不同网站的页面资源。而且,每个网站都有一个独立的IP地址,对搜索引擎优化也大有裨益。
使用nmtui配置网络服务,在同一个网卡设备上创建三个IP地址分别为:
IP:192.168.10.10;IP:192.168.10.20;IP:192.168.10.30
systemctl restart httpd
ping 192.168.10.20
ping 192.168.10.30
第1步:分别在/home/wwwroot中创建用于保存不同网站数据的3个目录,并向其中分别写入网站的首页文件。
mkdir -p /home/wwwroot/10
mkdir -p /home/wwwroot/20
mkdir -p /home/wwwroot/30
echo "IP:192.168.10.10" > /home/wwwroot/10/index.html
echo "IP:192.168.10.20" > /home/wwwroot/20/index.html
echo "IP:192.168.10.30" > /home/wwwroot/30/index.html
第2步:在httpd服务的配置文件中分别追加写入三个基于IP地址的虚拟主机网站参数,然后保存并退出。记得需要重启httpd服务,这些配置才生效。
vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
113 <VirtualHost 192.168.10.10>
114 DocumentRoot /home/wwwroot/10
115 ServerName www.linuxprobe.com
116 <Directory /home/wwwroot/10 >
117 AllowOverride None
118 Require all granted
119 </Directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.20>
122 DocumentRoot /home/wwwroot/20
123 ServerName bbs.linuxprobe.com
124 <Directory /home/wwwroot/20 >
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
129 <VirtualHost 192.168.10.30>
130 DocumentRoot /home/wwwroot/30
131 ServerName tech.linuxprobe.com
132 <Directory /home/wwwroot/30 >
133 AllowOverride None
134 Require all granted
135 </Directory>
136 </VirtualHost>
………………省略部分输出信息………………
systemctl restart httpd
第3步:此时访问网站,则会看到httpd服务程序的默认首页面。
由于当前的/home/wwwroot目录及里面的网站数据目录的SELinux安全上下文与网站服务不吻合,因此httpd服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的SELinux安全上下文设置正确,并使用restorecon命令让新设置的SELinux安全上下文立即生效,这样就可以立即看到网站的访问效果了。
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/*
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
基于主机域名
让Apache自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。
/etc/hosts是Linux系统中用于强制把某个主机域名解析到指定IP地址的配置文件。
基于主机域名和基于IP配置虚拟网络主机功能的区别主要是:
手工定义IP地址与域名之间对应关系的配置文件,保存并退出后会立即生效。可以通过分别ping这些域名来验证域名是否已经成功解析为IP地址。
其余步骤均相同
vim /etc/hosts
192.168.10.10 www.linuxprobe.com bbs.linuxprobe.com tech.linuxprobe.com
ping -c 4 tech.linuxprobe.com
基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用Apache配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。因此我们不仅要考虑httpd服务程序的配置因素,还需要考虑到SELinux服务对新开设端口的监控。一般来说,使用80、443、8080等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux服务的限制。
在接下来的实验中,我们不但要考虑到目录上应用的SELinux安全上下文的限制,还需要考虑SELinux域对httpd服务程序的管控。
第1步:分别在/home/wwwroot中创建用于保存不同网站数据的两个目录,并向其中分别写入网站的首页文件。
mkdir -p /home/wwwroot/6111
mkdir -p /home/wwwroot/6222
echo "port:6111" > /home/wwwroot/6111/index.html
echo "port:6222" > /home/wwwroot/6222/index.html
第2步:在httpd服务配置文件分别添加用于监听6111和6222端口的参数。
vim /etc/httpd/conf/httpd.conf
42 Listen 80
43 Listen 6111 #add
44 Listen 6222 #add
第3步:在httpd服务的配置文件中大约113行处开始,分别追加写入两个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启httpd服务,这些配置才生效。
vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
113 <VirtualHost 192.168.10.10:6111>
114 DocumentRoot "/home/wwwroot/6111"
115 ServerName www.linuxprobe.com
116 <Directory "/home/wwwroot/6111">
117 AllowOverride None
118 Require all granted
119 </Directory>
120 </VirtualHost>
121 <VirtualHost 192.168.10.10:6222>
122 DocumentRoot "/home/wwwroot/6222"
123 ServerName bbs.linuxprobe.com
124 <Directory "/home/wwwroot/6222">
125 AllowOverride None
126 Require all granted
127 </Directory>
128 </VirtualHost>
第4步:因为我们把网站数据目录存放在/home/wwwroot目录中,因此还是必须要正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合。最后记得用restorecon命令让新配置的SELinux安全上下文立即生效。
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/*
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/*
restorecon -Rv /home/wwwroot/`bash
出现报错信息是因为SELinux服务检测到6111和6222端口原本不属于Apache服务应该需要的资源,但现在却以httpd服务程序的名义监听使用了,所以SELinux会拒绝使用Apache服务使用这两个端口。
#查询并过滤出所有与HTTP协议相关且SELinux服务允许的端口列表
semanage port -l | grep http
第5步:SELinux允许的与HTTP协议相关的端口号中默认没有包含6111和6222,因此需要将这两个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。设置好后再重启httpd服务程序,然后就可以看到网页内容了。
semanage port -a -t http_port_t -p tcp 6111
semanage port -a -t http_port_t -p tcp 6222
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
systemctl restart httpd
firefox
Apache的访问控制
Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。它通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
第1步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含Successful单词的首页文件。
mkdir /var/www/html/server
echo "Successful" > /var/www/html/server/index.html
第2步:打开httpd服务的配置文件,添加下述规则来限制源主机的访问。这段规则的含义是允许使用Firefox浏览器的主机访问服务器上的首页文件,除此之外的所有请求都将被拒绝。
vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
129 <Directory "/var/www/html/server">
130 SetEnvIf User-Agent "Firefox" ff=1
131 Order allow,deny
132 Allow from env=ff
133 </Directory>
………………省略部分输出信息………………
systemctl restart httpd
firefox
通过匹配源主机的IP地址进行访问控制。
如只允许IP地址为192.168.10.20的主机访问网站资源,可以在httpd服务配置文件添加下述规则。这样在重启httpd服务程序后再用本机(即服务器,其IP地址为192.168.10.10)来访问网站的首页面时就会提示访问被拒绝了。
vim /etc/httpd/conf/httpd.conf
………………省略部分输出信息………………
129 <Directory "/var/www/html/server">
130 Order allow,deny
131 Allow from 192.168.10.20
132 </Directory>
………………省略部分输出信息………………
systemctl restart httpd
firefox