萬盛學電腦網

 萬盛學電腦網 >> Linux教程 >> 打造Linux下超級安全的LAMP服務器

打造Linux下超級安全的LAMP服務器

class="21379">

歡迎轉載,請保留作者信息
包子@鄭州大學網絡安全園
http://secu.zzu.edu.cn

本文已經投稿到黑客防線03年11期的文章,講的比較基礎詳細,有興趣的朋友搾干了看吧:)

謹以此文獻給鄭州大學網絡中心的領導和老師

並祝各位朋友、老師和同學們在新的一年裡,身體健康,工作順利,學業有成,新年新氣象!


編前:本文全面細致的介紹了在Linux下加固apache+php+mysql的方法,通過仔細閱讀本文,你可以快速掌握安全配置apache,php,和mysql的方方面面,還有chroot這個前沿而強悍的技術,依靠這些知識,完全可以讓你的WWW服務器在層出不窮的SQL注射(SQL Injection)和CSS跨站腳本攻擊(Cross Site Script)中屹立不倒

從動網的幾個漏洞到獨孤劍客的網站被黑,腳本攻擊鬧的沸沸揚揚,可見它在網絡攻擊中終於顯現出他的重要性了。由於程序開發人員無意或有意的不小心,用Perl、PHP、ASP等編寫的腳本就會出現這樣或那樣的錯誤,輕則導致洩露路徑,重則導致整個服務器被攻陷甚至蔓延到整個網絡。難道我們就非得把所用的腳本讀N遍,認真的分析?我相信不是人人都有這等功力的,就算有這樣的功力也不會枉費那麼多的時間和精力。
你可能會問:“我既想用網上免費的程序,又不想因此受到重創。難道就沒有一個兩全的辦法?”

針對windows主機,我們可以使用IISLockdown,SecureIIS之類的

針對*nix主機給大家提出兩個方案,一個就是給apache裝上mod-security模塊,另外一個辦法就是把LAMP放置在一個chroot jail環境中。當然,最強的還是把兩個方案結合在一起咯:)
下面,讓我們一起來分享這兩個方案
前提:我們只需要有普通的linux操作經驗,包括vi的使用等

首先,我們先弄清楚幾個概念

什麼是Debian:一個完全自由的Linux操作系統,他最令我心儀的就是他的apt包管理工具,讓你安裝或者升級軟件無憂!如果你是CERNET用戶的話,推薦你到電子科大http://debian.ustc.edu.cn或者我的網站http://secu.zzu.edu.cn升級,CHINANET用戶可以在http://mirror.gennkbone.org升級

什麼是LAMP:就是Linux Apache MySQL Php的縮寫,幾乎是最強的架站組合

什麼是chroot:是change root的縮寫,就是把一個進程守護程序限制在某個特定的root環境中執行,這個被chroot了的程序幾乎接近無法訪問任何超出了這個root的任何文件或空間,這個root目錄(也就是下面我們說到的jail)包含了執行進程守護程序所需要的所有文件,在你正確配置之後,絕大多數的入侵者是不可能跳出jail而接觸到外面的文件的。這樣我們就可以最大限度的限制入侵者保護自己。

本文主要涉及到的軟件

makejail;;http://www.floc.net/makejail/
是一個自動把建立jail所需要的程序放到jail內的軟件,使用python編寫,他有debian和openbsd的版本

Zend Performance Suit http://www.zend.com
Zend公司開發的一套給PHP加速的東西,包括一個代碼優化器(optimizer)和一個加速器(accelerator)


,還有cache功能,很好使的,有了他,php程序跑起來就跟飛一樣!可以申請30天試用版本的,如果你覺得好用的話就買下來吧:)

mod-security http://www.modsecurity.org/
他是apache的一個模塊,他有請求過濾,日志審計等功能,可以防止SQL Injection,跨站腳本攻擊,很不錯的一個模塊

OK,動手
我們假設我們手頭上有一個裝好的debian woody,並且已經正確設置了了apt源

二話不說,先升級到debian sarge,也就是testing版本,我覺得這個版本還是不錯的,因為他的軟件比較新,而且有security支持,最主要這個版本的軟件列表包含makejail這個軟件

首先su到root升級系統並安裝apache,php,mysql,gd
更新apt源,我在教育網,所以使用中科大的apt源debian.ustc.edu.cn速度很快
[root@debian /]apt-get update (如圖update.jpg)
再更新所有軟件包
[root@debian /]apt-get dist-upgrade(如圖upgrade.jpg)


[root@debian /]apt-get install apache php4 php4-gd2 php4-mysql mysql-server mysql-client
並且把extension=gd.so和extension=mysql.so加到php.ini中
你的系統就已經裝上了apache-1.3.27,php-4.1.2,mysql-4.0.13
這樣一個基本的LAMP就起來了,簡單吧。
再加一個系統用戶,這個用戶是我們等會chroot要用的
[root@debian /]adduser --home /chroot/apache --shell /dev/null --no-create-home --system --group chrapax


接著我們編輯httpd.conf文件並做一些修改,刪除多余的apache模塊並激活php模塊

[root@debian /]vi /etc/apache/httpd.conf

注釋掉除了mod_access,mod_auth,mod_dir,mod_log_config,mod_mime,mod_alias之外的所有模塊
去掉注釋LoadModule php4_module /usr/lib/apache/1.3/libphp4.so以支持PHP (如圖apache_mod.jpg )


設置ServerAdmin [email protected]
設置ServerName secu.zzu.edu.cn

下面的Options Indexes Includes FollowSymLinks MultiViews的Indexes去掉,這樣避免被別人索引目錄
把用戶和組改成chrapax
User chrapax
Group chrapax
在下面加上index.php如下

DirectoryIndex index.php index.html index.htm index.shtml index.cgi

默認使用中文字符集
AddDefaultCharset gb2312
加出錯重定向,這樣當出現下面的錯誤的時候,用戶就會被重頂向到到你指定的頁面
ErrorDocument 404 http://secu.zzu.edu.cn/index.php
ErrorDocument 402 http://secu.zzu.edu.cn/index.php
ErrorDocument 403 http://secu.zzu.edu.cn/index.php
ErrorDocument 500 http://secu.zzu.edu.cn/index.php
把signature關掉
ServerSignature Off
如果signature打開的話,當有人訪問到一個被禁止或者不存在的頁面的話,會出現一些錯誤信息的
這樣的信息,不好,去掉他 (如圖403.jpg)
如果不需要cgi支持的話,刪除
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/

AllowOverride None
Options ExecCGI -MultiViews
Order allow,deny
Allow from all

這行的注釋去掉,因為我們需要PHP支持
把AddType application/x-httpd-php .php
最後把多余的Alias,Directory,Location都去掉,保存退出
OK,apache算是配置完畢,我比較喜歡干淨的配置文件,下面的命令可以去掉httpd.conf裡#打頭的行
[root@debian /]mv httpd.conf httpd.conf.bak
[root@debian /]grep -v '#' httpd.conf.bak > httpd.conf
到此為止,apache配置文件編輯完畢

接著我們開始加固php,我們打開php.ini
[root@debian /]vi /etc/php4/apache/php.ini
首先打開安全模式,打開他的好處就是PHP文件只能訪問所有者和PHP文件所有著一樣的文件,即使在chroot環境下也無法訪問jail中屬主不一樣的文件,類似於php shell這樣的後門就沒用武之地了哦,phpshell是很流行的php後門,他可以執行系統命令,就象他的名字一樣,和shell很接近(如圖phpshell.jpg)
safe_mode = On

如果php程序沒有指明需要register_globals的話,最好把register_globals設置為Off,這樣可以避免很多安全問題的
舉個例子吧,我們有一個這樣的PHP文件片段叫做test.php

// 前面的代碼
if ($authorised) {
// 執行一些受保護的動作
}
// 其余的代碼
}
?>
如果register_globle是打開的話,入侵者可以通過提交這樣一個請求來繞過驗證
http://www.test.com/test.php?authorised=1
當然,如果你非得使用register_globle的話,我們在後面同樣可以使用mod-security來限制一下的

open_basedir =/var/www/
上面的設置就限制了fopen(), file()等函數可以操作的目錄范圍,避免了入侵者非法讀取文件,一定要在/var/www後面加"/",否則/var/wwww下的文件也能被訪問

禁止使用phpinfo和get_cfg_var函數,這樣可以避免洩露服務信息
disable_functions = phpinfo,get_cfg_var
如果我們使用了被禁止使用的phpinfo函數的話,我們可以看到這樣的錯誤

Warning: phpinfo() has been disabled for security reasons in /var/www/info.php on line 1


設置php程序錯誤日志,這樣我們可以很清楚的知道程序問題所在
error_reporting; =; E_ALL
log_errors = On
error_log = /var/log/php_err.log


默認display_error是打開的,我們在jail沒弄好之前還是打開他,或許出錯信息可以給我們一點提示的,但是在完工之後記得關閉這個選項啊,因為他顯示出的一些出錯信息有可能會暴露你的物理路徑的。
在這個過程中,最需要注意的就是不能使用root做為php程序的屬主,否則php程序就可以隨意訪問他的屬主,也就是root所有的文件了,這樣就完全失去了safe_mode的意義了

禁止打開遠程地址,記得最近出的php include的那個漏洞嗎?就是在一個php程序中include了變量,那麼入侵者就可以利用這個控制服務器在本地執行遠程的一個php程序,例如phpshell,所以我們關閉這個
allow_url_fopen = Off


OK,保存退出
到此為止,針對php的安全優化基本上完畢,下面我們開始給mysql"做手腳"吧

Debian下用apt裝的mysql默認已經禁止從網絡連接mysql了的,我們可以從他的配置文件my.cnf裡看出來,但是得注意一下,RedHat的RPM,FreeBSD的ports安裝,skip-networking是注釋掉了的,也就是監聽3306端口了,要是mysql出了什麼問題,別人就可以有機會利用了
[root@debian /]grep net /etc/mysql/my.cnf
# The skip-networkin option will no longer be set via debconf menu.
# You

copyright © 萬盛學電腦網 all rights reserved