一邢疙、apache server安全性設(shè)置
- 以Nobody用戶運(yùn)行
一般情況下棍弄,Apache是由Root 來(lái)安裝和運(yùn)行的。如果Apache Server進(jìn)程具有Root用戶特權(quán)疟游,那么它將給系統(tǒng)的安全構(gòu)成很大的威脅呼畸,應(yīng)確保Apache Server進(jìn)程以最可能低的權(quán)限用戶來(lái)運(yùn)行。通過(guò)修改httpd.conf文件中的下列選項(xiàng)颁虐,以Nobody用戶運(yùn)行Apache 達(dá)到相對(duì)安全的目的蛮原。
User nobody
Group# -1
2.ServerRoot目錄的權(quán)限
為了確保所有的配置是適當(dāng)?shù)暮桶踩模枰獓?yán)格控制Apache 主目錄的訪問(wèn)權(quán)限另绩,使非超級(jí)用戶不能修改該目錄中的內(nèi)容儒陨。Apache 的主目錄對(duì)應(yīng)于Apache Server配置文件httpd.conf的Server Root控制項(xiàng)中,應(yīng)為:
Server Root /usr/local/apache
3.SSI的配置
在配置文件access.conf 或httpd.conf中的確Options指令處加入Includes NO EXEC選項(xiàng)笋籽,用以禁用Apache Server 中的執(zhí)行功能蹦漠。避免用戶直接執(zhí)行Apache 服務(wù)器中的執(zhí)行程序,而造成服務(wù)器系統(tǒng)的公開(kāi)化干签。
Options Includes Noexec
4.阻止用戶修改系統(tǒng)設(shè)置
在Apache 服務(wù)器的配置文件中進(jìn)行以下的設(shè)置津辩,阻止用戶建立、修改 .htaccess文件容劳,防止用戶超越能定義的系統(tǒng)安全特性喘沿。
AllowOveride None
Options None
Allow from all
5.改變Apache 服務(wù)器的缺省訪問(wèn)特性
Apache 的默認(rèn)設(shè)置只能保障一定程度的安全,如果服務(wù)器能夠通過(guò)正常的映射規(guī)則找到文件竭贩,那么客戶端便會(huì)獲取該文件蚜印,如http://local host/~ root/ 將允許用戶訪問(wèn)整個(gè)文件系統(tǒng)。在服務(wù)器文件中加入如下內(nèi)容:
order deny,ellow
Deny from all
6.CGI腳本的安全考慮
CGI腳本是一系列可以通過(guò)Web服務(wù)器來(lái)運(yùn)行的程序留量。為了保證系統(tǒng)的安全性窄赋,應(yīng)確保CGI的作者是可信的。對(duì)CGI而言楼熄,最好將其限制在一個(gè)特定的目 錄下忆绰,如cgi-bin之下,便于管理可岂;另外應(yīng)該保證CGI目錄下的文件是不可寫(xiě)的错敢,避免一些欺騙性的程序駐留或混跡其中;如果能夠給用戶提供一個(gè)安全性 良好的CGI程序的模塊作為參考缕粹,也許會(huì)減少許多不必要的麻煩和安全隱患稚茅;除去CGI目錄下的所有非業(yè)務(wù)應(yīng)用的腳本,以防異常的信息泄漏平斩。
二亚享、PHP安全性設(shè)置
1、程序代碼漏洞問(wèn)題
很多 PHP 程序所存在的重大弱點(diǎn)并不是 PHP 語(yǔ)言本身的問(wèn)題绘面,而是編程者的安全意識(shí)不高而導(dǎo)致的欺税。因此,必須時(shí)時(shí)注意每一段代碼可能存在的問(wèn)題揭璃,去發(fā)現(xiàn)非正確數(shù)據(jù)提交時(shí)可能造成的影響晚凿。
<?php
unlink ($evil_var);
fwrite ($fp, $evil_var);
system ($evil_var);
exec ($evil_var);
?>
2、用戶輸入表單問(wèn)題
驗(yàn)證用戶輸入的任何數(shù)據(jù)塘辅,保證PHP代碼的安全晃虫。
注意1:JS只是為了提高來(lái)訪用戶的體驗(yàn)而產(chǎn)生的,而不是驗(yàn)證的工具扣墩。因?yàn)槿魏我粋€(gè)來(lái)訪的用戶都可能會(huì)哲银,也有可能無(wú)意間就禁用了客戶端腳本的執(zhí)行,從而跳過(guò)這層驗(yàn)證呻惕。所以我們必須在PHP的服務(wù)器端程序上檢驗(yàn)這些數(shù)據(jù)荆责。
注意2:不要使用$_SERVER[‘HTTP_REFERER’]這個(gè)超級(jí)變量來(lái)檢查數(shù)據(jù)的來(lái)源地址,一個(gè)很小的菜鳥(niǎo)黑客都會(huì)利用工具來(lái)偽造這個(gè)變量的數(shù)據(jù)亚脆,盡可能利用Md5做院,或者rand等函數(shù)來(lái)產(chǎn)生一個(gè)令牌,驗(yàn)證來(lái)源的時(shí)候,驗(yàn)證這個(gè)令牌是否匹配键耕。
3寺滚、PHP文件權(quán)限問(wèn)題
PHP 被設(shè)計(jì)為以用戶級(jí)別來(lái)訪問(wèn)文件系統(tǒng),所以完全有可能通過(guò)編寫(xiě)一段 PHP 代碼來(lái)讀取系統(tǒng)文件如 /etc/passwd屈雄,更改網(wǎng)絡(luò)連接以及發(fā)送大量打印任務(wù)等等村视。因此必須確保 PHP 代碼讀取和寫(xiě)入的是合適的文件。
4酒奶、隱藏PHP擴(kuò)展名
一般而言蚁孔,通過(guò)隱藏的手段提高安全性被認(rèn)為是作用不大的做法。但某些情況下惋嚎,盡可能的多增加一份安全性都是值得的杠氢。
一些簡(jiǎn)單的方法可以幫助隱藏 PHP,這樣做可以提高攻擊者發(fā)現(xiàn)系統(tǒng)弱點(diǎn)的難度另伍。在 php.ini 文件里設(shè)置 expose_php = off 鼻百,可以減少他們能獲得的有用信息。
另一個(gè)策略就是讓 web 服務(wù)器用 PHP 解析不同擴(kuò)展名质况。無(wú)論是通過(guò) .htaccess 文件還是 Apache 的配置文件愕宋,都可以設(shè)置能誤導(dǎo)攻擊者的文件擴(kuò)展名:
1、使PHP看上去像其它的編程語(yǔ)言
AddType application/x-httpd-php .asp .py .pl
2结榄、使 PHP 看上去像未知的文件類型
AddType application/x-httpd-php .bop .foo .133t
3中贝、使 PHP 代碼看上去像HTML頁(yè)面
AddType application/x-httpd-php .htm .html
三、Mysql數(shù)據(jù)庫(kù)安全性設(shè)置
1臼朗、數(shù)據(jù)庫(kù)設(shè)計(jì)問(wèn)題
應(yīng)用程序永遠(yuǎn)不要使用數(shù)據(jù)庫(kù)所有者或超級(jí)用戶帳號(hào)來(lái)連接數(shù)據(jù)庫(kù)邻寿,因?yàn)檫@些帳號(hào)可以執(zhí)行任意的操作,比如說(shuō)修改數(shù)據(jù)庫(kù)結(jié)構(gòu)(例如刪除一個(gè)表)或者清空整個(gè)數(shù)據(jù)庫(kù)的內(nèi)容视哑。
2.數(shù)據(jù)庫(kù)連接問(wèn)題
把連接建立在 SSL 加密技術(shù)上可以增加客戶端和服務(wù)器端通信的安全性绣否,或者 SSH 也可以用于加密客戶端和數(shù)據(jù)庫(kù)之間的連接。如果使用了這些技術(shù)的話挡毅,攻擊者要監(jiān)視服務(wù)器的通信或者得到數(shù)據(jù)庫(kù)的信息是很困難的蒜撮。
3.數(shù)據(jù)庫(kù)數(shù)據(jù)的加密
SSL/SSH 能保護(hù)客戶端和服務(wù)器端交換的數(shù)據(jù),但 SSL/SSH 并不能保護(hù)數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)跪呈。SSL 只是一個(gè)加密網(wǎng)絡(luò)數(shù)據(jù)流的協(xié)議段磨。
如果攻擊者取得了直接訪問(wèn)數(shù)據(jù)庫(kù)的許可(繞過(guò) web 服務(wù)器),敏感數(shù)據(jù)就可能暴露或者被濫用耗绿,除非數(shù)據(jù)庫(kù)自己保護(hù)了這些信息苹支。對(duì)數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)加密是減少這類風(fēng)險(xiǎn)的有效途徑,但是只有很少的數(shù)據(jù)庫(kù)提供這些加密功能误阻。
對(duì)于這個(gè)問(wèn)題债蜜,有一個(gè)簡(jiǎn)單的解決辦法晴埂,就是創(chuàng)建自己的加密機(jī)制,然后把它用在 PHP 程序內(nèi)寻定,最常見(jiàn)的例子就是把密碼經(jīng)過(guò) MD5 加密后的散列存進(jìn)數(shù)據(jù)庫(kù)來(lái)代替原來(lái)的明文密碼儒洛。
<?php
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');",
addslashes($username), md5($password));
$result = pg_query($connection, $query);
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
addslashes($username), md5($password));
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo 'Welcome, $username!';
} else {
echo 'Authentication failed for $username.';
}
?>
4、SQL注入問(wèn)題
直接 SQL 命令注入就是攻擊者常用的一種創(chuàng)建或修改已有 SQL 語(yǔ)句的技術(shù)特姐,從而達(dá)到取得隱藏?cái)?shù)據(jù)晶丘,或覆蓋關(guān)鍵的值黍氮,甚至執(zhí)行數(shù)據(jù)庫(kù)主機(jī)操作系統(tǒng)命令的目的唐含。這是通過(guò)應(yīng)用程序取得用戶輸入并與靜態(tài)參數(shù)組合成 SQL 查詢來(lái)實(shí)現(xiàn)的。
<?php
$query = "SELECT id, name, inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
可以在原來(lái)的查詢的基礎(chǔ)上添加另一個(gè) SELECT 查詢來(lái)獲得密碼: union select ‘1’, concat(uname||’-‘||passwd) as name, ‘1971-01-01’, ‘0’ from usertable; 假如上述語(yǔ)句(使用 ‘ 和 –)被加入到 $query 中的任意一個(gè)變量的話沫浆,那么就麻煩了捷枯。
這些攻擊總是建立在發(fā)掘安全意識(shí)不強(qiáng)的代碼上的。所以专执,永遠(yuǎn)不要信任外界輸入的數(shù)據(jù)淮捆,特別是來(lái)自于客戶端的,包括選擇框本股、表單隱藏域和 cookie攀痊。