Apache服务程序部署
Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务。
Web 网络服务是一种被动访问的服务程序,即只有接收到互联网中其他主机发出的请求后才会响应,最终用于提供服务程序的 Web 服务器会通过 HTTP(超文本传输协议)或HTTPS(安全超文本传输协议)把请求的内容传送给用户。
首先配置yum仓库
其次,安装Apache服务程序。
注意,用yum安装时,命令后面Apache服务的软件包名为httpd。直接用yum install apache会报错。
# yum install httpd -y
最后,启动服务并加入开机自启动,登录后就可以看到了web默认页面。
# systemctl start httpd
# systemctl enable httpd
配置服务文件参数
httpd服务程序的主要配置文件及存放位置:
主配置文件中保存的是最重要的服务参数,一般会被保存到/etc目录中以软件名称命名的一个文件夹之中,名字为“服务名称.conf”。
在httpd服务程序的主配置文件中,有三种类型的信息:注释行信息、全局配置、区域配置。
全局配置:就是一种全局性的配置参数,可作用于对所有的子站点,既保证了子站点的正常访问,也有效减少了频繁写入重复参数的工作量。
区域配置:是单独针对每个独立的子站点进行设置的。
配置httpd服务程序时最常用的参数以及用途描述
DocumentRoot参数用于定义网站数据的保存路径,其参数的默认值是/var/www/html(即把网站数据存放到这个目录中);而当前网站普遍的首页面名称是index.html,因此可以向/var/www/html/index.html文件中写入一段内容,替换掉httpd服务程序的默认首页面。该操作会立即生效。
在日常生产中可能我们需要把目录设置到别的路径下。
如,对网站数据保存/var/www/html进行目录修改为/home/wwwroot:
第一步:建立网站数据保存目录,并创建首页文件。
第二步:打开httpd服务程序的主配置文件,将约122行的定义网站数据保存路径的参数DocumentRoot修改为/home/wwwroot,约127行用于定义目录权限的参数Directory后面的路径也改为/home/wwwroot,保存退出。
第三步:重新启动httpd服务程序并验证效果
唉,改应该是改过了,但是被权限阻止了。这里就是SELinux造成的。
可以通过日志查看下 # less /var/log/messages
里面进行/sealer 搜索即可看到。
SELinux安全子系统
SELinux(Security-Enhanced Linux)是一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。Linux使用SELinux技术目的是为了让各个服务进程都受约束,使其获取本应获取的资源。
SELinux安全子系统能够从多方面监控未付行为:对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情);对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)。
SELinux服务有三种配置模式:
enforcing:强制启用安全策略模式,拦截服务的不合法请求。
permissive:遇到服务越权访问时,只发出警告而不强制拦截。
disabled:对越权行为不警告也不拦截。
SELinux标签具有多种上下文:用户、角色、类型和敏感度。类型上下文通常以_t结尾。
web服务器类型上下文是httpd_t。
通常位于/var/www/hmtl中的文件和目录的类型上下文是httpd_sys_content_t。
通常位于/tmp和/var/tmp中的文件和目录上下文是tmp_t。
web服务器端口的类型上下文是http_port_t。
许多处理文件的命令都是使用-Z选项来显示或设置SELinux上下文。如ps,ls,cp,mkdir都使用-Z选项。
SELinux服务的主配置文件中,定义的是SELinux的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。
用getenforce获取当前SELinux服务运行模式;用setenforce [0|1]修改SELinux当前运行模式(0位禁用,1位启用),这是临时修改,重启后会失效。生效需要改配置文件。
现在我们来对比下,/var/www/html 与 /home/wwwroot的安全上下文
当我们改成警告模式,可以访问网站
那么如何更改安全上下文呢?那么就要用semanage
semanage命令与restorecon命令
semanage命令用于管理SELinux的策略,语法格式为“semanage [参数] [文件]”。
semanage命令不仅能够像传统chcon命令那样——设置文件、目录的策略,还可以管理网络端口、消息接口。
semanage命令中常用参数以及作用
restorecon命令让SELinux安全上下文立即生效,-Rv递归操作,及显示修改过程。
个人用户主页功能
httpd服务程序提供的个人用户主页功能可以让系统内所有的用户在自己的家目录中管理个人的网站,且访问起来也非常容易。
第一步:httpd服务默认没有开启个人用户主页功能。需要修改配置文件,
第17行的UserDir disabled参数 前面加上井号(#),意思是httpd服务开启个人用户主页功能
第24行的UserDir public_html 参数前面的井号去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)
# vim /etc/httpd/conf.d/userdir.conf
第二步:在用户家目录中建立保存网站数据的目录及首页面文件。还需要把家目录的权限修改为755,保证其他人也有权限读取里面内容。
第三步:重启httpd服务,在浏览器网址中输入网址,格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格),如果系统报错检查SELinux。
第四步:思考这次报错的原因是什么。
httpd 服务程序在提供个人用户主页功能时,该用户的网站数据目录本身就应该是存放到与这位用户对应的家目录中的,所以应该不需要修改家目录的 SELinux 安全上下文。
但是,前文还讲到了 Linux 域的概念。 Linux 域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。
httpd 服务中突然开启的这项个人用户主页功能到底有没有被 SELinux 域默认允许呢?
getsebool与setsebool命令
getsebool命令 查询并过滤 所有与HTTP协议相关的安全策略。其中off禁止,on允许。
# getsebool -a | grep http
setsebool命令 修改SELinux策略中各条规则的布尔值。-P参数,是让修改后的SELinux策略规则永久且立即生效。
# setsebool -P httpd_enable_homedirs=on
有时候网站的网页内容不直接显示,只让通过验证的用户访问,那么网站添加口令功能:
第一步:用htpasswd命令生成密码数据库。-c参数表示第一次生成; 后面再分别添加密码数据库的存放文件,及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。
# htpasswd -c /etc/httpd/passwd zuguo
第二步:编辑个人用户主页功能的配置文件,第31~37行的参数修改并重启httpd服务。
# vi /etc/httpd/conf.d/userdir.conf
31 <Directory "/home/*/public_html">
32 AllowOverride all
#刚刚生成出来的密码验证文件保存路径
33 authuserfile "/etc/httpd/passwd"
#当用户尝试访问个人用户网站时的提示信息
34 authname "My privately website"
35 authtype basic
#用户进行账户密码登录时需要验证的用户名称
36 require user zuguo
37 </Directory>
# systemctl restart httpd
注意:用户访问某个用户的个人网站是,输入的账号密码是用htpasswd命令生成的专门用于网站登录的口令密码。
虚拟主机功能
利永虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”。但是该技术无法实现目前云主机技术的硬件资源隔离。
Apache的虚拟主机功能是服务器基于用户请求的不同IP地址、主机域名或端口号,实现提供多个网址同时为外部提供访问服务的技术,用户请求的资源不同,最终获取到的网页内容也不同。
基于IP地址
一台服务器多个IP地址,每个地址与服务器上部署的每个网站一一对应,当用户请求访问不同的ip地址会访问到不同的页面资源。
实验用三个IP地址,保证都能访问
第一步:分别在/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
# ehco “IP:192.168.10.20”> /home/wwwroot/20/index.html
# ehco “IP:192.168.10.30”> /home/wwwroot/30/index.html
第二步:在httpd服务配置文件中大约132行处开始,分别追加写入三个基于IP地址的虚拟主机网站参数。重启httpd服务。
# vim /etc/httpd/conf/httpd.conf
# systemctl restart httpd
第三步:修改SELinux安全上下文网站数据目录为新的,并用restorecon命令让新设置立即生效。
# 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
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30
# semanage fcontext -a -t httpd_sys_content-t /home/wwwroot/30/*
# restorecon -Rv /home/wwwroot
基于主机域名
服务无法为每个网站分配一个独立的IP地址时候,可以让Apache自动识别用户请求的域名,根据不同的域名请求来传输不同的内容。
DNS解析服务配置还没有,需要手工定义IP地址与域名之间的对应关系。/etc/hosts是linux系统中用于强制把某个主机域名解析到指定IP地址的配置文件。只要配置正确,即使网卡参数中没有DNS信息也依然能够将域名机械为某个IP地址。
第一步:手工定义IP地址与域名间对应关系的配置文件,并生效。
# vim /etc/hosts
192.168.10.10 www.linuxprobe.com www.linuxcool.com www.linuxdown.com
# ping -c 4 www.linuxprobe.com
# ping -c 4 www.linuxcool.com
# ping -c 4 www.linuxdown.com
第二步:分别在/home/wwwroot中创建用于保存不同网站数据的三个目录,并向其中分别写入网站的首页文件。
# mkdir -p /home/wwwroot/linuxprobe
# mkdir -p /home/wwwroot/linuxcool
# mkdir -p /home/wwwroot/linuxdwon
# echo “www.linuxprobe.com” > /home/wwwroot/linuprobe/index.html
# echo “www.linuxcool.com” > /home/wwwroot/linuxcool/index.html
# echo “www.linuxdown.com” > /home/wwwroot/linuxdown/index.html
第三步:在httpd服务配置文件中约132行开始,分别追加写入三个基于主机名的虚拟主机网站参数,重启httpd服务。
# vim /etc/httpd/conf/httpd.conf
# systemctl restart httpd
第四步:因当前网站数据目录还在/home/wwwroot中,必须要正确设置网站数据目录文件的SELinux安全上下文,与网站服务功能吻合。restorecon命令让设置立即生效。
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxprobe//*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxcool/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/linuxdown/*
# restorecon -Rv /home/wwwroot
基于端口号
虚拟主机功能让用户通过指定的端口号来访问服务器上的网站资源。
在使用Apache配置虚拟网站主机功能时,基于端口号方式是最复杂的。要考虑httpd服务程序的配置因素,还要考虑SELinux服务对新开设端口的监控。
一般用80,443,8080等端口来提供网站访问服务是比较合理的,其他端口号则会受到SELinux服务限制。
第一步:在/home/wwwroot中创建网站数据的两个不同目录,并写入网站的首页文件。
# mkdir -p /home/wwwroot/6666
# mkdir -p /home/wwwroot/7777
# echo “port:6666” > /home/wwwroot/6666/index.html
# echo “port:7777” > /home/wwwroot/7777/index.html
第二步:httpd服务配置文件第46、47分别添加用于监听6666和7777端口的参数。
# vim /etc/httpd/conf/httpd.conf
第三步:在httpd服务配置文件约134行开始分别追加写入两个基于端口号的虚拟主机网站参数,重启httpd服务生效。
# vim /etc/httpd/conf/httpd.conf
第四步:正确配置网站数据目录文件的SELinux安全上下文,restorecon命令立即生效SELinux安全上下文。
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6666
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/66666/*
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/7777
# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/7777/*
# restorecon -Rv /home/wwwroot
# systemctl restart httpd
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.
可以看到报错:因为SELinux服务检测到6666和7777端口不属于Apache服务的资源,但现在却以httpd服务程序的名义监听使用。
# semanage port -l | grep http
第五步:SELinux策略中添加这两个端口号。
# semanage port -a -t http_port_t -p tcp 6666
# semanage port -a -t http_port_t -p tcp 7777
# semanage port -l | grep http
# systemctl restart httpd
如果火狐浏览器出现了,偶尔会遇到’This address is restricted’ 的错误,这个错误经常发生在不是用默认的80 端口访问某个网址或者IP。
1.打开火狐浏览器,在地址栏里面输入 about:config 然后回车
一个的话,就输入. 6666
多个就是逗号分隔:6666,7777
范围的话就是: 81-6666
或者干脆全覆盖:1-65535
Apache的访问控制
pache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问。有时会用到Order指令,来定义allow或deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。如”Order Allow,Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。
第一步:先在服务器上建立一个网站数据目录的子目录,并在子目录中建一个首页文件。
# mkdir -p /var/www/html/server
# echo "This is test web site." > /var/www/html/server/index.html
第二步:打开httpd服务配置文件,第161行后面添加规则来限制源主机的访问。
含义是允许使用Firefox浏览器的主机访问服务器上的首页文件,除此之外所有请求都将被拒绝。
重启服务,及相关防火墙的设置
# systemctl restart httpd
# iptables -F
# iptables-save
# firewall-cmd --permanent --zone=public --add-service=http
# firewall-cdm --reload
可以看到可以访问主页,但是无法访问设置的server页面,火狐的则可以
可以通过匹配源主机的 IP 地址进行访问控制