2012-09-05 29 views
11

假設一個很小的(< 5)網站,.htaccess.htpassword的正確用法是什麼?我最近看了a tutorial from Nettuts+這裏被賦予此示例代碼:適當的.htpasswd用法

的.htaccess

AuthName "Login title" 
AuthType Basic 
AuthUserFile /path/to/.htpasswd 
require valid-user 

htpasswd的

username:encrypted-version-of-password 

(使用htpasswd -c <file> <username>命令創建),我也好奇,以實際水平這提供了安全性:它可以輕鬆繞過嗎?如果Apache默認不允許用戶直接訪問這兩個文件中的任何一個,他們是否需要在公共目錄之外?有沒有速度影響?

回答

57

這是否提供什麼級別的安全性?

htpasswd的本身並不能提供多少安全性。也就是說,它提供了一種登錄機制,Apache不會在沒有正確憑證的情況下進行響應,但除非單獨配置,否則關於交換的任何內容都不會被加密(甚至模糊處理)。例如,聽GET要求與Wireshark給你所有的頭的美景客戶端發送的,其中包括:

Authorization: Basic d3BhbG1lcjp0ZXN0dGVzdA== 

d3BhbG1lcjp0ZXN0dGVzdA==」,這正好是編碼的「wpalmer:testtest」形式的base64。現在,黑客(或更可能是病毒)可以坐在公共WiFi連接上,並記錄包含Authorization:的任何請求以供以後閱讀。通常,通過未加密的HTTP連接發送任何身份驗證信息被認爲是一個壞主意,即使您通過有線或安全的WiFi端到端。例如,如果您將客戶數據,付款信息等存儲在.htpasswd鎖的後面,則它不會符合PCI Compliance的要求。

添加HTTPS的組合,你完全排除這樣一種特殊的問題,但是...如Apache的httpd的實現不提供任何形式的限速或強力保護

.htpasswd認證。您可以同時嘗試多個密碼猜測,因爲Apache願意同時爲頁面提供服務,並且Apache將盡可能快地響應成功/失敗。您可以使用類似Fail2Ban限制從說話到服務器阻塞客戶端之前可以進行嘗試失敗的次數,但不一定會提供對一個僵屍網絡,它可以自動地從成千上萬的唯一的目標服務器的任何有用的保護地址。這可能導致的決定:「我是否讓自己容易受到來自僵屍網絡的密碼企圖的攻擊,或者當整個帳戶由於多個客戶端的故障而被鎖定時,我是否容易受到拒絕服務攻擊?」

這些攻角可以通過在您的.htaccess文件中添加基於IP的限制來限制,只允許來自特定地址的連接。根據您的操作方式,這可能不方便,但也會嚴重限制您容易受到威脅的類型。您仍然面臨專門針對您的網站的某人的風險,或者部分網絡基礎設施本身受到感染。根據您所保護的內容類型,這可能「足夠好」。這種限制的一個例子是:

Order deny,allow 
Deny from all 
Allow from 127.0.0.1 

這就是說,「只允許來自本地主機的連接」。逐行表示:

  • Order deny,allow定義處理規則的順序,最後一個匹配優先。
  • Deny from all首先假定所有的客戶端被拒絕
  • Allow from 127.0.0.1如果客戶有IP 127.0.0.1,然後它被允許

在一定程度上,基於IP的限制,也將保護您的地步HTTPS可能被認爲是可選的。攻擊者/病毒仍然可以看到您的憑據,但他們更難在頁面上使用這些憑據。同樣,這不符合PCI標準,也不適用於「重要」信息,但有些情況可能會被視爲「足夠好」。請注意,許多人在多個站點上重複使用憑據,因此即使站點本身受到保護,通常也認爲未能保護登錄信息對用戶非常危險。

最後,.htaccess文件本身有點責任。看到「他們需要在公共目錄之外嗎?」的回覆瞭解更多細節。

它可以很容易地被繞過嗎?

號沒有理由期望,服務器,配置正確時,將永遠無法要求登錄信息來訪問受保護的內容。雖然HTTP Basic認證存在缺陷,但Apache httpd非常強大,是世界上經過最徹底測試的軟件之一。如果您告訴Apache需要使用HTTP基本身份驗證來訪問某些內容,那麼這將是必需的。

如果Apache在默認情況下不允許用戶直接訪問或者兩個文件的,做他們需要的是公共目錄之外?

這裏有幾點要說明。首先,Apache默認爲而不是,以防止訪問這些文件。阿帕奇的httpd的許多分佈包括(使用規則「從所有拒絕」),其根據所述分配,.htaccess/.htpasswd文件,.ht*文件或文件.*防止訪問初始配置。這很常見,但有很多原因可能不是這種情況。您可以自己添加一條規則阻止這些文件,如果他們不是已經封鎖:

<FilesMatch "^.(htaccess|htpasswd)$"> 
    Order Allow,Deny 
    Deny from all 
</FilesMatch> 

其次,應該指出的是,.htaccess文件的工作方式,它們被處理時,他們在匹配的目錄。也就是說:.htpasswd可能在其他地方,但.htaccess需要在同一個目錄中。也就是說,請參閱「速度影響」部分了解更多細節。

所以,它們可以如此容易堵塞,所以保持.htpasswd外的公共目錄的?由於錯誤發生,並且.htpasswd文件是一個很大的責任。即使您使用HTTPS,暴露您的.htpasswd文件也意味着您的密碼可以通過強力攻擊輕鬆破解。現在,消費級GPU可以每秒進行數百萬次密碼猜測。這可以使得甚至「強壯」的密碼在相對較少的時間內落下。再說一遍,這個說法通常只適用於有針對性的攻擊,但事實仍然是,如果攻擊者擁有你的文件並且想要訪問你的系統,那麼這些日子他們可以輕鬆完成。有關Coding Horror的更多信息,請參閱Speed Hashing,以獲取最近的(2012年4月)關於事物狀態的概述。

考慮到這一點,意外(暫時)暴露您的.htaccess文件的可能性值得將它移動到某個httpd正在查找要提供的內容時甚至不應該被查看的地方。是的,仍然有配置更改可能會暴露它,如果它是「一級」而不是「在公共目錄中」,但這些更改不太可能偶然發生。

速度有什麼影響嗎?

一些。

首先,使用.htaccess文件確實會減慢速度。更具體地說,AllowOverride all指令會導致很多潛在的減速。這將導致Apache在每個目錄中查找.htaccess文件,並訪問所訪問的目錄的每個父目錄(達到幷包括DocumentRoot)。這意味着爲每個請求查詢文件系統的文件(或對文件的更新)。與潛在的替代方案相比,從來沒有命中文件系統,這是相當不同的。

那麼,爲什麼.htaccess都存在?有很多原因可能會使它「值得」:

  • 取決於您的服務器負載,您可能永遠不會注意到這種差異。你的服務器是否真的需要在每個請求中擠出最後一毫秒?如果沒有,那麼不要擔心。一如既往,不要擔心估計和預測。剖析你的真實世界的情況,看看它是否有所作爲。
  • .htaccess可以在不重新啓動服務器的情況下進行修改。事實上,這就是如此緩慢的原因--Apache會在每個請求中檢查更改或存在.htaccess文件,因此會立即應用更改。
  • .htaccess中的錯誤將取消目錄,而不是服務器。這比起更改httpd.conf文件要少得多。
  • .htaccess即使您只具有對單個目錄的寫入訪問權限,也可以進行修改。這使它成爲共享主機環境的理想選擇。根本不需要訪問httpd.conf,或訪問重新啓動服務器。
  • .htaccess可以將訪問規則保留在它們要實現的文件旁邊。這可以使他們更容易找到,並使事情更有組織。

不想使用.htaccess,即使考慮到上述所有情況?可以將任何適用於.htaccess的規則直接添加到httpd.conf或包含的文件中。

.htpasswd怎麼樣?這取決於你有多少用戶。它是基於文件的,並且在實施方面最低。從The docs for httpd 2.2

的因爲這基本驗證指定的方式,您 用戶名和密碼,必須每次從服務器請求一個 文件時間驗證。即使您正在重新加載相同的頁面,以及頁面上的每個圖像(如果它們來自受保護的 目錄),也是如此。正如你所想象的那樣,這會讓事情變得緩慢。減慢速度的 的數量與密碼文件的大小成正比,因爲它必須打開該文件,然後沿着用戶列表向下,直到達到您的名字。並且它必須每頁加載一次 。

這樣做的一個後果是,您可以將多少個 用戶放入一個密碼文件中,這是有實際限制的。此限制將根據您的特定服務器計算機的性能而有所不同,具體取決於 ,但您可以在 希望看到速度超過幾百個條目時減速,並且當時 可能希望考慮採用不同的身份驗證方法。

總之,.htpasswd是緩慢的。如果你只有少數需要認證的用戶,你永遠不會注意到,但這又是一個考慮因素。

摘要

保護與.htpasswd的管理部分是不理想適用於所有情況。鑑於其簡單性,可能值得安全和性能不是最優先考慮的風險和問題。對於很多情況,只要稍微調整一下,就可以認爲它「足夠好」。什麼構成「足夠好」是你要作出的判斷要求。