發(fā)表于: 2006-9-04 21:47 作者: 風(fēng)子 來源: IXPUB技術(shù)博客
認(rèn)證(Authentication)是指任何識(shí)別用戶身份的過程。授權(quán)(Authorization)是允許特定用戶訪問特定區(qū)域或信息的過程。
相關(guān)模塊和指令
認(rèn)證和授權(quán)涉及到三組模塊。通常,你需要從每一組中選擇至少一個(gè)模塊。
認(rèn)證類型模塊(參見AuthType指令)
mod_auth_basic
mod_auth_digest
認(rèn)證支持模塊
mod_authn_alias
mod_authn_anon
mod_authn_dbd
mod_authn_dbm
mod_authn_default
mod_authn_file
mod_authnz_ldap
授權(quán)支持模塊(參見Require指令)
mod_authnz_ldap
mod_authz_dbm
mod_authz_default
mod_authz_groupfile
mod_authz_owner
mod_authz_user
mod_authnz_ldap模塊既包含認(rèn)證功能也包含授權(quán)功能。mod_authn_alias模塊自身并不實(shí)現(xiàn)認(rèn)證功能,但是允許其它認(rèn)證支持模塊以更靈活的方式進(jìn)行配置。
mod_authz_host模塊提供基于主機(jī)名、IP地址、請(qǐng)求特征的訪問控制,但并不屬于認(rèn)證支持系統(tǒng)。
簡(jiǎn)介
如果網(wǎng)站上有些敏感信息或只希望為一個(gè)小群體所訪問,本文闡述的方法能確保用戶只能訪問被允許的資源。
本文涵蓋了保護(hù)站點(diǎn)資源的"標(biāo)準(zhǔn)"方法,大多數(shù)管理員將要用到這些方法。
先決條件
本文中討論的指令應(yīng)該被放進(jìn)主配置文件(通常在<Directory>段中)或者針對(duì)單個(gè)目錄的配置文件(.htaccess文件)中。
如果你打算使用.htaccess文件,則必須設(shè)置服務(wù)器以允許在這些文件中使用認(rèn)證指令,即用AllowOverride指令指定哪些指令在針對(duì)單個(gè)目錄的配置文件中有效。
既然本文討論認(rèn)證,就應(yīng)該對(duì)AllowOverride這樣設(shè)置:
AllowOverride AuthConfig
如果你希望把這些指令直接寫入主配置文件,當(dāng)然就需要具有對(duì)主配置文件的寫權(quán)限。
而且,你需要對(duì)服務(wù)器的目錄結(jié)構(gòu)有所了解,以確定某些文件的位置。這個(gè)并不難,需要時(shí)我們會(huì)做適當(dāng)?shù)恼f明。
啟用認(rèn)證
先介紹用密碼來保護(hù)服務(wù)器上的目錄。
首先需要建立一個(gè)密碼文件。這個(gè)文件應(yīng)該放在不能被網(wǎng)絡(luò)訪問的位置,以避免被下載。例如,如果/usr/local/apache/htdocs以外的空間不能被網(wǎng)絡(luò)訪問,那么可以考慮把密碼文件放在/usr/local/apache/passwd目錄中。
Apache在其安裝目錄的bin子目錄中提供了htpasswd工具,用于建立密碼文件,可以這樣使用:
htpasswd -c /usr/local/apache/passwd/passwords rbowen
htpasswd會(huì)要你輸入密碼,并要求重新輸入以進(jìn)行確認(rèn):
# htpasswd -c /usr/local/apache/passwd/passwords rbowen
New password: mypassword
Re-type new password: mypassword
Adding password for user rbowen
如果htpasswd不在搜索路徑中,則必須使用完整路徑,如:/usr/local/apache/bin/htpasswd
然后修改httpd.conf或.htaccess文件,指示服務(wù)器允許哪些用戶訪問并向用戶索取密碼。若要保護(hù)/usr/local/apache/htdocs/secret目錄,則可以將下列指令寫入/usr/local/apache/htdocs/secret/.htaccess或者h(yuǎn)ttpd.conf的<Directory /usr/local/apache/apache/htdocs/secret>段。
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/local/apache/passwd/passwords
Require user rbowen
讓我們逐個(gè)解釋這些指令。AuthType指令選擇對(duì)用戶實(shí)施認(rèn)證的方法,最常用的是由mod_auth_basic提供的Basic 。必須認(rèn)識(shí)到的很重要的一點(diǎn)是,Basic認(rèn)證方法并不加密來自用戶瀏覽器的密碼,因此,不應(yīng)該用于高度敏感的數(shù)據(jù)。Apache中還有另一種更安全的認(rèn)證方法"AuthType Digest",即由mod_auth_digest供的摘要認(rèn)證。目前,只有最新的瀏覽器版本才支持摘要認(rèn)證。
AuthName指令設(shè)置了使用認(rèn)證的域(Realm),它起兩個(gè)作用,首先,此域會(huì)出現(xiàn)在顯示給用戶的密碼提問對(duì)話框中,其次,也幫助客戶端程序確定應(yīng)該發(fā)送哪個(gè)密碼。
所以,如果一個(gè)用戶已經(jīng)在"Restricted Files"域通過了認(rèn)證,則客戶端就可以嘗試使用同樣的密碼來訪問同一個(gè)服務(wù)器上任何名為"Restricted Files"域的其他部分,從而使多個(gè)受限區(qū)域使用同一個(gè)密碼,以避免用戶重復(fù)輸入。當(dāng)然,出于安全考慮,如果服務(wù)器變了,客戶端始終會(huì)要求重新輸入密碼。
AuthUserFile指令設(shè)置了密碼文件的位置,也就是剛才我們用htpasswd建立的文件。如果用戶很多則認(rèn)證速度會(huì)很慢,因?yàn)閷?duì)每個(gè)請(qǐng)求都必須搜索這個(gè)純文本文件,對(duì)此,Apache還支持把用戶信息存入快速的數(shù)據(jù)庫文件,mod_authn_dbm模塊提供了AuthDBMUserFile指令,并可以用dbmmanage程序建立和操作這些數(shù)據(jù)庫。Apache模塊數(shù)據(jù)庫中還提供了許多其他第三方模塊提供的認(rèn)證選項(xiàng)。
最后,Require指令設(shè)置了允許訪問受保護(hù)區(qū)域的用戶,下一節(jié)將對(duì)Require指令作詳細(xì)說明。
允許多人訪問
上述指令只允許一個(gè)人(一個(gè)叫rbowen的用戶)訪問這個(gè)目錄,但是多數(shù)情況下,都需要允許多人訪問,所以就要用到AuthGroupFile指令。
如果想允許多人訪問,那么就必須建立一個(gè)組文件以確定組中的用戶。其格式很簡(jiǎn)單,可以用你喜歡的編輯器建立,例如:
GroupName: rbowen dpitts sungo rshersey
它只是每組一行的一個(gè)用空格分隔的組成員列表。
向已有的密碼文件中增加一個(gè)用戶,可以輸入:
htpasswd /usr/local/apache/passwd/passwords dpitts
程序的提示和上面的一樣,但是它會(huì)追加到已有的文件中,而不是建一個(gè)新文件(參數(shù) -c 可以強(qiáng)制建立新的密碼文件)。
現(xiàn)在,需要將.htaccess文件修改成這樣:
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName
現(xiàn)在,GroupName組中的成員都在password文件中有一個(gè)相應(yīng)的記錄,從而允許他們輸入正確的密碼進(jìn)行訪問。
除了建立組文件,還有另一種途徑允許多人訪問,就是使用如下指令:
Require valid-user
使用上述指令,而不是 Require user rbowen ,可以允許密碼文件中的所有用戶使用正確的密碼進(jìn)行訪問。通過為每個(gè)組建立一個(gè)密碼文件,這里甚至允許列舉各個(gè)組,其優(yōu)點(diǎn)是Apache只需要檢查一個(gè)文件(而不是兩個(gè)),其缺點(diǎn)是,必須維護(hù)眾多密碼文件,而且要確保AuthUserFile指定了一個(gè)正確的密碼文件。
可能存在的問題
由于采用了Basic認(rèn)證的方法,每次向服務(wù)器請(qǐng)求甚至刷新一個(gè)受保護(hù)的頁面或圖片時(shí)都必須校驗(yàn)用戶名和密碼,為此,必須打開密碼文件并逐行搜索用戶名,因此,服務(wù)器響應(yīng)速度會(huì)受一些影響,受影響的程度與密碼文件的大小成正比。
所以,對(duì)密碼文件中的用戶總數(shù)存在一個(gè)實(shí)際上的上限,此上限取決于特定的服務(wù)器機(jī)器的性能,但是一般有幾百個(gè)用戶就會(huì)對(duì)響應(yīng)速度有非常明顯的影響,在這種情況下,可以考慮用其他認(rèn)證方法。
其他認(rèn)證方法
基于用戶名和密碼的認(rèn)證只是方法之一,時(shí)常會(huì)有不需要知道來訪者是誰,只需要知道來自哪里的情況。
Allow和Deny指令可以允許或拒絕來自特定主機(jī)名或主機(jī)地址的訪問,同時(shí),Order指令告訴Apache處理這兩個(gè)指令的順序,以改變過濾器。
這些指令的用法:
Allow from address
address可以是一個(gè)IP地址(或者IP地址的一部分),也可以是一個(gè)完整的域名(或者域名的一部分),還可以同時(shí)指定多個(gè)IP地址和域名。
比如,要拒絕不受歡迎的兜售垃圾的站點(diǎn):
Deny from 205.252.46.165
這樣,這個(gè)指令所管轄的區(qū)域?qū)⒕芙^所有來自該地址的訪問。除了指定IP地址,也可以指定域名,如:
Deny from host.example.com
另外,還可以指定地址或域名的一部分來阻止一個(gè)群體:
Deny from 192.101.205
Deny from cyberthugs.com moreidiots.com
Deny from ke
Order可以組合Deny和Allow指令,以保證在允許一個(gè)群體訪問的同時(shí),對(duì)其中的一些又加以限制:
Order deny,allow
Deny from all
Allow from dev.example.com
只列出Allow指令不會(huì)得到你想要的結(jié)果,因?yàn)樗谠试S指定對(duì)象訪問的同時(shí)并不禁止其他未列出的對(duì)象的訪問。所以上例使用的方法是:首先拒絕任何人,然后允許來自特定主機(jī)的訪問。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。