10.1 网站服务程序
动手安装Apache服务程序。注意,使用yum命令进行安装时,跟在命令后面的Apache服务的软件包名称为httpd。如果直接执行yum install apache命令,则系统会报错。
[root@linuxprobe ~]# yum install httpd
启用httpd服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供Web服务:
[root@linuxprobe ~]# systemctl start httpd [root@linuxprobe ~]# systemctl enable httpd
10.2 配置服务文件参数
Linux系统中的配置文件
服务目录 /etc/httpd 主配置文件 /etc/httpd/conf/httpd.conf 网站数据目录 /var/www/html 访问日志 /var/log/httpd/access_log 错误日志
/var/log/httpd/error_log
ServerRoot | 服务目录 |
ServerAdmin | 管理员邮箱 |
User | 运行服务的用户 |
Group | 运行服务的用户组 |
ServerName | 网站服务器的域名 |
DocumentRoot | 网站数据目录 |
Listen | 监听的IP地址与端口号 |
DirectoryIndex | 默认的索引页页面 |
ErrorLog | 错误日志文件 |
CustomLog | 访问日志文件 |
Timeout | 网页超时时间,默认为300秒 |
把保存网站数据的目录修改为/home/wwwroot目录:将约第119行用于定义网站数据保存路径的参数DocumentRoot修改为/home/wwwroot,同时还需要将约第124行用于定义目录权限的参数Directory后面的路径也修改为/home/wwwroot。
做完上面的配置后,重新启动httpd服务程序并验证效果,看到了httpd服务程序的默认首页面。按理来说,只有在网站的首页面文件不存在或者用户权限不足时,才显示httpd服务程序的默认首页面。这是SELinux的问题。
10.3 SELinux安全子系统
RHEL 7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。
对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。
SELinux服务有三种配置模式,具体如下:
[root@linuxprobe ~]# vim /etc/selinux/config
SELinux服务的主配置文件中,定义的是SELinux的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用getenforce命令获得当前SELinux服务的运行模式。
为了确认图10-6所示的结果确实是因为SELinux而导致的,可以用setenforce [0|1]命令修改SELinux当前的运行模式(0为禁用,1为启用)。注意,这种修改只是临时的,在系统重启后就会失效。
httpd服务程序的功能是允许用户访问网站内容,因此SELinux肯定会默认放行用户对网站的请求操作。但是,我们将网站数据的默认保存目录修改为了/home/wwwroot,而这就产生问题了。在6.1小节中讲到,/home目录是用来存放普通用户的家目录数据的,而现在,httpd提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了SELinux的监管原则。
查看文件的上下文:
[root@linuxprobe ~]# ls -Zd /var/www/html drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html (由用户段、角色段以及类型段等多个信息项,说明文件被谁所用)
semanage命令
semanage命令用于管理SELinux的策略,格式为“semanage [选项] [文件]”。
可以向新的网站数据目录中新添加一条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安全上下文立即生效。在使用restorecon命令时,可以加上-Rv参数对指定的目录进行递归操作,以及显示SELinux安全上下文的修改过程。
[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/
10.4 个人用户主页功能
如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。
第1步:在httpd服务程序中,默认没有开启个人用户主页功能。
[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 17 # UserDir disabled 24 UserDir public_html (UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)
第2步:在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把家目录的权限修改为755,保证其他人也有权限读取里面的内容。
第3步:重新启动httpd服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格),从理论上来讲就可以看到用户的个人网站了。
第4步:httpd服务程序在提供个人用户主页功能时,该用户的网站数据目录本身就应该是存放到与这位用户对应的家目录中的,所以应该不需要修改家目录的SELinux安全上下文。但是,前文还讲到了SELinux域的概念。SELinux域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。httpd服务中突然开启的这项个人用户主页功能到底有没有被SELinux域默认允许呢?
使用getsebool命令查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态。
[root@linuxprobe ~]# getsebool -a | grep http httpd_enable_homedirs --> off [root@linuxprobe ~]# setsebool -P httpd_enable_homedirs=on 一定要记得在setsebool命令后面加上-P参数,让修改后的SELinux策略规则永久生效且立即生效。
有时,网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户访客看到里面的内容,这时就可以在网站中添加口令功能了。
第1步:先使用htpasswd命令生成密码数据库。-c参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。
[root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe
第2步:编辑个人用户主页功能的配置文件。把第31~35行的参数信息修改成下列内容:
[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 3132 AllowOverride all #刚刚生成出来的密码验证文件保存路径 33 authuserfile "/etc/httpd/passwd" #当用户尝试访问个人用户网站时的提示信息 34 authname "My privately website" 35 authtype basic #用户进行账户密码登录时需要验证的用户名称 36 require user linuxprobe 37 [root@linuxprobe ~]# systemctl restart httpd
10.5 虚拟网站主机功能
利用虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是,该技术无法实现目前云主机技术的硬件资源隔离,让这些虚拟的服务器共同使用物理服务器的硬件资源,供应商只能限制硬盘的使用空间大小。
10.5.1 基于IP地址
使用nmtui配置IP地址(systemctl restart network,并测试测试连通性):
第1步:分别在/home/wwwroot中创建用于保存不同网站数据的3个目录,并向其中分别写入网站的首页文件。
[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 ………………省略部分输出信息……………… 113114 DocumentRoot /home/wwwroot/10 115 ServerName www.linuxprobe.com 116 117 AllowOverride None 118 Require all granted 119 120 121122 DocumentRoot /home/wwwroot/20 123 ServerName bbs.linuxprobe.com 124 125 AllowOverride None 126 Require all granted 127 128 129130 DocumentRoot /home/wwwroot/30 131 ServerName tech.linuxprobe.com 132 133 AllowOverride None 134 Require all granted 135 136 ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd
第3步:此时访问网站,则会看到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/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
10.5.2 基于主机域名
[root@linuxprobe ~]# vim /etc/hosts 192.168.10.10 www.linuxprobe.com bbs.linuxprobe.com tech.linuxprobe.com
[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
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113114 DocumentRoot "/home/wwwroot/www" 115 ServerName "www.linuxprobe.com" 116 117 AllowOverride None 118 Require all granted 119 120 121122 DocumentRoot "/home/wwwroot/bbs" 123 ServerName "bbs.linuxprobe.com" 124 125 AllowOverride None 126 Require all granted 127 128 129130 DocumentRoot "/home/wwwroot/tech" 131 ServerName "tech.linuxprobe.com" 132 133 AllowOverride None 134 Require all granted 135 136 ………………省略部分输出信息………………
[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
10.5.3 基于端口号
不但要考虑到目录上应用的SELinux安全上下文的限制,还需要考虑SELinux域对httpd服务程序的管控。
[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
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf 43 Listen 6111 44 Listen 6222
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113114 DocumentRoot "/home/wwwroot/6111" 115 ServerName www.linuxprobe.com 116 117 AllowOverride None 118 Require all granted 119 120 121122 DocumentRoot "/home/wwwroot/6222" 123 ServerName bbs.linuxprobe.com 124 125 AllowOverride None 126 Require all granted 127 128 ………………省略部分输出信息………………
[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/
因为SELinux服务检测到6111和6222端口原本不属于Apache服务应该需要的资源,但现在却以httpd服务程序的名义监听使用了,所以SELinux会拒绝使用Apache服务使用这两个端口。我们可以使用semanage命令查询并过滤出所有与HTTP协议相关且SELinux服务允许的端口列表。 [root@linuxprobe ~]# semanage port -l | grep http
[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111 [root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222
10.6 Apache的访问控制
过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order指令,这个指令用来定义Allow或Deny指令起作用的顺序。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 129130 SetEnvIf User-Agent "Firefox" ff=1 131 Order allow,deny 132 Allow from env=ff 133