歡迎您光臨本站 註冊首頁

用Linux搭建全自動虛擬主機(上)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
一般,作為一所高校都會為各院系、部門,及老師、學生提供虛擬主機服務.一般要求有一個二級域名,能由用戶自主管理,能支持PHP、JSP等動態網頁技術,並且需要給用戶一個空間限制,要求他們不能任意上傳大量文件.

對於熟悉Web的系統管理員實現以上要求並不困難:二級域名可以通過在域名系統做一個CNAME記錄,並在Apache的配置文件里為其做一個基於名稱的虛擬主機實現;自主管理可以通過給每個用戶一個FTP賬號實現;支持PHP和JSP則可以通過安裝相應模塊實現.但是問題隨之而來,每次修改完Apache的配置文件后都要重新啟動Apache;在域名系統里添加記錄后還要做ndc reload(Red Hat 9.0下為mdc reload);隨著用戶的增加,系統的httpd.conf文件變大,/etc/passwd文件里的用戶變多,這樣一個大的系統對於管理、安全來說都是災難性的.

怎麼能高效、安全、方便地管理這樣一個系統呢?筆者作為一名高校的網路管理員,經過仔細地研究和實踐,成功地利用自由軟體在Linux伺服器上實現了該系統的自動管理.一切工作都可以在Web頁面上自助完成,系統會要求身份驗證,管理員通過Web頁面核對該用戶資料是否屬實,確認后可為用戶開通服務.目前該系統運行良好.

準備工作

1.軟體的選擇

按照需求提供服務是最基本的原則.這裡提供服務的實際環境為一台DNS/Web伺服器(IBM x232),要求有固定IP.

這裡選擇Apache來提供虛擬Web服務.Apache是一個可自由使用、功能完備的Web伺服器,被廣泛地應用,許多商業Web服務軟體都採用Apache作為前端服務軟體.Apache有各種模塊供用戶選擇,基本上能滿足用戶要求,這裡使用兩個重要的非默認模塊.



考慮現在普及的方式和系統成本,採用FTP來管理文件,實現用戶的自我管理.FTP服務軟體種類很多,選擇的原則是:不能使用系統賬號,安全性高,易用性強.經典的wu-ftpd在許多Unix平台是默認的FTP服務軟體,但其使用了系統賬號,安全性較差;與Red Hat搭配的vsftpd安全性高、穩定性好,但其易用性沒有達到本系統要求.所以選擇了proftpd.proftpd是一個非常流行的FTP服務軟體,配置方便,並有MySQL和Quota模塊可供選擇,利用它們的完美結合可以實現非系統賬號的管理和用戶磁碟的限制.

用戶域名服務選擇Bind.可在Red Hat系統安裝時選擇Bind.

實現PHP動態網頁服務當然少不了PHP.JSP則採用Resin,沒有採用常見的Tomcat,主要是考慮Apache和Resin的結合會更好.當然,也可以選擇其它服務軟體.

還必須安裝MySQL軟體.安裝MySQL軟體可以在Red Hat系統安裝時進行,也可以安裝完系統后再手工安裝.這裡選擇手工編譯安裝,儘管RPM包安裝要方便很多,但手工編譯帶來的是更方便的選擇.

除以上軟體外,該系統還安裝了Zend Optimizer和mod_security.Zend Optimizer軟體不僅能提供加密代碼的執行,更關鍵的是能夠提高PHP代碼的執行效率.mod_security則是一個為了防範某些SQL注入攻擊行為的模塊.更多信息請參考相關資料.

2.軟體的下載

可將所有軟體都下載到/root/vhosts/下.

(1)Apache1.3.28

#wget ftp://ftp.linuxaid.com.cn/pub/mirrors/apache/dist/httpd/apache_1.3.28.tar.gz



(2)PHP4.3.3

#wget http://php.linuxaid.com.cn/get/php-4.3.3.tar.gz/from/cn.php.net/mirror



(3)MySQL4.0.16

#wget http://www.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.16.tar.gz/from/http://mysql.linuxforum.net/



(4)proftpd1.2.8



#wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.8.tar.gz



(5)proftpd-mod-quotatab-1.2.7

#wget http://www.castaglia.org/proftpd/modules/proftpd-mod-quotatab-1.2.7.tar.gz



(6)Resin2.1

#wget http://www.caucho.com/download/resin-2.1.11.tar.gz



(7)Zend Optimizer

http://www.zend.com/store/getfreefile.php?pid=13&zbid=548

這裡要有一個Accept的用戶授權協議,然後才能下載.

(8)mod_security

#wget http://www.modsecurity.org/download/mod_security-1.6.tar.gz



系統安裝和配置

下面就進入具體的實現步驟.具體實現前請注意,安裝系統時要求選擇開發包,即把GCC及關聯軟體包選擇上.

1.DNS伺服器的安裝

安裝Red Hat 9.0時需選擇伺服器安裝方式,選擇域名服務,其它軟體均可不裝.安裝需要的安裝系統是安全的一個基本原則.

2.域名伺服器的配置

將申請域名的解析權利交給該台DNS伺服器.具體辦法是申請的時候要求把DNS解析權指向該伺服器,然後可在其上配置域.

/etc/named.conf文件配置示例如下:

options {
directory "/var/named";
};
zone "." in {
type hint;
file "named.root";
};
zone "0.0.127.in-addr.arpa" in {
type master;
file "localhost.rev";
};
zone "yourdomain.com" in {
type master;
file "yourdomain.hosts";
};
zone "176.118.202.in-addr.arpa" in {
type master;
file "176.rev";
};



域名裡面的yourdomain是配置的關鍵,將採用泛域名形式.

/var/named/yourdomain.hosts文件內容如下:
$TTL 3600
@ IN SOA hrbeu.hrbeu.edu.cn. root.mail.hrbeu.edu.cn. (
2003080812 ; serial
360000 ; refresh every 100 hours
3600 ; retry after 1 hour
4w ; expire after 4 weeks
3600 ; default ttl is 1 hours


) ; Define the nameservers and mail servers
IN NS hrbeu.hrbeu.edu.cn.
IN NS lion.hrbeu.edu.cn.
IN MX 10 mail.yourdomain.com.
; Define localhost
localhost IN A 127.0.0.1
; Define hosts in this zone
*.yourdomain.com. IN A 218.7.43.21



其中主要用的就是這個*.yourdomain.com. IN A 218.7.43.21.以後任何像abc.yourdomain.com、hello.yourdomain.com的域名都將解析到218.7.43.21.這樣就不用每開一個虛擬主機都必須在域名系統上做一個CNAME記錄,並reload域名配置文件.特別要注意的是,*.yourdomain.com.後面有一個「.」.

3.MySQL的安裝和配置

(1)添加mysql用戶和mysql組

#cd /root/vhosts/
#groupadd mysql
#useradd -g mysql mysql



(2)編譯安裝

#tar -zxvf mysql-3.23.52.tar.gz
#cd mysql-3.23.52
#./configure --prefix=/usr/loca/mysql
#make
#make install



(3)初始化資料庫,修改目錄許可權並啟動資料庫

#scripts/mysql_install_db
#chown -R root /usr/local/mysql
#chown -R mysql /usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql
#cp support-files/my-medium.cnf /etc/my.cnf
#/usr/local/mysql/bin/safe_mysqld --user=mysql &



(4)設置MySQL自啟動

#cp support-files/mysql.server /etc/init.d/
#ln -s /etc/init.d/mysql.server /etc/rc3.d/S99mysqld



注意,修改mysql.server和S99mysqld為可執行.

為了方便以後進入MySQL,最好把MySQL的客戶端程序路徑加入到/etc/profile中.在該文件末尾加入export PATH=/usr/local/mysql/bin:$PATH.

到此MySQL的安裝已經完成,可以使用MySQL命令進入.注意要先退出再進入,已經修改/etc/profile,重新進入后才能自動搜索MySQL路徑.進入后,請注意修改MySQL的root密碼.命令如下:

#mysqladmin -u root password newpassword



注意,還應刪除自己的.bash_history文件,否則可能造成密碼泄露.



4.proftpd的安裝

(1)將proftpd的源碼包解壓縮到目錄下

#tar -zxvf proftpd-1.2.8.tar.gz



解壓縮mod_quotatab-1.2.7:

#tar -zxvf proftpd-mod-quotatab-1.2.7.tar.gz



進入mod_quotatab目錄,把mod_quotatab中的文件拷貝到proftpd的modules目錄中:

#cd mod_quotatab
#cp -Rpf * ../proftpd-1.2.8/modules



(2)在開始運行configure之前,先修改mod_sql_mysql.c文件

#cd ../proftpd-1.2.8/contrib
#vi mod_sql_mysql.c



把#include 改為實際路徑,如MySQL安裝在/usr/local/mysql下,將其修改為:

#include



(3)配置proftpd

#cd ..
#./configure--prefix=DIR
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
--with-includes=DIR
--with-libraries=DIR



需要修改的三個地方是:

◆--prefix=DIR,DIR為要安裝到的目錄名,如在本例中DIR為/usr/local/proftpd.

◆--with-includes=DIR,DIR為MySQL的includes目錄,如在本例中DIR為/usr/local/mysql/include/mysql.

◆--with-libraries=DIR,DIR為MySQL的lib目錄,如在本例中DIR為/usr/local/mysql/lib/mysql.

安裝完成:

#make
#make install



5.配置proftpd.conf

由於利用了MySQL,所以要在MySQL中建一個庫,並賦予一個用戶許可權.

mysql> create database ftp;
mysql> grant all privileges on ftp.*
to ftpuser@localhost identified by 'test#@' with grant option;



接下來,進入安裝好的proftpd目錄,修改etc/proftpd.conf文件進行配置.基本配置講解示例:proftpd.conf.

ServerName "HRBEU's ftp server"
ServerType standalone
DefaultServer on
Port 21
Umask 022
DefaultRoot ~
SystemLog /usr/local/proftpd/logs/ftp.log
TransferLog /usr/local/proftpd/logs/ftp.transferlog


MaxLoginAttempts 30
AllowRetrieveRestart on
#for quota configure
QuotaDirectoryTally on
QuotaDisplayUnits Kb
QuotaEngine on
QuotaLog /usr/local/proftpd/logs/Quota.log
QuotaShowQuotas on
#for sql configure

SQLConnectInfo ftp@localhost:3306 ftpuser test#@
SQLAuthTypes Backend Plaintext
SQLUserInfo FTPUSERS userid passwd uid gid home shell
SQLGroupInfo FTPGRPS groupname gid members
RequireValidShell off
SQLAuthenticate users
SQLHomedirOnDemand on
#MySQL部分配置講解見后.
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type,
bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail,
files_xfer_avail FROM quotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used,
bytes_out_used, bytes_xfer_used, files_in_used, files_out_used,
files_xfer_used FROM quotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE
"bytes_in_used = bytes_in_used %{0}, bytes_out_used = bytes_out_used %{1},
bytes_xfer_used = bytes_xfer_used %{2}, files_in_used = files_in_used %{3},
files_out_used = files_out_used %{4},
files_xfer_used = files_xfer_used %{5} WHERE name = '%{6}' AND quota_type = '%{7}'"
quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}
" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally

MaxInstances 30
User ftp
Group ftp

AllowOverwrite on




6.MySQL部分配置講解

資料庫連接的信息:

SQLConnectInfo DatabaseName@HostName:Port UserName Password



其中DatabaseName是資料庫名,HostName是主機名,Port是埠號,UserName是連接資料庫的用戶名,Password是密碼.



資料庫認證的類型:

SQLAuthTypes Backend Plaintext



指定用來做用戶認證的表的有關信息.「FTPUSERS」和「FTPGRPS」是數據表名字,會在後面建立.

SQLUserInfo FTPUSERS userid passwd uid gid homedir shell
SQLGroupInfo FTPGRPS groupname gid members



設置如果Shell為空時允許用戶登錄:

RequireValidShell off



資料庫的鑒別:

SQLAuthenticate users groups usersetfast groupsetfast



如果HOME目錄不存在,則系統會根據其HOME項新建一個目錄:

SQLHomedirOnDemand on



7.數據表的建立

在該資料庫中建立一個用戶表FTPUSERS,該表是必須的:

use ftp;
create table FTPUSERS (
userid TEXT NOT NULL,
passwd TEXT NOT NULL,
uid INT NOT NULL,
gid INT NOT NULL,
home TEXT,
shell TEXT
);



此表為用戶認證所需,其中userid、passwd必不可少.userid是FTP服務的用戶名;passwd是對應用戶的密碼;uid是系統用戶的id,即所映射的系統用戶;id是所屬系統組的id;home是該用戶所在的HOME目錄;shell可以為該用戶指定相應的Shell.

如果還需要組的功能,可以添加另一個表:FTPGRPS,即確定組的表格.也可不用該表,本文基本上就沒有使用到它,下面是它的格式:

create table FTPGRPS (
groupname TEXT NOT NULL,
gid SMALLINT NOT NULL,
members TEXT NOT NULL
);



其中grpname是組的名稱,gid是系統組的id,members是組的成員.注意,如果是多成員他們之間要用逗號隔開,而不能使用空格.這樣可以對一個組賦予許可權,比一個個單獨賦予更方便.

為空用戶表FTPUSERS插入記錄:

INSERT INTO FTPUSERS (userid, passwd, uid, gid, home, shell)
VALUES ('test', '88888888', '1000', '1000', '/usr/local/apache/htdocs/test', '' );





按此格式可以為用戶添加一個記錄.如果為組添加記錄,一定要注意在members欄位多個成員之間用逗號隔開,如:

INSERT INTO FTPGRPS VALUES ('Webusers', '1000', 'test,test2,test3');



8.為FTP用戶建立相應的系統用戶

本例中,為FTP服務只提供一個有效的系統用戶ftp和組ftp,用其來啟動FTP daemon,並把所有的FTP用戶映射到該用戶.

先建立ftp組:

# groupadd -g 1000 -r ftp



然後建立ftp用戶:

# useradd -u 1000 -g 1000 -d /usr/local/apache/htdocs -s /bin/bash -r ftp



為ftp用戶建立HOME,把所有的FTP user活動空間全部放置在此目錄下:

# chown ftp /usr/local/apache/htdocs
# chgrp ftp /usr/local/apache/htdocs



到這裡MySQL認證部分基本配置完成,接下來的將是磁碟限額部分.


[火星人 ] 用Linux搭建全自動虛擬主機(上)已經有734次圍觀

http://coctec.com/docs/linux/show-post-56556.html