本文目錄:1.1 htpasswd命令1.2 身份認證類基本指令1.3 Require指令1.4 web身份認證示例 httpd對web身份認證的支持很豐富,提供的控制也非常細緻。無疑,功能豐富意味著模塊多。關於完整的模塊,見http://httpd.apache.org/docs/2.4/mod/ ...
本文目錄:
1.1 htpasswd命令
1.2 身份認證類基本指令
1.3 Require指令
1.4 web身份認證示例
httpd對web身份認證的支持很豐富,提供的控制也非常細緻。無疑,功能豐富意味著模塊多。關於完整的模塊,見http://httpd.apache.org/docs/2.4/mod/ ,其中mod_authX_XXX都是和認證有關的模塊。要實現最基本的帳戶認證訪問控制,只需幾個常見的模塊即可:mod_authz_core,mod_authz_user,mod_authz_host...。
1.1 htpasswd命令
htpasswd用於為指定用戶生成基於網頁用戶身份認證的密碼,由httpd-tools軟體包提供。支持3種加密演算法:MD5、SHA和系統上的crypt()函數,不指定演算法時,預設為md5。
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] passwdfile username password
htpasswd -n [ -m | -d | -s | -p ] username
htpasswd -nb [ -m | -d | -s | -p ] username password
選項說明:
passwdfile:包含用戶名及其密碼的用戶密碼文件。如果使用了"-c"選項,則會創建或覆蓋文件。不使用"-n"選項時必須指定passwdfile參數。
username:為指定的用戶名創建密碼。如果該用戶記錄已存在,則更新。
-c:創建用戶密碼文件passwdfile,如果文件已經存在則會覆蓋已存在的文件。不能和"-n"一起使用。
-n:在標準輸出中輸出結果,而不是將其寫入到用戶密碼文件中。該選項會忽略用戶密碼文件passwdfile參數。不能和"-c"選項一起使用。
-m:使用MD5加密演算法。預設。
-d:使用crypt()函數計算密碼,不安全。
-s:使用SHA加密演算法。安全。
-P:強制不加密密碼,保持明文狀態,不安全。
-B:強制bcrypt加密密碼,非常安全。
-D:從用戶密碼文件中刪除指定的用戶及其密碼。
-b:使用批處理模式,即非交互模式,可以直接待加密的傳遞明文密碼。
password:指定要輸入的明文密碼。只能在批處理模式中使用,即和"-b"一起使用。
例如:
(1).使用"-n"選項直接將結果輸出到標準輸出而不創建passwdfile。
[root@xuexi ~]# htpasswd -n Jim
New password:
Re-type new password:
Jim:ZKHud9tziGucY
(2).使用批處理模式直接傳遞密碼。
[root@xuexi ~]# htpasswd -nb Jim 123456 ; htpasswd -nb Jim 123456
Jim:r.BF8RVw56BOA
Jim:xXoNgOS8nN3LQ
發現密碼完全是隨機的。
(3).創建用戶密碼文件passwdfile。
[root@xuexi ~]# htpasswd -cb Bobfile Bob 123456
[root@xuexi ~]# cat Bobfile
Bob:fvUxzB3kcnDPk
(4).刪除用戶文件中的某用戶。
[root@xuexi ~]# htpasswd -D Bobfile Bob
(5).使用sha和md5加密演算法計算密碼。
[root@xuexi ~]# htpasswd -mb Bobfile Bob 123456
[root@xuexi ~]# cat Bobfile
Bob:$apr1$bllkodFt$GUmeb8hXngOAschs1SBgq0
[root@xuexi ~]# htpasswd -sb Bobfile Bob 123456
[root@xuexi ~]# cat Bobfile
Bob:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=
1.2 身份認證類基本指令
AuthType
:指定web身份認證的類型。有效值為none、basic、digest以及form。通常最基本的認證使用的是文件認證,所以通常使用basic。AuthName
:設置身份認證時的提示信息。AuthUserFile file-path
:指定web用戶認證列表。由htpasswd命令生成。AuthGroupFile file-path
:指定組認證文件,文件中分組格式為"mygroup: Jim Bob Alice"。如果文件路徑為相對路徑,則相對於ServerRoot
基於basic類型的認證就這麼幾個指令,最主要的還是require指令的使用。更多的認證方法見官方手冊的auth類模塊。
1.3 Require指令
該指令只能放在Directory容器中,用於控制對目錄的訪問許可權。它的主要功能是由mod_authz_core模塊提供,但有些身份認證類模塊也提供它額外的功能,這時它可以放在< Directory >、< Files >或< Location >容器中。
主要功能:
- Require all granted
無條件允許所有人訪問該目錄 - Require all denied
無條件拒絕所有人訪問該目錄 - Require env env-var [env-var] ...
只有給定的環境變數var-env已經定義才允許訪問該目錄 - Require method http-method [http-method] ...
只有給定的HTTP請求方法才允許訪問該目錄,如只允許GET才能訪問 - Require expr expression
只有給定的表達式為true才允許訪問該目錄
身份認證類模塊提供的require指令功能包括:
- mod_authz_user為require指令提供的功能:
- Require user userid [userid] ...:認證列表中只有指定的userid才能訪問
- Require valid-user:認證列表中的所有用戶都可以訪問
- mod_authz_groupfile為require指令提供的功能:
- Require group group1 [group2] ...:指定組內的用戶都可以訪問
- 本地文件系統身份參考類:
- Require file-owner:要求web用戶名必須和請求文件的uid對應的username完全相同
- Require file-group:要求web用戶名必須為請求文件的gid組中的一員
- mod_authz_host為require指令提供的ip和host功能:
- Require ip 192.168.1.104 192.168.1.205
- Require ip 10.1
- Require ip 10 172.20 192.168.2
- Require ip 10.1.0.0/255.255.0.0
- Require ip 10.1.0.0/16
- Require host www.example.org
- Require host example.org
- Require host .net example.edu
- Require local
可以在require指令後緊跟not關鍵字,表示取反。例如"require not group group1"、"require not local"等。
還支持require條件容器,包括< RequireAll >、< RequireAny >和< RequireNone >,當require指令沒有寫在任何Require容器中時,它們隱式包含在一個< RequireAny >容器中。
- < RequireAll >:其內封裝的Require指令必須全都不能失敗,且至少有一個成功時,該容器成功。如果其內所有指令既不成功又不失敗,則該容器中立。其餘所有情況都會導致該容器失敗。
- < RequireAny >:其內封裝的Require指令只要有一個成功,該容器就成功。如果其內所有指令既不成功又不失敗,則該容器中立。其餘所有情況(即全部失敗時)都會導致該容器失敗。
- < RequireNone >:其內封裝的Require指令只要有一個成功時該容器就失敗,否則就中立。
1.4 web身份認證示例
以最常見的Basic認證方式為例。支持基於用戶的認證和基於組的認證。
1.4.1 基於用戶的認證
先創建一個web用戶及其密碼列表文件。其內有4個用戶:Jim、Bob、Alice和Tom。
[root@xuexi ~]# htpasswd -cb /usr/local/apache/a_com.pass Jim 123456
[root@xuexi ~]# htpasswd -b /usr/local/apache/a_com.pass Bob 123456
[root@xuexi ~]# htpasswd -b /usr/local/apache/a_com.pass Alice 123456
[root@xuexi ~]# htpasswd -b /usr/local/apache/a_com.pass Tom 123456
修改httpd配置文件,假設只有www.a.com中的a.com目錄才需要認證且只有Jim和Bob可以認證,而其他目錄以及www.b.com不需要認證,其他用戶認證不通過。
<VirtualHost 192.168.100.14:80>
ServerName www.a.com
DocumentRoot /usr/local/apache/htdocs/a.com
<Directory /usr/local/apache/htdocs/a.com>
AllowOverride Authconfig
AuthType Basic
AuthName "please enter your name & passwd"
AuthUserFile a_com.pass
Require user Jim Bob
</Directory>
</VirtualHost>
<VirtualHost 192.168.100.14:80>
ServerName www.b.com
DocumentRoot /usr/local/apache/htdocs/b.com
</VirtualHost>
此處AuthUserFile使用的相對路徑,所以該文件必須放在ServerRoot(我的測試環境ServerRoot為/usr/local/apache)下。且Require user行可以替換為"Require valid-user"表示a_com.pass中的所有用戶都允許認證。
然後重啟httpd,並修改客戶端hosts文件。
192.168.100.14 www.a.com www.b.com
再測試訪問。
1.4.2 基於組的認證
基於組的認證只需創建一個組文件,文件中包含的是組名和組中用戶成員。
例如,將Tom和Alice加入到allow組,使它們也可以訪問a.com目錄。
[root@xuexi ~]# echo 'allow:Tom Alice' >/usr/local/apache/auth_group
修改配置文件,例如:
<VirtualHost 192.168.100.14:80>
ServerName www.a.com
DocumentRoot /usr/local/apache/htdocs/a.com
<Directory /usr/local/apache/htdocs/a.com>
AllowOverride Authconfig
AuthType Basic
AuthName "please enter your name & passwd"
AuthUserFile a_com.pass
AuthGroupFile auth_group
Require user Jim Bob
Require group allow
</Directory>
</VirtualHost>
<VirtualHost 192.168.100.14:80>
ServerName www.b.com
DocumentRoot /usr/local/apache/htdocs/b.com
</VirtualHost>
再重啟進行測試。