配置安全的linux-apache服务器(5)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
实验简介
实验所属系列Linux网络服务配置与安全
实验对象 本科/专科信息安全专业、网络工程
相关课程及专业系统安全配置、服务器配置、计算机网络
实验时数学分2学时
实验类别实践实验类
预备知识
虚拟主机简介
虚拟主机Virtual Host是指在一台主机上运行的多个Web 站点每个站点均有自己独立的域名或IP地址。虚拟主机允许为不同的IP地址、主机名或同一机器上的不同端口运行不同的服务器站点。譬如可以在同一个web服务器上使用虚拟主机来运行 http://www.example.com 和 http://www.anotherexample.com 这两个网站。虚拟主机对用户是透明的就好像每个站点都在单独的一台主机上运行一样。
SSL介绍
默认情况下客户端使用http协议访问apache服务器服务器和它的客户之间的通信就不会被加密这并不能保证数据传输过程中的安全。对于索求信用卡信息的电子商务网站需要更加可靠的传输而SSL加密连接可以帮助浏览者更加安全可靠的传输数据。使用SSL的是HTTPS协议。
在搭建安全的apache服务器配置使用基于SSL的HTTPS协议之前先了解一些证书的一些基本概念。
SSL证书可以在客户端浏览器和Web服务器之间建立一条SSL安全通道。首先要有一个根证书然后用根证书来签发服务器证书和客户证书。SSL必须安装服务器证书来认证在此环境中通常有三个证书根证书服务器证书客户端证书。在生成证书之前一般会有一个私钥用私钥生成证书请求最后利用证书服务器的根证来签发证书。
实验目的
Apache是一种开放源码的HTTP服务器由于其多平台和安全性而被广泛使用是最流行的Web服务器端软件之一。本实验首先通过基本配置演示了如何在redhat linux环境下搭建多个基于apache服务器的虚拟主机。在此基础上进一步完成了基于apache服务器的安全配置包括基于用户名的认证、基于IP地址的认证以及使用https协议进行双向认证的过程。
实验环境
测试系统
CentOS IP:10.1.1.47
WinXP IP:10.1.1.215
所需软件httpd-2.2.15-5.el6.i686.rpm、openssl-0.9.8l.tar.gz、od_ssl-2.8.0-1.3.17.tar.gz
实验步骤一
基本配置安装和启动Apache服务器
1、Apache软件的安装
在RHEL6.0中可以通过两种方式安装Apache服务器。一种是在RHEL6.0光盘上找到自带的httpd-2.2.14-5.el6.i686.rpm软件包。本次实验使用的是centos软件包已提前下载好。
其中httpd-manual-2.2.15-5.el6.noarch.rpm是Apache相关的帮助手册。
使用rpm命令安装httpd-2.2.15如果出现如下安装包的依赖问题
先用rpm -ivh httpd-tools-2.2.15-86.2.x86_64.rpm安装httpd-tools然后再执行上述安装命令即可。
系统安装成功后会创建/etc/httpd及相关的目录。
在/etc/httpd中的文件和目录的作用如下
1/etc/httpd/conf/httpd.conf: Apache的主配置文件。
2/etc/httpd/logs其实是符号链接指向/var/log/httpd目录用于存放Apache服务相关的日志文件。
3/etc/httpd/modules符号链接指向/usr/lib/httpd/modules目录用于存放Apache服务相关的模块。
此外和apache服务相关的文件及目录还有
4/usr/sbin/apachectl Apache控制脚本用于启动、停止、重启服务。
5/usr/sbin/httpd: Apache服务器的程序文件。
6/usr/share/doc/httpd-2.2.14Apache说明文档目录。
7/var/www: Apache提供的默认网站存放目录。
2、Apache 服务器的启动和停止
当安装完Apache服务器后如果想让其提供Web服务还必须启动它。
1使用service命令来启动和重新启动Apache服务器
#service httpd start 和 #service httpd restart
2使用控制脚本来启动和停止服务
#/usr/sbin/apachectl start 和 #/usr/sbin/apachectl stop
此外还可以使用#./apachectl -V查看已安装的apache的版本信息#./apachectl -l 查看apache服务安装的相关的模块。
3、查看Apache服务器是否启动
可以使用如下命令查看Apache服务器的运行状态
1#service httpd status
2#pstree | grep httpd
3#ps -eaf | grep httpd
查看Apache监听的端口
可以看到80端口号处于监听状态。为使客户端能访问Apache服务器的80端口要打开防火墙的TCP80端口。使用命令如下
或者使用下面的命令清空防火墙的所有规则
#iptables -F
4、测试服务器
可以在客户端的浏览器中输入服务器的IP验证一下如果没有错误会出现下图页面。
5、SElinux和Apache服务器
若SElinux处于开启状态则在SELinux默认的策略中apache进程默认只能访问/var/www目录。为了完成后面的一些操作需要关闭SELinux关闭的方法是
1修改/etc/selinux/config配置文件设置 SELINUX=disabled然后重启系统后生效。
2如果不想重启系统可以使用命令#setenforce 0 //建议使用此命令
如果不想关闭SELinux又想访问其他目录可以用如下命令给自己创建的目录如/var/website1添加httpd content类型的上下文
#chcon -Rt httpd_sys_content_t /var/website1
其中-R(recursive)递归-t(type)类型
虚拟主机设置
虚拟主机Virtual Host是指在一台主机上运行的多个Web 站点每个站点均有自己独立的域名或IP地址。虚拟主机允许为不同的IP地址、主机名或同一机器上的不同端口运行不同的服务器站点。譬如可以在同一个web服务器上使用虚拟主机来运行 http://www.example.com 和 http://www.anotherexample.com 这两个网站。虚拟主机对用户是透明的就好像每个站点都在单独的一台主机上运行一样。
Apache服务器提供两种类型的虚拟主机1基于IP 地址的虚拟主机每个Web 站点拥有不同的IP 地址2基于名字或主机名的虚拟主机不同的站点可以使用同一个IP地址但使用的域名不同。通过使用虚拟主机技术既可以在同一个服务器上同时搭建多个Web站点又可以通过共享同一个IP 地址以解决IP 地址缺乏的问题。
对于默认的虚拟主机和基于 IP 的虚拟主机该选项和<VirtualHost> 指令相对应对于基于名称的虚拟主机还需要配合NameVirtualHost 指令使用。
1、基于 IP 的虚拟主机
基于IP 的虚拟主机拥有不同的IP 地址这就要求服务器必须配置多个IP 地址。
1添加多个IP地址
使用命令#ifconfig查看网络配置。假设你的网络设备名为eth0。下面首先添加一个虚拟IP接口并配置IP地址为 10.1.1.120使用命令
$sudo ifconfig eth0:0 10.1.1.120 up //为网络设备eth0:0添加IP并启动
类似地再添加一个 10.1.1.121 的 ip
$sudo ifconfig eth0:1 10.1.1.121 up //注意此时的设备名为eth0:1
2添加两个虚拟主机所对应的站点目录
为了完成随后对虚拟主机的测试首先在/var目录下创建子目录website1作为使用IP地址为10.1.1.120虚拟主机所对应的站点目录同时在此目录下创建一个测试文件test1.html
#mkdir /var/website1
#echo 'This virtual host is based on ip address 10.1.1.120!' > /var/website1/test1.html
目录下创建测试文件
#mkdir /var/website2
#mkdir /var/website2/icons
#echo 'This virtual host is based on ip address 10.1.1.121!' > /var/website2/test2.html
3更改apache配置文件/etc/httpd/conf/httpd.conf
打开配置文件/etc/httpd/conf/httpd.conf找到第3 部分Section 3即用于设置和创建虚拟主机Virtual Hosts的部分在其中添加以下内容
<VirtualHost 10.1.1.120> //虚拟主机1使用的IP是10.1.1.120
DocumentRoot "/var/website1" //虚拟主机所对应的目录
Options Indexes FollowSymLinks //Indexes表示在指定的目录中找不到指定的文件时允许生成当前目录的文件列表
</VirtualHost>
<VirtualHost 10.1.1.121> //虚拟主机2使用的IP是10.1.1.121
DocumentRoot "/var/website2"
Options Indexes FollowSymLinks
</VirtualHost>
4重启服务并验证
在服务器端保存httpd.conf 配置文件利用命令#apachectl -t检查并确保虚拟主机配置正确。使用命令“service httpd restart”重启Apache 服务器以使配置生效。
在客户端打开浏览器输入http://10.1.1.120/test1.html如果配置正确会看到
2、基于名称的虚拟主机
假设我们想使用www.abc.com访问站点website1使用www.xyz.com访问站点website2需要创建两个基于名称的虚拟主机。因为最终域名要被解析为IP地址所以www.abc.com和www.xyz.com要对应到服务器的IP这两个站点可以使用同一个IP也可以使用不同的IP。假设使用同一个IP为10.1.1.122下面给出具体配置步骤
1添加虚拟主机ip接口
$sudo ifconfig eth0:2 10.1.1.122 up //为网络设备eth0:2添加IP并启动
2创建相关的目录添加主页文件
#mkdir /var/abc
#echo "welcome to abc page">/var/abc/abctest.html
#mkdir /var/xyz
#echo "welcome to xyz page">/var/xyz/xyztest.html
3更改apache配置文件/etc/httpd/conf/httpd.conf
找到第3 部分Section 3即用于设置和创建虚拟主机Virtual Hosts的部分在其中添加以下内容
NameVirtualHost 10.1.1.122
<VirtualHost 10.1.1.122>
DocumentRoot "/var/abc"
ServerName www.abc.com
</VirtualHost>
<VirtualHost 10.1.1.122>
DocumentRoot "/var/xyz"
ServerName www.xyz.com
</VirtualHost>
4配置客户端
配置客户端保证能将域名 www.abc.com和www.xyz.com解析成服务器的IP地址10.1.1.122。方法有两个一是配合使用DNS服务设置客户端的DNS Server的IP地址二是修改客户端的C:\Windows\System32\drivers\etc\hosts文件。DNS的配置比较复杂前面章节已有所涉及下面我们给出的是修改hosts文件。直接修改hosts文件添加下面的两行
10.1.1.122 www.abc.com
10.1.1.122 www.xyz.com
保存退出后用ping命令验证一下
#ping www.abc.com
5测试
在服务器端保存httpd.conf 配置文件利用命令#apachectl -t检查并确保虚拟主机配置正确。使用命令“service httpd restart”重启Apache 服务器以使配置生效。
在客户端打开浏览器输入http://www.abc.com/abctest.html
如果配置正确会看到
welcome to abc page的页面。
实验步骤二
安全配置进阶
1、基于认证的配置
1基本的Apache用户认证方法
若对某一目录如/var/website1/docs下的文件需要做到用户认证用vim编辑器打开Apache的主配置文件vim /etc/httpd/conf/httpd.conf
则在httpd.conf 中加入下面的行
<Directory /var/website1/docs>
Options Indexes
AllowOverride AuthConfig
</Directory>
使用Apache安装后自带的程序htpasswd添加用于认证的用户并将这些用户保存到文件/etc/.passwd此文件的格式是每行一个用户名密码。
htpasswd命令用法htpasswd [选项] 文件名 用户名
例如#htpasswd -c /etc/.passwd zhangsan //其中-c表示生成新的文件zhangsan是用户名生成文件时还可以选取多种加密方式参数-p(不加密)-m(md5加密)-s(SHA加密)-d(ENCRYPT加密)
要删除用户zhangsan使用命令
#htpasswd -D /etc/.passwd zhangsan
再添加用户lisi: #htpasswd /etc/.passwd lisi //lisi是用户名如果此用户在文件.htaccess存在则更新其密码否则添加用户
在要认证的目录/var/website1/docs下添加文件.htaccess内容如下
AuthName "MyAuth"
AuthType basic
Authuserfile /etc/.passwd
Require user zhangsan lisi …
验证浏览器输入http://10.1.1.120/docs/file1.txt
只有能提供正确的用户名和密码对才允许登录访问这是针对任何地址来的请求都要求提供用户名和密码认证。
2针对部分网段或地址要求认证。
要限制某些IP地址的访问需要设置对IP地址的认证。假定站点1主目录是/var/website1主目录下的某个目录如/var/website1/iplimit是禁止10.1.1.101访问的可以在httpd.conf中放入
<Directory /var/website1/iplimit>
Options Indexes FollowSymLinks
AllowOverride AuthConfig
order deny,allow
deny from 10.1.1.101
</Directory>
2、SSL加密的配置
SSL证书可以在客户端浏览器和Web服务器之间建立一条SSL安全通道。首先要有一个根证书然后用根证书来签发服务器证书和客户证书。SSL必须安装服务器证书来认证在此环境中通常有三个证书根证书服务器证书客户端证书。在生成证书之前一般会有一个私钥用私钥生成证书请求最后利用证书服务器的根证来签发证书。
2-1服务器端认证配置
1安装并配置ssl环境
用以下命令安装openssl环境已提供
#yum -y install openssl
安装完成后即可用openssl命令来生成、签署证书了查看openssl的安装目录是/usr/bin/openssl
安装mod_ssl
#yum -y install mod_ssl
实验机内用不了yum命令用#rpm -ivh mod_ssl-2.2.15-86.2.x86_64.rpm 命令安装
安装之后就会在目录/etc/httpd/conf.d下生成ssl.conf文件。
2生成CA证书
要建立一个 CA 的证书首先为CA证书 创建一个 RSA 私钥
#cd /root
#openssl genrsa -des3 -out ca.key 1024 //生成私钥 ca.key 文件。在此过程中系统会提示输入密码输入后牢记它。
#chmod 400 ca.key //将私钥文件属性改为400
#openssl rsa -noout -text -in ca.key //查看秘钥ca.key的内容
#openssl req -new -x509 -days 3650 -key ca.key -out ca.crt //利用 CA 的 RSA 密钥创建一个自签署的 CA 证书X.509结构生成 ca.crt 文件
在证书生成过程中需要输入下列信息
Country Name: cn //两个字母的国家代号;
State or Province Name: ShanDong //省份名称
Locality Name: QingDao //城市名称
Organization Name: Family Network //公司名称
Organizational Unit Name: Home //部门名称
Common Name: 10.1.1.47 //注意要与服务器的名称或IP一致因为我们使用IP来访问服务器这里我们填的是服务器的IP
Email Address: zhang@163.com //Email地址
#chmod 400 ca.crt //将文件属性改为400并放在安全的地方。
#openssl x509 -noout -text -in ca.crt //查看证书的内容
3创建服务器证书签署请求
首先为你的 Apache 创建一个 RSA 私用密钥
#openssl genrsa -des3 -out server.key 1024 //生成 server.key 文件
#chmod 400 server.key //将文件属性改为400并放在安全的地方。
#openssl rsa -noout -text -in server.key //查看秘钥的内容
#openssl req -new -key server.key -out server.csr //用 server.key 生成证书签署请求server.csr。这里也要输入一些信息和证书生成时输入的内容类似。 至于 'extra' attributes 不用输入。
#openssl req -noout -text -in server.csr //查看证书签署请求server.csr的细节
签署证书
#openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
#chmod 400 server.crt //将文件属性改为400并放在安全的地方。
#rm server.csr //删除CSR
4修改apache设置
修改/etc/httpd/conf.d/ssl.conf找到下面的两行
SSLCertificateFILE /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
将其中的localhost.crt、localhost.key参数分别改为刚才生成的文件server.crt、server.key并将server.crtserver.key拷贝到相应的目录中。
5测试
1)重启apache服务此时要填入生成证书时输入的认证码
2)windows客户端端验证
打开另一台机器如windows客户端。
打开IE浏览器输入https://10.1.1.47弹出安全警告
单击“查看证书”可以看到颁发给服务器的证书。选择“y”继续打开服务器主页。
图 服务器信任警告
单击添加例外“我已充分了解可能得风险”按钮然后“添加例外”出现图6所示对话框单击其中的查看按钮“查看…”可以查看关于该证书的详细信息。
图 添加安全例外
这样基于HTTPS协议的网页发布成功再次单击地址栏出现下图所示单击“更多信息…”按钮查看更多信息。
图 查看更多信息
2-2客户端认证配置
1生成客户端密钥库及证书
//生成用户的 RSA 密钥对
#openssl genrsa -des3 -out client.key 1024
//生成用户证书请求
#openssl req -new -days 3650 -key client.key -out client.csr //(注意其中Common Name填写客户端的ip如10.1.1.215)
//使用 CA 签发用户证书生成client.crt文件
#openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt
//生成pkcs格式文件将来导入到客户端浏览器中
#openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
注意其中输入的export password要记住后面用。
//将client.p12复制到服务器所对应的网站根目录这里是/var/www/html
#cp -p /root/client.p12 /var/www/html
2客户端下载所生成的证书
因为证书是在linux端生成的这里要在win下使用所以先将client.p12从linux传输到win下
将客户端证书放到网站根目录下由win主机去下载到桌面
图 客户端下载证书
3导入并查看证书
如果客户端使用ie浏览器可以直接双击client.p12按照提示一步步导入即可。
或者使用firefox浏览器导入client.p12证书文件。步骤打开forefox浏览器找到firefox 工具主菜单工具-->选项->高级->证书单击“查看证书”后将证书导入即可。
图 导入证书
输入前面的密码
图 加密证书
4修改ssl配置文件ssl.conf强行对客户端认证
修改/etc/httpd/conf.d/ssl.conf找到下面的行
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
SSLVerifyClient require //要求进行客户端认证。
SSLVerifyDepth 10
删除行首的注释“#”并将其中的 ca-bundle.crt 修改为 ca.crt并将原来生成的文件ca.crt其拷贝到相应的目录/etc/pki/tls/certs中。
#cp -p /root/ca.crt /etc/pki/tls/certs
(5)测试https://serve ip
首先重启服务。#service httpd restart
接下来在windows客户端打开浏览器输入https://10.1.1.47弹出对话框让用户选择客户端证书对客户端认证。
具体实验截图