一、网站服务程序
1.先通过虚拟机光驱指向REHL7的ISO文件
2.挂载光驱设备到目录
mkdir -p /media/cdrom
mount /dev/cdrom /media/cdrom
也可以vim /etc/fstab 将挂载内容写入
/dev/cdrom /media/cdrom iso9660 defaults 0 0
3. Vim 文本编辑器创建Yum 仓库的配置文件
vim /etc/yum.repos.d/rhel7.repo
[rhel] name=rhel baseurl=file:///media/cdrom enabled=1 gpgcheck=0
|
#本地安装,不需要验证
gpgcheck=0
4.安装Apache 服务程序。注意,使用yum 命令进行安装时,跟在命令后面的Apache 服务的软件包名称为httpd。如果直接执行yum install apache 命令,则系统会报错。
yum install httpd
5.启用httpd 服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供Web 服务
systemctl start httpd
systemctl enable httpd
firefox
此时打开firefox输入本机IP地址可以显示默认页面(出现默认页面的原因1.没有首页面2.没有权限)
这表示服务已启,但新站点没有首页。
下面写一个首页,首先进入目录:
cd /var/www/html/
vim index.html
写入如下内容
my first page!
刷新原默认页面
显示上面的内容了
二、配置服务文件参数
Linux系统中的配置文件
配置文件的名称 存放位置
服务目录 /etc/httpd
主配置文件/etc/httpd/conf/httpd.conf
网站数据目录/var/www/html
访问日志/var/log/httpd/access_log
错误日志/var/log/httpd/error_log
此时,网站首页默认存入于/var/www/html/,可以更换为/home/wwwroot
mkdir /home/wwwroot
echo "wwwroot index" > /home/wwwroot/index.html
前提需要修改相应的配置文件
vim /etc/httpd/conf/httpd.conf
修改
119 DocumentRoot "/home/wwwroot" 120 121 # 122 # Relax access to content within /var/www. 123 # 124 <Directory "/home/wwwroot"> |
systemctl restart httpd
此时刷新页面只显示默认页面,但通过访问http://127.0.0.1/index.html 页面时,竟然发现页面中显示“Forbidden,You don't have permission toaccess /index.html on this server.”。原因是SELinux。
下面对SELinux
三、SELinux设置
SELinux 域:限制了服务的功能(例如不能让美图软件抓取用户的银行卡与密码信息)
SELinux 安全上下文:文件权限的限制(例如银行卡信息上加上限制,仅限网银软件使用)
“SELinux 域”和“SELinux 安全上下文”称为是Linux 系统中的双保险,系统内的服务程序只能规规矩矩地拿到自己所应该获取的资源,这样即便黑客入侵了系统,也无法利用系统内的服务程序进行越权操作。
命令:
vim /etc/selinux/config
可以查看SELinux 服务有三种配置模式。
enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
permissive:遇到服务越权访问时,只发出警告而不强制拦截。
disabled:对于越权的行为不警告也不拦截。
可以运行getenforce 命令获得当前SELinux服务的运行模式:
[root@linuxprobe ~]# getenforce
Enforcing
可以用setenforce [0|1]命令修改SELinux 当前的运行模式(0 为禁用,1 为启用)。重启会失效 。
无法访问home目录下的网页文件的原因是:,/home 目录是用来存放普通用户的家目录数据的,而现在,httpd
提供的网站服务却要去获取普通用户家目录中的数据了,这显然违反了SELinux 的监管原则。
查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的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
[root@linuxprobe ~]# ls -lZd /home/wwwroot
drwxr-xr-x. root root unconfined_u:object_r:home_root_t:s0 /home/wwwroot
SELinux 安全上下文是由用户段、角色段以及类型段等多个信息项共同组成的。其中,用户段system_u 代表系统进程的身份,角色段object_r 代表文件目录的角色,类型段httpd_sys_content_t 代表网站服务的系统文件。
semanage 命令用于管理SELinux 的策略,格式为“semanage [选项] [文件]”。
-l 参数用于查询;
-a 参数用于添加(改为修改);
-m 参数用于修改;
-d 参数用于删除。
向新的网站数据目录中新添加一条SELinux 安全上下文,让这个目录以及里面的所有文件能够被httpd 服务程序所访问到:
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
执行上述设置之后,还无法立即访问网站,还需要使用restorecon 命令将设置好的SELinux 安全上下文立即生效
restorecon -Rv /home/wwwroot/
[root@linuxprobe ~]# ls -ldZ /home/wwwroot
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /home/wwwroot
四、个人用户主页功能
例1.
可以让操作系统系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。
操作如下:
1)因httpd 服务程序默认没有开启个人用户主页功能,所以需要编辑配置文件
vim /etc/httpd/conf.d/userdir.conf
加注释:UserDir disabled 或修改为: UserDir public_html
取消注释:
2)在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把家目录的权限修改为755,保证其他人也有权限读取里面的内容。7表示本人可以写读执行,除本人外,本组或其他用户只可进行读和执行的权限。
[root@linuxprobe ~]# useradd linux
[root@linuxprobe ~]# su - linux
[linux@linuxprobe ~]$ mkdir public_html
[linux@linuxprobe ~]$ echo "This is linux's website" > public_html/index.html
[linux@linuxprobe ~]$ chmod -Rf 755 /home/linux
3)使用getsebool 命令查询并过滤出所有与HTTP 协议相关的安全策略。
getsebool -a | grep http
查看后确定SELinux 域安全策略应该是httpd_enable_homedirs,默认值为off:
ttpd_enable_homedirs --> off
下面使用用setsebool 命令来修改SELinux 策略,其中上-P 参数,让修改后的SELinux 策略规则永久生效且立即生效。
setsebool -P httpd_enable_homedirs=on
4)重新启动httpd 服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格)
systemctl restart httpd
然后通过浏览器访问:http://192.168.180.10/~linux/
网页显示内容:This is linux's website
同理user用户执行
[root@linuxprobe ~]# useradd user
[root@linuxprobe ~]# su - user
[user@linuxprobe ~]# mkdir public_html
[user@linuxprobe ~]# echo "This is user's website" > public_html/index.html
[user@linuxprobe ~]# chmod -Rf 755 /home/user
切回root用户,重启服务
[root@linuxprobe ~]# systemctl restart httpd
然后通过浏览器访问:http://192.168.180.10/~user/
网页显示:This is user's website
例2.网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户访客看到里面的内容,这时就可以在网站中添加口令功能了。
1)使用htpasswd 命令生成密码数据库。-c 参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。
htpasswd -c /etc/httpd/passwd linux
如此,生成了一个密码文件:
命令vim /etc/httpd/passwd查看此文件内容如下:
linux:$apr1$kg5I8vZ7$MlHmoiWn/zEmAcdUR7dC50
zhangsan:$apr1$8b.yCztD$1GEVY.CILjuk8.qqr6L171
以上为标准的密码文件
2)编辑个人用户主页功能的配置文件。把第31~35 行的参数信息修改成下列内容
vim /etc/httpd/conf.d/userdir.conf
AllowOverride all
#刚刚生成出来的密码验证文件保存路径
authuserfile "/etc/httpd/passwd"
#当用户尝试访问个人用户网站时的提示信息
authname "My privately website"
authtype basic
#用户进行账户密码登录时需要验证的用户名称
require user linux
重启httpd服务
systemctl restart httpd
然后重启浏览器,然后通过浏览器访问:http://192.168.180.10/~user/ 或http://192.168.180.10/~linux/ 均需要输入用户名与密码
当然可以添加别的账户和密码下面添加用户zhangsan
htpasswd /etc/httpd/passwd zhangsan
编辑个人用户主页功能的配置文件。
vim /etc/httpd/conf.d/userdir.conf
增加一行
require user zhangsan
则无论登录哪一个用户的网站,都可以进行linux用户及zhangsan用户的登录操作。
此实验相当于验证了SELinux 安全上下文
五、虚拟主机
虚拟主机功能,可以把一台处于运行状态的物理服务器分割成多个“虚拟的服务器”,云计算之前数据中心的虚拟主机功能,有跨站攻击的危险,后来被VPS取代,再后来被云主机取代
Apache 的虚拟主机功能是服务器基于用户请求的不同IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术。
1 基于IP 地址
1)修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-eno16777728
HWADDR=00:0C:29:0C:AB:5D TYPE=Ethernet BOOTPROTO=static NAME=eno16777728 UUID=ae916295-ff29-4c5b-8ee0-3a8808a708b8 ONBOOT=yes IPADDR1=192.168.180.10 IPADDR2=192.168.180.20 IPADDR3=192.168.180.30 NETMASK=255.255.255.0 GATEWAY=192.168.180.1 DNS1=192.168.180.1 |
保存后重启网络
systemctl restart network
2.在/home/wwwroot 中创建3个目录d10、d20、d30、
[root@linuxprobe wwwroot]# mkdir d10 d20 d30
3)每个目录内写入不同内容的index.html
echo "<h1>IP10</h1>" > d10/index.html
echo "<h1>IP20</h1>" > d20/index.html
echo "<h1>IP30</h1>" > d30/index.html
此时不做任何修改是可以通过地址http://192.168.180.10/d10/、http://192.168.180.10/d20/、http://192.168.180.10/d30/访问的不同的页面,当然也可以通过192.168.180.20和192.168.180.30访问以上不同的页面,但这不是本练习的最终目的
4) 在httpd 服务的配置文件中大约113 行处开始,分别追加写入三个基于IP 地址的虚拟主机网站参数,然后保存并退出。重启httpd 服务使配置才生效。
vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.180.10> DocumentRoot /home/wwwroot/d10 ServerName www.111.com <Directory /home/wwwroot/d10 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.180.20> DocumentRoot /home/wwwroot/d20 ServerName www.222.com <Directory /home/wwwroot/d20 > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.180.30> DocumentRoot /home/wwwroot/d30 ServerName www.333.com <Directory /home/wwwroot/d30 > AllowOverride None Require all granted </Directory> </VirtualHost> |
systemctl restart httpd
此时访问网站,则会看到httpd 服务程序的默认首页面,需要进行SELinux设置
向新的网站数据目录中新添加一条SELinux 安全上下文,让这个目录以及里面的所有文件能够被httpd 服务程序所访问到:
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot
semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*
执行上述设置之后,还无法立即访问网站,还需要使用restorecon 命令将设置好的SELinux 安全上下文立即生效
restorecon -Rv /home/wwwroot/
2 基于主机域名
恢复虚拟机,练习基于主机域名的网站访问。
使用同一台服务器的多个网站可以不为每个网站分配独立的IP地址,可以尝试让Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。
首先挂载光盘,安装APACHE
[root@linuxprobe ~]# mkdir -p /media/cdrom
[root@linuxprobe ~]# mount /dev/cdrom /media/cdrom
mount: no medium found on /dev/sr0
[root@linuxprobe ~]# mount /dev/cdrom /media/cdrom
mount: /dev/sr0 is write-protected, mounting read-only
[root@linuxprobe ~]# vim /etc/fstab
写入内容:
/dev/cdrom /media/cdrom iso9660 defaults 0 0
Vim 文本编辑器创建Yum 仓库的配置文件
vim /etc/yum.repos.d/rhel7.repo
[rhel] name=rhel baseurl=file:///media/cdrom enabled=1 gpgcheck=0
|
[root@linuxprobe ~]# yum install httpd
[root@linuxprobe ~]# systemctl start httpd
[root@linuxprobe ~]# systemctl enable httpd
实验使用要手工定义IP 地址与域名之间的对应关系。/etc/hosts 此文件是Linux 系统中用于强制把某个主机域名解析到指定IP 地址的配
置文件。简单来说,只要这个文件配置正确,即使网卡参数中没有DNS 信息也依然能够将域名解析为某个IP 地址。
1.修改文件
vim /etc/hosts
增加
192.168.180.10 www.al.com bbs.al.com www.bd.com www.tx.com
vim /var/www/html/index.html
写入内容
it is my first page!
然后通过firefox浏览器访问192.168.180.10或www.al.com或bbs.al.com均显示
it is my first page!
下面练习更为复杂的内容,将网站内容放于/home/wwwroot
第 2 步:分别在/home/wwwroot 中创建用于保存不同网站数据的2个目录www和bbs
[root@linuxprobe d10]# mkdir /home/wwwroot/
[root@linuxprobe d10]# cd /home/wwwroot/
[root@linuxprobe wwwroot]# mkdir www bbs
echo " www"> /home/wwwroot/www/index.html
echo "bbs "> /home/wwwroot/bbs/index.html
第 3 步:在httpd 服务的配置文件中大约113 行处开始,分别追加写入2个基于主机名的虚拟主机网站参数,然后保存并退出。记得需要重启httpd 服务,这些配置才生效。
[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf
在约113行处写入如下内容
<VirtualHost 192.168.180.10> DocumentRoot /home/wwwroot/www ServerName www.bd.com <Directory /home/wwwroot/www > AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.180.10> DocumentRoot /home/wwwroot/bbs ServerName www.tx.com <Directory /home/wwwroot/bbs > AllowOverride None Require all granted </Directory> </VirtualHost>
DocumentRoot "/home/wwwroot/" <Directory "/home/wwwroot"> |
systemctl restart httpd
第 4 步:因为当前的网站数据目录还是在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的SELinux 安全上下文,使其与网站服务功能相吻合。
[root@linuxprobe wwwroot]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe wwwroot]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www [root@linuxprobe wwwroot]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs/* semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www/* |
最后用restorecon 命令让新配置的SELinux 安全上下文立即生效,这样就可以立即访问到虚拟主机网站了,
restorecon -Rv /home/wwwroot
restorecon -Rv /home/wwwroot/www
restorecon -Rv /home/wwwroot/bbs
此时通过http://www.tx.com/,http://www.bd.com/均可访问到相应的页面
3 基于端口号
基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。
不仅
要考虑httpd 服务程序的配置因素,还需要考虑到SELinux 服务对新开设端口的监控。一般来说,使用80、443、8080 等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到SELinux 服务的限制。
第 1 步:分别在/home/wwwroot 中创建用于保存不同网站数据的两个目录,并向其中分别写入网站的首页文件。
[root@linuxprobe ~]# cd /home/wwwroot/
[root@linuxprobe wwwroot]# mkdir 6111 6222
echo "port:6111" > /home/wwwroot/6111/index.html
echo "port:6222" > /home/wwwroot/6222/index.html
第 2 步:在httpd 服务配置文件的第43 行和第44 行分别添加用于监听6111 和6222端口的参数。
vim /etc/httpd/conf/httpd.conf
第 3 步:在httpd 服务的配置文件中大约113 行处开始,分别追加写入两个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启httpd 服务
114 <VirtualHost 192.168.180.10:6111> 115 DocumentRoot /home/wwwroot/www 116 ServerName www.bd.com 117 <Directory /home/wwwroot/www > 118 AllowOverride None 119 Require all granted 120 </Directory> 121 </VirtualHost> 122 <VirtualHost 192.168.180.10:6222> 123 DocumentRoot /home/wwwroot/bbs 124 ServerName www.tx.com 125 <Directory /home/wwwroot/bbs > 126 AllowOverride None 127 Require all granted 128 </Directory> 129 </VirtualHost> |
重启httpd服务
systemctl restart httpd
第 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/
以使用semanage 命令查询并过滤出所有与HTTP 协议相关且SELinux 服务允许的端口列表。
semanage port -l | grep http
第 5 步:SELinux 允许的与HTTP 协议相关的端口号中默认没有包含6111 和6222,因此需要将这两个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。
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
发现6111,6222已经添加进去了
此时通过浏览器访问
http://192.168.180.10:6111
http://192.168.180.10:6222
六、Apache 的访问控制
Apache 可以基于源主机名、源IP 地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制。
Allow 指令允许某个主机访问服务器上的网站资源,通过Deny 指令实现禁止访问。在允许或禁止访问网站资源时,还会用到Order 指令.比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访
问请求,反之则拒绝访问请求。
下面进行实验练习:
准备:挂载光盘,安装APACHE(内容略,见前文)
第 1 步:先在服务器上的网站数据目录/var/www/html/中新建一个子目录,并在这个子目录中创建一个包含Successful 单词的首页文件。
cd /var/www/html
mkdir server
echo "Successful" > /var/www/html/server/index.html
虚拟机中访问地址:http://192.168.180.10/server/可以看到上述生成的页面内容,显示文字“Successful”
通过外面的主机访问时无法访问,原因是REDHAT7中默认80端口被过滤了,需要打开,操作步骤如下:
firewall-cmd --zone=public --add-port=80/tcp --permanent
重启firewall服务:
firewall-cmd --reload
此时外面的主机便可以访问虚拟机中的网页了。
第 2 步:打开httpd 服务的配置文件,在第129 行后面添加下述规则来限制源主机的访问。
这段规则的含义是允许使用Firefox 浏览器的主机访问服务器上的首页文件,除此之外的所有
请求都将被拒绝。
<Directory "/var/www/html/server">
SetEnvIf User-Agent "Firefox" ff=1
Order allow,deny
Allow from env=ff
</Directory>
然后重启服务
systemctl restart httpd