10.4 个人用户主页功能

如果想在系统中为每位用户建立一个独立的网站,通常的方法是基于虚拟网站主机功能来部署多个网站。但这个工作会让管理员苦不堪言(尤其是用户数量很庞大时),而且在用户自行管理网站时,还会碰到各种权限限制,需要为此做很多额外的工作。其实,httpd服务程序提供的个人用户主页功能完全可以胜任这个工作。该功能可以让系统内所有的用户在自己的家目录中管理个人的网站,而且访问起来也非常容易。

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

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

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

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

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

无法访问个人用户网站

图10-9 禁止访问用户的个人网站

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

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

  1. [root@linuxprobe ~]# getsebool -a | grep http
  2. httpd_anon_write --> off
  3. httpd_builtin_scripting --> on
  4. httpd_can_check_spam --> off
  5. httpd_can_connect_ftp --> off
  6. httpd_can_connect_ldap --> off
  7. httpd_can_connect_mythtv --> off
  8. httpd_can_connect_zabbix --> off
  9. httpd_can_network_connect --> off
  10. httpd_can_network_connect_cobbler --> off
  11. httpd_can_network_connect_db --> off
  12. httpd_can_network_memcache --> off
  13. httpd_can_network_relay --> off
  14. httpd_can_sendmail --> off
  15. httpd_dbus_avahi --> off
  16. httpd_dbus_sssd --> off
  17. httpd_dontaudit_search_dirs --> off
  18. httpd_enable_cgi --> on
  19. httpd_enable_ftp_server --> off
  20. httpd_enable_homedirs --> off
  21. httpd_execmem --> off
  22. httpd_graceful_shutdown --> on
  23. httpd_manage_ipa --> off
  24. httpd_mod_auth_ntlm_winbind --> off
  25. httpd_mod_auth_pam --> off
  26. httpd_read_user_content --> off
  27. httpd_run_stickshift --> off
  28. httpd_serve_cobbler_files --> off
  29. httpd_setrlimit --> off
  30. httpd_ssi_exec --> off
  31. httpd_sys_script_anon_write --> off
  32. httpd_tmp_exec --> off
  33. httpd_tty_comm --> off
  34. httpd_unified --> off
  35. httpd_use_cifs --> off
  36. httpd_use_fusefs --> off
  37. httpd_use_gpg --> off
  38. httpd_use_nfs --> off
  39. httpd_use_openstack --> off
  40. httpd_use_sasl --> off
  41. httpd_verify_dns --> off
  42. named_tcp_bind_http_port --> off
  43. prosody_bind_http_port --> off

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

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

Apache个人网站功能

图10-10 正常看到个人用户主页面中的内容

有时,网站的拥有者并不希望直接将网页内容显示出来,只想让通过身份验证的用户访客看到里面的内容,这时就可以在网站中添加口令功能了。

第1步:先使用htpasswd命令生成密码数据库。-c参数表示第一次生成;后面再分别添加密码数据库的存放文件,以及验证要用到的用户名称(该用户不必是系统中已有的本地账户)。

  1. [root@linuxprobe ~]# htpasswd -c /etc/httpd/passwd linuxprobe
  2. New password:此处输入用于网页验证的密码
  3. Re-type new password:再输入一遍进行确认
  4. Adding password for user linuxprobe

第2步:编辑个人用户主页功能的配置文件。把第31~35行的参数信息修改成下列内容,其中井号(#)开头的内容为刘遄老师添加的注释信息,可将其忽略。随后保存并退出配置文件,重启httpd服务程序即可生效。

  1. [root@linuxprobe ~]# vim /etc/httpd/conf.d/userdir.conf
  2. 27 #
  3. 28 # Control access to UserDir directories. The following is an example
  4. 29 # for a site where these directories are restricted to read-only.
  5. 30 #
  6. 31 <Directory "/home/*/public_html">
  7. 32 AllowOverride all
  8. #刚刚生成出来的密码验证文件保存路径
  9. 33 authuserfile "/etc/httpd/passwd"
  10. #当用户尝试访问个人用户网站时的提示信息
  11. 34 authname "My privately website"
  12. 35 authtype basic
  13. #用户进行账户密码登录时需要验证的用户名称
  14. 36 require user linuxprobe
  15. 37 </Directory>
  16. [root@linuxprobe ~]# systemctl restart httpd

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

Apache密码验证

图10-11 网站提示需要输入账户和密码才能访问

出现问题?大胆提问!

因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~

Linux技术交流请加A群:560843(),B群:340829(推荐),C群:463590(推荐),点此查看全国群

*本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。