前面系列文章讲解了Linux下经过文件传输、文件共享、邮件系统来分享和获取资源,本文讲解网络资源获取和共享的另一种形式,经过Apache服务程序来提供Web服务。html
本文先讲解目前主流的Web服务程序以及各自的特色和优点,而后以Apache服务为例讲解Linux下Web网站的部署,并在部署过程当中穿插讲解SELinux的使用。最后在以示例讲解Apache的虚拟主机功能及访问控制。linux
咱们平时在互联网上访问的网站服务就是Web服务,好比咱们经常使用的百度网站,他就是一个Web网站。Web网络服务,通常是指容许用户经过浏览器访问到其中各类资源的服务。web
Web网络服务是一种被动访问的服务程序,当接入到互联网中的用户主机发出请求后,Web服务才会响应并经过HTTP或HTTPS把请求的内容回传给用户。示意图以下:数据库
目前提供Web服务的程序有:IIS、Apache、Ngnix等。apache
IIS(Internet Information Services):互联网信息服务,是Windows系统中默认的Web服务程序。它是一款带图形化界面的网站管理工具,不只提供Web网站服务,还能够提供FTP、SMTP等服务,功能丰富。可是因为它是用在Windows系统中,所以不介绍它。vim
Apache程序是目前市场上占有率很高的Web服务程序之一,其特色是跨平台、安全性高、API扩展简单可靠。centos
Apache服务程序能够运行在Linux、UNIX、 Windows系统中,支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket层(SSL),可以实时监视服务状态与定制日志消息,有着各种丰富的模块支持。浏览器
因为它是RHEL五、六、7中默认的Web服务程序,而且做为老牌的Web服务程序,市场占用率仍是很高的,所以本文主要以Apache为例进行Web服务的演示。安全
2004年,为俄罗斯知名门户站点开发的Web服务程序Nginx横空出世。它做为一款轻量级的网站服务软件,因其稳定性和丰富的功能而快速占领服务器市场。服务器
它因系统资源消耗低、并发能力强的特色,在国内受到诸如新浪、腾讯、网易等门户网站的青睐。Ngnix做为后起之秀,截至本文写做时为止市场占有率几乎与Apache齐平,之后有机会再单独对其进行演示和讲解。
Apache是RHEL7默认的web程序,以包含在默认的安装镜像中,所以能够直接挂载安装镜像直接安装,也能够用远程Yum仓库进行安装。
须要注意的是,在CentOS和RHEL上,Apache软件包和服务称为httpd而非apache。
先检查Apache是否安装,若是未安装,经过yum仓库安装便可
[root@apache ~]# rpm -q httpd package httpd is not installed [root@apache ~]# yum install httpd Loaded plugins: fastestmirror, langpacks ...省略部份内容 Complete! [root@apache ~]# rpm -q httpd httpd-2.4.6-90.el7.centos.x86_64 [root@apache ~]#
安装完成后,httpd服务是没有启动的,还须要将其启动,并加入到开机启动中
[root@apache ~]# systemctl start httpd [root@apache ~]# systemctl enable httpd ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service' [root@apache ~]#
此时在虚拟机Centos内部,打开浏览器,便可看到apache部署成功
若是要让外部机器(如宿主机)访问此Web,则须要对防火墙进行设置,固然直接关闭防火墙也能够,不过这样存在风险。
根据前文讲解的防火墙知识,打开HTTP和HTTPS的80和443端口
[root@apache ~]# firewall-cmd --permanent --zone=public --add-service=http success [root@apache ~]# firewall-cmd --permanent --zone=public --add-service=https success [root@apache ~]# firewall-cmd --reload success [root@apache ~]#
这样宿主机上也能够直接访问该Web,以下图
[root@apache ~]# httpd -v Server version: Apache/2.4.6 (CentOS) Server built: Aug 8 2019 11:41:18 [root@apache ~]#
[root@apache ~]# systemctl status httpd httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Mon 2020-02-10 10:52:35 CST; 7min ago Docs: man:httpd(8) man:apachectl(8) ...省略部份内容
只有掌握httpd服务相关配置文件以及各自的用途,才能更好地对其进行配置了。
httpd服务程序默认主要配置文件(这些默认配置是能够进行修改的)以下:
用途 | 文件 |
---|---|
服务目录 | /etc/httpd |
主配置文件 | /etc/httpd/conf/httpd.conf |
网站数据目录 | /var/www/html |
访问日志 | /var/log/httpd/access_log |
错误日志 | /var/log/httpd/error_log |
主配置文件为:/etc/httpd/conf/httpd.conf,在此文件中存存在三种类型的类型:注释行信息、全局配置、区域配置。
从主配置文件中截取部分进行说明以下:
全局配置参数
全局配置参数就是一种全局性的配置参数,可做用于对全部的子站点,既保证了子站点的正常访问,也有效减小了频繁写入重复参数的工做量。
区域配置参数
区域配置参数则是单独针对于每一个独立的子站点进行设置的。
httpd服务程序最经常使用的参数以下
参数 | 用途 |
---|---|
ServerRoot | 服务目录 |
ServerAdmin | 管理员邮箱 |
User | 运行服务的用户 |
Group | 运行服务的用户组 |
ServerName | 网站服务器的域名 |
DocumentRoot | 网站数据目录 |
Directory | 网站数据目录的权限 |
Listen | 监听的 IP 地址与端口号 |
DirectoryIndex | 默认的索引页页面 |
ErrorLog | 错误日志文件 |
CustomLog | 访问日志文件 |
Timeout | 网页超时时间,默认为 300 秒 |
分析:既然上表中提到DocumentRoot是用于定义网站数据的保存路径,那咱们查看下其参数的默认值,而后把对应网页内容放入该目录,就能够实现网页替换。静态网页名称通常为index.html。
打开主配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
查看到看默认网站数据目录为:/var/www/html。默认该目录为空,向目录中建立index.html文件,并经过浏览器进行查看。
若是忘记VI或VIM编辑器使用方法的,请返回复习前面的文章:“linux入门系列4--vi&vim编辑器”。
[root@apache ~]# ll /var/www/html/ total 0 [root@apache ~]# echo "hi,this is heimatengyun's blog">/var/www/html/index.html [root@apache ~]# ll /var/www/html/ total 4 -rw-r--r--. 1 root root 31 Feb 10 11:59 index.html [root@apache ~]#
在宿主机经过浏览器再次查看,便可查看刚才新加的网页文件内容
经过这样的操做,咱们应该明白,若是你已经作好你的网页内容,只须要往/var/www/html/目录存放,便可实现网站的访问。
但实际工做中,有可能咱们会更换网站目录,把网站内容存放到一个指定的目录中,而非默认的/var/www/html/。这该怎么作呢?这就会涉及到SELinux的问题,所以请继续下边的实验。
假设咱们把系统根目录下的website目录做为网站目录,咱们进行以下操做:
(1)建立自定义网站目录和网页文件
[root@apache /]# mkdir /website [root@apache /]# cd /website/ [root@apache website]# echo "this is my custom directory">index.html [root@apache website]# ll total 4 -rw-r--r--. 1 root root 28 Feb 10 12:21 index.html [root@apache website]#
(2)主配置文件中配置目录
[root@apache website]# vim /etc/httpd/conf/httpd.conf
主要修改DocumentRoot参数指定网站目录为/website,同时修改定义目录权限的区域参数Directory。
(3)访问验证
配置完成后,重启httpd服务
[root@apache website]# systemctl restart httpd
在宿主机中浏览器查看
见鬼,怎么显示的仍是httpd默认的页面呢?
通常状况只有网站的首页页面文件不存在或用户权限不足时,才显示httpd默认的页面。好比后文的4.1,设置禁止的ip访问后,就直接跳转到此页面。
咱们在加上文件名试下呢
能够看到提示权限不足,看到这里,你应该想到是SELinux在搞鬼。为了验证一下,让咱们把SELinux关闭后在试试看
[root@apache website]# getenforce Enforcing [root@apache website]# setenforce 0 [root@apache website]# getenforce Permissive [root@apache website]#
再次在宿主机浏览器访问
发现能够访问了,那说明果真是SELinux在搞鬼。但生产环境不建议直接关闭SELinux,接下来咱们就来看看SELinux相关的知识,掌握以后咱们在来开启SELinux并进行设置,使其在SELinux开启的状况下依然能够访问咱们Web网站。
在前面的文件传输、文件共享、邮件系统的文章中或多或少都讲解了SELinux相关的知识,本文再次集中总结一下。
SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的 一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。
RHEL7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。它的重要性不言而喻,举个例子,好比你从网上下载了一个软件用于编辑文档,可是这个软件“不老实”,当你正在努力码字的同时,它却悄悄监视你在各个网站登陆时输入的密码,而后悄悄上传到黑客指定的地址。SELinux就是为了防止这种状况的发生而开发的,从而更好的保护你的电脑。
SELinux具体从两个方面进行限制:SELinux域和上下文。
SELinux域对服务程序的功能进行限制,能够确保服务程序作不了出格的事情。
SELinux上下文对文件资源的访问限制,确保文件资源 只能被其所属的服务程序进行访问。
开启SELinux后,这样就等于开启了系统双保险,系统内的服务程序只能规规矩矩地拿到本身所应该获取的资源,这样即使黑客入侵了系 统,也没法利用系统内的服务程序进行越权操做。
SELinux配置有三种模式,以下:
参数值 | 做用 |
---|---|
enforcing | 强制启用安全策略模式,将拦截服务的不合法请求 |
permissive | 遇到服务越权访问时,只发出警告而不强制拦截 |
disabled | 对于越权的行为不警告也不拦截 |
正如2.2.1中,经过setenforce 0命令将SELinux关闭后,咱们的Web就能够访问了,就是这个道理。
SELinux配置文件对应为:/etc/selinux/config 。
[root@apache website]# cat /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 [root@apache website]#
该文件中的值定义的是SELinux默认的运行状态,也就是系统重启后的状态,所以修改它不会当即生效。
用于查看SELinux的运行模式
[root@apache website]# getenforce Enforcing [root@apache website]#
setenforce 0或1,用于禁用(0)或启用(1)SELinux,注意这个命令的修改只是临时的,系统重启后就会失效。
[root@apache website]# getenforce Enforcing [root@apache website]# setenforce 0 [root@apache website]# getenforce Permissive [root@apache website]
所以,若是原来系统的SELinux是关闭的,若是要开启它,须要在配置文件中将进行设置SELINUX=enforcing,并同时要经过setenforce 1进行设置。这样即便系统重启,依然生效。
用于设置SELinux上下文的值,管理SELinux的策略。
语法格式:semanage [选项] [文件]”
参数
参数 | 做用 |
---|---|
-l | 查询 |
-a | 添加 |
-m | 修改 |
-d | 删除 |
具体使用细节能够经过帮助命令man semanage进行查看。
该命令用于查看SELinux域相关的安全策略。
语法格式:getsebool -a(其中-a参数表示查看全部域相关的安全策略)
[root@apache ~]# getsebool usage: getsebool -a or getsebool boolean... [root@apache ~]# getsebool -a abrt_anon_write --> off abrt_handle_event --> off abrt_upload_watch_anon_write --> on antivirus_can_scan_system --> off ...省略部份内容
其中,on表示容许状态,off表示禁止状态。
该命令用于修改SELinux域相关的策略规则。
语法格式:setsebool -P 规则项=on或off (其中-P参数表示当即让修改永久生效)
[root@apache ~]# getsebool -a | grep xdm_write_home xdm_write_home --> off [root@apache ~]# setsebool -P xdm_write_home=on [root@apache ~]# getsebool -a | grep xdm_write_home xdm_write_home --> on [root@apache ~]# setsebool -P xdm_write_home=off [root@apache ~]# getsebool -a | grep xdm_write_home xdm_write_home --> off [root@apache ~]# getsebool xdm_write_home xdm_write_home --> off
以上实验,咱们先查看grep xdm_write_home状态,而后将其改成on,查看修改是否生效,而后再将其改回原值。查看某一项的值能够经过正则匹配,也能够直接经过该具体项获取。
有了以上这些储备知识,咱们再继续完成开启SELinux的状况下让咱们自定义目录的网站也能访问。
经过上边的讲解,咱们大概已经知道了前面的问题就是SELinux上下文引发,所以咱们经过如下命令来查看下默认的/var/www/html和咱们自定义的/website他们的SELinux上下文的值究竟有什么不一样
[root@apache website]# ll -Z /var/www/html/ -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html [root@apache website]# ll -Z /website/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@apache website]#
咱们经过ll命令的-Z参数进行查看,很明显就看到了不一样。(-Z参数专门用于查看SELinux域相关设置)
能够看到在文件上设置的SELinux安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。以上示例中,用户段system_u表明系统进程的身份,角色段object_r表明文件目录的角色, 类型段httpd_sys_content_t表明网站服务的系统文件。
搞清楚区别后,咱们直接用前边讲解的semanage命令添加SELinux安全上下文便可,使其目录及里边的全部文件可以被httpd服务程序访问到
[root@apache website]# ll -Z /var/www/html/ -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html [root@apache website]# ll -Z /website/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@apache website]# semanage fcontext -a -t httpd_sys_content_t /website [root@apache website]# semanage fcontext -a -t httpd_sys_content_t /website/* [root@apache website]# ll -Z /website/ -rw-r--r--. root root unconfined_u:object_r:default_t:s0 index.html [root@apache website]# restorecon -Rv /website/ restorecon reset /website context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /website/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@apache website]# ll -Z /website/ -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html [root@apache website]#
须要注意的是,设置上下文值后并不是当即生效,还须要执行restorecon才会生效,过程如上,请自行体验。
通过这样设置后,就能够正常访问了。
本案例演示了SELinux上下文对资源的限制致使的web不能访问,以及设置上下文值。
上一个案例演示了SELinux上下文的设置,本案例再经过Apache的我的用户主页功能来演示SELinux域的设置。
假设有这样有一个需求:须要为Linux每一位系统用户创建一个独立的网站。咱们该怎么作呢?
方法有不少,httpd服务程序提供的我的用户主页功能彻底能够实现这个需求。它可让系统内全部的用户在本身的家目录中管理我的的网站,并且访问起来也很是容易。
步骤以下:
我的用户主页功能配置文件为:/etc/httpd/conf.d/userdir.conf 。主要修改2处:注释掉UserDir disabled使其开启我的主页功能,同时设置我的网站目录,取消UserDir public_html 前的注释便可。
[root@apache website]# vim /etc/httpd/conf.d/userdir.conf
在用户家目录中创建用于保存网站数据的目录及首页面文件。
[root@apache website]# useradd heima [root@apache website]# echo "123456" | passwd --stdin heima Changing password for user heima. passwd: all authentication tokens updated successfully. [root@apache website]# su - heima [heima@apache ~]$ ls [heima@apache ~]$ pwd /home/heima [heima@apache ~]$ mkdir public_html [heima@apache ~]$ echo "this is heima's website">public_html/index.html [heima@apache ~]$ ll public_html/ total 4 -rwxrwxr-x. 1 heima heima 24 Feb 10 16:11 index.html [heima@apache ~]$ chmod -Rf 775 /home/heima/
另外,还须要把家目录的权限修改成755,保证其余人也有权限读取里面的内容。
文章最开始已经设置了防火墙,此时咱们大体一想,应该是能够访问我的网页了吧。咱们先切换到root用户,重启httpd服务,而后进行访问,结果很不幸,此次又提示权限不足。
[root@apache ~]# systemctl restart httpd
访问地址为ip/~用户名,其中的波浪号是必需的,并且网址、波浪号、用户名之间没有空格。
咱们回想一下,这个现象和案例1遇到的症状有几分类似,当时是由于咱们新建了一个目录/website,而没有设置SELinux上下文所致使。那此次是否是也是由于SELinux的上下文致使呢?
很显然不是,httpd服务程序在提供我的用户主页功能时,该用户的网站数据目录自己就应该是存放到与这位用户对应的家目录中的,因此应该不须要修改家目录的 SELinux 安全上下文,若是你实在不放心,也能够执行以下命令验证:
[heima@apache ~]$ ll -Z /home/heima/ drwxrwxr-x. heima heima unconfined_u:object_r:httpd_user_content_t:s0 public_html [heima@apache ~]$
对吧,很明显不是SELinux上下文致使,由于httpd默认就给用户目录添加了上下文值。
那是什么缘由呢,咱们仍是按照以前的方法来排查,先把SELinux关闭,而后在此访问。结果能够正常访问了,那说明就是SELinux的问题,再回想咱们前面提到的SELinux经过上下文和域这两个方面进行限制和保护。既然上下文没问题,所以天然而然,咱们应该知道这就是SELinux域致使的。
Linux 域确保服务程序不能执行违规的操做,只能本本分分地为用户提供服务。httpd 服务中忽然开启的这项我的用 户主页功能到底有没有被SELinux域默认容许呢?
给我的主页相关的域规则项为:httpd_enable_homedirs,若是不知道记住便可。咱们看下他的状态确实为off,所以将其改成on就能够了,切换到root用户进行操做
[root@apache ~]# getsebool httpd_enable_homedirs httpd_enable_homedirs --> off [root@apache ~]# setsebool httpd_enable_homedirs=on [root@apache ~]#
此时,咱们再次访问,便可正常访问了。
有时候咱们不但愿别人直接就能够访问我的网站,须要经过身份认证才能进行查看,这就须要在网站中添加口令功能来实现。
(1)生成密码数据库
[root@apache ~]# htpasswd -c /etc/httpd/passed heima New password: Re-type new password: Adding password for user heima [root@apache ~]#
注意,文件名任意取,在下一步中保持一致便可,-c参数表示第一次生成。设置密码为888888,以区别以前heima用户登陆系统的密码123456,这样作的目的是为了区分说明不此处设置的密码不是用户登陆系统的密码。
(2)修改配置文件
[root@apache ~]# vim /etc/httpd/conf.d/userdir.conf <Directory "/home/*/public_html"> # AllowOverride FileInfo AuthConfig Limit Indexes # Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec # Require method GET POST OPTIONS AllowOverride all authuserfile "/etc/htppd/passed" authname "heima website" authtype basic require user heima Require method GET POST OPTIONS </Directory>
将文末的内容注释并按以下进行修改便可
修改完成后,重启httpd
[root@apache ~]# systemctl restart httpd
再次访问,就要求输入密码了。
此时输入用户名heima,以及刚才建立的888888密码(注意不是heima登陆系统的密码)便可登陆网站。
这个案例演示了SELinux域对进程的控制,以及如何对其进行设置。
经过案例1和案例2,不只完整演示了Apache经常使用操做,还特别演示了生产级别的SELinux域和上下文的设置。
下一篇文章继续演示Apache的虚拟主机功能和访问控制的实现方法。