10.4 個人用戶主頁功能

2023-05-12 10:25 更新

如果想在系統中為每位用戶建立一個獨立的網站,通常的方法是基于虛擬網站主機功能來部署多個網站。但這個工作會讓管理員苦不堪言(尤其是用戶數量很龐大時),而且在用戶自行管理網站時,還會碰到各種權限限制,需要為此做很多額外的工作。其實,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域確保服務程序不能執(zhí)行違規(guī)的操作,只能本本分分地為用戶提供服務。httpd服務中突然開啟的這項個人用戶主頁功能到底有沒有被SELinux域默認允許呢?

接下來使用getsebool命令查詢并過濾出所有與HTTP協議相關的安全策略。其中,off為禁止狀態(tài),on為允許狀態(tài)。

  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域安全策略規(guī)則,實在沒有必要逐個理解它們,我們只要能通過名字大致猜測出相關的策略用途就足夠了。比如,想要開啟httpd服務的個人用戶主頁功能,那么用到的SELinux域安全策略應該是httpd_enable_homedirs吧?大致確定后就可以用setsebool命令來修改SELinux策略中各條規(guī)則的布爾值了。大家一定要記得在setsebool命令后面加上-P參數,讓修改后的SELinux策略規(guī)則永久生效且立即生效。隨后刷新網頁,其效果如圖10-10所示。

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

圖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所示。

圖10-11 網站提示需要輸入賬戶和密碼才能訪問

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群。

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號