编辑
2023-03-08
Linux学习
00
请注意,本文编写于 561 天前,最后修改于 558 天前,其中某些信息可能已经过时。

目录

Apache 服务程序的部署
配置服务文件参数
SELinux 安全子系统
semanage 命令
虚拟主机功能
基于 IP 地址
基于主机域名
基于端口号
Apache 的访问控制

Apache 服务程序的部署

第 1 步:把光盘设备中的系统镜像挂载到/media/cdrom 目录。

[root@linuxprobe ~]# mkdir -p /media/cdrom [root@linuxprobe ~]# mount /dev/cdrom /media/cdrom mount: /dev/sr0 is write-protected, mounting read-only

第 2 步:使用 Vim 文本编辑器创建 Yum 仓库的配置文件。

[root@linuxprobe ~]# vim /etc/yum.repos.d/rhel7.repo [rhel7] name=rhel7 baseurl=file:///media/cdrom enabled=1 gpgcheck=0

第 3 步:动手安装 Apache 服务程序。注意,使用 yum 命令进行安装时,跟在命令后面的Apache 服务的软件包名称为 httpd。如果直接执行 yum install apache 命令,则系统会报错。

[root@linuxprobe ~]# yum install httpd Loaded plugins: langpacks, product-id, subscription-manager ………………省略部分输出信息……………… Dependencies Resolved ============================================================================ Package Arch Version Repository Size ============================================================================ Installing: httpd x86_64 2.4.6-17.el7 rhel 1.2 M Installing for dependencies: apr x86_64 1.4.8-3.el7 rhel 103 k apr-util x86_64 1.5.2-6.el7 rhel 92 k httpd-tools x86_64 2.4.6-17.el7 rhel 77 k mailcap noarch 2.1.41-2.el7 rhel 31 k Transaction Summary ============================================================================ Install 1 Package (+4 Dependent packages) Total download size: 1.5 M Installed size: 4.3 M Is this ok [y/d/N]: y Downloading packages: ………………省略部分输出信息……………… Complete!

第 4 步:启用 httpd 服务程序并将其加入到开机启动项中,使其能够随系统开机而运行,从而持续为用户提供 Web 服务:

[root@linuxprobe ~]# systemctl start httpd [root@linuxprobe ~]# systemctl enable httpd ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user. target.wants/httpd.service'

在浏览器(这里以 Firefox 浏览器为例)的地址栏中输入 http://127.0.0.1 并按回车键,就可以看到用于提供 Web 服务的 httpd 服务程序的默认页面了。

[root@linuxprobe ~]# firefox

配置服务文件参数

Linux 系统中的配置文件:

配置文件的名称存放位置
服务目录/etc/httpd
主配置文件/etc/httpd/conf/httpd.conf
网站数据目录/var/www/html
访问日志/var/log/httpd/access_log
错误日志/var/log/httpd/error_log

在 httpd 服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置 。

全局配置参数就是一种全局性的配置参数,可作用于对所有的子站点,既保证了子站点的正常访问,也有效减少了频繁写入重复参数的工作量。区域配置参数则是单独针对于每个独立的子站点进行设置的。

在 httpd 服务程序主配置文件中,最为常用的参数如表所示。

参数用途
ServerRoot服务目录
ServerAdmin管理员邮箱
User运行服务的用户
Group运行服务的用户组
ServerName网站服务器的域名
DocumentRoot网站数据目录
Directory网站数据目录的权限
Listen监听的 IP 地址与端口号
DirectoryIndex默认的索引页页面
ErrorLog错误日志文件
CustomLog访问日志文件
Timeout网页超时时间,默认为 300 秒

从表中可知, DocumentRoot 参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html 目录中;而当前网站普遍的首页面名称是 index.html,因此可以向/var/www/html 目录中写入一个文件,替换掉 httpd 服务程序的默认首页面,该操作会立即生效。

在执行上述操作之后,再在 Firefox 浏览器中刷新 httpd 服务程序,可以看到该程序的首 页面内容已经发生了改变,如图 10-5 所示。

[root@linuxprobe ~]# echo "Welcome To LinuxProbe.Com" > /var/www/html/index.html [root@linuxprobe ~]# firefox

在默认情况下,网站数据是保存在/var/www/html 目录中,而如果想把保存网站数据的目录修改为/home/wwwroot 目录,该怎么操作呢?且看下文。 第 1 步:建立网站数据的保存目录,并创建首页文件。

[root@linuxprobe ~]# mkdir /home/wwwroot [root@linuxprobe ~]# echo "The New Web Directory" > /home/wwwroot/index.html

第 2 步:打开 httpd 服务程序的主配置文件,将约第 119 行用于定义网站数据保存路径的参数 DocumentRoot 修改为/home/wwwroot,同时还需要将约第 124 行用于定义目录权限的参数 Directory 后面的路径也修改为/home/wwwroot。配置文件修改完毕后即可保存并退出。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113 114 # 115 # DocumentRoot: The directory out of which you will serve your 116 # documents. By default, all requests are taken from this directory, but 117 # symbolic links and aliases may be used to point to other locations. 118 # 119 DocumentRoot "/home/wwwroot" 120 121 # 122 # Relax access to content within /var/www. 123 # 124 <Directory "/home/wwwroot"> 125 AllowOverride None 126 # Allow open access: 127 Require all granted 128 </Directory> ………………省略部分输出信息……………… [root@linuxprobe ~]#

第 3 步:重新启动 httpd 服务程序并验证效果,浏览器刷新页面后的内容为默认首页。为什么看到了 httpd 服务程序的默认首页面?按理来说,只有在网站的首页面文件不存在或者用户权限不足时,才显示 httpd 服务程序的默认首页面。我们在尝试访问 http://127.0.0.1/index.html 页面时, 竟然发现页面中显示“Forbidden,You don't have permission to access /index.html on this server.”。而这一切正是 SELinux 在捣鬼。

[root@linuxprobe ~]# systemctl restart httpd[root@linuxprobe ~]# firefox

SELinux 安全子系统

SELinux( Security-Enhanced Linux)是美国国家安全局在 Linux 开源社区的帮助下开发的一个强制访问控制( MAC, Mandatory Access Control)的安全子系统。 RHEL 7 系统使用SELinux 技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

SELinux 服务有三种配置模式,具体如下。

  • enforcing:强制启用安全策略模式,将拦截服务的不合法请求。
  • permissive:遇到服务越权访问时,只发出警告而不强制拦截。
  • disabled:对于越权的行为不警告也不拦截。

查看 SELinux 服务主配置文件中定义的默认状态。如果是 permissive 或 disabled,建议赶紧修改为 enforcing。

[root@linuxprobe ~]# vim /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded.SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are protected.# mls - Multi Level Security protection. SELINUXTYPE=targeted

SELinux 服务的主配置文件中,定义的是 SELinux 的默认运行状态,可以将其理解为系统重启后的状态,因此它不会在更改后立即生效。可以使用 getenforce 命令获得当前 SELinux 服务的运行模式:

[root@linuxprobe ~]# getenforceEnforcing

为了确认无法访问的结果确实是因为 SELinux 而导致的,可以用 setenforce [0|1]命令修改 SELinux 当前的运行模式( 0 为禁用, 1 为启用)。注意,这种修改只是临时的,在系统 重启后就会失效:

[root@linuxprobe ~]# setenforce 0[root@linuxprobe ~]# getenforcePermissive

再次刷新网页,就会看到正常的网页内容了。

semanage 命令

semanage 命令用于管理 SELinux 的策略,格式为“semanage [选项] [文件]”。 SELinux 服务极大地提升了 Linux 系统的安全性,将用户权限牢牢地锁在笼子里。semanage 命令不仅能够像传统 chcon 命令那样—设置文件、目录的策略,还可以管理网络端口、消息接口。使用 semanage 命令时,经常用到的几个参数及其功能如下所示:

  • -l 参数用于查询;

  • -a 参数用于添加;

  • -m 参数用于修改;

  • -d 参数用于删除。

例如,可以向新的网站数据目录中新添加一条 SELinux 安全上下文,让这个目录以及里面的所有文件能够被 httpd 服务程序所访问到:

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/*

注意,执行上述设置之后,还无法立即访问网站,还需要使用 restorecon 命令将设置好的 SELinux 安全上下文立即生效。在使用 restorecon 命令时,可以加上-Rv 参数对指定的目录 进行递归操作,以及显示 SELinux 安全上下文的修改过程。最后,再次刷新页面,就可以正 常看到网页内容了。

[root@linuxprobe ~]# restorecon -Rv /home/wwwroot/ restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0-> unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/index.html context unconfined_u:object_r:home_root_ t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox

个人用户主页功能

该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。 第 1 步:在 httpd 服务程序中,默认没有开启个人用户主页功能。为此,我们需要编辑下面的配置文件,然后在第 17 行的 UserDir disabled 参数前面加上井号( #),表示让 httpd 服务程序开启个人用户主页功能;同时再把第 24 行的 UserDir public_html 参数前面的井号(#)去掉( UserDir 参数表示网站数据在用户家目录中的保存目录名称,即 public_html 目录)。最后,在修改完毕后记得保存。

[root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 1 # 2 # UserDir: The name of the directory that is appended onto a user's home 3 # directory if a ~user request is received. 4 # 5 # The path to the end user account 'public_html' directory must be 6 # accessible to the webserver userid. This usually means that ~userid 7 # must have permissions of 711, ~userid/public_html must have permissions 8 # of 755, and documents contained therein must be world-readable. 9 # Otherwise, the client will only receive a "403 Forbidden" message. 10 # 11 <IfModule mod_userdir.c> 12 # 13 # UserDir is disabled by default since it can confirm the presence 14 # of a username on the system (depending on home directory 15 # permissions). 16 # 17 # UserDir disabled 18 19 # 20 # To enable requests to /~user/ to serve the user's public_html 21 # directory, remove the "UserDir disabled" line above, and uncomment 22 # the following line instead: 23 # 24 UserDir public_html 25 </IfModule> 26 27 # 28 # Control access to UserDir directories. The following is an example 29 # for a site where these directories are restricted to read-only. 30 # 31 <Directory "/home/*/public_html"> 32 AllowOverride FileInfo AuthConfig Limit Indexes 33 Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec 34 Require method GET POST OPTIONS 35 </Directory>

第 2 步:在用户家目录中建立用于保存网站数据的目录及首页面文件。另外,还需要把 家目录的权限修改为 755,保证其他人也有权限读取里面的内容。

[root@linuxprobe home]# su - linuxprobe Last login: Fri May 22 13:17:37 CST 2017 on :0 [linuxprobe@linuxprobe ~]$ mkdir public_html [linuxprobe@linuxprobe ~]$ echo "This is linuxprobe's website" > public_html/ index.html [linuxprobe@linuxprobe ~]$ chmod -Rf 755 /home/linuxprobe

第 3 步:重新启动 httpd 服务程序,在浏览器的地址栏中输入网址,其格式为“网址/~ 用户名”(其中的波浪号是必需的,而且网址、波浪号、用户名之间没有空格),从理论上来 讲就可以看到用户的个人网站了。 不出所料的是,系统显示报错页面,这一定还是 SELinux 惹的祸。

第 4 步:思考这次报错的原因是什么。 httpd 服务程序在提供个人用户主页功能时,该用户的网站数据目录本身就应该是存放到与这位用户对应的家目录中的,所以应该不需要修改家目录的 SELinux 安全上下文。但是,前文还讲到了 Linux 域的概念。 Linux 域确保服务程序不能执行违规的操作,只能本本分分地为用户提供服务。 httpd 服务中突然开启的这项个人用户主页功能到底有没有被 SELinux 域默认允许呢?

接下来使用 getsebool 命令查询并过滤出所有与 HTTP 协议相关的安全策略。其中, off 为禁止状态, on 为允许状态。

[root@linuxprobe ~]# getsebool -a | grep http httpd_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_connect_ftp --> off httpd_can_connect_ldap --> off httpd_can_connect_mythtv --> off httpd_can_connect_zabbix --> off httpd_can_network_connect --> off httpd_can_network_connect_cobbler --> off httpd_can_network_connect_db --> off httpd_can_network_memcache --> off httpd_can_network_relay --> off httpd_can_sendmail --> off httpd_dbus_avahi --> off httpd_dbus_sssd --> off httpd_dontaudit_search_dirs --> off httpd_enable_cgi --> on httpd_enable_ftp_server --> off httpd_enable_homedirs --> off httpd_execmem --> off httpd_graceful_shutdown --> on httpd_manage_ipa --> off httpd_mod_auth_ntlm_winbind --> off httpd_mod_auth_pam --> off httpd_read_user_content --> off httpd_run_stickshift --> off httpd_serve_cobbler_files --> off httpd_setrlimit --> off httpd_ssi_exec --> off httpd_sys_script_anon_write --> off httpd_tmp_exec --> off httpd_tty_comm --> off httpd_unified --> off httpd_use_cifs --> off httpd_use_fusefs --> off httpd_use_gpg --> off httpd_use_nfs --> off httpd_use_openstack --> off httpd_use_sasl --> off httpd_verify_dns --> off named_tcp_bind_http_port --> off prosody_bind_http_port --> off

面对如此多的 SELinux 域安全策略规则,实在没有必要逐个理解它们,我们只要能通过名字大致猜测出相关的策略用途就足够了。比如,想要开启 httpd 服务的个人用户主页功能,那么用到的 SELinux 域安全策略应该是 httpd_enable_homedirs 吧?大致确定后就可以用setsebool 命令来修改 SELinux 策略中各条规则的布尔值了。一定要记得在 setsebool 命令后面加上-P 参数,让修改后的 SELinux 策略规则永久生效且立即生效。

[root@linuxprobe ~]# setsebool -P httpd_enable_homedirs=on [root@linuxprobe ~]# firefox

有时,网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户访 客看到里面的内容,这时就可以在网站中添加口令功能了。 第 1 步:先使用 htpasswd 命令生成密码数据库。 -c 参数表示第一次生成;后面再分 别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的 本地账户)。

[root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe New password:此处输入用于网页验证的密码 Re-type new password:再输入一遍进行确认 Adding password for user linuxprobe 第 2 步: 编辑个人用户主页功能的配置文件。把第 31~35 行的参数信息修改成下列内容, 其中井号( #)开头的内容为刘遄老师添加的注释信息,可将其忽略。随后保存并退出配置文 件,重启 httpd 服务程序即可生效。 [root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf 27 # 28 # Control access to UserDir directories. The following is an example 29 # for a site where these directories are restricted to read-only. 30 # 31 <Directory "/home/*/public_html"> 32 AllowOverride all \#刚刚生成出来的密码验证文件保存路径 33 authuserfile "/etc/httpd/passwd" \#当用户尝试访问个人用户网站时的提示信息 34 authname "My privately website" 35 authtype basic \#用户进行账户密码登录时需要验证的用户名称 36 require user linuxprobe 37 </Directory> [root@linuxprobe ~]# systemctl restart httpd

此后,当用户再想访问某个用户的个人网站时,就必须要输入账户和密码才能正常访问了。另外,验证时使用的账户和密码是用 htpasswd 命令生成的专门用于网站登录的口令密码,而不是系统中的用户密码。

虚拟主机功能

Apache 的虚拟主机功能是服务器基于用户请求的不同 IP 地址、主机域名或端口号,实现提供多个网站同时为外部提供访问服务的技术,用户请求的资源不同,最终获取到的网页内容也各不相同。

基于 IP 地址

第 1 步:确保三张网卡IP获取正常,分别在/home/wwwroot 中创建用于保存不同网站数据的3 个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便我们稍后能更直观地检查效果。

[root@linuxprobe ~]# mkdir -p /home/wwwroot/10 [root@linuxprobe ~]# mkdir -p /home/wwwroot/20 [root@linuxprobe ~]# mkdir -p /home/wwwroot/30 [root@linuxprobe ~]# echo "IP:192.168.10.10" > /home/wwwroot/10/index.html [root@linuxprobe ~]# echo "IP:192.168.10.20" > /home/wwwroot/20/index.html [root@linuxprobe ~]# echo "IP:192.168.10.30" > /home/wwwroot/30/index.html

第 2 步:在 httpd 服务的配置文件中大约 113 行处开始,分别追加写入三个基于 IP 地址的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113 <VirtualHost 192.168.10.10> 114 DocumentRoot /home/wwwroot/10 115 ServerName www.linuxprobe.com 116 <Directory /home/wwwroot/10 > 117 AllowOverride None 118 Require all granted 119 </Directory> 120 </VirtualHost> 121 <VirtualHost 192.168.10.20> 122 DocumentRoot /home/wwwroot/20 123 ServerName bbs.linuxprobe.com 124 <Directory /home/wwwroot/20 > 125 AllowOverride None 126 Require all granted 127 </Directory> 128 </VirtualHost> 129 <VirtualHost 192.168.10.30> 130 DocumentRoot /home/wwwroot/30 131 ServerName tech.linuxprobe.com 132 <Directory /home/wwwroot/30 > 133 AllowOverride None 134 Require all granted 135 </Directory> 136 </VirtualHost> ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd

第 3 步:此时访问网站,则会看到 httpd 服务程序的默认首页面。大家现在应该立刻就反应过来—这是 SELinux 在捣鬼。由于当前的/home/wwwroot 目录及里面的网站数据目录的SELinux 安全上下文与网站服务不吻合,因此 httpd 服务程序无法获取到这些网站数据目录。我们需要手动把新的网站数据目录的 SELinux 安全上下文设置正确,并使用restorecon 命令让新设置的 SELinux 安全上下文立即生效,这样就可以立即看到网站的访问效果了。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/10/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/20/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/30/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0-> unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/10 context unconfined_u:object_r:home_root_t:s0- \>unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/10/index.html context unconfined_u:object_r:home_ root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/20 context unconfined_u:object_r:home_root_t:s0-> unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/20/index.html context unconfined_u:object_r:home_ root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/30 context unconfined_u:object_r:home_root_t:s0-> unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/30/index.html context unconfined_u:object_r:home_ root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox

基于主机域名

当服务器无法为每个网站都分配一个独立 IP 地址的时候,可以尝试让 Apache 自动识别用户请求的域名,从而根据不同的域名请求来传输不同的内容。在这种情况下的配置更加简单, 只需要保证位于生产环境中的服务器上有一个可用的 IP 地址就可以了。**/etc/hosts 是 Linux 系统中用于强制把某个主机域名解析到指定 IP 地址的配置文件。**简单来说,只要这个文件配置正确,即使网卡参数中没有 DNS 信息也依然能够将域名解析为某个 IP 地址。

第 1 步:手工定义 IP 地址与域名之间对应关系的配置文件,保存并退出后会立即生效。 可以通过分别 ping 这些域名来验证域名是否已经成功解析为 IP 地址。

[root@linuxprobe ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.10.10 www.linuxprobe.com bbs.linuxprobe.com tech.linuxprobe.com [root@linuxprobe ~]# ping -c 4 www.linuxprobe.com PING www.linuxprobe.com (192.168.10.10) 56(84) bytes of data. 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=1 ttl=64 time=0.070 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=2 ttl=64 time=0.077 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=3 ttl=64 time=0.061 ms 64 bytes from www.linuxprobe.com (192.168.10.10): icmp_seq=4 ttl=64 time=0.069 ms --- www.linuxprobe.com ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.061/0.069/0.077/0.008 ms [root@linuxprobe ~]#

第 2 步:分别在/home/wwwroot 中创建用于保存不同网站数据的三个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便我们稍后能更直观地检查效果。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113 <VirtualHost 192.168.10.10> 114 DocumentRoot "/home/wwwroot/www" 115 ServerName "www.linuxprobe.com" 116 <Directory "/home/wwwroot/www"> 117 AllowOverride None 118 Require all granted 119 </directory> 120 </VirtualHost> 121 <VirtualHost 192.168.10.10> 122 DocumentRoot "/home/wwwroot/bbs" 123 ServerName "bbs.linuxprobe.com" 124 <Directory "/home/wwwroot/bbs"> 125 AllowOverride None 126 Require all granted 127 </Directory> 128 </VirtualHost> 129 <VirtualHost 192.168.10.10> 130 DocumentRoot "/home/wwwroot/tech" 131 ServerName "tech.linuxprobe.com" 132 <Directory "/home/wwwroot/tech"> 133 AllowOverride None 134 Require all granted 135 </directory> 136 </VirtualHost> ………………省略部分输出信息………………

第 4 步:因为当前的网站数据目录还是在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的 SELinux 安全上下文立即生效,这样就可以立即访问到虚拟主机网站了。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/www/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/bbs/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/tech/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0->unconfined_u: object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/www context unconfined_u:object_r:home_root_t: s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/www/index.html context unconfined_u:object_r: home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/bbs context unconfined_u:object_r:home_root_t: s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/bbs/index.html context unconfined_u:object_r: home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/tech context unconfined_u:object_r:home_root_t: s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/tech/index.html context unconfined_u:object_r: home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# firefox

基于端口号

基于端口号的虚拟主机功能可以让用户通过指定的端口号来访问服务器上的网站资源。在使用 Apache 配置虚拟网站主机功能时,基于端口号的配置方式是最复杂的。因此我们不仅要考虑 httpd 服务程序的配置因素,还需要考虑到 SELinux 服务对新开设端口的监控。一般来说,使用 80、 443、 8080 等端口号来提供网站访问服务是比较合理的,如果使用其他端口号则会受到 SELinux 服务的限制。

在接下来的实验中,我们不但要考虑到目录上应用的 SELinux 安全上下文的限制,还需要考虑 SELinux 域对 httpd 服务程序的管控。

第 1 步:分别在/home/wwwroot 中创建用于保存不同网站数据的两个目录,并向其中分别写入网站的首页文件。每个首页文件中应有明确区分不同网站内容的信息,方便我们稍后能更直观地检查效果。

[root@linuxprobe ~]# mkdir -p /home/wwwroot/6111 [root@linuxprobe ~]# mkdir -p /home/wwwroot/6222 [root@linuxprobe ~]# echo "port:6111" > /home/wwwroot/6111/index.html [root@linuxprobe ~]# echo "port:6222" > /home/wwwroot/6222/index.html

第 2 步:在 httpd 服务配置文件的第 43 行和第 44 行分别添加用于监听 6111 和 6222端口的参数。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 33 # 34 # Listen: Allows you to bind Apache to specific IP addresses and/or 35 # ports, instead of the default. See also the <VirtualHost> 36 # directive. 37 # 38 # Change this to Listen on specific IP addresses as shown below to 39 # prevent Apache from glomming onto all bound IP addresses. 40 # 41 #Listen 12.34.56.78:80 42 Listen 80 43 Listen 6111 44 Listen 6222 ………………省略部分输出信息………………

第 3 步:在 httpd 服务的配置文件中大约 113 行处开始,分别追加写入两个基于端口号的虚拟主机网站参数,然后保存并退出。记得需要重启 httpd 服务,这些配置才生效。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 113 <VirtualHost 192.168.10.10:6111> 114 DocumentRoot "/home/wwwroot/6111" 115 ServerName www.linuxprobe.com 116 <Directory "/home/wwwroot/6111"> 117 AllowOverride None 118 Require all granted 119 </Directory> 120 </VirtualHost> 121 <VirtualHost 192.168.10.10:6222> 122 DocumentRoot "/home/wwwroot/6222" 123 ServerName bbs.linuxprobe.com 124 <Directory "/home/wwwroot/6222"> 125 AllowOverride None 126 Require all granted 127 </Directory> 128 </VirtualHost> ………………省略部分输出信息………………

第 4 步:因为我们把网站数据目录存放在/home/wwwroot 目录中,因此还是必须要正确设置网站数据目录文件的 SELinux 安全上下文,使其与网站服务功能相吻合。最后记得用restorecon 命令让新配置的 SELinux 安全上下文立即生效。

[root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6111/* [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222 [root@linuxprobe ~]# semanage fcontext -a -t httpd_sys_content_t /home/wwwroot/6222/* [root@linuxprobe ~]# restorecon -Rv /home/wwwroot/ restorecon reset /home/wwwroot context unconfined_u:object_r:home_root_t:s0-> unconfined_u:object_r: httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6111 context unconfined_u:object_r:home_root_t: s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6111/index.html context unconfined_u:object_r: home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6222 context unconfined_u:object_r:home_root_t: s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /home/wwwroot/6222/index.html context unconfined_u:object_r: home_root_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@linuxprobe ~]# systemctl restart httpd Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctlxn' for details.

见鬼了!在妥当配置 httpd 服务程序和 SELinux 安全上下文并重启 httpd 服务后,竟然出 现报错信息。 这是因为 SELinux 服务检测到 6111 和 6222 端口原本不属于 Apache 服务应该需要的资源,但现在却以 httpd 服务程序的名义监听使用了,所以 SELinux 会拒绝使用 Apache服务使用这两个端口。我们可以使用 semanage 命令查询并过滤出所有与 HTTP 协议相关且SELinux 服务允许的端口列表。

[root@linuxprobe ~]# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989

第 5 步: SELinux 允许的与 HTTP 协议相关的端口号中默认没有包含 6111 和 6222,因此需 要将这两个端口号手动添加进去。该操作会立即生效,而且在系统重启过后依然有效。设 置好后再重启 httpd 服务程序,然后就可以看到网页内容了。

[root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6111 [root@linuxprobe ~]# semanage port -a -t http_port_t -p tcp 6222 [root@linuxprobe ~]# semanage port -l| grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 6222, 6111, 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989 [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox

Apache 的访问控制

Apache 可以基于源主机名、源 IP 地址或源主机上的浏览器特征等信息对网站上的资源 进行访问控制。它通过 Allow 指令允许某个主机访问服务器上的网站资源,通过 Deny 指令实现禁止访问。在允许或禁止访问网站资源时,还会用到 Order 指令,这个指令用来定义 Allow或 Deny 指令起作用的顺序,其匹配原则是按照顺序进行匹配,若匹配成功则执行后面的默认指令。比如“Order Allow, Deny”表示先将源主机与允许规则进行匹配,若匹配成功则允许访问请求,反之则拒绝访问请求。

第 1 步:先在服务器上的网站数据目录中新建一个子目录,并在这个子目录中创建一个包含 Successful 单词的首页文件。

[root@linuxprobe ~]# mkdir /var/www/html/server [root@linuxprobe ~]# echo "Successful" > /var/www/html/server/index.html

第 2 步: 打开 httpd 服务的配置文件, 在第 129 行后面添加下述规则来限制源主机的访问。 这段规则的含义是允许使用 Firefox 浏览器的主机访问服务器上的首页文件,除此之外的所有 请求都将被拒绝。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 129 <Directory "/var/www/html/server"> 130 SetEnvIf User-Agent "Firefox" ff=1 131 Order allow,deny 132 Allow from env=ff 133 </Directory> ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox

除了匹配源主机的浏览器特征之外,还可以通过匹配源主机的 IP 地址进行访问控制。例如,我们只允许 IP 地址为 192.168.10.20 的主机访问网站资源,那么就可以在 httpd 服务配置文件的第 129 行后面添加下述规则。这样在重启 httpd 服务程序后再用本机(即服务器,其 IP地址为 192.168.10.10)来访问网站的首页面时就会提示访问被拒绝了。

[root@linuxprobe ~]# vim /etc/httpd/conf/httpd.conf ………………省略部分输出信息……………… 129 <Directory "/var/www/html/server"> 130 Order allow,deny 131 Allow from 192.168.10.20 132 Order allow,deny 133 Allow from env=ie 134 </Directory> ………………省略部分输出信息……………… [root@linuxprobe ~]# systemctl restart httpd [root@linuxprobe ~]# firefox
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Gustav

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!