現在LAMP(Linux+Apache+Mysql+PHP)架站模式是越來越流行了,幾乎都可以說是成為了架站的時尚了。但常言道樹大招風,相應的安全問題也就随之而來了,象層出不窮的SQL腳本注入(SQL Injection)及CSS跨站腳本攻擊(Cross Site Script)等讓人不厭其煩。那麼有沒有什麼好的方法來盡量減少這方面的危險呢?甚至在事發之後可以有效的進行日志反查以明白其攻擊手法為日後響應做準備呢?答案是肯定的!其實這已經不再屬于局限于架站而更多屬于安全的範疇了,也就是如标題所言要如何建立一個SLAMP(Security)伺服器了。
本來是想利用makejail包做一個chroot環境的。但由于makejail包隻在基于Debian woody的Apache 1.3.22 上做過測試,而由于沒有時間,本人暫時也還沒做過基于Ubuntu 5.04上的Apache2的測試,是以不敢妄語,有哪位朋友做過或有類似方式的話,還請不吝賜教!好了廢話少說,下面就開始我們的安全架站之旅了。本文的所有操作在Ubuntu 5.04發行版上測試通過。具體步驟如下:
1.将系統更新到最新狀态,在做任何操作之前都要做這一步,以確定系統的穩定,同時也不會有一些莫名其妙的現象出現。
$sudo apt-get update
$sudo apt-get upgrade-dist
2.架設LAMP伺服器
$sudo apt-get apache2 mysql-server php4 php4-gd php4-mysql
3.配置LAMP服務
a) 我們編輯/etc/php4/apache2/php.ini檔案,先做一般配置,在改動之前,請先将該配置檔案做個備份。以便在出錯的時候可以恢複。
>memory_limit = 8M =>修改成你所需的記憶體大小
>upload_max_filesize = 2M =>修改檔案最大上傳尺寸
>extension=mysql.so
>extension=gd.so =>将你要用到子產品前面的注釋給去掉
b) 這樣LAMP服務就算是架設完成了,下面就要對該架構進行安全加強了。
4.編輯/etc/apache2/apache2.conf檔案,在改動之前,請先将該配置檔案做個備份。以便在出錯的時候可以恢複。
>AddDefaultCharset ISO-8859-1 =>AddDefaultCharset GB2312
6.然後開始加強php,我們再次編輯/etc/php4/apache2/php.ini檔案,之是以沒有一次改完,主要是為了給大家一個清晰的思路。
>#打開安全模式,打開他的好處就是PHP檔案隻能通路所有者和PHP檔案所有着一樣的檔案,即使在chroot環境下也無法通路jail 中屬主不一樣的 檔案,類似于php shell這樣的後門就沒用武之地了哦,phpshell是很流行的php後門,他可以執行系統指令,就象他的名字一樣,和shell很接近。
>safe_mode = On
>#上面的設定就限制了fopen(), file()等函數可以操作的目錄範圍,避免了入侵者非法讀取檔案,一定要在/var/www後面加"/",否則/var/wwww下的檔案也能被通路 。
>open_basedir = /var/www/
>#禁止使用phpinfo和get_cfg_var函數,這樣可以避免洩露服務資訊,一般在在确認PHP能正常工作之後再使之關閉
>disable_functions = phpinfo,get_cfg_var
>#設定php程式錯誤日志
>error_reporting = E_ALL
>log_errors = On
>error_log = /var/log/php_err.log
>#如果php程式沒有指明需要register_globals的話,最好把register_globals設定為Off,這樣可以避免很多安全問題的。注意,如果你的程式是需要register_globals的話,可千萬别關。Ubuntu預設是關閉的。
>register_globals = Off
>#禁止打開遠端位址,記得最近出的php include的那個漏洞嗎?就是在一個php程式中include了變量,那麼入侵者就可以利用這個控制伺服器在本地執行遠端的一個php程式,例如phpshell,是以我們關閉這個。
>allow_url_fopen = Off
7.這樣PHP的安全優化就做好了,下面做MySQL的安全優化。
a)在Ubuntu下用apt裝的mysql預設是禁止從網絡連接配接MySQL的,我們可以從/etc/mysql/my.cnf檔案中看到有 skip-networking語句的,如果你做的是MySQL伺服器的話,那麼是要将其注釋掉的,這樣其他機器才能通路你這台機器,如果該服務僅供本機使用的話,那麼就保持原狀,這樣别的機器不能通路你這台機器的MySQL。由于這裡是做在一起的,是以保持不變好了。
b)然後我們給mysql設定一個密碼并修改管理者使用者名(預設是root),但一定得記得,無論怎麼樣修改密碼,都會有記錄的,如果通過 mysqladmin修改,shell的曆史記錄會有的,如果登陸了mysql之後再修改,在 ~/.mysql_history會記錄的,是以我們一定得處理這兩個曆史記錄檔案,我們把他們删了,再從/dev/null做個軟連接配接過來就可以解決問題了。注意由于我們會在SHELL下用的是sudo,是以該曆史是儲存在本使用者目錄下的,而不是在根使用者目錄下的。而mysql也是在本使用者目錄下使用的,是以也是儲存在本使用者目錄下的。如果你覺得不能記憶曆史記錄麻煩的話,也可以在用到了MySQL的Root使用者之後,進入這兩個檔案中,将相關語句删除。
$rm .bash_history
$rm .mysql_history
$ln -s /dev/null .bash_history
$ln -s /dev/null .mysql_history
c)然後我們删除多餘的資料庫并去掉匿名帳号
[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)然後修改預設的管理者帳号root為你喜歡的,我這裡改成myadmin
mysql> update user set user="myadmin" where user="root";
這樣就可以通過myadmin而不是root使用者名來通路MySQL資料庫了!
8.現在我們安裝mod-security。
a)首先安裝libapache2-mod-security包
$sudo apt-get install libapache2-mod-security
b)該子產品預設是沒激活的,我們可以在/etc/apache2/mods-available目錄下看到有mod-security.load檔案,但在/etc/apache2/mods-enabled目錄卻沒有它的軟連結。我們現在激活它:
$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,老規則改動之前先做好備份。
># 檢測内容長度以避免堆溢出攻擊
>SecFilterForceByteRange 32 254 =>SecFilterForceByteRange 32 126
># debug設定
>SecFilterDebugLevel 9 =>SecFilterDebugLevel 0
># 設定預設的動作
>SecFilterDefaultAction "deny,log,status:499" =>SecFilterDefaultAction "deny,log,status:404"
># 把設定傳遞給子目錄
>SecFilterInheritance Off
># Redirect user on filter match
># 當比對sh的時候,重新定向到一個特殊的警告頁面,該頁面是自行編寫的,寫些警告的話讓攻擊者知難而退,該段先不要生效,等到相關配置配好之後再失效不遲。記住在配好之後要使之生效。
>#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服務即可。
$sudo /etc/init.d/apache2 restart
本文轉自 firehare 51CTO部落格,原文連結:http://blog.51cto.com/firehare/588235,如需轉載請自行聯系原作者