本書講述了linux安全的方方面面,而且以一問一答的方式介紹,思路清晰。文中提供了很
多有益的安全提示,是Linux系統維護人員的必備參考書。經過本書,你能瞭解到linux安
全的總體概念,從系統安全到應用安全,從單機安全到網絡安全。但安全問題是一個不斷變
化不斷更新的過程而不是一個解決方案,因此本書只是提到當時爲人所發現的安全問題的介
紹,新出現的安全問題可參考該書網站的更新和網上的安全警告。linux
第一章 linux安全問題概述
粘着位(Sticky bit)
若是用戶對目錄有寫權限,則能夠刪除其中的文件和子目錄,即便該用戶不是這些文件的所
有者,並且也沒有讀或寫許可。粘着位出現執行許可的位置上,用t表示,設置了該位後,
其它用戶就不以刪除不屬於他的文件和目錄。可是該目錄下的目錄不繼承該權限,要再設置
纔可以使用。
# chmod 1770 xxxweb
文件屬性
chattr命令修改
lsattr命令列出文件屬性算法
文件屬性定義
A 不要更新atime文件,當在筆記本電腦或NFS上限制磁盤I/0流量時,頗有用,除2.0
系列外,這一屬性不被其它內核支持。
a 文件僅能以追加方式打開,只有root才能設置這個屬性。
c 文件保存在磁盤時,內核將自動壓縮該文件。
d 文件標記,使其不能被轉儲。
i 文件不能被修改,刪除或重命名,不能建立任何指向它的連接,並不能寫入任何數據。
s 刪除文件時,相應的磁盤存儲塊清零。
S 修改文件時,對其寫入進行同步。
u 刪除文件時,保存其內容。shell
Ulimit命令
設置限制 能夠把命令加到profile文件裏,也能夠在/etc/security/limits.conf文件中定義
限制。
命令參數
-a 顯示全部限制
-c core文件大小的上限
-d 進程數據段大小的上限
-f shell所能建立的文件大小的上限
-m 駐留內存大小的上限
-s 堆棧大小的上限
-t 每秒可佔用的CPU時間上限
-p 管道大小
-n 打開文件數的上限
-u 進程數的上限
-v 虛擬內存的上限
除可用Ulimit命令設置外,也能夠在/etc/security/limits.conf文件中定義限制。
domino type item value
domino是以符號@開頭的用戶名或組名,*表示全部用戶,type設置爲hard or soft。item指
定想限制的資源。如cpu,core nproc or maxlogins
。value是相應的限制值。數據庫
信號
# kill -TERM XXXX 終止信號
# kill -HUP HTTPD 重讀配置信號安全
特權端口
root用戶是可綁定端口小於1024的唯一用戶。能夠信任來自於遠程機器端口小於1024的連
接。服務器
第二章 預防措施與從***中恢復
系統安全
簡單的FIND命令
# find / \(-perm -02000 -o -perm -4000 \) -ls 能夠找出系統中全部的setuserid and setgroupid
程序。
在最嚴格的狀況下,能夠去掉除/bin/su外全部已安裝程序的setXid位。網絡
系統安全掃描工具 cops tiger Nabouless
掃描檢測器
******系統前所作的第一件事就是從網絡上掃描系統,掃描檢測器能及時獲知,是一個良
好的***檢測系統(IDS)
Klaxon Courtney Scanlogd PortSentrydom
加固系統
Bastille項目建立了一組模塊來加固新近發佈的REDHAT。在安裝完系統後可運行該補丁,
在何時均可運行,沒必要要必定是剛安裝完系統。
加固的方法是:一、下載源代碼到/root目錄並解包。以root身份動行InteractiveBastille.pl腳
本。在回答完問題後,程序將作出相應改動。配置完成後,該工具把其保存在BackEnd.pl
中,若是但願加固一樣配置的服務器,將它複製到新服務器並運行AutomatedBastille.pl便可。
Openwall Linux補丁
它是一個內核補丁。要這些補丁起做用,用戶必須從新編譯和安裝新的打上補丁的內核。在
某些狀況下,這些內核補丁和標準linux不徹底兼容,所以在決定使用前必須確信理解其含
義。
LIDS
它包括內核級的端口掃描檢測程序和安全警告程序。是內核補丁(如今適用於2.2.X和2.4.X,
但之後將再也不支持2.2)和系統管理工具。其特性包括:
一、高級文件保護,甚至root也不能發現和處置受LIDS保護的文件。
二、進程保護,內核拒絕向受保護的進程發送信號(例如SIGKILL),進程也能夠被徹底隱
藏起來,在/proc下不會存在任何痕跡。
三、更好的訪問控制,更有效地使用與特權相關的權能,包括禁止root更改這些權能。
四、內置式端口掃描檢測,內置於內核的掃描程序可以檢測到Nmap,SATAN等工具的絕大
部分掃描。
要安裝LIDS,必須下載最新的linux內核正式版和LIDS源代碼。使用LIDS給內核打上補丁,
而後從新編譯內核。
日誌文件分析
syslogd消信可標記爲特定的功能和級別,在/etc/syslog.conf文件中能夠根據這兩個選項來設
置消信的去向。
syslogd功能 描述
auth 安全性/驗證消息(負面)
authpriv 安全性/驗證消息
cron cron and at
daemon 其它系統守護進程(sshd,xinetd,pppd等)
kern 內核消息
lpr 行打印系統
mail 郵件子系統(sendmail,postfix,qmail等)
news Usenet新聞消息
syslog 內部syslog消息
user 通常用戶級消息
uucp UUCP子系統
local0-local7 自定義的級別
日誌級別 描述
emerg 系統已不可用
alert 必須立刻採起行動
crit 危急
err 錯誤
warning 警告
notice 普通但重要的情形
info 通知消息
debug 調試消息
syslog.conf每一行的配置格式爲
facility.loglevel logtarget,全部字段用tab隔開
例子:
daemon.notice /var/log/daemon.log 把程序發送過來的功能爲daemon,優先級爲notice
或更高級別的全部日誌消息記錄到/var/log/daemon.log文件中,可使用*號表示匹配全部功
能或日誌級別。
目標 描述
/path/to/filename 將消息附加到所指定文件的文件尾,這是最經常使用的情形。
@loghost 寫到loghost機器上的syslog服務器。可方便把日誌發來多臺機器上,
|/path/to/named_pipe 寫到指定的命名管道(便於用外部程序過濾消息)。
user1,user2 寫到所列用戶。
* 寫到全部登陸用戶。
/dev/console 寫到已命名的終端。
日誌文件許可
應設置日誌只爲root全部和寫入,同時可以被log組(或你所但願的組)讀取,而其餘用戶
沒有任何權限。一個用戶在輸入用戶名的地方使用了口令,在登陸失敗時,將會把用戶名(在
此例中爲口令,由於用戶失誤)記錄到日誌中。而後建立一個屬於log組的虛構用戶,並讓
全部日誌檢查程序以該用戶而不是root運行。日誌檢查程序不該當以root用戶運行。
能夠經過日誌分析軟件開監控日誌,如logcheck,swatch和logsurfer。但最好的工具仍是管理
員自已寫的腳本。
文件系統完整性檢查
修改文件系統是***在侵入系統以後常常要作的一件事情,下面列出了常常被修改的一些文
件:
類型 例子
服務器配置文件 /etc/inetd.conf,/etc/ftpaccess
網絡配置文件 /etc/host.conf,/etc/sysconfig/network
系統配置文件 /etc/ld.so.conf,/etc/nsswitch.conf
crontab /etc/cron.daily/*,/var/spool/cron/root
setuserid程序 /bin/su,/bin/ping,usr/bin/chfn,/sbin/dump
setgroupid程序 /sbin/netreport,/usr/bin/lpr,/usr/bin/write,/usr/bin/man
若是知道機器什麼時候被***,就能夠判斷修改時,並瞭解哪些東西被修改了,例如想知道在9
月17日發生的侵入事件中被修改的全部文件,能夠執行以下命令:
# touch 09170000 /tmp/comparison
# find / \( -newer /tmp/comparison -o -cnewer /tmp/comparison \) -ls
但記住,檢查文件時間所給出的統計結果是不可靠的,touch命令能夠更改任何文件的修改
時間(mtime)和訪問時間(atime).
校驗和
校驗和是一個使用數學算法生成的字符串,能夠用來判斷兩個文件是否相同,即便在一個文
件中只改動了一位,它們的校驗和也會不一樣。一般
用md5sum命令。
# md5sum xxx
文件許可
經過檢查文件許可,用戶能夠知道修改發生的時間,並判斷其行爲是合法,意外仍是惡意的,
同時肯定其對系統的影響。
生成校驗和與許可數據庫
在******系統前生成文件的校驗和,下面是一個快捷的perl腳本,可以使用戶生成自已
的文件許可和校驗和數據庫(文本)。
#!/usr/bin/perl
use MD5;
require 'find.pl';
$md5 = new MD5;
@dirs = @ARGV;
for $dir ( @dirs ) { find($dir);}
sub wanted { push @files,$name;}
for $name ( sort @files ) {
($uid,$gid) = (stat $name)[4,5];
$stat = sprintf "%0o",(stat _)[2];
unless ( -f $name ) {
printf "$stat\t$uid $gid\t\t\t\t\t\t$name\n";
next;
}
$md5->reset();
open FILE,$name or print(STDERR "Can't open file $name\n"),next;
$md5->addfile(FILE);
close FILE;
$checksum = $md5->hexdigest();
printf "$stat\t$uid $gid $checksum\t$name\n";
}
生成的數據庫儘可能不要放在本機上,要放在其它機器上或一次寫屢次讀(CDR)的機器上。
現有的文件完整性工具 Tripwire AIDE Nabou
如何知道系統什麼時候被黑
發現系統被***的方法:
一、主頁變化
二、磁盤空間的急劇減小 用df工具查看磁盤使用狀況
三、頻繁地使用網絡 使用netstat -na 或lsof輸出,檢查存在什麼鏈接
四、來自其它管理員的聯繫 當你的機器被用於***其它機器時
五、混雜模式的網絡接口 若是***想嗅探系統中可用的網絡服務,會把網絡接口設置
爲混雜模式(捕獲全部的包)。請檢查 ifconfig -a輸出的promisc以肯定接
口模式。
六、抹去/截斷的日誌文件 檢查syslog
七、被破壞的utmp/wtmp
八、系統中存在的新用戶 ***一般使用與現存的用戶名相近的名稱以減小被發現的
機會,例如與lp近似的lpr或uucp1等。或者
***方言中的名字,如t00r and own3d.
九、正在運行的陌生程序
十、不能解釋的CPU使用狀況
十一、本地用戶的遠程賬號被破解
十二、「看起來古怪」的事情
被***後應採起的措施
制止損害
一、 關閉全部網絡接口,使***對系統喪失了交互行爲的能力,但那些正在運行的進程仍然
二、 會繼續運行。
三、 將系統切換到單用戶模式,關閉全部正式的root進程和全部用戶進程,任何剩下的進程
四、 可能就來自於***。
三、使用未被損害的linux啓動盤重啓系統。以只讀模式加載系統,檢查系統,以查看***
所動的手腳。
四、進行嚴重損害的控制。
破壞估計
以只讀模式掛上全部分區,並記錄所發現的任何事情。
一、找到可疑的文件和目錄 口令文件,***工具和任何你沒有放置在系統中的目錄。這
些目錄在你重啓前多是不可見的。
二、定位新的setuserid程序 任何新的setXid程序(尤爲是屬於root的)都極有可疑。
三、檢查時間戳 檢查******以後發生變化的文件。
四、閱讀日誌文件 檢查全部日誌文件。
五、驗證校驗和 比較******先後的校驗和數據庫。
六、驗證所安裝的軟件包 確認正確的版本,***能夠把軟件降級,以讓系統使用不安
全的版本。
七、手工驗證配置文件 快速瀏覽,以肯定變化,如web以root用戶運行,或在
/etc/inetd.conf中出現了額外的服務器。
八、備份文件
九、特殊工具 有不少工具能夠幫助檢查系統,最新的是組件是coroners toolkit。
十、通知權威機構。
在線恢復
在肯定了***行爲後,有兩個選擇,一、堵上漏洞並對系統被篡改部份啓用備份;二、從新安
裝系統。最安全的方法是徹底從新安裝系統。
僅僅堵上發現的漏洞並繼續運行一般要快得多,可是,你可能並不能肯定***在系統中所作
的全部事情。***可留下在幾個月後才發做的時間×××,也可能修改了系統二進制代碼,使
其運行不穩定。所以,咱們建議的把***從系統中清除出去的最好方法以下:
一、對重要文件進行備份。
二、徹底格式化全部驅動器,(這也是對系統進行任何改變的最佳時間,例如添加硬盤或改變
分區大小,要充分利用停工期的有利條件)
三、從頭安裝linux版本,而且只包含那此必需的東西。
四、對已安裝的軟件包進行徹底升級。
五、生成校驗和並將之保存在安全的地方。
六、對配置文件進行必要的手工修改。不要僅僅從備份中複製這些文件,它們可能已經被改
變。
七、從備份中複製必要的文件。
八、從新檢查從備份中安裝的文件,確認其沒有被破壞的跡像。
九、使用另外一種方法計算文件系統的校驗和。
十、第一次啓用網絡。
對於實際或覺察到的***,經常使用的對策是取消發動***的機器與本機通訊的能力。具體作法
有以下幾種:
一、使用tcp封裝器,拒絕來自***ip的鏈接。
二、使用iptables規則,退回/拒絕來自該ip地址的包。
三、建立拒絕路由表以使本機不能和相應的ip地址通訊,此時,仍然能夠收到來自源地址的
包,但不能響應,從而破壞相互間的通訊。
四、在防火牆上建立相似的拒絕訪問列表。
第三章 對機器和網絡踩點
在線搜索
新聞組/郵件列表搜索
internet上有不少新聞組/郵件列表或論壇,是向知識淵博的人請教問題的好地方,但也可能
在徹底無心識下泄露了系統信息。好比公司的網絡拓撲結構,安全配置狀況,電話號碼,管
理員名字,我的信息等。
對策:
對所發貼子要再三審讀,刪除任何有可能被***利用的信息。或使用與系統不相關的賬號發
送郵件,好比申請的免費郵箱。
whois數據庫
ping掃射
ping掃射是指ping指定網絡中的全部ip,若是機器正在監聽ip地址,就會迴應ping。從而
就知道它處於活動狀態。有***經過這種方法列出全部正在運行的機器,而後決定***目標。
有兩種不一樣的ping主機方法:ICMP ping and echo ping。能夠用一些工具加速ping。其中兩
個最有意義:Fping and Nmap
ICMP ping方法:源機器向目的機器發送icmp echo request.若是目標機器正在運行,則會響
應icmp echo reply。
# ping -c 3 target
echo ping方法:以udp or tcp包鏈接到目標機器的回顯端口(端口7),若是機器在運行狀態,
該端口直接回顯發送過來的信息。
# telnet target.example.com echo
Fping是一個直接了當的ping工具,能夠在命令行列出須要ping的機器,也能夠用文件方
式
# Fping -a < machinelist
若是要掃描整個網絡(192.168.10.X),必須提供IP列表,在命令行用perl語句能夠容量實
現。
# perl -e 'for (1..254) {print "192.168.10.$_\n"}' |fping -a -q 2>/dev/null
Nmap是一種多用途的掃描工具,內置了ping掃描功能。
# nmap -sP 192.168.10.0/24
ping掃射對策
經過配置機器(iptables等)來拒絕進入的echo request包和出去的echo reply包。從而避免
響應icmp echo request。關閉本機回顯服務。在/etc/inetd.conf中註釋掉如下兩行
echo stream tcp nowait root internal
echo dgram udp wait root internal
再重啓inetd。
dns問題
在linux上,最好的dns服務器是bind,它有幾個版本,若是你是先鋒派,bind9.x是最佳選擇,
4.x是最穩定版本,8.x則是一個不錯的過濾,大部分站點都是用這個版本。請保持bind的
版本是最新,最爲它的安全漏洞較多,並且一旦發現漏洞,就會很被***利用。
儘可能不要在配置文件中包含hinfo and txt信息。
區域傳送
通常狀況下,爲了保證dns老是能夠,每一個域中,都有一個主dns機器,而其它都是次級dns,
每當dns區域發生變化時,次級dns機器就從主機器複製所有內容。系統成爲次級dns的方
法是在named.conf中添加以下內容:
zone "expample.com" {
type slave;
file "slave/expample.com";
masters {xxx.xxx.xxx.xxx};
};
可是***也能夠攫取區域文件(若是沒有采起措施),下例給出使用host命令列出整個域中
全部NS,A和PTR記錄的方法。
# host -t ns example.com
# host -l example.com
對策:
配置主名字服務器時,使之不容許除次級服務器外機器的區域傳送。在全局默認選項中設置
以下:
option {
....
allow-transfer {xxx.xxx.xxx.xxx};
...
}
警告:必須確保在主和從服務器上都禁止區域傳送,由於從服務器也能接受區域傳送請求。
任何未經受權的區域傳送都會被syslog記錄下來。
反解析是指從ip到域名的過程。能夠用host命令實現。若是大量使用真實的主機名,會給
***知道機器的功能。因此最好在PTR記錄中使用通常的反解析名如:
xxx-xxx-xxx-xxx.example.com.
端口掃描
***會運行一個或多個端口掃描工具來了解目標系統提供的服務。工具主要有
netcat,strobe,nmap(best)。玩轉nmap能夠學到不少東西。包括自已的系統,也包括網絡方面。
網絡漏洞掃描程序
iss,satan,Nessus
加密文件系統
CFS,TCFS,BestCrypt,PPDD,Encrypted
第四章 社交工程、特洛伊***和其餘***伎倆
第五章 物理*** 物理***小結一、不要把口令或訪問ID記在別人能夠看到的地方。二、不要把電話本,組織結構圖,備忘錄,內部手冊,會議安排或內部安全策略遺忘在容量被閱讀或偷竊的地方。三、在丟棄打印文檔,電子介質或客戶數據時必須謹慎從事,把敏感材料標記爲「敏感」,在處理前粉碎敏感的文件和手冊。抹去電子介質中的數據,而且把全部的垃圾箱放置在照明狀況良好的保護區域。四、在標記網絡設施時必須謹慎。將這些信息記錄在清楚的網絡圖中,並將其鎖起來。五、 使用好的屏幕保護程序,確保帶有口令,而且在運行時隱藏屏幕內容。將延遲時間設置六、 爲合理值---在合理時間後就運行它。六、必須離開系統時,鎖定屏幕。七、 使用便攜機時,必須儘量在全部時間都將其帶在身邊。對竊賊的那些把它從你身過度八、 開的詭計保持警戒。對進入工做場所的每一個便攜機貼上標籤,在帶離時對其進行安全檢查。八、避免使用雙重啓動系統,linux的安全性取決於機器中安裝的安全性最差的系統。九、在啓動加載時程序中設置保護口令,防止可能得到root權限的非法重啓方式。十、設置BIOS口令,以防止其被修改。11,將全部敏感系統放在加鎖的房間,以防止破壞。十二、使用好的加密文件系統能夠防止那些得到系統權限的人看到機密數據。這應看成爲安全防衛的底線。