• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 打造Linux下超級安全的LAMP服務器(ZT)

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    在綠盟看到的好文一篇... [code:1:348a7bec36]文摘出處:http//www.xfocus .net /articles/200409/735.html 創建時間:2004-09-04 文章屬性:原創 文章提交:fatbfatb_at_security.zz.ha.cn 歡迎轉載,請保留作者信息 包子@鄭州大學 網絡安全 園 http//secu.

    在綠盟看到的好文一篇...


    [code:1:348a7bec36]文摘出處:http://www.xfocus.net/articles/200409/735.html

    創建時間:2004-09-04
    文章屬性:原創
    文章提交:fatb (fatb_at_security.zz.ha.cn)

    歡迎轉載,請保留作者信息
    包子@鄭州大學網絡安全園 
    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)和一個加速器(aclearcase/" target="_blank" >ccelerator)


    ,還有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 fatb@zzu.edu.cn
    設置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 have to manually change it if you want networking i.e. the server
    skip-networking
    在這個方面Debian做的不錯,但是Debian和Freebsd下系統裝的mysqld是動態鏈接的,而RedHat的RPM安裝的就是靜態的,我們可以通過下面的命令來查看
    [root@debian ~]file `which mysqld`
    /usr/sbin/mysqld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), stripped
    我們可以看到"dynamically linked"字樣,這樣在chroot mysql的時候就比較麻煩了,因為要復制很多的共享庫,不過在debian下我們有makejail:)等會我們就可以看到他的威力了

    接著我們修改mysql數據庫里的東西,不過不管怎么樣,我們首先得給mysql設置一個密碼并修改管理員用戶名(默認是root),但一定得記得,無論怎么樣修改密碼,都會有記錄的,如果通過mysqladmin修改,shell的歷史記錄會有的,如果登陸了mysql之后再修改,在~/.mysql_history會記錄的,所以我們一定得處理這兩個歷史記錄文件,我們把他們刪了,再從/dev/null做個軟連接過來就可以解決問題了
    [root@debian /]cd ~
    [root@debian ~]ll
    total 13K
    -rw-------    1 root     root         1.8K Sep 28 21:05 .bash_history
    -rw-------    1 root     root           14 Sep 29 09:29 .mysql_history
    我們可以看到這兩個文件里面都記錄了東西的,下面我們處理他們
    [root@debian ~]rm .bash_history
    [root@debian ~]rm .mysql_history
    [root@debian ~]ln -s /dev/null .bash_history
    [root@debian ~]ln -s /dev/null .mysql_history
    我們再看看
    [root@debian ~][root@debian ~]ll
    total 10K
    lrwxrwxrwx    1 root     root            9 Sep 29 09:29 .bash_history -> /dev/null
    lrwxrwxrwx    1 root     root            9 Sep 29 09:29 .mysql_history -> /dev/null
    現在可以放心的設置密碼了
    [root@debian ~]mysqladmin -u root password mypasswd
    這樣我們以后root就得通過"mypasswd"這個密碼來訪問mysql數據庫

    然后我們刪除多余的數據庫并去掉匿名帳號
    [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;

    然后修改默認的管理員帳號root為你喜歡的,我這里改成fatb

    mysql> update user set user="fatb" where user="root";
    mysql> flush privileges;
    以后我們就得通過fatb帳號訪問mysql數據庫
    [root@debian ~]mysql -u root -p
    Enter password:
    ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)
    [root@debian ~]mysql -u fatb -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 14 to server version: 4.0.13-log
    到這里,mysql的安全設置基本上完畢了

    現在我們安裝mod-security,debian下同樣很簡單,并且自動把模塊加到httpd.conf里
    [root@debian /]apt-get install libapache-mod-security
    默認這個模塊是沒激活的,編輯一下httpd.conf文件并去掉下面這行的注釋
    LoadModule security_module /usr/lib/apache/1.3/mod_security.so
    接著在httpd.conf的末尾加上

        # 打開或者關閉過濾引擎
        SecFilterEngine On
        # 設置缺省的動作    
        SecFilterDefaultAction "deny,log,status:404"
        # 把設置傳遞給字目錄
        SecFilterInheritance Off
        # 檢測URL編碼是否正確
        SecFilterCheckURLEncoding On
        # 檢測內容長度以避免堆溢出攻擊
        SecFilterForceByteRange 32 126
        # 日志文件的位置和名字
        SecAuditLog logs/audit_log
        # debug設置
        SecFilterDebugLog logs/modsec_debug_log
        SecFilterDebugLevel 0
        # 檢測POST數據
        SecFilterScanPOST On
        # 當匹配sh的時候,重新定向到一個特殊的頁面,讓攻擊者知難而退
        SecFilter sh redirect:http://secu.zzu.edu.cn/hack/fu.htm
        # Only check the body of the POST request
        #過濾一些敏感的東西,我們使用*是為了攻擊者使用/etc/./passwd來繞開檢測
        SecFilter /etc/*passwd
        SecFilter /bin/*sh
        # 防止double dot攻擊,也就是類似http://www.test.com/openfile.php?path=/../../..,雖然這個漏洞看似弱智,但是很多網站都有的,比如CERNET某大學某圖片站:)
        SecFilter "../"
        # 防止跨站腳本(CSS)攻擊
        SecFilter "<( | )*script"
        SecFilter "<(.| )+>"
        # 防止SQL插入(SQL Injection)攻擊
        SecFilter "delete(空格| )+from"
        SecFilter "insert(空格| )+into"
        SecFilter "select(空格| )+from"
        SecFilter "union(空格| )+from"
        # 下面是限制了upload.php文件只能用來上傳jpeg.bmp和gif的圖片
        
            SecFilterInheritance Off
            SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
        

    用好了mod-security,可以使你的網站的安全性大大的提高的,在他帶的manual里你可以找到更多的設置的,在光盤中附帶了更加詳細的規則
    (mod-security.rule.txt)



    然后我們裝Zend Performance Suit,在安裝的時候,他問你使用的用戶的時候,記得寫chrapax而不是www-data

    order allow,deny
    allow from 211.43.125.63(你的IP)
    deny from all
    Options All



    下面重頭戲到了,chroot,非常重要的一步,但可能還是比較簡單的一步,先把幾個python寫的配置文件復制到/etc/makejail下
    [root@debian /etc/makejail]cp /usr/share/doc/makejail/examples/apache.py ./
    然后編輯apache.py文件添加修改相應的信息
    users=["chrapax"]
    groups=["chrapax"]
    packages=["apache","apache-common","php4","php4-gd","mysql-common","libapache-mod-security"]
    然后執行makejail命令
    [root@debian /etc/makejail]makejail apache.py
    完成之后,我們得先做個軟連接并把chrapax從passwd和group文件分離出來
    [root@debian /etc/makejail]ln -s /var/chroot/apache /apache
    [root@debian /etc/makejail]grep chrapax /etc/passwd > /apache/etc/passwd
    [root@debian /etc/makejail]grep chrapax /etc/group > /apache/etc/group
    [root@debian /etc/makejail]cp /etc/mime.types /apache/etc/
    然后在/etc/init.d里建一個叫chrapax的文件并讓他可執行,內容詳見光盤中的chrapax
    [root@debian /etc/makejail]cat > /etc/init.d/chrapax
    [root@debian /etc/makejail]chmod +x /etc/init.d/chrapax
    接著使用rcconf命令讓他在系統啟動的時候啟動(如圖rcconf.bmp)
    [root@debian /etc/makejail]rcconf
    啟動chroot的apache
    [root@debian /etc/makejail]/etc/init.d/chrapax start
    先測試一下php和mysql連接是否有問題
    [root@debian /etc/makejail]cat > /apache/var/www/mysql.php
        $conn = mysql_connect("localhost", "fatb", "urpassword")
          or die;
        print "php can work with mysql now";
        mysql_close($conn);
        phpinfo();
    ?>
    結果瀏覽器返回
    Warning: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) in /var/www/mysql.php on line 2

    但是我們可以看到在/var/run/mysqld/下的確有mysqld.sock文件,其實就是因為我們已經chroot apache了,他只能訪問apache root jail里的東西,也就是/var/chroot/apache下面的東西,而mysqld.sock明顯在jail外面,所以連接不上當然是很正常的了,解決這個問題的方法也很簡單,做個硬連接就是了
    [root@debian /apache/var/run/mysqld]ln /var/run/mysqld/mysqld.sock mysqld.sock
    再訪問一下mysql.php看看,果然OK了吧(如圖ok.bmp)

    做硬連接很麻煩,而且在訪問mysqld的時候導致apache用資源好厲害,解決的辦法就是在mysqld的配置文件里加上bind-address 127.0.0.1這樣就通過tcp連接而不是通過socket連接了

    經過我們這樣一弄,整個LAMP服務器就安全的多了,就算萬一php程序編寫的不安全或者apache,php出了什么漏洞,想入侵進來并且跳出root jail還是非常困難的


    參考:
    security apache step by step
    security php step by step
    security mysql step by step
    (不知道為什么在家里上網搜索不到這三個文章了,在www.securityfosuc.com的,有興趣的可以去看看)
    mod-security manual

    san的php安全配置
    http://www.xfocus.net/articles/200111/304.html 

    版本信息
    v1@2003.11 初始版
    v2@2004.1  解決chroot后php程序連接mysql的時候apache耗用大量資源的問題
               修正ustc.edu.cn為電子科大而不是中科大:)
    v3@2004.9  增加allow_url_fopen = Off
               增加mod-security對sql injection的過濾[/code:1:348a7bec36]

     我愛臭豆腐 回復于:2004-09-14 15:37:14
    good:)

     haohaoo 回復于:2004-09-15 13:29:05
    哈哈,我幾個月前自己把apache+php+mysql給chroot起來,打包好,可以傻瓜化安裝,不知道有沒有人要

     seacaptain 回復于:2004-09-15 15:33:11
    很好!不知道linux下怎么做

     ztigers 回復于:2004-10-26 21:49:02
    [quote:e62daeb455="haohaoo"]哈哈,我幾個月前自己把apache+php+mysql給chroot起來,打包好,可以傻瓜化安裝,不知道有沒有人要[/quote:e62daeb455]

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>