Apache配置對站點目錄的認證

前言:

有的時候需要對站點中的某個目錄進行保護,只有輸入指定的賬號密碼才可以瀏覽。這當然可以通過動態網站設計語言來實現,但通過對Apache本身的配置來實現似乎要更方便一些。

配置方法:

一、Apache配置編輯及站點創建

創建一個站點配置文件。

[root@localhost auth]# vim /etc/httpd/conf.d/vhost1.conf

內容如下:

<Directory "/tmp/html/auth/">      // 要啓用認證的目錄
    AuthName "請認證身份"           // 服務器返回的認證對話框的標題
    AuthType Basic                 // 認證類型
    AuthUserFile /tmp/html/auth/.htpasswd      // 密碼配置文件路徑
    require valid-user             // 允許通過認證的所有用户訪問,如果改為某一用户名則只允許此用户訪問
</Directory>
<VirtualHost *:80>                 // 創建一個簡單的虛擬主機用於測試
    DocumentRoot /tmp/html/
</VirtualHost>

創建站點運行目錄及要開啓認證的站點子目錄。

[root@hostname ~]# mkdir -p /tmp/html{,/auth}

查看此時的站點目錄結構。

[root@hostname ~]# tree /tmp/html/
/tmp/html/
└── auth

在站點子目錄下創建首頁文件。

[root@hostname ~]# echo 'Hello,world!' > /tmp/html/auth/index.html

二、生成用户密碼配置文件

創建新文件,並向其中添加一個用户認證信息。

[root@hostname ~]# htpasswd -cb /tmp/html/auth/.htpasswd user1 123456     //-c參數用於創建新文件,若文件已存在則無需使用-c參數,-b參數用於指定在命令行中直接鍵入密碼,而不是用交互模式。user1為用户名,123456為密碼。
Adding password for user user1   //提示成功添加了user1的用户密碼

增加一個新的認證用户。

[root@hostname ~]# htpasswd -b /tmp/html/auth/.htpasswd user2 123456
Adding password for user user2   //成功添加

修改用户的密碼。

[root@hostname ~]# htpasswd -mb /tmp/html/auth/.htpasswd user1 654321
Updating password for user user1 //密碼更新成功

刪除認證用户。

[root@hostname ~]# htpasswd -D /tmp/html/auth/.htpasswd user2
Deleting password for user user1 //刪除成功

測試:

使用瀏覽器訪問http://URL/auth(URL是你網站的域名或IP)就會看到要求認證的對話框啦!

這裏我為了方便,使用的是Linux下的Links瀏覽器進行測試的。

正確輸入賬號密碼後,即可看到網頁內容。

為Apache配置虛擬目錄

虛擬目錄簡介:

虛擬目錄就是將原本不存在於網站根目錄下的目錄映射到一個別名上,這樣Apache就可以通過“http(s)://網址/別名”的形式訪問他啦!

配置方法:

先配置一個簡單的虛擬主機。

[root@localhost ~]# vim /etc/httpd/conf.d/a.conf
<VirtualHost *:80>
       DocumentRoot /tmp/html/
</VirtualHost>

在虛擬主機中定義虛擬目錄。

Alias /dir /tmp/html1

最終的虛擬機配置文件的內容是這樣的。

<VirtualHost *:80>
       DocumentRoot /tmp/html/
       Alias /dir /tmp/html1
</VirtualHost>

創建站點目錄及網頁。

[root@localhost ~]# mkdir /tmp/html /tmp/html1
[root@localhost ~]# echo one > /tmp/html/index.html
[root@localhost ~]# echo two > /tmp/html1/index.html

在保證selinux和防火牆均關閉的情況下啓動Apache。

[root@localhost ~]# service httpd start

測試:

可以選擇在Windows的瀏覽器上測試,這裏我為了方便,直接在CentOS下的文本瀏覽器中測試。

安裝瀏覽器。

[root@localhost ~]# yum install -y links

使用瀏覽器打開站點首頁,這裏的192.168.1.100是我的Apache服務器的IP地址。

[root@localhost ~]# links 192.168.1.100

按q退出後,重新打開帶虛擬目錄的站點URL,可以看到,成功輸出了虛擬目錄中的首頁文件的內容,至此,虛擬目錄配置完成。

[root@localhost ~]# links 192.168.1.100/dir

Apache配置HTTPS訪問

介紹:

HTTPS協議是加密後的HTTP協議,瀏覽器和服務器間的通信被加密傳輸,有效的防止了網頁劫持並保護了用户的數據安全。HTTPS加密會使用到SSL證書,本例中使用OpenSSL這個開源軟件來生成SSL證書做測試用。網站正式上線後需去專門的CA機構申請SSL證書,自己生成的證書是不被瀏覽器信任的。

安裝軟件:

[root@localhost ~]# yum install -y openssl       //安裝OpenSSL軟件包用於生成SSL證書,此軟件包通常已隨系統默認安裝。
[root@localhost ~]# yum install -y httpd         //安裝Apache。
[root@localhost ~]# yum install -y mod_ssl       //安裝Apache的SSL加密模塊。

生成證書:

使用OpenSSL在/etc/httpd/ssl目錄下生成一個自簽名證書(存儲位置隨意)。

[root@localhost ~]# mkdir /etc/httpd/ssl       //創建SSL存儲文件夾
[root@localhost ~]# openssl req -newkey rsa:2048 -nodes -keyout /etc/httpd/ssl/ssl.key -x509 -days 365 -out /etc/httpd/ssl/ssl.crt       //生成SSL證書文件

隨後程序會依次要求輸入所在的國家、地區、城市等等的信息,因為我們是做測試用的,這裏全部直接回車即可。但是在下圖中紅色箭頭所指的位置上要填上啓用HTTPS的站點的域名,否則客户端瀏覽器可能會因為簽名域名和站點實際域名不同而斷開鏈接。

查看剛剛生成的證書。

[root@localhost ~]# ls /etc/httpd/ssl/

其中,.crt文件是證書文件,.key文件是私鑰文件。

Apache配置部分:

配置Apache的ssl.com子配置文件,此配置文件必須是安裝過mod_ssl模塊才會有。

[root@localhost ~]# vim /etc/httpd/conf.d/ssl.conf

我看到網上很多教程説,在修改/etc/httpd/conf.d/ssl.conf子配置文件前還要在/etc/httpd/conf/httpd.conf主配置文件中引入mod_ssl模塊。這裏特殊説明一下,在CentOS 6.5下/etc/httpd/conf.d/ssl.conf子配置文件中就已經引入了mod_ssl模塊,不需要再另外引入,另外,此配置文件中也默認開啓了對443端口(HTTP使用80端口傳輸,HTTPS使用443端口傳輸)的監聽。

本例中修改成如下圖所示,“*”代表監聽所有IP地址,虛擬主機所使用的域名必須使用DNS服務器解析到Apache服務器的IP上。

在105行和112行找到下圖中的選項,將這輛個選項的參數修改為證書文件及私鑰文件的存儲位置。

創建網站首頁文件。

[root@localhost ~]# echo 'hello,world!' > /var/www/html/index.html

如果在啓用HTTPS訪問的同時還要禁止HTTP訪問可以做如下修改。

編輯Apache主配置文件。

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

方法1:暴力修改法。

轉到第136行左右位置將監聽80端口的選項直接禁用掉,這將會影響主配置文件中所有的虛擬主機。

修改後如圖。

方法2:將需要禁用HTTP訪問的虛擬主機配置信息刪掉即可,如下圖就是一個監聽80端口(HTTP使用80端口)的虛擬主機配置信息。

最後,保存配置文件,並在保證防火牆及selinux均已關閉的情況下重啓Apache。

[root@localhost ~]# service httpd restart

測試:

此時,通過HTTP協議已無法訪問網站。

HTTPS協議正常訪問網站,但瀏覽器會提示證書錯誤,因為是自簽證書所以並不會被瀏覽器所信任,此處可不予理會。

Apache配合MySQL做訪問認證

介紹:
默認情況下,任何用户都可以訪問由Apache所承載的網站,但如果網站管理員想要只有通過身份認證的用户才能訪問網站要怎樣做呢?
當然,這個需求可以使用動態網頁設計語言來實現,但本篇文章中我來介紹下如何使用Apache內置的身份認證來滿足此需求。
安裝軟件包:

# yum install -y mysql-server         //安裝MySQL數據庫,用於存放用户身份信息
# yum install -y httpd                //安裝Apache
# yum install -y mod_auth_mysql       //為Apache安裝mod_auth_mysql模塊,使其可以使用MySQL中存放的用户信息做認證

MySQL配置部分:
啓動mysql服務器。

# service mysqld start

修改默認root密碼(此root用户是MySQL的管理員賬户,而非Linux系統的root用户)。

# mysqladmin -u root -p password 123456

之後會彈出提示,要求輸入原root密碼,安裝MySQL後默認為空,直接回車即可。
若是MySQL5.6及以上版本,默認root密碼不為空而是一個隨機字符串,存放在~/.mysql_secret文件中。
使用root用户登錄MySQL服務器,回車後會要求鍵入root密碼。

# mysql -u root -p

隨後轉到MySQL的命令提示符下,如下圖。

創建一個數據庫:auth_db。

mysql>create database auth_db;

選中數據庫。

mysql>use auth_db;

在其中新建一個數據表:user,其表結構如下圖。

mysql>create table user(ID int,Name varchar(10),Birthday datetime,Sex char(8),Password char(64),primary key(ID));

查看剛剛添加的數據表的表結構。

mysql>desc user;


向表中添加兩位用户的數據,要求如下。

 
兩位用户的口令與用户名相同。

mysql>insert into user values(0,'myuser1','1996-7-1','male','myuser1');
mysql>insert into user values(1,'myuser2','1997-9-1','female','myuser2');

查看剛剛添加的數據。

mysql>select * from user;


加密密碼字段。

mysql>update user set password=encrypt(password);

查看加密後的密碼字段。

至此,MySQL配置部分完成。
Apache配置部分:
編輯Apache主配置文件,添加一個虛擬主機。

# vim /etc/httpd/conf/httpd.conf

轉到最後一行,可以看到如下內容,取消其前方的註釋,並刪除多餘行(是否刪除看具體需求,此處為了演示方便,除了必要選項之外全部刪除),同時對選項的參數進行適當修改。

處理完後,如下。

上圖中,DocumentRoot選項配置網站主目錄,ServerName選項配置網站域名。注:此處的域名需使用DNS服務器解析到Apache服務器的IP上,否則無法使用域名訪問。
創建網站首頁文件。

# echo 'hello,world!' > /var/www/html/index.html

編輯Apache的auth_mysql.conf子配置文件,此配置文件必須是安裝過mod_auth_mysql模塊才會有。

# vim /etc/httpd/conf.d/auth_mysql.conf

轉到第26行左右位置,可以看到如下內容,去掉其前方註釋,並按實際情況修改各選項的參數。

本例中,修改後如下圖。

保存並退出後,在保證防火牆和selinux均關閉的情況下重啓Apache服務,使配置文件生效。

# service httpd restart

在客户機驗證配置,訪問網站域名後彈出認證提示框:

正確輸入賬號名和密碼後成功訪問網站: