全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2858
推到 Plurk!
推到 Facebook!

FreeBSD下構建安全的Web伺服器

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-30 14:45:10 IP:220.132.xxx.xxx 未訂閱
FreeBSD下構建安全的Web伺服器(轉載)- - http://solo5603.blogchina.com/2154187.html                                               * 郵箱:heiyeluren_at_163.com * 主頁:http://www.unixsky.net * 博客:http://blog.csdn.net/heiyeshuwu ::目錄:: 序言 一、系統和服務程式的安裝 1. 系統安裝 2. 服務程式安裝 二、系統安全設置 1. 用戶控制 2. 文件訪問控制 3. 系統服務和埠控制 4. 日誌管理和控制 5. 文件指紋檢測 6. 系統指紋泄露和防範 7. 系統內核安全 8. 系統安全優化 三、服務程式的安全設置 1. Apache安全設置 2. PHP安全設置 3. Mysql安全設置 4. vsFTPd安全設置 5. SSH的安全設置 四、防火牆的安裝和設置 1. 安裝ipfw 2. 配置ipfw 五、Unix/Linux上的後門技術和防範 1. 帳號後門 2. shell後門 3. cron服務後門 4. rhosts後門 5. Login後門 6. Bind後門 7. 服務後門 8. rootkit後門 9. 內核後門 10. 其他後門 六、結束語 附錄 序言 在我們跑Web伺服器的時候,大家可能都會一致認?使用Linux+Mysql+Apache+PHP整個開源的系統是比較好的選擇,但是我個人認?這是不合理的,首先要根據你的應用來覺得你使用什?服務。假如你需要跑Oracle等大型應用的話,而且Oracle在Linux下是支援的比較好的,那?使用Linux是個好的選擇,因?在FreeBSD下安裝Oracle是個非常麻煩的事情。那?如果是跑普通的網站應用的話,我覺得使用FreeBSD+Mysql+Apache+PHP是個好的選擇,因?對於一個網站來講,穩定安全是第一位的,否則你的網站什?時候被人修改了都不知道怎?回事,或者被黑客入侵,把資料修改或者刪除,那就糟糕了,畢竟現在什?紅客、黑客的一堆,不能不防。當然,不是說Linux不安全,但是在Linux下集成了很多不安全的程式,導致了它的不安全,但如果設置的好,Linux一樣可以很安全。在中國網路應急回應中心(http://www.cert.org.cn)這幾個月的資料來看,每個月被入侵成功最高的是Linux系統,占百分之六十多,然後過來是Windows系統,占百分之三十多,而FreeBSD的入侵比例是百分之幾。 任何系統都可以很安全,也可以很不安全,關鍵是管理員怎?做的,世界上沒有最安全的系統,只有更安全的系統。下面的文章就是 在FreeBSD平臺上構建一個比較安全的Web伺服器,希望對網管和網路安全愛好者能有一些?發,權當?磚引玉,希望能夠有更好闡述的文章。 一、系統和服務程式的安裝 1. 系統安裝 ?了保證系統的安全,我們系統準備採用最新的FreeBSD版本,首先是安全,系統相容性也比較好,這個主要是個人習慣和需求,?了簡單起見,這裏我們選用了最新的FreeBSd5.3版本進行安裝。整個安裝過程我就不講了,如果不清楚的朋友可以參考FreeBSD中文手冊(http://www.freebsd.org.cn),整個過程不是很複雜,雖然沒有Windows/Linux的系統安全簡單,但是比起有些Unix的安裝來講是人性許多的。安裝中必須把基本包和內核源代碼都裝上,?了以後編譯內核方便,如果另外,如果喜歡使用ports安裝軟體的話,還要把ports裝上,但是儘量一些沒有必要的程式不要裝。如果要安裝Webmin等,還要把perl等包裝上。系統文件拷貝完以後,會要求配置一些設置,比如把IP位址、名字伺服器等設好,不要打開IPv6,不需要DHCP等服務,不要系統默認的FTP服務,配置 /etc/inetd.conf 時把SSH服務打開,方便我們進行遠端管理,如果不想使用inetd這個超級服務來管理的話,可以關閉它,在/etc/rc.conf中添加inetd_enable="NO",然後設置sshd_enable="YES"一樣可以打開SSH服務,後面我們會詳細談到SSH的設置。 系統裝完後,在 /etc/inetd.conf 中把除了ssh之外的服務全部關閉,特別是telnet和rlogin等服務,一定要慎重,否則很可能每幾天系統就被入侵了。安裝完系統後,建議對系統進行升級,比如使用 make world 或 cvsup 把系統內核和ports進行升級。這個步驟和Windows裝完後打補丁差不多。 2. 服務程式安裝 系統裝完以後,就開始安裝我們的應用軟體,我們的方針還是最新的軟體是最安全的,比如能夠防止一些老版本中的溢出等等。我們基本就是要讓我們的系統有資料庫,同時能夠處理Web服務,同時能夠遠端對網站進行文件管理的FTP服務。我們基本選擇的程式都是比較通常的程式。另外,?了有個視覺化的管理工具,我們同時也可以安裝一個基於瀏覽器的管理工具Webmin,方便沒有ssh用戶端等等的時候進行管理。 首先我們選用的Web服務是Apache httpd 2.0.53,這是目前的最新版本,當然你也可以考慮1.3的版本,主要是看個人習慣。我們網站是PHP程式編寫,所以要安裝PHP,版本是4.3.11,也是最新的版本,如果你的網站程式需要PHP5的支援,那?可以下載php5.0.4。資料庫還是最快速的Mysql,選擇的版本是最新的 4.0.23,如果你需要外鍵、事務、子查詢、存儲過程等的支援,那?你可以考慮4.1和5.0的版本。最後我們的FTP選擇最安全的vsFTPd,因?它是最安全快速的,我在局域網中測試它的最高創數速率能夠達到10MB/S,proFTPd只有8MB/S,vsFTPd針對小型FTP伺服器支援非常好,畢竟我用戶不多,幾個更新網站而已,當然,如果你喜歡簡單方便,也可以考慮使用FreeBSD自帶的FTPd,功能和易用性也是不錯的。如果你用戶比較多,並且功能要求比較高,建議使用proFTPd、pure-FTPd、wu-FTPd等,但有些FTPd不是非常安全,選擇時候一定要慎重考慮。 伺服器程式列表: Apache 2.0.53 下載地址:http://httpd.apache.org PHP 4.3.11 下載地址:http://www.php.net Mysql 4.0.23 下載地址:http://dev.mysql.com vsFTPd 2.0.2 下載地址:http://vsftpd.beasts.org 反正最少的服務 最少的埠 安全的設置 = 最大的安全,儘量能夠不需要使用的服務就不要安裝,比如telnetd、rlogind等,那?相反會對伺服器安全構成威脅。 安裝以上程式你可以採用手工編譯安裝,也可以採用FreeBSD的ports 來進行安裝,這看個人愛好,我個人比較喜歡使用手工安裝,如果不明白具體安裝的朋友可以參考我的Blog上關於安裝Apache PHP Mysql的方法。 二、系統安全設置 1. 用戶控制 儘量少的用戶,我們的FTP帳戶是和系統帳戶綁定在一起的,所以我們添加用戶的時候先建立一個目錄,然後把新建的用戶主目錄指向到該目錄下。假設我需要一個用戶能夠管理我的網站,而我網站的目錄是在 /usr/www 目錄下,那?我們新建立的用戶 www_user 的主目錄就指向 /usr/www 目錄,同時它的shell是沒有的:/usr/sbin/nologin ,主要是?了防止它通過ssh登陸到系統。同時FTP的密碼也要設置的非常複雜,防止黑客通過暴力破解獲得FTP許可權。另外還要說道我們的root用戶的密碼,我想最少應該不要少於10位元的數位+字母+字元的密碼(我的密碼是18位元),否則是非常不安全的,如果密碼簡單,那?黑客通過短時間的暴力破解SSH中的root帳戶,不用幾天,系統就可能被攻破了,同時也建議最少一個月更改一次root用戶的密碼。(強烈建議一般帳戶不要有登陸系統的許可權,就是把shell設?/usr/sbin/nologin) 一般如果要使用root許可權建議建立一個屬於wheel組的小用戶,然後登陸後通過su命令提升?root用戶進行管理,如果黑客通過破解了我們普通用戶的許可權後登陸系統,也不能直接通過root許可權進行管理,這是一種安全防範的簡單方法。 2. 文件訪問控制 有時候被黑客入侵後拿到了小許可權用戶,比如傳了一個WebShell到系統中,那?對方很可能會把 /etc/passwd 等內容直接讀取出來,同時查看/etc/master.passwd中對加密後的root用戶的密碼hash進行破解,最後拿到密碼進行登陸系統。那?我們就要控制部分文件只有root能夠訪問,其他用戶無權訪問。比如uname,gcc等,如果黑客拿到小許可權用戶後就會查看系統版本,然後找到該版本系統對應的溢出程式,使用gcc來進行編譯,如果我們能夠限制黑客訪問uname和gcc等程式,能在一定程度上減緩黑客入侵的腳步。 使用chmod來改變某個文件的許可權資訊,比如我要 /etc/passwd 和 /etc/master.passwd 文件只能允許root訪問: 使用八進位數字來設置 # chmod 700 /etc/passwd # chmod 700 /etc/master.passwd 使用字元標記來進行設置 # chmod u w r x,go-w-r-x /etc/passwd # chmod u w r x,go-w-r-x /etc/master.passwd 系統中有多個重要文件需要設置控制訪問許可權,一定要控制好,否則將會構成重要威脅。 3. 系統服務和埠控制 埠開的越多就越給黑客多一個入侵的機會,服務越多,危險越大,因?你不知道那些服務是不是有潛在的漏洞或者又發現了新的漏洞,所以儘量少的服務,比如sendmail默認是打開的,那?些建議你把sendmail關閉,關閉防範是在 /etc/rc.conf中加上: sendmail_enable = "NONE",如果設?"NO"那?只能夠關閉掉pop3服務,不能關閉smtp的服務,所以要設置?"NONE"。 系統中最好除了我們能夠看到的Apache、Mysql、vsFTPd、SSH之外不要打開其他任何埠和服務。基本的方式是使用netstat -a 查看打開的埠,然後從對應的埠來找相關的服務,比如我們這裏應該只允許開的埠有 21, 22, 80, 3306等,如果有其他埠,那?一定要仔細檢查,很可能是黑客的後門或者是會對系統安全構成威脅的服務。同時有些服務不需要監聽網路連接的話,只是需要本地的連接,比如Mysql,那?就可以關閉Socket監聽,這個將在Mysql安全設置中講解,另外,可以通過防火牆來控制部分埠訪問和連接狀況,比如Mysql的3306埠只允許192.168.0.1訪問,那?我們就在ipfw裏添加規則: ipfw add 10001 allow tcp from 192.168.0.1 to 10.10.10.1 80 in 這樣就能夠防止黑客來訪問伺服器上的Mysql服務。具體防火牆的設置將在下面“防火牆設置”中詳細講解。 4. 日誌管理和控制 (未完) 5. 文件指紋檢測 文件指紋就是我們文件的基本資訊,比如文件許可權、文件所屬用戶/組、文件最後修改日期、文件大小等等,這些都是重要資訊,一般黑客入侵後都可能修改文件,那?文件指紋就不一樣了。另外,文件的md5校驗值也屬於文件的指紋的一種。 ?了防止黑客篡改系統中的部分核心文件,比如 /etc/passwd, /etc/shadow, /etc/inetd.conf 等等,那?我們就可以考慮把部分重要文件進行備份,同時做一份目前有的文件的一個指紋保留,比如把 /etc,/bin, /usr/bin 目錄下的文件進行指紋保留: # ls -l /etc > /var/back/etc.txt # ls -l /bin > /var/back/bin.txt # ls -l /bin > /var/back/usrbin.txt 當然,還有就是給每個重要的文件加上md5校驗值,如果覺得不對勁的時候就進行匹配,保證文件的安全。 你可以給你覺得需要做指紋備份的目錄進行備份,一般這是?了以後被黑客入侵後的系統檢測和系統恢復。比如可以通過文件被修改的時間來確定是不是被入侵,比如可以對比看 /etc/inetc.conf文件和備份的文件有什?不同來確定是不是安裝了服務型後門等。 6. 系統指紋泄漏和防範 (未完) 一般黑客?了入侵某個系統,一定會先進行掃描等工作,掃描包括目標系統的埠開放情況和伺服器使用服務程式和作業系統情況。比如很簡單的手工檢測Web服務的指紋: # telnet target.com 80 那?就很可能返回Apache和PHP的版本資訊,那?同時也可能使用掃描工具對Mysql、vsFTPd、SSH等服務的埠進行掃描,獲取這些服務的指紋。多暴露一份系統資訊,那?系統就多一份危險。那?解決辦法就是把伺服器上服務程式的Banner全部修改掉,從而能夠迷惑黑客。 下面簡單的說一些修改那些服務Banner的方法。 * Apache 修改httpd.conf文件,設置以下選項: ServerSignature Off ServerTokens Prod 上面的適用apache1***, apache 2.0這些都是默認 , 不過還是有server=Apache字樣, 若要完全去掉需重新編譯。 徹底地去掉banner, 修改httpd.h: Include/httpd.h Define SERVER_BASEVENDOR "Apache Group" Define SERVER_PRODUCTVENDOR "Apache" Define SERVER_BASEVERSION "1.3.27" 後從新編譯Apache就能夠完全去掉了。 * PHP 在php.ini中設置 expose_php = Off ,那?將無法在 http頭資訊中看到php的版本資訊。 * Mysql * vsFTPd vsFTPd基本上是無法獲取到一些關於vsFTPd的banner資訊的,不過因?vsFTPd默認的banner資訊是"Welcome to FTP Server!"對於高手來說,還是能夠猜測到一點,所以我們要徹底改掉。修改vsFTPd的配置文件 vsftpd.conf 中的下面選項: Ftpd_banner=xxxxx 把後面的xxxxx改?你想要的banner資訊。 * SSH 好象FreeBSD下默認安裝的SSH被telnet target.com 22 的時候會顯示SSH和FreeBSD的資訊,簡直是個大禍害,什?都告訴別人了,但是目前?止我還不知道怎?修改,知道的高手請指點。 7. 系統內核安全 FreeBSD有個比較強的功能,就是能夠定義系統內核的安全等級,主要是?了防止內核後門專門定制的,能通過不同的等級限制對內核的訪問和對防火牆等的修改。我們首先要開?系統的安全等級,然後設定安全等級,我們打開 /etc/rc.conf: # ee /etc/rc.conf 加入下面的內容: kern_securelevel_enable="YES" kern_securelevel="-1" 第一句是打開安全等級,第二句是定義等級。它一共五個等級,下面說說不同之處。 * kern_securelevel -1:這是系統默認級別,沒有提供任何內核的保護錯誤; * kern_securelevel 0:基本上作用不多,當你的系統剛?動就是0級別的,當進入多用戶模式的時候就自動變成1級了。 * kern_securelevel 1:在這個級別上,有如下幾個限制: a. 不能通過kldload或者kldunload載入或者卸載可載入內核模組; b. 應用程式不能通過/dev/mem或者/dev/kmem直接寫記憶體; c. 不能直接往已經裝在(mounted)的磁片寫東西,也就是不能格式化磁片,但是可以通過標準的內核介面執行寫操作; d. 不能?動X-windows,同時不能使用chflags來修改文件屬性; * kern_securelevel 2:在 1 級別的基礎上還不能寫沒裝載的磁片,而且不能在1秒之內製造多次警告,這個是防止DoS控制臺的; * kern_securelevel 3:在 2 級別的級別上不允許修改IPFW防火牆的規則。 如果你已經裝了防火牆,並且把規則設好了,不輕易改動,那?建議使用3級別,如果你沒有裝防火牆,而且還準備裝防火牆的話,不建議使用。我們這裏推薦使用 2 級別,能夠避免比較多對內核攻擊。 8. 系統安全優化 一般優化系統主要是重新編譯內核,去掉一些不要的驅動等等,你可以參考我在我Blog上寫的關於編譯內核的文章。我們這裏對網路和內核一些選項進行優化和安全設置。編輯 /etc/sysctl.conf 文件,在裏面加入如下內容:(有注釋) #最大的待發送TCP資料緩衝區空間 net.inet.tcp.sendspace=65536 #最大的接受TCP緩衝區空間 net.inet.tcp.recvspace=65536 #最大的接受UDP緩衝區大小 net.inet.udp.sendspace=65535 #最大的發送UDP資料緩衝區大小 net.inet.udp.maxdgram=65535 #本地套接字連接的資料發送空間 net.local.stream.sendspace=65535 #加快網路性能的協定 net.inet.tcp.rfc1323=1 net.inet.tcp.rfc1644=1 net.inet.tcp.rfc3042=1 net.inet.tcp.rfc3390=1 #最大的套接字緩衝區 kern.ipc.maxsockbuf=2097152 #系統中允許的最多文件數量 kern.maxfiles=65536 #每個進程能夠同時打開的最大文件數量 kern.maxfilesperproc=32768 #當一台電腦發起TCP連接請求時,系統會回應ACK應答資料包。該選項設置是否延遲ACK應答資料包,把它和包含資料的資料包一起發送,在高速網路和低負載的情況下會略微提高性能,但在網路連接較差的時候,對方電腦得不到應答會持續發起連接請求,反而會降低性能。 net.inet.tcp.delayed_ack=0 #遮罩ICMP重定向功能 net.inet.icmp.drop_redirect=1 net.inet.icmp.log_redirect=1 net.inet.ip.redirect=0 net.inet6.ip6.redirect=0 #防止ICMP廣播風暴 net.inet.icmp.bmcastecho=0 net.inet.icmp.maskrepl=0 #限制系統發送ICMP速率 net.inet.icmp.icmplim=100 #安全參數,編譯內核的時候加了options TCP_DROP_SYNFIN才可以用 net.inet.icmp.icmplim_output=0 net.inet.tcp.drop_synfin=1 #設置?1會幫助系統清除沒有正常斷開的TCP連接,這增加了一些網路帶寬的使用,但是一些死掉的連接最終能被識別並清除。死的TCP連接是被撥號用戶存取的系統的一個特別的問題,因?用戶經常斷開modem而不正確的關閉活動的連接 net.inet.tcp.always_keepalive=1 #若看到net.inet.ip.intr_queue_drops這個在增加,就要調大net.inet.ip.intr_queue_maxlen,?0最好 net.inet.ip.intr_queue_maxlen=1000 #防止DOS攻擊,默認?30000 net.inet.tcp.msl=7500 #接收到一個已經關閉的埠發來的所有包,直接drop,如果設置?1則是只針對TCP包 net.inet.tcp.blackhole=2 #接收到一個已經關閉的埠發來的所有UDP包直接drop net.inet.udp.blackhole=1 #?網路資料連接時提供緩衝 net.inet.tcp.inflight.enable=1 #如果打開的話每個目標位址一次轉發成功以後它的資料都將被記錄進路由表和arp資料表,節約路由的計算時間,但會需要大量的內核記憶體空間來保存路由表 net.inet.ip.fastforwarding=0 #kernel編譯打開options POLLING功能,高負載情況下使用低負載不推薦SMP不能和polling一起用 #kern.polling.enable=1 #並發連接數,默認?128,推薦在1024-4096之間,數位越大佔用記憶體也越大 kern.ipc.somaxconn=32768 #禁止用戶查看其他用戶的進程 security.bsd.see_other_uids=0 #設置kernel安全級別 kern.securelevel=0 #記錄下任何TCP連接 net.inet.tcp.log_in_vain=1 #記錄下任何UDP連接 net.inet.udp.log_in_vain=1 #防止不正確的udp包的攻擊 net.inet.udp.checksum=1 #防止DOS攻擊 net.inet.tcp.syncookies=1 #僅?線程提供實體記憶體支援,需要256兆以上記憶體 kern.ipc.shm_use_phys=1 # 線程可使用的最大共用記憶體 kern.ipc.shmmax=67108864 # 最大線程數量 kern.ipc.shmall=32768 # 程式崩潰時不記錄 kern.coredump=0 # lo本地資料流程接收和發送空間 net.local.stream.recvspace=65536 net.local.dgram.maxdgram=16384 net.local.dgram.recvspace=65536 # 資料包資料段大小,ADSL?1452。 net.inet.tcp.mssdflt=1460 # ?網路資料連接時提供緩衝 net.inet.tcp.inflight_enable=1 # 資料包資料段最小值,ADSL?1452 net.inet.tcp.minmss=1460 # 本地資料最大數量 net.inet.raw.maxdgram=65536 # 本地資料流程接收空間 net.inet.raw.recvspace=65536 #ipfw防火牆動態規則數量,默認?4096,增大該值可以防止某些病毒發送大量TCP連接,導致不能建立正常連接 net.inet.ip.fw.dyn_max=65535 #設置ipf防火牆TCP連接空閒保留時間,默認8640000(120小時) net.inet.ipf.fr_tcpidletimeout=864000 三、 服務程式的安全設置 到這裏就是本文的重點所在了,我們將花費比較多的文字進行描述,當然,所以描述不一定是非常正確的,也希望能夠對你有一些幫助。我們系統默認是運行了包括Apache、Mysql、vsFTPd,SSH等服務,我們以下進行一一講解。 1. Apache的安全設置 Apache的核心設置就是在 httpd.conf 裏面,我們安裝的Apache的目錄是在 /usr/local/apache2/ 下,那?我們的配置文件就是在 /usr/local/apache2/conf/httpd.conf ,如果你是使用ports等安裝的,配置文件應該是在/etc或/usr/local/etc目錄下。使用ee或者vi打開配置文件: # ee /usr/local/apache2/conf/httpd.conf 下面我們就要進行比較多的安全設置了,基本的服務、埠、主目錄等等設置就不說了,只講與安全有關的設置。 (1)指定運行Apache服務的用戶和組 這是比較重要的,因?許可權是繼承的,如果運行Apache服務的用戶許可權太高,那?很可能使得入侵者通過WebShell等就會對系統構成嚴重威脅。一般我們運行Apache的是nobody用戶和nobody組。在httpd.conf的250-275行之間找到User和Group選項,比如我們默認設置如下(去掉了注釋資訊): User nobody Group #-1 (2) Apache的日誌文件 Apache的日誌文件是非常重要的,可以發現apache的運行狀況和訪問情況,對於判斷入侵等有重要幫助。它的默認選項是: # 錯誤日誌存放目錄,默認是存放在apache安裝目錄的logs下 ErrorLog logs/error_log # 日誌記錄的級別,級別有debug, info, notice, warn, error, crit等,默認是“warn”級別 LogLevel warn # 訪問日誌記錄的格式,每一種格式都有不同的內容,根據你的需要進行定制,以獲取最多訪問資訊 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent # 使用上面格式的那一種,默認是使用common CustomLog logs/access_log common 文件格式預定義的格式內容: %a 遠端用戶IP %A 本地httpd伺服器的ip %f 傳送的檔案名 %h 遠端主機 %m 請求方式 %l identd給出的遠端名 %p 連接的httpd埠號 %P 請求的httpd進程 %t 時間 %T 服務請求時間 你可以定制自己的日誌格式,然後通過CustomLog logs/access_log common來進行調用。 注意,日誌文件是由運行Apache的用戶進行打開的,要注意該文件的安全,防止被黑客改寫或者刪除。 (3) Apache服務資訊顯示控制 在配置文件中有個選項是控制是否顯示apache版本資訊、主機名稱、埠、支援的cgi等資訊的: ServerSignature On 默認?On,那?將顯示所有資訊: 我故意訪問一個不存在的文件:http://www.target.com/404.html 那?就會在給的錯誤提示中顯示如下資訊: Apache/2.0.53 (Unix) PHP/4.3.11 Server at target.com Port 80 所有Apache和PHP的資訊暴露無遺,這是很不安全的。當然同時還有Off和EMail選項,Off將不顯示任何資訊,EMail將顯示管理員的郵箱地址,建議設?Off或者EMail,這樣能夠避免泄漏Apache伺服器的資訊給黑客。 (4) 目錄瀏覽 在httpd.conf中可以設置apache能夠對一些沒有索引文件的網頁目錄進行目錄瀏覽: Options Indexes FollowSymLinks AllowOverride None 這是不合適也不安全的,建議不需要目錄瀏覽: Options FollowSymLinks AllowOverride None (5) 用戶主頁 設置httpd.conf中的: UserDir public_html 能夠使得每個使用系統的用戶在自己的主目錄下建立 public_html 目錄後就能夠把自己的網頁放進該目錄,然後通過: http://www.target.com/~用戶名/網頁 就能夠顯示自己的網頁,這是不安全的,而且對於我們伺服器來講,這沒有必要,所以我們直接關閉該功能: UserDir disabled 或者把該內容改名,改成 一個黑客比較不容易猜到的檔案名,比如: UserDir webserver_public_htmlpath 也可以只允許部分用戶具有該功能: UserDir enabled user1 user2 user3 (6) CGI執行目錄 如果你的apache要執行一些perl等cgi程式,那?就要設置一下選項: ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" 但是這也給了黑客利用一些不安全的cgi程式來進行破壞,所以如果你不需要cgi的話,建議關閉該選項: #ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" (7) 控制PHP腳本只能訪問指定目錄 在httpd.conf添加如下內容: php_admin_value open_basedir /usr/www 後面的路徑是你需要PHP腳本能夠訪問的目錄,如果PHP腳本想要訪問其他目錄將出項錯誤提示。 (8) 目錄訪問控制 (未完) 這項內容最複雜,同時涉及的東西也比較多,我只能簡單說一下,不清楚請參考其他文章。 比如下面的內容: Options FollowSymLinks AllowOverride None 就是允許訪問每一個目錄,裏面設置的是允許執行的動作,一般包含的動作有:Options、AllowOverride、Order、Allow、Deny。 Options是只對指定目錄及其子目錄能夠執行的操作,Indexes、Includes、FollowSymLinks、ExecCGI、MultiViews、None、All等操作。 AllowOverride是指定目錄訪問的許可權,當然也可以通過 AccessFileName文件指定的 .htaccess 來控制。它的操作有:None、All、Options、FileInfo、AuthConfit、Limit等。 Order、Allow、Deny三個指令必須配合來控制目錄訪問許可權。Order指定檢查次序的規則,比如Order Allow, Deny,表示先按Allow檢查,如果不匹配再按Deny進行檢查。Order Deny, Allow ,表示先按Deny規則檢查,如果不滿足條件,再按Allow進行檢查。 控制目錄訪問許可權的文件 默認在Unix平臺下能夠使用 .htaccess 來對目錄許可權進行規則定義,但是這是不安全的,建議關閉,默認的選項: AccessFileName .htaccess 建議設成: #AccessFileName .htaccess 全部目錄許可權定義使用httpd.conf中的定義,不使用 .htaccess。 (9) 用戶訪問認證 這個技術非常重要,能夠控制一些非法用戶訪問本內容。假設我們的網站: http://www.target.com/admin 是我們的後臺管理目錄,我不允許一些非法用戶進行訪問,那?我就必須設定對該目錄訪問是需要驗證的。 先在httpd.conf中加入要進行訪問認證的目錄: authtype basic authname "Private" authuserfile /usr/local/apache/bin/admin.dat require user login_user Options Indexes FollowSymlinks MultiViews AllowOverride None 上面我們就設置了我們的 /usr/www/admin目錄是必須進行認證才能訪問的,接著我們設置訪問密碼: # /usr/local/apahche/bin/htpasswd -c /usr/local/apache/bin/admin.dat login_name New password: ***** Re-type new password: ***** Adding password for user login_name 那?下次任何用戶訪問http://www.target.com/admin目錄的時候就需要輸入用戶名login_name和你設置的密碼。 2. PHP安全設置 PHP本身再老版本有一些問題,比如在 php4.3.10和php5.0.3以前有一些比較嚴重的bug,所以推薦使用新版。另外,目前鬧的轟轟烈烈的SQL Injection也是在PHP上有很多利用方式,所以要保證安全,PHP代碼編寫是一方面,PHP的配置更是非常關鍵。 我們php手手工安裝的,php的默認配置文件在 /usr/local/apache2/conf/php.ini,我們最主要就是要配置php.ini中的內容,讓我們執行php能夠更安全。 整個PHP中的安全設置主要是?了防止phpshell和SQL Injection的攻擊,一下我們慢慢探討。我們先使用任何編輯工具打開/etc/local/apache2/conf/php.ini,如果你是採用其他方式安裝,配置文件可能不在該目錄。 (1) 打開php的安全模式 php的安全模式是個非常重要的內嵌的安全機制,能夠控制一些php中的函數,比如system(),同時把很多文件操作函數進行了許可權控制,也不允許對某些關鍵文件的文件,比如/etc/passwd,但是默認的php.ini是沒有打開安全模式的,我們把它打開: safe_mode = on (2) 用戶組安全 當safe_mode打開時,safe_mode_gid被關閉,那?php腳本能夠對文件進行訪問,而且相同組的用戶也能夠對文件進行訪問。 建議設置?: safe_mode_gid = off 如果不進行設置,可能我們無法對我們伺服器網站目錄下的文件進行操作了,比如我們需要對文件進行操作的時候。 (3) 安全模式下執行程式主目錄 如果安全模式打開了,但是卻是要執行某些程式的時候,可以指定要執行程式的主目錄: safe_mode_exec_dir = /usr/bin 一般情況下是不需要執行什?程式的,所以推薦不要執行系統程式目錄,可以指向一個目錄,然後把需要執行的程式拷貝過去,比如: safe_mode_exec_dir = /tmp/cmd 但是,我更推薦不要執行任何程式,那?就可以指向我們網頁目錄: safe_mode_exec_dir = /usr/www (4) 安全模式下包含文件 如果要在安全模式下包含某些公共文件,那?就修改一下選項: safe_mode_include_dir = /usr/www/include/ 其實一般php腳本中包含文件都是在程式自己已經寫好了,這個可以根據具體需要設置。 (5) 控制php腳本能訪問的目錄 使用open_basedir選項能夠控制PHP腳本只能訪問指定的目錄,這樣能夠避免PHP腳本訪問/etc/passwd等文件,一定程度上限制了phpshell的危害,我們一般可以設置?只能訪問網站目錄: open_basedir = /usr/www (6) 關閉危險函數 如果打開了安全模式,那?函數禁止是可以不需要的,但是我們?了安全還是考慮進去。比如,我們覺得不希望執行包括system()等在那的能夠執行命令的php函數,或者能夠查看php資訊的phpinfo()等函數,那?我們就可以禁止它們: disable_functions = system,passthru,exec,shell_exec,popen,phpinfo 如果你要禁止任何文件和目錄的操作,那?可以關閉很多文件操作 disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown 以上只是列了部分不叫常用的文件處理函數,你也可以把上面執行命令函數和這個函數結合,就能夠抵制大部分的phpshell了。 (7) 關閉PHP版本資訊在http頭中的泄漏 我們?了防止黑客獲取伺服器中php版本的資訊,可以關閉該資訊斜路在http頭中: expose_php = Off 比如黑客在 telnet www.target.com 80 的時候,那?將無法看到PHP的資訊。 (8) 關閉註冊總體變數 在PHP中提交的變數,包括使用POST或者GET提交的變數,都將自動註冊?總體變數,能夠直接訪問,這是對伺服器非常不安全的,所以我們不能讓它註冊?總體變數,就把註冊總體變數選項關閉: register_globals = Off 當然,如果這樣設置了,那?獲取對應變數的時候就要採用合理方式,比如獲取GET提交的變數var,那?就要用$_GET['var']來進行獲取,這個php程式師要注意。 (9) 打開magic_quotes_gpc來防止SQL注入 SQL注入是非常危險的問題,小則網站後臺被入侵,重則整個伺服器淪陷,所以一定要小心。php.ini中有一個設置: magic_quotes_gpc = Off 這個默認是關閉的,如果它打開後將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉? \'等,這對防止sql注射有重大作用。所以我們推薦設置?: magic_quotes_gpc = On (10) 錯誤資訊控制 一般php在沒有連接到資料庫或者其他情況下會有提示錯誤,一般錯誤資訊中會包含php腳本當前的路徑資訊或者查詢的SQL語句等資訊,這類資訊提供給黑客後,是不安全的,所以一般伺服器建議禁止錯誤提示: display_errors = Off 如果你卻是是要顯示錯誤資訊,一定要設置顯示錯誤的級別,比如只顯示警告以上的資訊: error_reporting = E_WARNING & E_ERROR 當然,我還是建議關閉錯誤提示。 (11) 錯誤日誌 建議在關閉display_errors後能夠把錯誤資訊記錄下來,便於查找伺服器運行的原因: log_errors = On 同時也要設置錯誤日誌存放的目錄,建議根apache的日誌存在一起: error_log = /usr/local/apache2/logs/php_error.log 注意:給文件必須允許apache用戶的和組具有寫的許可權。 3. Mysql的安全設置 我們把Mysql安裝在 /usr/local/mysql目錄下,我們必須建立一個用戶名?mysql,組?mysql的用戶來運行我們的mysql,同時我們把它的配置文件拷貝到 /etc目錄下: # cp suport-files/my-medium.cnf /etc/my.cnf chown root:sys /etc/my.cnf chmod 644 /etc/my.cnf 使用用戶mysql來?動我們的mysql: # /usr/local/mysql/bin/mysqld_safe -user=mysql & (1) 修改root用戶的的口令 缺省安裝的mysql是沒有密碼的,所以我們要修改,以防萬一。下面採用三種方式來修改root的口令。 * 用mysqladmin命令來改root用戶口令 # mysqladmin -uroot password test 這樣,MySQL資料庫root用戶的口令就被改成test了。(test只是舉例,我們實際使用的口令一定不能使用這種易猜的弱口令) * 用set password修改口令: mysql> set password for root@localhost=password('test'); 這時root用戶的口令就被改成test了。 * 直接修改user表的root用戶口令 mysql> use mysql; mysql> update user set password=password('test') where user='root'; mysql> flush privileges; 這樣,MySQL資料庫root用戶的口令也被改成test了。其中最後一句命令flush privileges的意思是強制刷新記憶體授權表,否則用的還是緩衝中的口令,這時非法用戶還可以用root用戶及空口令登陸,直到重?MySQL伺服器。 (2) 刪除默認的資料庫和用戶 我們的資料庫是在本地,並且也只需要本地的php腳本對mysql進行讀取,所以很多用戶不需要。mysql初始化後會自動生成空用戶和test庫,這會對資料庫構成威脅,我們全部刪除。 我們使用mysql用戶端程式連接到本地的mysql伺服器後出現如下提示: 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; (3) 改變默認mysql管理員的名稱 這個工作是可以選擇的,根據個人習慣,因?默認的mysql的管理員名稱是root,所以如果能夠修改的話,能夠防止一些腳本小子對系統的窮舉。我們可以直接修改資料庫,把root用戶改?"admin" mysql> use mysql; mysql> update user set user="admin" where user="root"; mysql> flush privileges; (4) 提高本地安全性 提高本地安全性,主要是防止mysql對本地文件的存取,比如黑客通過mysql把/etc/passwd獲取了,會對系統構成威脅。mysql對本地文件的存取是通過SQL語句來實現,主要是通過Load DATA LOCAL INFILE來實現,我們能夠通過禁用該功能來防止黑客通過SQL注射等獲取系統核心文件。 禁用該功能必須在 my.cnf 的[mysqld]部分加上一個參數: set-variable=local-infile=0 (5) 禁止遠端連接mysql 因?我們的mysql只需要本地的php腳本進行連接,所以我們無需開socket進行監聽,那?我們完全可以關閉監聽的功能。 有兩個方法實現: * 配置my.cnf文件,在[mysqld]部分添加 skip-networking 參數 * mysqld伺服器中參數中添加 --skip-networking ?動參數來使mysql不監聽任何TCP/IP連接,增加安全性。如果要進行mysql的管理的話,可以在伺服器本地安裝一個phpMyadmin來進行管理。 (6) 控制資料庫訪問許可權 對於使用php腳本來進行交互,最好建立一個用戶只針對某個庫有 update、select、delete、insert、drop table、create table等許可權,這樣就很好避免了資料庫用戶名和密碼被黑客查看後最小損失。 比如下面我們創建一個資料庫?db1,同時建立一個用戶test1能夠訪問該資料庫。 mysql> create database db1; mysql> grant select,insert,update,delete,create,drop privileges on db1.* to test1@localhost identified by 'admindb'; 以上SQL是創建一個資料庫db1,同時增加了一個test1用戶,口令是admindb,但是它只能從本地連接mysql,對db1庫有select,insert,update,delete,create,drop操作許可權。 (7) 限制一般用戶瀏覽其他用戶資料庫 如果有多個資料庫,每個資料庫有一個用戶,那?必須限制用戶瀏覽其他資料庫內容,可以在?動MySQL伺服器時加--skip-show-database ?動參數就能夠達到目的。 (8) 忘記mysql密碼的解決辦法 如果不慎忘記了MySQL的root密碼,我們可以在?動MySQL伺服器時加上參數--skip-grant-tables來跳過授權表的驗證 (./safe_mysqld --skip-grant-tables &),這樣我們就可以直接登陸MySQL伺服器,然後再修改root用戶的口令,重?MySQL就可以用新口令登陸了。 (9) 資料庫文件的安全 我們默認的mysql是安裝在/usr/local/mysql目錄下的,那?對應的資料庫文件就是在/usr/local/mysql/var目錄下,那?我們要保證該目錄不能讓未經授權的用戶訪問後把資料庫打包拷貝走了,所以要限制對該目錄的訪問。 我們修改該目錄的所屬用戶和組是mysql,同時改變訪問許可權: # chown -R mysql.mysql /usr/local/mysql/var # chmod -R go-rwx /usr/local/mysql/var (10) 刪除歷史記錄 執行以上的命令會被shell記錄在歷史文件裏,比如bash會寫入用戶目錄的.bash_history文件,如果這些文件不慎被讀,那?資料庫的密碼就會泄漏。用戶登陸資料庫後執行的SQL命令也會被MySQL記錄在用戶目錄的.mysql_history文件裏。如果資料庫用戶用SQL語句修改了資料庫密碼,也會因.mysql_history文件而泄漏。所以我們在shell登陸及備份的時候不要在-p後直接加密碼,而是在提示後再輸入資料庫密碼。 另外這兩個文件我們也應該不讓它記錄我們的操作,以防萬一。 # rm .bash_history .mysql_history # ln -s /dev/null .bash_history # ln -s /dev/null .mysql_history (11) 其他 另外還可以考慮使用chroot等方式來控制mysql的運行目錄,更好的控制許可權,具體可以參考相關文章。 4. vsFTPd安全設置 vsFTPd是一款非常著名的ftp daemon程式,目前包括Redhat.com在內很多大公司都在使用,它是一款非常安全的程式,因?它的名字就叫:Very Secure FTP Daemon (非常安全的FTP伺服器)。 vsftpd設置選項比較多,涉及方方面面,我們下面主要是針對安全方面進行設置。 目前我們的需求就是使用系統帳戶同時也作?是我們的FTP帳戶來進行我們文件的管理,目前假設我只需要一個帳戶來更新我的網站,並且我不希望該帳戶能夠登陸我們的系統,比如我們的網站的目錄是在/usr/www下面,那?我們新建一個用戶ftp,它的主目錄是/usr/www,並且它的shell是/usr/sbin/nologin,就是沒有shell,防止該用戶通過ssh等登陸到系統。 下面在進行系統詳盡的設置,主要就是針對vsftpd的配置文件vsftpd.conf文件的配置。 (1) 禁止匿名用戶訪問, 我們不需要什?匿名用戶,直接禁止掉: anonymous_enable=NO (2) 允許本地用戶登陸,因?我們需要使用ftp用戶來對我們網站進行管理: local_enable=YES (3) 只允許系統中的ftp用戶或者某些指定的用戶訪問ftp,因?系統中帳戶?多,不可能讓誰都訪問。 打開用戶文件列表功能: userlist_enable=YES 只允許用戶文件列表中的用戶訪問ftp: userlist_deny=NO 用戶名文件列表路徑: userlist_file=/etc/vsftpd.user_list 然後在/etc下建立文件 vsftpd.user_list 文件,一行一個,把用戶ftp加進去,同時也可以加上你允許訪問的系統帳戶名。 (4) 禁止某些用戶登陸ftp: pam_service_name=vsftpd 指出VSFTPD進行PAM認證時所使用的PAM配置檔案名,預設值是vsftpd,默認PAM配置文件是/etc/pam.d/vsftpd。 /etc/vsftpd.ftpusers VSFTPD禁止列在此文件中的用戶登錄FTP伺服器,用戶名是一行一個。這個機制是在/etc/pam.d/vsftpd中默認設置的。 這個功能和(3)裏的功能有點類似,他們倆能結合使用,那樣就最好了。 (5) 把本地用戶鎖定在自己的主目錄,防止轉到其他目錄,比如把/etc/passwd給下載了: chroot_local_users=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd.chroot_list 然後在/etc下建立vsftpd.chroot_list文件,裏面把我們要限制的本地帳戶加進去,一行一個,我們加上ftp,防止它登陸到系統。 (6) 隱藏文件真實的所有用戶和組資訊,防止黑客拿下ftp後查看更多系統用戶資訊: hide_ids=YES (7) 取消ls -R命令,節省資源,因?使用該命令,在文件列表很多的時候將浪費大量系統資源: ls_recurse_enable=NO (8) 上傳文件的默認許可權,設置?022: local_umask=022 如果要覆蓋刪除等C
系統時間:2024-04-29 9:00:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!