Linux之Web服務(2)Httpd服務配置之三html
前言算法
默認安裝的Httpd服務通常只有默認的一個DocumentRoot節點配置,及一個站點文檔資源存放根目錄,可是在生產環境中須要有多種分類的資源,好比用於外部訪問和內部訪問,又或者是資源自己類型,好比分別用來存放一些文檔、圖片、單項加密算法文件等,爲了更好分配站點管理的資源,Httpd服務提供了VirtualHost及虛擬主機的配置,能夠在一個Httpd服務下模擬進行部署多個站點,這樣不一樣的站點進行不一樣的配置,更方便進行分佈式管理。apache
VirtualHost 虛擬主機配置格式介紹vim
主機標示方式:瀏覽器
IP不一樣安全
PORT不一樣bash
ServerName服務器
一個IP:PORT配置例子:curl
<VirtualHost IP:PORT> #若寫成 <VirtualHost *:80> ,則表示全部IP:80 端口 ServerName server.meng.com #站點完整主機名 Document /vhost/www1 #站點文檔根目錄 <Directory 「/vhost/www1」> #站點文檔根目錄訪問控制,必須配置,不然沒法訪問 Options None Require all granted </Diretory> ErrorLog 「logs/www1_errorlog」 #錯誤認知 Customlog 「logs/www1_accesslog」 common #訪問日誌 </VirtualHost>
補充:要在httpd-2.2版本使用基於ServerName的虛擬主機配置時,要使用專用的配置指令,及添加下面配置便可:分佈式
NameVirtualHost IP:PORT
Httpd2.4配置案例:
1、基於主機的配置:
#基於主機IP地址配置
<VirtualHost 10.1.249.223:80> DocumentRoot "/vhosts/baidu" <Directory "/vhosts/baidu.com"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
#基於主機名的配置,不過須要hosts檔案文件或DNS服務解析
<VirtualHost *:80> ServerName www.meng.com DocumentRoot "/vhosts/meng" <Directory "/vhosts/baidu.com"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
#IP和Port以及完整主機名的混合使用
<VirtualHost 10.1.249.22:8080> ServerName www.google.com DocumentRoot "/vhosts/google" <Directory "/vhosts/google"> Options None AllowOverride None Require all granted </Directory> </VirtualHost>
基於用戶認證的訪問控制 Require
Require user USERLIST#基於用戶
Require group GROUPLIST #基於用戶組
認證的方式(AuthenType):
basic #基本base64算法
digest #單項加密內容摘要算法
http協議認證過程:
1、認證質詢:
www-Authencate :響應碼爲401,拒絕客戶端請求,並說明用戶輸入正確的帳號和密碼以後可訪問;
2、認證:
Authorization:客戶端輸入帳號和密碼再次發送請求報文;認證經過,服務器發送響應內容。
配置案例:
1、基於指定用戶的驗證
<Directory "/var/www/html/admin">#對/var/www/html/admin/目錄進行訪問控制 Options None AllowOverride None AuthType Basic #使用級別算法認證 AuthName "Please amdin username and password login:" #配置認證的提示信息 AuthUserFile /var/www/html/.htpasswd #配置要使用的存放的單項加密的摘要文件 Require user tom hadoop #須要進行的用戶,多個用空格隔開 </Directory>
2、基於指定用戶組進行認證
<Directory "/vhosts/www1/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin Area, Enter your name/pass" AuthUserFile "/etc/httpd/conf/.htpasswd" AuthGroupFile "/etc/httpd/conf/.htgroup" Require group GRPNAME1 GRPNAME 2 </Directory>
提示:組帳號文件格式:
每行定義一個組,如:
group_name: user1 user2 ...
3、帳號及文件生成工具htpasswd 命令
命令格式:
htpasswd [options] 「/PATH/TO/HT_PASSWD_FILE」 username
-c:建立新文件,若是指令路徑有將被覆蓋
-m:md5加密算法生成內容摘要
-s:使用sha1算法
-D:刪除指定用戶
配置案例:
一、在服務根配置目錄下(/etc/httpd/conf.d/)下建立一個配置文件authen.conf
[root@root ~]# vim /etc/httpd/conf.d/authen.conf <Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic #使用級別認證 AuthName "Please amdin username and password login:" #設置認證提示短語 AuthUserFile /var/www/html/.htpasswd #使用的認證內容摘要及密碼 Require user tom hadoop #添加的用戶tom、hadoop </Directory>
解析:這裏的tom、hadoop用戶不是/etc/passwd中建立的用戶,而是Httpd服務中使用的用戶,所以須要建立.htpasswd用戶檔案文件來記錄對應的用戶和密碼用於驗證。
二、構建配置目錄結構
#在默認文檔根目錄/var/www/html下添加admin目錄
[root@root ~]# [ ! -d "/var/www/html/admin/" ] && mkdir -p /var/www/html/admin
#爲了測試顯示,這裏在admin目錄下添加一個html文檔
[root@root ~]# cat /var/www/html/admin/admin.html <html> <head><title>This is admin dir</title></head> <body> <div> <h1>Admin Page</h1> </div> </body> </html>
3、生成密鑰,可使用htpasswd命令
#使用htpasswd生成單項加密口令
[root@root ~]# htpasswd -cm "/var/www/html/.htpasswd" tom New password: Re-type new password: Adding password for user tom
注意:要建立爲以.開頭的隱藏文件。
#固然還有一個用戶,可使用命令再次添加
[root@root ~]# htpasswd -m "/var/www/html/.htpasswd" hadoop
說明:不過此次不要使用-c選項了,否則會覆蓋.htpasswd文件的,不過在添加以前,能夠先來看一下htpasswd -m的md5加密算法算出的是個什麼格式的文件。
#查看生成的.htpasswd文件
[root@root ~]# cat /var/www/html/.htpasswd tom:$apr1$991zkDGC$oz6fhL9n992o2xy75fzh7/
解析:這裏發現,此格式以 : 爲分割符分爲兩列,第一列爲驗證的用戶名,而第二列爲加密的密碼。而且密碼也是有規律的,這裏有3個$符號,那麼以每一個$後面的字符又有不一樣的含義吧,猜測第一個$後面的爲一種加密算法的標示,而第二個$後面有8個字符,好像相似隨意生成字符,沒什麼規律,而第三個$後面好想纔是真正密碼加密的生成的口令。
4、根據上面的猜測,可使用一些其它的加密工具命令openssl來驗證上面的結果
一、使用openssl生成一個8位的隨機字符
[root@root ~]# openssl rand -base64 8 VhBGjczh+Ic=
2、使用openssl來接收一個重定向並使用-apr及apache專用加密算法生成密碼
[root@root ~]# echo "123456" | openssl passwd -apr1 -stdin $apr1$jvDpJ./u$D4HDqiqJniPjwV/eA2N4z0
解析:這裏發現生成的密文只有2個$符號,而少了一個,固然passwd 子命令是由一個選項-salt及給口令加鹽,防止密碼被反推的。
三、再次使用passwd -salt給密碼加鹽生成口令
[root@root ~]# echo 123456 | openssl passwd -apr1 -salt '**' -stdin $apr1$**$ST9n6tfQeeHScnBbeAQfj/
解析:這裏發現了出現了3個$符號,原來第2個$符號是用來安全給口令加鹽的。
四、根據上面的結論那麼經過重定向就能夠直接生成想要的密碼了
#直接使用openssl重定向米密碼,並添加用戶名輸出到文件
[root@root ~]# echo "123456" | openssl passwd -apr1 -salt "`openssl rand -base64 8`" -stdin | sed 's/.*/hadoop:&/' > pass.log [root@root ~]# cat pass.log hadoop:$apr1$EgZjb9Va$o3tt8Qy7CxrEpaZtlFrrv/
說明:經過htpasswd命令生成檔案文件來看,用戶名和密碼之間用 : 來隔開,那麼使用sed命令在生成的密文前面添加拼接上一個用戶名便可,並跟 :符號與密碼隔開。
#一般查看剛纔的文件和開始htpasswd命令生成文件
[root@root ~]# cat pass.log /var/www/html/.htpasswd hadoop:$apr1$EgZjb9Va$o3tt8Qy7CxrEpaZtlFrrv/ tom:$apr1$991zkDGC$oz6fhL9n992o2xy75fzh7/
說明:是否是同樣,感受差很少,那麼測試一下可否通此密鑰登陸。
#將剛纔密文追加到.htpasswd文件中
[root@root ~]# cat ./pass.log >> /var/www/html/.htpasswd
#測試配置並重載httpd服務
[root@root ~]# httpd -t Syntax OK [root@root ~]# systemctl reload httpd.service
#進行訪問,出現了登陸驗證界面
說明:注意了了右上角的狀態碼了嗎?401,沒錯,前面說的Httpd的認證機制在接受到請求時就響應此狀態表示須要經過用戶驗證機制,出現了一個登錄界面,這裏的提示信息就是剛纔設置的AuthenName對應的提示字符。
#下面輸入使用剛纔的tom用戶和對應密碼進行登陸
說明:這裏輸入後直接回車便可,不要在選擇OK去點回車,不然會顯示301。
#下面退出,使用圖形瀏覽器,而後再次訪問並使用hadoop用戶登陸
說明:這裏發現了其實加密就是經過一些口令進行驗證,與/etc/passwd和/etc/shadow驗證的機制都是調用了Pam模塊機制,固然,這是不靈活的,固然能夠編寫一些用戶驗證機制模塊來自定義驗證知足需求。前面講到Directory中的Options選項時有一個參數爲Indexes這個選擇,若是指定目錄沒有默認主頁,則列出全部文件,去掉則不顯示文件列表。前面見到使用隱藏文件和去到讀權限來保證資源的安全,在這裏使用驗證機制直接就完整了上面的一堆麻煩事,爲何呢?,請看下面的操做:
#一樣使用curl去抓嘗試抓取admin.html資源原代碼
[root@root ~]# curl http://10.1.249.223/admin/admin.html
解析:這時發現,抓取的源代碼是一個401及驗證狀態碼,這裏這就進行了數據資源響應的一層攔截,若是沒有輸入密碼進行驗證,是沒法獲取成功的響應信息的。也驗證了開始的驗證機制的兩條說明。驗證經過纔會收到服務端的響應報文。固然前面的用法也不是沒有用處,在處理多個文件訪問仍是有用的。