WebServer
Apache:目前拥有很高市场占有率的Web服务程序之一,其跨平台和安全性广泛被认可且拥有快速、可靠、简单的API扩展。可以运行在Linux系统、UNIX系统甚至是Windows系统中,支持基于IP、域名及端口号的虚拟主机功能,支持多种认证方式,集成有代理服务器模块、安全Socket层(SSL),能够实时监视服务状态与定制日志消息,并有着各类丰富的模块支持
Nginx: 一款由俄罗斯的程序设计师 Igor Sysoev 所开发高性能的Web和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
实验环境
Windows10系统、VMware Workstation、Red Hat 7、Xshell 6、Chrome浏览器、Firefox浏览器
Apache安装
解释 | 命令 |
---|---|
安装 | yum install httpd |
启动 | service httpd start (systemctl start httpd ) |
停止 | service httpd stop (systemctl stop httpd ) |
查询httpd进程是否存在 | `ps -ef |
网络统计,查看80端口是否启用 | `netstat -anpl |
关闭防火墙(开启80端口) | service iptables stop (sytemctl stop iptables ) |
加入开机启动项 | chkconfig httpd on (systemctl enable httpd ) |
查看启动情况 | chkconfig --list httpd (systemctl is-enabled httpd ) |
注:括号内为RedHat7的新命令
配置服务文件参数
配置文件 | 解释 |
---|---|
/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 | 网页超时时间 |
1. 建立网站数据的保存目录并创建首页文件
1 | mkdir -p /home/wwwroot |
2. 修改httpd服务程序的主配置文件
将DocumentRoot修改为/home/wwwroot
将用于定义目录权限的参数Directory修改为/home/wwwroot
1 | vim /etc/httpd/conf/httpd.conf |
3. 修改SELinux当前的运行模式为禁用(0为禁用,1为启用),临时修改,系统重启后失效,永久的方法看步骤5、6、7
如果不修改则会报错:Forbidden,You don't have permission to access /index.html on this server
.
1 | setenforce 0 |
4. 刷新网页
SELinux安全子系统
- SELinux(Security-Enhanced Linux)
- 美国国家安全局在Linux开源社区帮助下开发的一个强制访问控制的安全子系统
- 目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源
- 对服务程序的功能进行限制(SELinux域限制可以确保服务程序做不了出格的事情)
- 对文件资源的访问限制(SELinux安全上下文确保文件资源只能被其所属的服务程序进行访问)
- SELinux服务主配置文件是/etc/selinux/config
SELinux服务的三种配置模式
- enforcing:强制启用安全策略模式,将拦截服务的不合法请求
- permissive:遇到服务越权访问时,只发出警告而不强制拦截
- disabled:对于越权的行为不警告也不拦截
管理SELinux策略的命令semanage
SELinux服务极大地提升了Linux系统的安全性,将用户权限牢牢地锁在笼子里。semanage
命令不仅能够像传统chcon
命令那样——设置文件、目录的策略,还可以管理网络端口、消息接口。其格式为“semanage [选项] [文件]
“:
semanage 参数 |
解释 |
---|---|
-l | 用于查询 |
-a | 用于添加 |
-m | 用于修改 |
-d | 用于删除 |
getenforce
命令获取当前SELinux服务的运行模式
5. 查看原始网站数据的保存目录与当前网站数据的保存目录是否拥有不同的SELinux安全上下文值
1 | setenforce 1 |
注:
用户段system_u代表系统进程的身份
角色段object_r代表文件目录的角色
类型段httpd_sys_content_t代表网站服务的系统文件
6. 向/home/wwwroot目录新添加一条SELinux安全上下文,使目录本身及目录里的所有文件都能被httpd访问
1 | semanage fcontext -a -t httpd_sys_content_t /home/wwwroot |
7. 使用restorecon
命令将设置好的SELinux安全上下文立即生效,-Rv参数对指定的目录进行递归操作,并显示SELinux安全上下文的修改过程
1 | restorecon -Rv /home/wwwroot/ |
个人用户主页功能
简单的个人用户主页
1. 开启个人用户主页功能
将第17行的UserDir disabled参数注释(加#),表示让httpd服务程序开启个人用户主页功能
将第24行的UserDir public_html参数的注释去掉(UserDir参数表示网站数据在用户家目录中的保存目录名称,即public_html目录)
1 | vim /etc/httpd/conf.d/userdir.conf |
2. 在用户家目录中建立用于保存网站数据的目录及首页面文件并将家目录的权限修改为755,保证其他人也有权限读取里面的内容
1 | # su - yanji |
3. 重启httpd服务,浏览器访问,地址为:网址/~用户名,出现Forbidden页面
4. 查询并过滤出所有与HTTP协议相关的安全策略。其中,off为禁止状态,on为允许状态
1 | getsebool -a | grep http |
5. 修改SELinux策略中与个人用户主页功能相关的规则布尔值为on,刷新网页
参数-P让修改后的SELinux策略规则永久生效且立即生效
1 | setsebool -P httpd_enable_homedirs=on |
添加口令功能
1. htpasswd
生成密码数据库
-c参数表示第一次生成;后面的是密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)
1 | htpasswd -c /etc/httpd/passwd yanji |
2. 编辑个人用户主页功能的配置文件,然后重启httpd服务,刷新网页后需输入口令才能访问
(RedHat7之前的个人用户主页功能是在主配置文件中的)
1 | vim /etc/httpd/conf.d/userdir.conf |
虚拟网站主机功能
基于IP地址
1. 配置IP地址
nmtui
命令打开网络配置页→选中Edit a connection→Edit→【把网络IPv4的配置方式改成Manual(手动)→show】→填写IP地址→OK
2. 将网卡配置文件中的ONBOOT参数修改成yes,重启网卡
1 | vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 |
3. 测试网络连通性
1 | ping -c 2 192.168.40.131 |
4. 分别在/home/wwwroot中创建用于保存不同网站数据的3个目录,并分别写入网站的首页文件
1 | mkdir -p /home/wwwroot/{131,141,151} |
5. 在httpd配置文件中添加三个基于IP地址的虚拟主机网站参数,重启httpd服务
1 | vim /etc/httpd/conf/httpd.conf |
6. 访问网站会看到编写的网页,如果显示的是默认首页,则可能是SElinux安全上下文与网站服务不符,参考配置服务文件参数的步骤6和7
基于主机域名
1. 定义IP地址与域名之间对应关系(本来应该用DNS解析服务的,但为演示方便直接修改hosts文件了)
由于是在Windows系统Chrome浏览器上测试,所以应修改C:\Windows\System32\drivers\etc\HOSTS文件,而Linux的是/etc/hosts文件,添加下面一行即可
1 | 192.168.40.131 www.zengzhilai.com bbs.zengzhilai.com mail.zengzhilai.com |
测试域名是否成功解析
1 | C:\Users\zengzhilai>ping www.zengzhilai.com |
2. 在/home/wwwroot中创建用于保存不同网站数据的三个目录,并分别写入网站的首页文件
1 | mkdir -p /home/wwwroot/{www,bbs,mail} |
3. 在配置文件写入三个基于主机名的虚拟主机网站参数,重启httpd服务
1 | vim /etc/httpd/conf/httpd.conf |
4. 正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合
(由于在前面的实验中已经设置/home/wwwroot
目录及其下的所有文件符合SELinux安全上下文了,所以这一步可省略)
5. 访问虚拟主机网站
基于端口号
- 可以让用户通过指定的端口号来访问服务器上的网站资源
- 需考虑httpd服务程序的配置因素以及SELinux服务对新开设端口的监控
- 一般使用80、443、8080等端口号来提供网站访问服务是比较合理的
1. 在/home/wwwroot中创建用于保存不同网站数据的两个目录,并分别写入网站的首页文件
1 | mkdir -p /home/wwwroot/{6111,6222} |
2. 在httpd服务配置文件中添加用于监听6111和6222端口的参数
1 | vim /etc/httpd/conf/httpd.conf |
3. 在httpd服务配置文件中写入两个基于端口号的虚拟主机网站参数
1 | vim /etc/httpd/conf/httpd.conf |
修改完配置文件后重启httpd服务会出现错误:Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.
这是因为SELinux服务检测到6111和6222端口原本不属于Apache服务应该需要的资源,但现在却以httpd服务程序的名义监听使用了,所以SELinux会拒绝使用Apache服务使用这两个端口
4. 正确设置网站数据目录文件的SELinux安全上下文,使其与网站服务功能相吻合
1 | semanage fcontext -a -t httpd_sys_content_t /home/wwwroot |
5. 添加6111和6222两端口号到SELinux允许的与HTTP协议相关的默认端口号中,重启httpd服务
1 | semanage port -a -t http_port_t -p tcp 6111 |
6. 防火墙开放6111和6222端口(关闭防火墙systemctl stop iptables
),重启防火墙,访问网站
1 | vim /etc/sysconfig/iptables |
注意:
原本端口号是随手打的6666和6667,但是实验后发现chrome浏览器对这两个端口进行了限制,查资料后给出的解释是这样的:
6666-6669是IRC协议使用的缺省端口,有安全风险,容易被木马程序利用,所以webkit内核的chrome缺省状态下禁止访问
FireFox访问给出的解释是这样的(感谢火狐浏览器☺):
Apache的访问控制
- Apache可以基于源主机名、源IP地址或源主机上的浏览器特征等信息对网站上的资源进行访问控制
- 通过Allow指令允许某个主机访问服务器上的网站资源,通过Deny指令实现禁止访问
- Order指令用来定义Allow或Deny指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令
- 如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求
在服务器上的网站数据目录中新建一个子目录,并创建首页文件
在前面已设置/home/wwwroot
替代/var/www/html
了,所以默认目录变了
1 | mkdir /home/wwwroot/server |
匹配源主机的浏览器进行访问控制
在httpd服务的配置文件中添加规则来限制源主机的访问
1 | vim /etc/httpd/conf/httpd.conf |
火狐浏览器访问成功页面:
谷歌浏览器访问被禁止页面:
匹配源主机的IP地址进行访问控制
在httpd服务的配置文件中添加规则:只允许IP地址为192.168.40.131的主机访问网站资源
1 | vim /etc/httpd/conf/httpd.conf |
Windows 10 IP地址不符合,被拒绝访问:
服务器的本身的IP地址192.168.40.131符合,允许访问