新聞中心
LAMP是一套軟件架構(gòu),包括這幾大部分:Linux(作為基礎(chǔ)層的操作系統(tǒng)),Apache(“位于操作系統(tǒng)之上”的網(wǎng)站服務(wù)器),MySQL(或MariaDB,作為關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)),最后是PHP(這種服務(wù)器端腳本語(yǔ)言用來處理和顯示存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息)。

我們?cè)诒疚闹屑僭O(shè)這套架構(gòu)的每個(gè)部分都已經(jīng)搭建并運(yùn)行起來,因而專門著重介紹為一臺(tái)或多臺(tái)LAMP服務(wù)器保駕護(hù)航。不過必須要強(qiáng)調(diào)的是,服務(wù)器端安全是個(gè)龐大繁雜的課題,因而別指望僅僅用一篇文章就能充分而全面地加以論述。
我們?cè)诒疚闹袑⑻接憺長(zhǎng)AMP軟件架構(gòu)的每個(gè)部分保駕護(hù)航所要做的基本事項(xiàng)。
確保Linux安全
你可能想通過ssh來管理自己的CentOS服務(wù)器,那就應(yīng)該考慮下面這些小貼士:通過編輯/etc/ssh/sshd_config配置文件,確保安全地遠(yuǎn)程訪問服務(wù)器。
1)只要有可能,盡量使用基于密鑰的驗(yàn)證遠(yuǎn)程登錄到服務(wù)器,而不是使用基本的驗(yàn)證機(jī)制(用戶名和密碼)。我們假設(shè)你已經(jīng)在客戶機(jī)上建立了密鑰對(duì)和用戶名,并拷貝到服務(wù)器上。
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes
2)更改sshd將偵聽的端口。建議使用高于1024的端口:
Port XXXX
3)只允許協(xié)議版本2:
Protocol 2
4)配置驗(yàn)證超時(shí),不允許root登錄,并且限制哪些用戶可以通過ssh登錄:
LoginGraceTime 2m
PermitRootLogin no
AllowUsers gacanepa
5)只允許特定的主機(jī)(及/或特定的網(wǎng)絡(luò))通過ssh登錄:
在/etc/hosts.deny文件中:
sshd: ALL
在/etc/hosts.allow文件中:
sshd: XXX.YYY.ZZZ. AAA.BBB.CCC.DDD
其中XXX.YYY.ZZZ.代表IPv4網(wǎng)絡(luò)地址的頭3個(gè)8位位組,而AAA.BBB.CCC.DDD是個(gè)IPv4地址。有了這種設(shè)置后,只有來自網(wǎng)絡(luò)XXX.YYY.ZZZ.0/24的主機(jī)和主機(jī)AAA.BBB.CCC.DDD才可以通過ssh進(jìn)行連接。其他的所有主機(jī)還沒有進(jìn)入到登錄提示符就被斷開,會(huì)收到類似這樣的錯(cuò)誤信息:
(別忘了重啟sshd后臺(tái)程序讓這些變更內(nèi)容生效:service sshd restart)。
我們必須要強(qiáng)調(diào)的是,說到阻止訪問你服務(wù)器的入站連接,這種方法快捷又簡(jiǎn)單,不過有點(diǎn)原始。想獲得進(jìn)一步的定制性、擴(kuò)展性和靈活性,應(yīng)該考慮使用普通iptables及/或fail2ban。
確保Apache安全
1)確保運(yùn)行Apache網(wǎng)站服務(wù)器的系統(tǒng)用戶無法訪問外殼:
# grep -i apache /etc/passwd
要是用戶apache有默認(rèn)外殼(比如/bin/sh),我們必須將它更改成/bin/false或/sbin/nologin:
# usermod -s /sbin/nologin apache
下列建議(2到5)針對(duì)/etc/httpd/conf/httpd.conf文件:
2)禁止目錄列表:如果目錄里面沒有index.html,這將防止瀏覽器顯示該目錄的內(nèi)容。
刪除Options指令中的單詞Indexes:
# Options指令既復(fù)雜又重要。請(qǐng)參閱
# http://httpd.apache.org/docs/2.2/mod/core.html#options
# 了解更多信息。
# Options Indexes FollowSymLinks
應(yīng)顯示為:
Options None
此外,你需要確保目錄和虛擬主機(jī)的設(shè)置并沒有覆蓋這個(gè)全局配置。
請(qǐng)注意上述這個(gè)例子,如果我們檢查設(shè)置、查找/var/www/icons目錄,就會(huì)看到“Indexes MultiViews FollowSymLinks”應(yīng)該被更改成了“None”。
更改前:
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
更改后:
Options None
AllowOverride None
Order allow,deny
Allow from all
3)隱藏Apache版本,并隱藏出錯(cuò)頁(yè)面(比如Not Found和Forbidden頁(yè)面)中的模塊/操作系統(tǒng)信息。
ServerTokens Prod # 這意味著http響應(yīng)頭只返回“Apache”,而不返回版本號(hào)
ServerSignature Off # 操作系統(tǒng)信息隱藏起來
#p#
4)通過注釋掉聲明不需要模塊的對(duì)應(yīng)行,禁用那些模塊:
小提示:如果目錄列表中沒有index.html文件,禁用autoindex_module是隱藏目錄列表的另一個(gè)方法。
5)限制HTTP請(qǐng)求大小(請(qǐng)求主體和請(qǐng)求頭),并設(shè)置連接超時(shí):
想了解更多指令以及設(shè)置指令方面的說明,請(qǐng)參閱Apache文檔(http://httpd.apache.org/docs/)。
確保MySQL服務(wù)器安全
我們首先運(yùn)行mysql-server軟件包隨帶的mysql_secure_installation腳本。
1)如果我們?cè)诎惭b過程中沒有為MySQL服務(wù)器設(shè)置root密碼,現(xiàn)在可以設(shè)置root密碼了,另外要記?。哼@在生產(chǎn)環(huán)境中必不可少。
繼續(xù)這個(gè)過程:
2)刪除匿名用戶:
3)只允許root從本地主機(jī)來連接:
4)刪除名為test的默認(rèn)數(shù)據(jù)庫(kù):
5)讓變更內(nèi)容生效:
6)下一步,我們將編輯/etc/my.cnf文件中的一些變量:
[mysqld]
bind-address=127.0.0.1 # MySQL將只接受來自本地主機(jī)的連接
local-infile=0 # Disable direct filesystem access log=/var/log/mysqld.log # 啟用日志文件以留意惡意活動(dòng)
別忘了使用‘service mysqld restart’,重啟MySQL服務(wù)器。
現(xiàn)在,說到日常數(shù)據(jù)庫(kù)管理,你會(huì)發(fā)現(xiàn)下列建議很有用:
?要是由于某個(gè)原因我們需要遠(yuǎn)程管理數(shù)據(jù)庫(kù),我們可以首先通過ssh連接到服務(wù)器,本地執(zhí)行必要的查詢和管理任務(wù),以實(shí)現(xiàn)遠(yuǎn)程管理。
?我們之后可能需要啟用直接訪問文件系統(tǒng)的功能,比如說為了需要將文件批量導(dǎo)入到數(shù)據(jù)庫(kù)中。
?保存日志不像上面兩點(diǎn)來得重要,但許多日志對(duì)于為數(shù)據(jù)庫(kù)排查故障及/或留意不熟悉的活動(dòng)大有幫助。
?千萬(wàn)不要以明文格式存儲(chǔ)敏感信息,比如密碼、信用卡號(hào)、銀行PIN等等??梢钥紤]使用散列函數(shù)來加密這些信息。
?確保針對(duì)特定應(yīng)用程序的數(shù)據(jù)庫(kù)只能由該應(yīng)用程序?yàn)榇藙?chuàng)建的相應(yīng)用戶訪問:
想調(diào)整MySQL用戶的訪問權(quán)限,請(qǐng)使用這些指令。#p#
首先,檢索來自用戶表的用戶列表:
gacanepa@centos:~$ mysql -u root -p
Enter password: [Your root password here]
mysql> SELECT User,Host FROM mysql.user;
確保每個(gè)用戶只能訪問它所需要的數(shù)據(jù)庫(kù),并確保每個(gè)用戶只有最基本的權(quán)限。在下面這個(gè)示例中,我們將檢查用戶db_usuario的權(quán)限:
mysql> SHOW GRANTS FOR 'db_usuario'@'localhost';
你隨后可以根據(jù)需要撤銷權(quán)限和訪問權(quán)。
確保PHP安全
由于本文旨在為L(zhǎng)AMP架構(gòu)的幾個(gè)部分保駕護(hù)航,我們?cè)诰幊谭矫娌粫?huì)深入介紹。我們假設(shè)我們的Web應(yīng)用程序很安全,因?yàn)殚_發(fā)人員已不怕麻煩地確保沒有留下為跨站腳本攻擊(XSS)或SQL注入攻擊等常見攻擊可趁之機(jī)的任何安全漏洞。
1) 禁用不必要的模塊:
我們可以使用下面這個(gè)命令:php -m,顯示當(dāng)前編譯模塊列表:
然后禁用不需要的那些模塊,為此只要?jiǎng)h除或更名/etc/php.d目錄中的相應(yīng)文件。
比如說,由于自PHP v5.5.0起mysql擴(kuò)展部分已被廢棄(將來會(huì)被刪除),我們需要禁用它:
# php -m | grep mysql
# mv /etc/php.d/mysql.ini /etc/php.d/mysql.ini.disabled
2) 隱藏PHP版本信息:
# echo "expose_php=off" >> /etc/php.d/security.ini [or modify the security.ini file if it already exists]
3)將open_basedir設(shè)置成幾個(gè)特定的目錄(在php.ini中),目的是為了限制對(duì)底層文件系統(tǒng)的訪問:
4)禁用遠(yuǎn)程代碼/命令執(zhí)行以及容易被利用的函數(shù),比如exec()、system()、passthru()和eval()等函數(shù)(在php.ini)中:
allow_url_fopen = Off
allow_url_include = Off
disable_functions = "exec, system, passthru, eval"
結(jié)束語(yǔ)
1)將軟件包更新到最新版本(比較下列命令的輸出和‘yum info [package]’的輸出):
下列命令返回Apache、MySQL和PHP的當(dāng)前版本:
# httpd -v
# mysql -V (capital V)
# php -v
然后,‘yum update [package]’可用于更新軟件包,以便擁有最新的安全補(bǔ)丁。
2) 確保配置文件只能被root帳戶寫入:
# ls -l /etc/httpd/conf/httpd.conf
# ls -l /etc/my.cnf
# ls -l /etc/php.ini /etc/php.d/security.ini
3)最后,如果你有機(jī)會(huì)的話,在不同的物理機(jī)或虛擬機(jī)中(通過防火墻來保護(hù)這些機(jī)器之間的聯(lián)系),運(yùn)行這些服務(wù)(網(wǎng)站服務(wù)器、數(shù)據(jù)庫(kù)服務(wù)器和應(yīng)用服務(wù)器),那樣萬(wàn)一某一項(xiàng)服務(wù)受到了危及,攻擊者也無法立即訪問其他服務(wù)。如果真出現(xiàn)攻擊者能立即訪問其他服務(wù)這種情況,就得改動(dòng)本文中討論的一些配置。請(qǐng)注意:有多種方案可以用來增強(qiáng)LAMP服務(wù)器的安全性,本文介紹的僅僅是其中之一。
本文題目:在CentOS或RHEL上如何為L(zhǎng)AMP服務(wù)器保駕護(hù)航
轉(zhuǎn)載注明:http://m.fisionsoft.com.cn/article/djepogo.html


咨詢
建站咨詢
