六、apache(httpd)服务的访问控制
访问控制的目的: 通过访问控制尽量提升web服务器的安全
(1)客户机地址限制
主配置文件: /usr/local/httpd/conf/httpd.conf
默认情况下网站服务器是对所有客户机开放的,网页目录未作任何限制
配置项:
[root@centos7-007 ~]# vim /usr/local/httpd/conf/httpd.conf 。。。。。 (进入主配置文件找到这个区域配置项) <Directory "/usr/local/httpd/htdocs"> # # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.4/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # AllowOverride FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Require all granted (下面的所有进行的修改,都是在这里,现在这个“Require all granted ”就是允许所有地址访问) </Directory> 。。。。。 根据不同情况进行相关的修改 (1)拒绝所有主机访问: 应改为: Require all denied (2)仅允许某个IP地址的主机访问: 应改为: Require ip 主机的IP地址 (3)仅允许某个网段的主机访问: 应改为: Require ip 网段 (可以跟多个网段,中间用空格隔开) (4)仅拒绝某个地址或某个网段: 使用not 禁止访问时,配置项需要放在<RequireAll> </ReauireAll> 区域配置项中 该配置应该是: (直接往里写入即可,就是在容器里由加了个容器) <RequireAll> Require not ip 某个地址 或 某个网段 (仅拒绝某个地址或网段) Require all granted (允许所有) </ReauireAll> 如果要拒绝某个主机名或域名的访问,则修改为: <RequireAll> Require not host 主机名或域名 Require all granted (允许所有) </ReauireAll>
(2)用户授权限制
用户授权的限制的目的: 实现在访问apache网站服务器时需要用户名和密码的验证才能 正常访问网站
通过识别用户身份,达到控制用户访问网站特定目录的功能
httpd服务器支持的认证方式有两种:
- 摘要认证(Digest)
- 基本认证(Basic)
(如果要实现摘要认证,需要在编译安装apache的时候添加“--enable-auth-digest" 选项模块,并且不是所有的浏览器都支持摘要认证,所以我这里就不做详细的解释了)
基本认证
基本认证是httpd服务器的基本功能
要求: 以基本认证的方式实现对网站的访问控制
步骤:
(1)创建用户认证数据文件:(使用apache安装后自带的htpasswd工具进行创建) [root@centos7-007 ~]# htpasswd -c /usr/local/httpd/conf/.awspwd aaa (创建一个隐藏文件,该文件中包含一个叫aaa的用户) New password: (按照提示输入两次密码) Re-type new password: Adding password for user aaa (提示创建成功) [root@centos7-007 ~]# htpasswd /usr/local/httpd/conf/.awspwd bbb (再次创建一个用户bbb) New password: Re-type new password: Adding password for user bbb [root@centos7-007 ~]# cat /usr/local/httpd/conf/.awspwd (可以查看已经创建的用户) aaa:$apr1$rWLboxDd$fy/XHTvB6KbCUYbFzifTt. bbb:$apr1$Rsc7/LIy$0Uff9/HCiv7IKKiajhHoG0 (2)添加用户授权配置:(需要修改apache主配置文件中的特定区域) [root@centos7-007 ~]# vim /usr/local/httpd/conf/httpd.conf (进入主配置文件) 。。。。。 (找到网站根目录区域) # DocumentRoot "/usr/local/httpd/htdocs" <Directory "/usr/local/httpd/htdocs"> # 。。。。。 # # Controls who can get stuff from this server. # Require all granted </Directory> 。。。。。(就是上面允许客户机地址配置项的区域配置项里) 把“Require all granted”删除 修改为: AuthName “www.aaa.com” (这个写自己上面修改的域名即可,一般配合dns) AuthType Basic (认证类型是基本认证) AuthUserFile /usr/local/httpd/conf/.awspwd (认证文件,也就是所保存的用户名和密码的数据文件) Require valid-user (授权所有的合法用户) 保存退出 [root@centos7-007 ~]# systemctl restart httpd (重启服务)
再次刷新网页发现需要输入用户名和密码才能访问(此时是两个用户aaa和bbb都可以访问)
成功!!!!
- 如果只想要aaa用户一个可以访问httpd的话,则把 “Require valid-user” 改为 “Require user aaa”
(如果想要授权多个用户则使用空格隔开即可)
[root@centos7-007 ~]# vim /usr/local/httpd/conf/httpd.conf 。。。。。 AuthName “www.aaa.com” AuthType Basic AuthUserFile /usr/local/httpd/conf/.awspwd Require user aaa (改这里就行) 。。。。。 [root@centos7-007 ~]# systemctl restart httpd (重启服务即可)
再次访问发现只有aaa用户可以进行访问,bbb用户无法进行访问,刚重启完服务可能还没生效,等一会就好了
成功!!!!
七、构建虚拟web主机
虚拟web主机定义: 在同一台服务器上运行多个web站点,每个站点不独立占用整个服务器
优点: 充分利用服务器硬件资源,降低网站构建以及运行成本
三种类型的主机:
(1)基于域名的虚拟主机:
网站使用不同的域名,相同的ip地址,需要dns服务器支持,最广泛,最普遍的虚拟主机
(2)基于ip地址:
使用不同的域名对应不同的ip,需要服务器配备多个网卡接口,应用不广泛
(3)基于端口的:
不使用域名,使用相同的ip地址不同的tcp端口号,用户访问时必须指定网站的端口号,应用不广泛
(1)基于域名的虚拟主机示例:
要求: 构建www.aaa.com和www.bbb.com这种基于域名的虚拟主机
步骤:
[root@centos7-007 ~]# vim /etc/named.conf (因为之前已经搭建过dns所以这里直接加一个区域即可) zone "." IN { type hint; file "named.ca"; }; zone "aaa.com" IN { type master; file "aaa.ca"; }; zone "bbb.com" IN { type master; file "bbb.ca"; }; include "/etc/named.rfc1912.zones"; include "/etc/named.root.key"; 保存退出 [root@centos7-007 ~]# vim /etc/named.conf [root@centos7-007 named]# cp aaa.ca bbb.ca (把写好了aaa.ca直接复制一份即可) [root@centos7-007 named]# vim bbb.ca $TTL 1D @ IN SOA bbb.com. mail.bbb.com. ( 2020120900 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS www.bbb.com. www IN A 192.168.100.7 [root@centos7-007 named]# chown named:named bbb.ca (不要忘了给属主和属组) [root@centos7-007 named]# systemctl restart named (重启dns服务) [root@centos7-007 named]# cd /usr/local/httpd/htdocs/ (cd到网站根目录) [root@centos7-007 htdocs]# mkdir aaa bbb (为两个域名准备网站根目录) [root@centos7-007 htdocs]# ll 总用量 4 drwxr-xr-x 2 root root 6 12月 9 22:17 aaa drwxr-xr-x 2 root root 6 12月 9 22:17 bbb -rw-r--r-- 1 root root 7 12月 9 18:00 index.html [root@centos7-007 htdocs]# echo "aaaaa" > /usr/local/httpd/htdocs/aaa/index.html [root@centos7-007 htdocs]# echo "bbbbb" > /usr/local/httpd/htdocs/bbb/index.html (为两个网站的页面写入内容) [root@centos7-007 htdocs]# vim /usr/local/httpd/conf/httpd.conf 在487行,将Include 前默认存在的“#” 去掉,表示加载独立的配置文件) 。。。。。 486 # Virtual hosts 487 Include conf/extra/httpd-vhosts.conf 。。。。。 保存退出 [root@centos7-007 htdocs]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf (修改独立配置文件) 上面的注释行不用管 <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/usr/local/httpd/docs/dummy-host.example.com" ServerName dummy-host.example.com ServerAlias www.dummy-host.example.com ErrorLog "logs/dummy-host.example.com-error_log" CustomLog "logs/dummy-host.example.com-access_log" common </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/usr/local/httpd/docs/dummy-host2.example.com" ServerName dummy-host2.example.com ErrorLog "logs/dummy-host2.example.com-error_log" CustomLog "logs/dummy-host2.example.com-access_log" common </VirtualHost> 修改为: <VirtualHost *:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/usr/local/httpd/htdocs/aaa" (网站的根目录) ServerName www.aaa.com (网站的域名) ServerAlias www.dummy-host.example.com (网站别名,可省略) ErrorLog "logs/www.aaa.com-error_log" (网站错误日志名称) CustomLog "logs/www.aaa.com-access_log" common (网站成功日志的名称) <Directory "/usr/local/httpd/htdocs"> (授权所有用户都能访问网站,可加可不加,下面的和这个一样) Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/usr/local/httpd/htdocs/bbb" ServerName www.bbb.com ErrorLog "logs/www.bbb.com-error_log" CustomLog "logs/www.bbb.com-access_log" common <Directory "/usr/local/httpd/htdocs"> Require all granted </Directory> </VirtualHost> 保存退出 [root@centos7-007 htdocs]# systemctl restart httpd (重启服务 )
验证访问,发现两个不同域名可以访问不同的页面
成功!!!!
(2)基于ip地址的虚拟主机示例:
[root@centos7-007 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 。。。。。 (添加一个网址) IPADDR2=192.168.100.8 PREFIX=24 。。。。。 [root@centos7-007 ~]# systemctl restart network (重启网卡) [root@centos7-007 ~]# ip a (发现成功添加了一个网址192.168.100.8) 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:44:ad:db brd ff:ff:ff:ff:ff:ff inet 192.168.100.7/24 brd 192.168.100.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet 192.168.100.8/24 brd 192.168.100.255 scope global secondary noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::7762:f351:dbfc:cb0e/64 scope link noprefixroute valid_lft forever preferred_lft forever 准备两个网站的根目录(上一个已经创建好了所以这里就不创建了) 在主配置文件添加虚拟主机支持 (上一个实验已经做过,这里就不做了) 。。。。。 51 #Listen 12.34.56.78:80 (在52行修改并添加下面的地址和端口号) 52 Listen 192.168.100.7:80 53 Listen 192.168.100.8:80 。。。。。 [root@centos7-007 ~]# systemctl restart httpd (重启服务) [root@centos7-007 ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf (修改独立配置文件) 如果是直接做这个的话,这里只需要修改一下“<VirtualHost 192.168.100.7:80>”中的地址 修改“DocumentRoot "/usr/local/httpd/htdocs/aaa"”中的网站根目录和修改日志的名称即可 <VirtualHost 192.168.100.7:80> ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/usr/local/httpd/htdocs/aaa" ServerName www.aaa.com ServerAlias www.dummy-host.example.com ErrorLog "logs/www.aaa.com-error_log" CustomLog "logs/www.aaa.com-access_log" common </VirtualHost> <VirtualHost 192.168.100.8:80> ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/usr/local/httpd/htdocs/bbb" ServerName www.bbb.com ErrorLog "logs/www.bbb.com-error_log" CustomLog "logs/www.bbb.com-access_log" common </VirtualHost> 保存退出 [root@centos7-007 ~]# systemctl restart httpd (重启服务)
如果之前做了用户授权配置的话,要记得把主配置文件中的这个改成Require all granted (允许所有人访问)
验证访问,发现两个网址可以访问不同的页面
成功!!!!
(3)基于端口的虚拟主机示例:
基于80端口和8080端口的
[root@centos7-007 ~]# vim /usr/local/httpd/conf/httpd.conf (进入主配置文件) 。。。。。 (修改52行的Listen选项,添加一个8080端口) 51 #Listen 12.34.56.78:80 52 Listen 80 53 Listen 8080 54 。。。。。 保存退出 [root@centos7-007 ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf (修改独立配置文件) <VirtualHost *:80> (第一个只需要指定网站根目录、日志名称即可) ServerAdmin webmaster@dummy-host.example.com DocumentRoot "/usr/local/httpd/htdocs/aaa" ServerName www.aaa.com (域名无需修改,这是我做上面的实验修改的) ServerAlias www.dummy-host.example.com ErrorLog "logs/www.aaa.com-error_log" CustomLog "logs/www.aaa.com-access_log" common </VirtualHost> <VirtualHost *:8080> (第二个指定访问端口、网站根目录、日志名称) ServerAdmin webmaster@dummy-host2.example.com DocumentRoot "/usr/local/httpd/htdocs/bbb" ServerName www.bbb.com (域名无需修改,这是我做上面的实验修改的) ErrorLog "logs/www.bbb.com-error_log" CustomLog "logs/www.bbb.com-access_log" common </VirtualHost> 保存退出 [root@centos7-007 ~]# systemctl restart httpd (重启服务)
访问验证,发现当访问httpd服务器地址后面跟不同的端口号时,访问的页面也不同
默认就是80端口,所以访问80端口时不用加端口号,但是访问8080端口得加
成功!!!!