Apache Security-2-Basic Authentication(基本認證)簡介及實戰練習
1. 說明
本文系我的"Web Server & Web Technology (WSWT)系列部落格之一,主要講解Linux系統的Apache配置和使用,以及如何使用apache搭建自己的個人網站".該系列部落格的總目錄參見這裡http://blog.csdn.net/u014303046/article/details/73694983。
2. 準備工作
為了方便大家觀察效果,我寫了幾個簡單的網頁,大家可以在這裡下載,不知道為什麼不能設成0積分下載,所以也可以到這裡免費下載,下載後把檔案解壓放在某個目錄下,比如我放在了/home/zsc/workspace/web/apache_1,然後在下面的Docker命令裡使用-v引數把這個目錄作為docker容器可訪問的資料卷。如果你沒有使用Docker,你只需要把下文中對應的DocumentRoot目錄修改成你自己的目錄就好了。
如果你使用Docker,那麼首先需要從你之前儲存的映象(從原始碼安裝好apache的映象)執行一個容器:
sudo docker run -ti -p 80:80 -v /home/zsc/workspace/web/apache_1/:/web/doc_root --name web apache:v1.0 bash
注意:-v引數用來把Docker宿主主機上的/home/zsc/workspace/web/apache_1目錄對映到容器內的/web/doc_root目錄,這樣就可以在容器內訪問該目錄及其子目錄了。所以我們在下文使用Docker的時候都是用/web/doc_root作為DocumetnRoot目錄。
本教程假設你已經學習了前面的教程,並在Docker裡或者自己的膝上型電腦或者自己購買的伺服器上從原始碼編譯好了apache和PHP。
如果你想使用Docker進行練習但是又沒有做好docker的相關映象,你可以從docker hub 搜尋我做好的映象:leeochang/angryberry,然後直接pull下來,就可以使用了。連結.
修改documentroot:
3. 需要哪些模組
Authentication type (see the AuthType directive)
- mod_auth_basic
- mod_auth_digest
- Authentication provider (see the AuthBasicProvider and
AuthDigestProvider directives)
- mod_authn_anon
- mod_authn_dbd
- mod_authn_dbm
- mod_authn_file
- mod_authnz_ldap
- mod_authn_socache
- Authorization (see the Require directive)
- mod_authnz_ldap
- mod_authz_dbd
- mod_authz_dbm
- mod_authz_groupfile
- mod_authz_host
- mod_authz_owner
- mod_authz_user
4. 基本認證(Basic Authentication)
這是一種簡單的認證方式,在很長的一段時期這種認證方式被廣泛使用。當然現在這種方式已經很少使用了。
4.1 basic authentication是如何工作的
如果一個檔案使用basic authentication保護,那麼當有想要訪問這個檔案的請求到來的時候,apache伺服器會返回一個“401 Authentication Required Header”,當客戶端比如瀏覽器收到返回的401 header之後,就會要求使用者輸入使用者名稱和密碼.
由於HTTP協議是無狀態的(stateless),因此每個請求都會要求輸入使用者名稱和密碼。幸運的是,你僅僅需要填寫一次使用者名稱和密碼,之後瀏覽器會自動填充。這在你關閉瀏覽器之前都是有效的,重啟瀏覽器你需要重新填寫使用者名稱和密碼。(但是有的瀏覽器即使你重啟也依舊會自動填寫)
4.2 實戰
- 建立密碼檔案
在/etc/apache2/目錄下建立一個password目錄:
mkdir /etc/apache2/password
使用如下命令建立密碼檔案:
cd /etc/apache2/server_root/bin
#下一條指令中的Tom是使用者名稱,可以自行更改;mypasswd是你儲存使用者名稱和密碼的檔案的名字,也可以自己更改
./htpasswd -c /etc/apache2/password/mypasswd Tom
#按要求輸入密碼
#第二個使用者不要使用-c引數,-c是新建一個密碼檔案,如果第二次依舊使用-c引數,會將前面的同名檔案刪除,然後新建。不使用-c引數會在已有的密碼檔案裡新新增使用者和對應的密碼。
./htpasswd ../../password/mypasswd Leo
#按要求輸入密碼
完成後到密碼檔案目錄,可以檢視我們新增的資訊:
- 修改httpd.conf檔案
首先,去掉httpc.conf檔案中本文第3小結列出的模組的註釋,以支援authentication.
然後修改httpd.conf的DIirectory部分如下:
同時,註釋掉“Require all granted”
解釋
AuthTyep 認證的型別,basic或者digest
AuthName 要求使用者填寫使用者名稱和密碼的時候顯示的提示資訊
AuthBasicProvider 可選引數,可以直接寫成“file”
AuthUserFile 你建立的密碼檔案路徑
AuthGroupFile 使用組(稍後會舉例)
Require 設定那些使用者或者和組符合條件
此時,重啟伺服器“apachectl restart”,在瀏覽器輸入地址:http://172.17.0.2,會出現如下提示:
輸入對應的使用者名稱和密碼後才可以訪問。
注意,由於我們只允許了Leo因此輸入Tom的使用者名稱和密碼依然是無法訪問的。如果希望Tom可以訪問,你需要:
“Require user Leo Tom”
但是當用戶數量變多的時候,這樣管理很繁瑣,因此,有了使用者組(group)的概念。先一個部分將會介紹如何使用使用者組。
- 設定組(group)
首先,繼續在mypaswd檔案裡新增幾個使用者:
./../bin/htpasswd ../../password/mypasswd Sinan
./../bin/htpasswd ../../password/mypasswd Edwin
然後建立你一個組檔案:
cd /etc/apache2/password
touch mygroup
vim mygroup
新增一個使用者組:格式是 groupname: username1 username2(祖名,然後一個冒號,之後是任意多個用空格間隔的使用者名稱),比如我的是“testgroup: Leo Edwin”:
然後修改httpd.conf檔案:
新增一行:
AuthGroupFile "/etc/apache2/password/mygroup"
修改一行:
#testgroup是我們的組名
Require group testgroup
重啟伺服器,在瀏覽器裡測試,發現只有在使用者組testgroup裡的Leo和Edwin可以訪問,另外兩個使用者即使輸入了正確的使用者名稱和密碼也不能正常訪問。
回憶一下上一個教程的內容,和virtualhost或者userdir結合,我們可以針對不同的埠或者主機名或者不同的userdir設定不同的組訪問許可權,這是一個很有意思的做法哦。
5. 答疑
5.1 如何退出登陸?
由於瀏覽器快取了使用者名稱和密碼,所以你可能只有第一次被要求輸入使用者名稱和密碼,後面就可以直接登陸了,這導致你無法嘗試其他的使用者名稱以至於只能換一個瀏覽器去測試其他使用者名稱和密碼。事實上除了關閉瀏覽器或者重啟系統你甚至沒有辦法退出登陸。
為了方便大家測試,我推薦一款終端瀏覽器:w3m,如果你使用ubuntu系統你可以這樣安裝:
sudo apt-get install w3m
使用的時候,輸入“w3m http://172.17.0.2”:
回車,你會在模擬終端底部發現提示:“401 Unauthorized”
之後會跳出輸入使用者名稱和密碼的介面,依次輸入使用者名稱和密碼,
回車,就可以了:
w3m的好處是它不會快取使用者名稱和密碼,你可以繼續測試其他使用者。
5.2 如何更改密碼提示框的樣式?
你覺得輸入使用者名稱和密碼的彈出框很醜,你想自定義自己的彈出框。事實上這是由瀏覽器決定的,使用basic authentication你無法自定義彈出框。多麼痛的領悟!(或許你可以自己弄個瀏覽器?誰知道呢!)
6. 小結
本文主要講解了basic authentication的應用,digest authentication的內容請搜尋後續教程。