打造Ubuntu下的SLAMP
現(xiàn)在LAMP(Linux+Apache+Mysql+PHP)架站模式是越來越流行了,幾乎都可以說是成為了架站的時尚了。但常言道樹大招風(fēng),相應(yīng)的安全問題也就隨之而來了,象層出不窮的SQL腳本注入(SQL Injection)及CSS跨站腳本***(Cross Site Script)等讓人不厭其煩。那么有沒有什么好的方法來盡量減少這方面的危險呢?甚至在事發(fā)之后可以有效的進(jìn)行日志反查以明白其***手法為日后響應(yīng)做準(zhǔn)備呢?答案是肯定的!其實這已經(jīng)不再屬于局限于架站而更多屬于安全的范疇了,也就是如標(biāo)題所言要如何建立一個SLAMP(Security)服務(wù)器了。
本來是想利用makejail包做一個chroot環(huán)境的。但由于makejail包只在基于Debian woody的Apache 1.3.22 上做過測試,而由于沒有時間,本人暫時也還沒做過基于Ubuntu 5.04上的Apache2的測試,所以不敢妄語,有哪位朋友做過或有類似方式的話,還請不吝賜教!好了廢話少說,下面就開始我們的安全架站之旅了。本文的所有操作在Ubuntu 5.04發(fā)行版上測試通過。具體步驟如下:
1.將系統(tǒng)更新到最新狀態(tài),在做任何操作之前都要做這一步,以確保系統(tǒng)的穩(wěn)定,同時也不會有一些莫名其妙的現(xiàn)象出現(xiàn)。
$sudo apt-get update
$sudo apt-get upgrade-dist
2.架設(shè)LAMP服務(wù)器
$sudo apt-get apache2 mysql-server php4 php4-gd php4-mysql
3.配置LAMP服務(wù)
a) 我們編輯/etc/php4/apache2/php.ini文件,先做一般配置,在改動之前,請先將該配置文件做個備份。以便在出錯的時候可以恢復(fù)。
>memory_limit = 8M =>修改成你所需的內(nèi)存大小
>upload_max_filesize = 2M =>修改文件最大上傳尺寸
>extension=mysql.so
>extension=gd.so =>將你要用到模塊前面的注釋給去掉
b) 這樣LAMP服務(wù)就算是架設(shè)完成了,下面就要對該架構(gòu)進(jìn)行安全加固了。
4.編輯/etc/apache2/apache2.conf文件,在改動之前,請先將該配置文件做個備份。以便在出錯的時候可以恢復(fù)。
>AddDefaultCharset ISO-8859-1 =>AddDefaultCharset GB2312
6.然后開始加固php,我們再次編輯/etc/php4/apache2/php.ini文件,之所以沒有一次改完,主要是為了給大家一個清晰的思路。
>#打開安全模式,打開他的好處就是PHP文件只能訪問所有者和PHP文件所有著一樣的文件,即使在chroot環(huán)境下也無法訪問jail 中屬主不一樣的 文件,類似于php shell這樣的后門就沒用武之地了哦,phpshell是很流行的php后門,他可以執(zhí)行系統(tǒng)命令,就象他的名字一樣,和shell很接近。
>safe_mode = On
>#上面的設(shè)置就限制了fopen(), file()等函數(shù)可以操作的目錄范圍,避免了***者非法讀取文件,一定要在/var/www后面加"/",否則/var/wwww下的文件也能被訪問 。
>open_basedir = /var/www/
>#禁止使用phpinfo和get_cfg_var函數(shù),這樣可以避免泄露服務(wù)信息,一般在在確認(rèn)PHP能正常工作之后再使之關(guān)閉
>disable_functions = phpinfo,get_cfg_var
>#設(shè)置php程序錯誤日志
>error_reporting = E_ALL
>log_errors = On
>error_log = /var/log/php_err.log
>#如果php程序沒有指明需要register_globals的話,最好把register_globals設(shè)置為Off,這樣可以避免很多安全問題的。注意,如果你的程序是需要register_globals的話,可千萬別關(guān)。Ubuntu默認(rèn)是關(guān)閉的。
>register_globals = Off
>#禁止打開遠(yuǎn)程地址,記得最近出的php include的那個漏洞嗎?就是在一個php程序中include了變量,那么***者就可以利用這個控制服務(wù)器在本地執(zhí)行遠(yuǎn)程的一個php程序,例如phpshell,所以我們關(guān)閉這個。
>allow_url_fopen = Off
7.這樣PHP的安全優(yōu)化就做好了,下面做MySQL的安全優(yōu)化。
a)在Ubuntu下用apt裝的mysql默認(rèn)是禁止從網(wǎng)絡(luò)連接MySQL的,我們可以從/etc/mysql/my.cnf文件中看到有 skip-networking語句的,如果你做的是MySQL服務(wù)器的話,那么是要將其注釋掉的,這樣其他機器才能訪問你這臺機器,如果該服務(wù)僅供本機使用的話,那么就保持原狀,這樣別的機器不能訪問你這臺機器的MySQL。由于這里是做在一起的,所以保持不變好了。
b)然后我們給mysql設(shè)置一個密碼并修改管理員用戶名(默認(rèn)是root),但一定得記得,無論怎么樣修改密碼,都會有記錄的,如果通過 mysqladmin修改,shell的歷史記錄會有的,如果登陸了mysql之后再修改,在 ~/.mysql_history會記錄的,所以我們一定得處理這兩個歷史記錄文件,我們把他們刪了,再從/dev/null做個軟連接過來就可以解決問題了。注意由于我們會在SHELL下用的是sudo,所以該歷史是保存在本用戶目錄下的,而不是在根用戶目錄下的。而mysql也是在本用戶目錄下使用的,所以也是保存在本用戶目錄下的。如果你覺得不能記憶歷史記錄麻煩的話,也可以在用到了MySQL的Root用戶之后,進(jìn)入這兩個文件中,將相關(guān)語句刪除。
$rm .bash_history
$rm .mysql_history
$ln -s /dev/null .bash_history
$ln -s /dev/null .mysql_history
c)然后我們刪除多余的數(shù)據(jù)庫并去掉匿名帳號
[root@debian ~]mysql -u root -p
Enter password:XXXXXX
mysql> drop database test;
mysql> use mysql;
mysql> delete from db;
mysql> delete from user where not (host="localhost" and user="root");
mysql> flush privileges;
d)然后修改默認(rèn)的管理員帳號root為你喜歡的,我這里改成myadmin
mysql> update user set user="myadmin" where user="root";
mysql> flush privileges;
這樣就可以通過myadmin而不是root用戶名來訪問MySQL數(shù)據(jù)庫了!
8.現(xiàn)在我們安裝mod-security。
a)首先安裝libapache2-mod-security包
$sudo apt-get install libapache2-mod-security
b)該模塊默認(rèn)是沒激活的,我們可以在/etc/apache2/mods-available目錄下看到有mod-security.load文件,但在/etc/apache2/mods-enabled目錄卻沒有它的軟鏈接。我們現(xiàn)在激活它:
$sudo ln -s /etc/apache2/mods-available/mod-security.load /etc/apache2/mods-enabled/mod-security.load
$sudo cp /usr/share/doc/libapache2-mod-security/examples/httpd2.conf.example-full /etc/apache2/mods-available/mod-security.conf
$sudo vi /etc/apache2/mods-available/mod-security.conf,老規(guī)則改動之前先做好備份。
># 檢測內(nèi)容長度以避免堆溢出***
>SecFilterForceByteRange 32 254 =>SecFilterForceByteRange 32 126
># debug設(shè)置
>SecFilterDebugLevel 9 =>SecFilterDebugLevel 0
># 設(shè)置缺省的動作
>SecFilterDefaultAction "deny,log,status:499" =>SecFilterDefaultAction "deny,log,status:404"
># 把設(shè)置傳遞給子目錄
>SecFilterInheritance Off
># Redirect user on filter match
># 當(dāng)匹配sh的時候,重新定向到一個特殊的警告頁面,該頁面是自行編寫的,寫些警告的話讓***者知難而退,該段先不要生效,等到相關(guān)配置配好之后再失效不遲。記住在配好之后要使之生效。
>#SecFilter sh redirect:http://localhost/hack/warning.htm
># Prevent OS specific keywords
>#過濾一些敏感的東西,我們使用*是為了***者使用/etc/./passwd來繞開檢測
>SecFilter /etc/passwd =>SecFilter /etc/*passwd
>SecFilter /bin/*sh
># Very crude filters to prevent SQL injection attacks
># 防止SQL插入(SQL Injection)***
>SecFilter "delete[[:space:]]+from"
>SecFilter "insert[[:space:]]+into"
>SecFilter "select.+from"
>SecFilter "select[[:space:]]+from"
>SecFilter "union[[:space:]]+from"
$sudo ln -s /etc/apache2/mods-available/mod-security.conf /etc/apache2/mods-enabled/mod-security.conf
c)重啟Apache2服務(wù)即可。
$sudo /etc/init.d/apache2 restart
總結(jié)
以上是生活随笔為你收集整理的打造Ubuntu下的SLAMP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的大学——序言
- 下一篇: 实现一个压缩Remoting传输数据的S