apache的用戶認證


 

1. 限制用戶訪問的方式:

  1. 限制訪問服務的客戶端主機

  2. 需要用戶名和密碼

2. 行為用戶驗證需要兩步:

  1. 創建一個包含用戶名和密碼的文件

  2. 服務器上的哪些資源需要保護,哪些用戶可以進行訪問

3. 創建用戶數據庫

  許多用戶名和密碼需要創建在一個文件中。出於安全考慮,這個文件不能放在文檔目錄里。在這個例子里,這個文件創建在/usr/local/etc/httpd目錄里,名字叫users。

  這個文件包含許多用戶名和密碼。用戶名和密碼通過冒號分割,每個用戶單獨占一行。但是你不能直接在這個文件中直接輸入用戶名和密碼,因為存儲在這個文件中的密碼是加密的。程序htpasswd可以用來創建該文件,添加或者修改用戶。

  使用htpasswd創建該文件,添加用戶名‘snow’,密碼‘snow’的用戶到該文件(/usr/local/httpd/user)

1 htpasswd -c /usr/local/etc/httpd/users snow

-c參數告訴htpasswd創建一個新的users文件。當你運行該命令時,將提示輸入該用戶的密碼並確認。你可以添加其它的用戶到該文件中,不過必須去掉-c參數。這個命名也可以用來修改密碼。當你添加一個用戶后,/usr/local/etc/httpd/users文件看起來想這樣:

1 snow:$apr1$VmvJWi7o$diZjyiUiHkd8pSmb/8/gE0

第一個列是用戶名,第二列是加密過后的密碼。

4. 配置服務

為了讓server使用在該文件中的用戶名和密碼,你需要配置一個realm,為了使用.htaccess文件限制一個目錄的訪問,你首先需要修改apache的配置文件(如何找到apache的配置文件),使目錄使用.htaccess的形式限制訪問,這個被AuthConfig屬性控制,如果你想限制/var/www目錄的訪問,你修改apache的配置文件:

1 <Directory /var/www/>
2          Options Indexes FollowSymLinks
3          AllowOverride AuthConfig
4          Require all granted
5 </Directory>

然后在/var/www目錄中建立一個.htaccess文件,內容如下:

AuthName "restricted stuff"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

require valid-user

第一個指令AuthName,為這個資源配置一個realm名字,只要用戶輸入有效的用戶名和密碼,相同realm名字的其他資源也可以通過這個用戶訪問,這樣做,主要是為了創建兩個區域,使同一個用戶可以訪問這兩個區域。

第二個指令AuthType告訴服務使用哪種協議進行認證,目前來說,僅有Baisc可用。但是出現了Digest,而且已經被標准化啦,只要瀏覽器實現了它,就可以使用它。digest認證比Basic認證更安全。

第三個指令AuthUserFile告訴服務被htpasswd創建的文件在哪里。

第四個指令require告訴服務該文件中的哪些用戶可以訪問該文件,valid-user參數是告訴服務該文件中的任何用戶都可以訪問該資源,你也可以配置特定用戶可以訪問該資源。例如:

require user snow john

只有snow,john兩個用戶可以訪問該資源,其他用戶都會被拒絕。

如果一個用戶被允許訪問不同的區域,他們僅僅需要輸入一次密碼,但是如果在不同的區域有不同的realm,用戶需要再次輸入他的密碼。

5. 使用Groups

如果你想要users文件的一些用戶訪問一個資源,你需要在require行列出所有的用戶,如果你有很多用戶的話,這種方式是不太好的。有一種方式可以解決這種問題,就是用一個group文件,你可以使用require行限制到特定的group。例如:有一個叫作staff的組,它包含所有訪問特定資源的用戶。

1 require group staff

多個group也可以使用,用戶也可以同時使用,

require group staff admin
require user adminuser

 

 它允許組staff和admin訪問資源和用戶adminuser訪問資源。

group文件的形式:

staff: martin jane

admin: art adminuser

staff和admin是組,martin和jane屬於staff組,art和adminuser屬於admin組。

AuthGroupFile指令是告訴group文件在哪里。記住,在group文件中一行的最大長度是8000字符(大約8K),如果你有超過行的長度的用戶數,你可以再寫一行伴隨着相同組。

當你添加AuthGroupFIle指令時,遇到如下錯誤時:/var/www/html/.htaccess: Invalid command 'AuthGroupFile', perhaps misspelled or defined by a module not included in the server configuration。請執行:

1 sudo a2enmod authz_groupfile

6. 伴隨着許多用戶的問題

使用htpasswd創建用戶和以文本的形式管理組相對來說比較簡單,但是如果用戶增多,服務器要做許多的處理來找響應的組和密碼信息,這種處理必須在每個請求中都要做(受保護的區域,盡管用戶僅僅輸入一次密碼,但是在每次請求中,都必須重新認證),如果伴隨着很多用戶,那是相當慢的,增加服務器負載。比較塊的訪問是使用DBM格式文件,它允許服務做比較塊的搜索,但是管理DBM文件也是比較復雜的。

7. 存儲用戶信息的其他方式

apache僅能訪問在文本文件中的用戶信息,但是有各種各樣的模塊允許用戶信息存儲到數據庫中。除了有DBM格式(mod_auth_dbm module),用戶信息和組信息也可以存儲以DB的格式文件(mod_auth_db),或者各種各樣的數據庫也可以使用。例如mSQL(mod_auth_msql),Postgres95(mod_auth_95),或者兼容DBI的數據庫(mod_auth_dbi),也可以有一個額外的程序檢測用戶和密碼是否有效(主要是用接口來檢測數據庫或者認證服務)。modules也可以用來檢測系統密碼文件或者使用Kerberos系統。

8. 限制不同的方法

在上面的例子中,require指令並沒有包含在<Limit>指令中,這樣意味着它應用到所有的請求方法,但是在一些應用中,需要將其放入<Limit>部分,例如:

1 <Limit GET POST PUT>
2     require valid-user
3 </Limit>

 在Apache中,最好忽略<Limit>標簽,是為了確保保護應用到所有的方法中。但是,這種格式主要用來限制特定的方法。例如:僅僅限制POST方法。

AuthName "restrict posting"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

<Limit POST>
    require group staff
</Limit>

 僅僅組staff的成員可以訪問POST方法,其他的用戶(未認證的)可以使用其它的方法。例如:GET方法。這樣做,主要是為了CGI程序讓任何人可以訪問。但是僅僅授權的用戶可以請求POST方法。

9. 被主機或者用戶限制

apache很有可能同時使用用戶和主機限制,正常情況下,apache需要兩個條件同時滿足,那即是,來自允許的主機或者域名的用戶必須輸入有效的用戶名和密碼才能進行資源訪問。但是Satisfy any指令被使用在.htaccess文件或者<Directory>,<Location>,<Files>部分,當這個指令被使用的時候,來自允許的主機或者域名不需要輸入用戶名和密碼就能進行訪問,來自不允許的主機或者域名必須輸入有效的用戶名和密碼。

10. WWW認證如何進行工作?

在HTTP中用戶認證的方法相當簡單,因為HTTP是無狀態的協議。只要一個請求完成,服務器並不會記得關於那個請求的任何信息。瀏覽器需要在每次請求中重新發送用戶名和密碼。這就是他的工作原理。

當第一次訪問需要認證的資源時,服務器返回401狀態(未授權)和包含一個WWW-Authenticate響應頭,這個包含認證策略(目前僅有Basic允許)和realm名字。瀏覽器然后詢問用戶名和密碼。然后再次請求相同的資源。這一次包含Authorization頭,它包含策略名字(Basic)和用戶名和密碼。

服務器檢測用戶名和密碼,如果他們有效,就返回頁面,如果密碼無效或者用戶並不允許,服務器返回401狀態,瀏覽器將會繼續詢問用戶名和密碼。

假如用戶名和密碼有效,用戶將會繼續請求另一個保護的資源,在這種情況下,服務器繼續返回401狀態,瀏覽器伴隨着用戶名和密碼繼續請求該資源,但是,這種將會很慢的。所以瀏覽器在接下來的請求中發送Authorization頭,瀏覽器必須保證發送用戶名和密碼到相同的服務器上。(如果用戶信息發送到不同的服務器,將會不安全的)

瀏覽器需要記住用戶名和密碼。所以它可以發送用戶名和密碼信息在接下來的請求中。但是在測試認證的時候,將會引起問題,因為瀏覽器第一次已經記住用戶名和密碼信息,強制瀏覽器再次詢問用戶名和密碼將會很困難的。

11. 安全和數字認證

認證允許資源被訪問,是針對特定的用戶。但是存在着一些潛在的安全問題。

  • 確保資源被限制在所有的方法中,例如:如果使用<Limit GET>,將會使其他的請求方法不被保護。
  • 用戶名和密碼放在文本文件中,雖然密碼是加密的,但是並不是絕對安全的。該文件不能被系統中的其他用戶訪問,更不能放在文檔目錄。(該目錄可以被來自於網絡的用戶訪問)
  • 用戶名和密碼應該要絕對安全。用戶不應該告訴其他人他們的密碼。
  • Basic認證策略在網絡中傳遞密碼是以非加密的方式傳遞的。所以他們可以被攔截。數字認證主要用來解決這個問題。

數字認證的方式將會使在網絡中密碼的方式更安全,在發送之前,密碼會被加密,然后服務器會解密它。數字認證工作的方式和Basic認證的方式一樣,數字認證的使用主要依賴於瀏覽器提供商是否寫入他們的產品。Apache已經做了數字認證,被mod_digest模塊所編譯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM