# 認證、授權、訪問控制
認證(Authentication)是指任何識別用戶身份的過程。授權(Authorization)是允許特定用戶訪問特定區域或信息的過程。
## 相關模塊和指令
認證和授權涉及到三組模塊。通常,你需要從每一組中選擇至少一個模塊。
* 認證類型模塊(參見`AuthType`指令)
* `mod_auth_basic`
* `mod_auth_digest`
* 認證支持模塊
* `mod_authn_alias`
* `mod_authn_anon`
* `mod_authn_dbd`
* `mod_authn_dbm`
* `mod_authn_default`
* `mod_authn_file`
* `mod_authnz_ldap`
* 授權支持模塊(參見`Require`指令)
* `mod_authnz_ldap`
* `mod_authz_dbm`
* `mod_authz_default`
* `mod_authz_groupfile`
* `mod_authz_owner`
* `mod_authz_user`
`mod_authnz_ldap`模塊既包含認證功能也包含授權功能。`mod_authn_alias`模塊自身并不實現認證功能,但是允許其它認證支持模塊以更靈活的方式進行配置。
`mod_authz_host`模塊提供基于主機名、IP地址、請求特征的訪問控制,但并不屬于認證支持系統。
## 簡介
如果網站上有些敏感信息或只希望為一個小群體所訪問,本文闡述的方法能確保用戶只能訪問被允許的資源。
本文涵蓋了保護站點資源的"標準"方法,大多數管理員將要用到這些方法。
## 先決條件
本文中討論的指令應該被放進主配置文件(通常在`<Directory>`段中)或者針對單個目錄的配置文件(`.htaccess`文件)中。
如果你打算使用`.htaccess`文件,則必須設置服務器以允許在這些文件中使用認證指令,即用`AllowOverride`指令指定哪些指令在針對單個目錄的配置文件中有效。
既然本文討論認證,就應該對`AllowOverride`這樣設置:
```
AllowOverride AuthConfig
```
如果你希望把這些指令直接寫入主配置文件,當然就需要具有對主配置文件的寫權限。
而且,你需要對服務器的目錄結構有所了解,以確定某些文件的位置。這個并不難,需要時我們會做適當的說明。
## 啟用認證
先介紹用密碼來保護服務器上的目錄。
首先需要建立一個密碼文件。這個文件應該放在不能被網絡訪問的位置,以避免被下載。例如,如果`/usr/local/apache/htdocs`以外的空間不能被網絡訪問,那么可以考慮把密碼文件放在`/usr/local/apache/passwd`目錄中。
Apache在其安裝目錄的`bin`子目錄中提供了`htpasswd`工具,用于建立密碼文件,可以這樣使用:
```
htpasswd -c /usr/local/apache/passwd/passwords rbowen
```
`htpasswd`會要你輸入密碼,并要求重新輸入以進行確認:
```
# 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`文件,指示服務器允許哪些用戶訪問并向用戶索取密碼。若要保護`/usr/local/apache/htdocs/secret`目錄,則可以將下列指令寫入`/usr/local/apache/htdocs/secret/.htaccess`或者`httpd.conf`的<Directory /usr/local/apache/apache/htdocs/secret>段。
```
AuthType Basic
AuthName "Restricted Files"
AuthUserFile /usr/local/apache/passwd/passwords
Require user rbowen
```
讓我們逐個解釋這些指令。`AuthType`指令選擇對用戶實施認證的方法,最常用的是由`mod_auth_basic`提供的`Basic` 。必須認識到的很重要的一點是,Basic認證方法并不加密來自用戶瀏覽器的密碼,因此,不應該用于高度敏感的數據。Apache中還有另一種更安全的認證方法"`AuthType Digest`",即由`mod_auth_digest`供的摘要認證。目前,只有最新的瀏覽器版本才支持摘要認證。
`AuthName`指令設置了使用認證的<dfn class="calibre27">域(Realm)</dfn>,它起兩個作用,首先,此域會出現在顯示給用戶的密碼提問對話框中,其次,也幫助客戶端程序確定應該發送哪個密碼。
所以,如果一個用戶已經在`"Restricted Files"`域通過了認證,則客戶端就可以嘗試使用同樣的密碼來訪問同一個服務器上任何名為`"Restricted Files"`域的其他部分,從而使多個受限區域使用同一個密碼,以避免用戶重復輸入。當然,出于安全考慮,如果服務器變了,客戶端始終會要求重新輸入密碼。
`AuthUserFile`指令設置了密碼文件的位置,也就是剛才我們用`htpasswd`建立的文件。如果用戶很多則認證速度會很慢,因為對每個請求都必須搜索這個純文本文件,對此,Apache還支持把用戶信息存入快速的數據庫文件,`mod_authn_dbm`模塊提供了`AuthDBMUserFile`指令,并可以用`dbmmanage`程序建立和操作這些數據庫。[Apache模塊數據庫](http://modules.apache.org/)中還提供了許多其他第三方模塊提供的認證選項。
最后,`Require`指令設置了允許訪問受保護區域的用戶,下一節將對`Require`指令作詳細說明。
## 允許多人訪問
上述指令只允許一個人(一個叫`rbowen`的用戶)訪問這個目錄,但是多數情況下,都需要允許多人訪問,所以就要用到`AuthGroupFile`指令。
如果想允許多人訪問,那么就必須建立一個組文件以確定組中的用戶。其格式很簡單,可以用你喜歡的編輯器建立,例如:
```
GroupName: rbowen dpitts sungo rshersey
```
它只是每組一行的一個用空格分隔的組成員列表。
向已有的密碼文件中增加一個用戶,可以輸入:
```
htpasswd /usr/local/apache/passwd/passwords dpitts
```
程序的提示和上面的一樣,但是它會追加到已有的文件中,而不是建一個新文件(參數 `-c` 可以強制建立新的密碼文件)。
現在,需要將`.htaccess`文件修改成這樣:
```
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group GroupName
```
現在,`GroupName`組中的成員都在`password`文件中有一個相應的記錄,從而允許他們輸入正確的密碼進行訪問。
除了建立組文件,還有另一種途徑允許多人訪問,就是使用如下指令:
```
Require valid-user
```
使用上述指令,而不是 `Require user rbowen` ,可以允許密碼文件中的所有用戶使用正確的密碼進行訪問。通過為每個組建立一個密碼文件,這里甚至允許列舉各個組,其優點是Apache只需要檢查一個文件(而不是兩個),其缺點是,必須維護眾多密碼文件,而且要確保`AuthUserFile`指定了一個正確的密碼文件。
## 可能存在的問題
由于采用了Basic認證的方法,每次向服務器請求甚至刷新一個受保護的頁面或圖片時都必須校驗用戶名和密碼,為此,必須打開密碼文件并逐行搜索用戶名,因此,服務器響應速度會受一些影響,受影響的程度與密碼文件的大小成正比。
所以,對密碼文件中的用戶總數存在一個實際上的上限,此上限取決于特定的服務器機器的性能,但是一般有幾百個用戶就會對響應速度有非常明顯的影響,在這種情況下,可以考慮用其他認證方法。
## 其他認證方法
基于用戶名和密碼的認證只是方法之一,時常會有不需要知道來訪者是誰,只需要知道來自哪里的情況。
`Allow`和`Deny`指令可以允許或拒絕來自特定主機名或主機地址的訪問,同時,`Order`指令告訴Apache處理這兩個指令的順序,以改變過濾器。
這些指令的用法:
```
Allow from <var class="calibre40">address</var>
```
address可以是一個IP地址(或者IP地址的一部分),也可以是一個完整的域名(或者域名的一部分),還可以同時指定多個IP地址和域名。
比如,要拒絕不受歡迎的兜售垃圾的站點:
```
Deny from 205.252.46.165
```
這樣,這個指令所管轄的區域將拒絕所有來自該地址的訪問。除了指定IP地址,也可以指定域名,如:
```
Deny from <var class="calibre40">host.example.com</var>
```
另外,還可以指定地址或域名的一部分來阻止一個群體:
```
Deny from <var class="calibre40">192.101.205</var>
Deny from <var class="calibre40">cyberthugs.com</var> <var class="calibre40">moreidiots.com</var>
Deny from ke
```
`Order`可以組合`Deny`和`Allow`指令,以保證在允許一個群體訪問的同時,對其中的一些又加以限制:
```
Order deny,allow
Deny from all
Allow from <var class="calibre40">dev.example.com</var>
```
只列出`Allow`指令不會得到你想要的結果,因為它在允許指定對象訪問的同時_并不禁止_其他未列出的對象的訪問。所以上例使用的方法是:首先拒絕任何人,然后允許來自特定主機的訪問。
## 更多信息
`mod_auth_basic`和`mod_authz_host`文檔中有更多的有關資料。`mod_authn_alias`同樣有助于簡化認證配置。
- Apache HTTP Server Version 2.2 文檔 [最后更新:2006年3月21日]
- 版本說明
- 從1.3升級到2.0
- 從2.0升級到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 參考手冊
- 編譯與安裝
- 啟動Apache
- 停止和重啟
- 配置文件
- 配置段(容器)
- 緩沖指南
- 服務器全局配置
- 日志文件
- 從URL到文件系統的映射
- 安全方面的提示
- 動態共享對象(DSO)支持
- 內容協商
- 自定義錯誤響應
- 地址和端口的綁定(Binding)
- 多路處理模塊
- Apache的環境變量
- Apache處理器的使用
- 過濾器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重寫指南
- Apache虛擬主機文檔
- 基于主機名的虛擬主機
- 基于IP地址的虛擬主機
- 大批量虛擬主機的動態配置
- 虛擬主機示例
- 深入研究虛擬主機的匹配
- 文件描述符限制
- 關于DNS和Apache
- 常見問題
- 經常問到的問題
- Apache的SSL/TLS加密
- SSL/TLS高強度加密:緒論
- SSL/TLS高強度加密:兼容性
- SSL/TLS高強度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 認證、授權、訪問控制
- CGI動態頁面
- 服務器端包含入門
- .htaccess文件
- 用戶網站目錄
- 針對特定平臺的說明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上編譯Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服務器和支持程序
- httpd - Apache超文本傳輸協議服務器
- ab - Apache HTTP服務器性能測試工具
- apachectl - Apache HTTP服務器控制接口
- apxs - Apache 擴展工具
- configure - 配置源代碼樹
- dbmmanage - 管理DBM格式的用戶認證文件
- htcacheclean - 清理磁盤緩沖區
- htdbm - 操作DBM密碼數據庫
- htdigest - 管理用于摘要認證的用戶文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本認證的用戶文件
- logresolve - 解析Apache日志中的IP地址為主機名
- rotatelogs - 滾動Apache日志的管道日志程序
- suexec - 在執行外部程序之前切換用戶
- 其他程序
- 雜項文檔
- 與Apache相關的標準
- Apache模塊
- 描述模塊的術語
- 描述指令的術語
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模塊 mod_actions
- Apache模塊 mod_alias
- Apache模塊 mod_asis
- Apache模塊 mod_auth_basic
- Apache模塊 mod_auth_digest
- Apache模塊 mod_authn_alias
- Apache模塊 mod_authn_anon
- Apache模塊 mod_authn_dbd
- Apache模塊 mod_authn_dbm
- Apache模塊 mod_authn_default
- Apache模塊 mod_authn_file
- Apache模塊 mod_authnz_ldap
- Apache模塊 mod_authz_dbm
- Apache模塊 mod_authz_default
- Apache模塊 mod_authz_groupfile
- Apache模塊 mod_authz_host
- Apache模塊 mod_authz_owner
- Apache模塊 mod_authz_user
- Apache模塊 mod_autoindex
- Apache模塊 mod_cache
- Apache模塊 mod_cern_meta
- Apache模塊 mod_cgi
- Apache模塊 mod_cgid
- Apache模塊 mod_charset_lite
- Apache模塊 mod_dav
- Apache模塊 mod_dav_fs
- Apache模塊 mod_dav_lock
- Apache模塊 mod_dbd
- Apache模塊 mod_deflate
- Apache模塊 mod_dir
- Apache模塊 mod_disk_cache
- Apache模塊 mod_dumpio
- Apache模塊 mod_echo
- Apache模塊 mod_env
- Apache模塊 mod_example
- Apache模塊 mod_expires
- Apache模塊 mod_ext_filter
- Apache模塊 mod_file_cache
- Apache模塊 mod_filter
- Apache模塊 mod_headers
- Apache模塊 mod_ident
- Apache模塊 mod_imagemap
- Apache模塊 mod_include
- Apache模塊 mod_info
- Apache模塊 mod_isapi
- Apache模塊 mod_ldap
- Apache模塊 mod_log_config
- Apache模塊 mod_log_forensic
- Apache模塊 mod_logio
- Apache模塊 mod_mem_cache
- Apache模塊 mod_mime
- Apache模塊 mod_mime_magic
- Apache模塊 mod_negotiation
- Apache模塊 mod_nw_ssl
- Apache模塊 mod_proxy
- Apache模塊 mod_proxy_ajp
- Apache模塊 mod_proxy_balancer
- Apache模塊 mod_proxy_connect
- Apache模塊 mod_proxy_ftp
- Apache模塊 mod_proxy_http
- Apache模塊 mod_rewrite
- Apache模塊 mod_setenvif
- Apache模塊 mod_so
- Apache模塊 mod_speling
- Apache模塊 mod_ssl
- Apache模塊 mod_status
- Apache模塊 mod_suexec
- Apache模塊 mod_unique_id
- Apache模塊 mod_userdir
- Apache模塊 mod_usertrack
- Apache模塊 mod_version
- Apache模塊 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航