你用chmod 000 文件 試試, 讓文件沒有任何許可權
B. Linux實用命令有哪些
1選擇
1.1一個文件的名字為rr.Z,可以用來解壓縮的命令時()
tar
gzip
compress
uncompress
1.2可以結束進程命令()
kill
ctrl+c
shutdown
halt
1.3 Linux下對文件進行歸檔的命令為:(多選)
dd
tar
zip
unzip
1.4 Linux查當前目錄下30天以前的文件並移動到/dev/null下的命令:(多選)
find.-mtime 30-type f xargs mv{}/dev/null;
find.-mtime+30-type xargs mv{}/dev/null;
find.-mtime+30-type f-exec mv{}/dev/null;
find.-mtime+30-type f-exec rm–rf{};
1.5 dstat與下面哪個命令類似
vmstat
sar
iotop
abc
1.6 rpm安裝軟體的參數
rpm-ivh
rpm-Ivh
rpm-Uvh
rpm-Iuvh
1.7 yum升級軟體包選項
rpm-uvh
rpm-Uvh
1.8查看網路流量命令是?
iftop
nsload
ifstatd
以上命令全可以
1.9停止進程的命令,除了kill還有誰?
pkill
killa
allkill
以上命令都不正確
1.10伺服器之間傳文件的命令有?
wget
scp
ftp
以上命令都可以
1.11對文件進行歸檔的命令為
dd
cpio
gzip
tar
1.12在rpm命令中,安裝新的rpm包軟體使用的參數是()
-i
-v
-h
-e
1.13命令中,使用友好的方式顯示信息的參數是()
-h
-f
-a
-t
1.14將/home/stud1/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現如此任務的tar命令格式___
tar zxvf/home/stud1/wang.tar.gz/home/wang
tar xcvf/home/stud1/wang/home/wang
tar zcv/home/stud1/wang/home/wang
tar zcvf/home/stud1/wang/home/wang.tar.gz
1.15終止一個前台進程可能用到的命令和操作()A:kill
B:CTRL+C
C:shutdown
D:halt
1.16關閉Linux系統(不重新啟動)可使用命令()
A:Ctrl+Alt+Del
B:halt
C:shutdown-r now
D:reboot
1.17下列提法中,不屬於ifconfig命令作用范圍的是__
A:配置本地環回地址
B:配置網卡的IP地址
C:激活網路適配器
D:載入網卡到內核中
1.18有關歸檔和壓縮命令,下面描述正確的是()
A:用uncompress命令解壓縮由compress命令生成地後綴為.zip的壓縮文件
B:upzip命令和gzip命令可以解壓相同類型文件
C:tar歸檔其壓縮的文件可以有gzip命令解壓縮
D:tar命令歸檔後的文件也是一種壓縮文件
1.19終止一共前台進程可能用到的命令和操作
kill
ctrl+c
shut down
halt
1.22為了將當前目錄下的歸檔文檔myftp,tar解壓縮到/tmp目錄下,用戶可以使用命令
tar xvzf myftp.tgz-C/tmp
tar xvzf myftp.tgz-R/tmp
tar vzf myftp.tgz-X/tmp
tar xvzf myftp.tgz/tmp
1.23下面有關linux查看系統負載的命令,說法錯誤的是?
uptime命令主要用於獲取主機運行時間和查詢linux系統負載等信息
vmstat命令可以查看cpu負載
sar命令可以查看網路介面信息
free命令可以查看磁碟負載情況
1.24以下哪些方式/命令不可以查看某ip是否可達?
telnet
ping
tracert
top
1.25 tar命令用於解壓的參數是?-v-x-c-f
1.26下面哪個命令不是用來查看網路故障?
telnet
ping
init
netstat
1.28為了知道誰在正注冊到你的機器上,可以用命令:___
Who users finger ping
1.29查看本網段其他計算機的MAC地址,可先ping對方主機,然後;
arp-g
arp-n
arp-a
arp-d
1.3014日下午2點date+%y%m%d%H%M輸出的時間是什麼
201711141212
1711141212
2017111412
201711021212
1.31以下哪個命令可以得出1487進程的線程運行情況()
top-Hp 1487
top-Pp 1487
ps-mp 1487
sat-p 1487
1.32從/home/oracle下搜索一個日誌文件alert.log,以下哪種方式可達到目的()
find/home./oracle-name alert.log
locate alert.log
find./-mtime 7 alert.log
find/home/oracle-exec alert.log
1.34以下哪些命令可以用來測試網路中特定主機的80埠是否可以訪問()
Ping telnet netstat lsof
2填空
2.1測試網路中主機的連通性用什麼命令
2.2如何查看numa是否關閉_**_
2.3將/home/stud1/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現如此任務的tar命令格式_**
2.4某個進程使用埠7001,如何快速找到該進程的PID
2.5結束後台進程的命令是**_**
2.6將/home/studl/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此存到/home目錄下,實現此任務的tar命令格式******__******
2.7 ping100個包的命令——
2.8 linux下,解壓縮bz2格式文件的命令是**_**
2.9 linux下,查看網路連接狀態的命令是**___**
2.10Linux查看文件系統的命令為__,顯示目錄或文件佔用磁碟的命令為___
2.11通常我們測試網路連通性使用的ping命令,它是通過____協議進行工作的
2.12簡述下列命令的各自作用
nslookup
dig
top
traceroute
2.13將/home/stud1/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此問價保存到/home目錄下,實現此任務的tar命令格****_****
2.14Linux系統查看進程數的命令___
2.15Linux系統查看系統內存的命令:____,**__**
2.16Linux系統查看cpu使用率的命令:____,**__**
2.17Linux系統查看硬碟空間使用率的命令:___
2.18Linux系統將某一文件下的所有.log文件進行打包壓縮,命令為___
2.19Linux常用的性能監控命令是:_、_、_、_、_、_等
2.20假設output程序可能輸出標准輸出和標准錯誤,請寫出一條命令把這兩者都忽略__
2.21 rpm軟體包安裝命令**_**
3簡答
3.1查看硬碟結構顯示的命令?查看文檔命令?編輯文檔命令?
3.2配置網路環境的命令,手工修改IP,主機名,DNS和網關
3.3有壓縮包a.tar.gz,如何解壓該包?如何不解壓該包,如何查看該包的內容?
3.4某進程abcd在系統中起了很多,數量難以統計,造成系統負荷較高,如何一條命令確保將此進程全部殺掉
3.5某日誌路徑是/data/logs/a.txt,如何跟蹤該日誌,以查看當時的運行狀態?
3.6 dmesg命令顯示的是哪方面信息
3.7尋找名稱為mytest.log的文件
3.8寫出-sh與df-h的區別
3.9查看當前linux伺服器是否監聽80埠,如果監聽,請找出其進程ID,並結束該進程。
3.10使用curl或者wget獲取http服務的header信息。
3.11寫出查看linux系統性能的命令,如cpu、內存、流量、io等
3.12解釋下列命令的意思
dd if=/dev/random of=/dev/sda
3.13如何查看佔用埠8080的進程
3.14查著佔用內存最多的進程
3.15壓縮和解壓縮目錄/opt/gjsy/所有文件命令
3.16Linxu系統下如何查看8080埠上運行的程序狀態
3.17ps aux中的VSZ代表什麼意思,RSS代表什麼意思?
3.18PING是使用TCP/IP協議中的**_**協議
3.19寫出網路故障排查常用的命令**__**
3.20寫出你常用的網路抓包工具,軟體名稱**__**
3.21將/home/stud1/wang目錄做歸檔壓縮,壓縮後生成wang.tar.gz文件,並將此文件保存到/home目錄下,實現此任務的tar命令格式___
3.22解釋該命令的含義:nohup zcat test.gz|grep"x6game">~/log.txt
2>/dev/null&
3.23查看系統硬體負載工具或命令有哪些
3.24使用lsof命令查看佔用80埠的進程
3.25如何使用CURL測試POST介面
3.26怎樣在目錄/home/user/training/下找到擴展名為txt的文件
3.27最常用的網路測試命令有什麼?
3.28ping的測試結果中都包含哪些部分?
3.29如何找出佔用22埠的進程及進程號?
3.30如何刪除當前目錄(包含字目錄)下所有30天以前創建的文件名後綴為.log的文件
3.31以下一些Linux命令的作用分別是什麼?
init 0
chkconfig--level 3 sendmail on
tar-czvf test.tar.gz./
chown-R
ln-s/data/log//var/log/sina_log
umount-f/data0
rpm-ivh hui.rpm
rpm-qf/bin/ls
3.32LINUX常用命令pwd、top、df、ifconfig、cat分別代表什麼含義?
3.33linux常用命令:關機、重啟、編輯某文檔文件、刪除某文件、更改操作系統密碼命令分別是什麼?
3.34請使用命令:刪除/backup目錄下10天前的普通文件
3.35如何查看伺服器當前連接ip的列表
3.36寫出liunx系統中diff、chmod、grep、kill、tar五個常用命令的功能
3.37簡述tar-cjvf/tmp/test.tar.gz/root命令中錯誤及錯誤原因
3.38Linux系統從A伺服器測試B伺服器一個tcp埠是否聯通使用___
3.39寫一個腳本查找最後創建時間使3天前,後綴是*.log的文件並刪除
3.40linux如何根據進程ID查找啟動程序的路徑
3.41查看佔用swap的進程id
3.42列出linux常見打包工具並寫相應解壓縮參數(至少三種)
3.43Linux中鎖定一個文件用什麼命令?他和md5sum有什麼區別?
3.44如何在系統中查找所有所屬用戶為user1的文件
3.45查看某個文件或者文件夾佔用磁碟空間大小的命令
3.46如何查看遠程linux系統運行了多少時間?我的伺服器內存,cpu,硬碟都是多少,系統版本,linux會優先將數據緩存到內存中,我的機器真實內存消耗實際上是多少
3.47查看伺服器當前開啟了哪些埠?如何查看某伺服器是否存在IO壓力
3.48如何查看某個文件system.log被哪些進程佔用
擴展
1.21在退出unix系統賬戶之後還需要繼續運行某個進程,那麼可用()
awk sed crontab nohup screen
1.20使用trace命令的目的是()
可用的,十分成功的測試手段
非常基本的測試手段
把IP地址和DNS加入路由表中
在源到目標傳輸的過程中查找失散點
1.27哪個變數用來指定一個遠程x應用程序將輸出放到哪個x server上
TERM
DISPLAY
ECHO
OUTPUT
1.33P系列伺服器被用做文件伺服器,所有的用戶文件存都放在一非rootvg的文件系統上,用什麼方法可以快速備份和恢復這些數據和文件系統的定義()
tar
cpio
savefs
savevg
C. Linux系統優化的12個步驟是什麼
Linux系統優化的12個步驟:
1、登錄系統。
2、禁止SSH遠程。
3、時間同步。
4、配置yum更新源。
5、關閉selinux及iptables。
6、調整文件描述符數量。
7、定時自動清理/var/spool/clientmquene/目錄垃圾文件。
8、精簡開機啟動服務。
9、Linux內核參數優化/etc/sysctl.conf,執行sysct -p生效。
10、更改字元集,防止亂碼問題出現。
11、鎖定關鍵系統文件。
12、清空/etc/issue,去除系統及內核版本登陸前的屏幕顯示。
D. linux文件鎖定被使用
一、什麼是文件鎖定
對於鎖這個字,大家一定不會陌生,因為我們生活中就存在著大量的鎖,它們各個方面發揮著它的作用,現在世界中的鎖的功能都可歸結為一句話,就是阻止某些人做某些事,例如,門鎖就是阻止除了屋主之外的人進入這個房子,你進入不到這個房子,也就不能使用房子裡面的東西。
而因為程序經常需要共享數據,而這通常又是通過文件來實現的,試想一個情況,A進程正在對一個文件進行寫操作,而另一個程序B需要對同一個文件進行讀操作,並以讀取到的數據作為自己程序運行時所需要的數據,這會發生什麼情況呢?進程B可能會讀到錯亂的數據,因為它並不知道另一個進程A正在改寫這個文件中的數據。
為了解決類似的問題,就出現了文件鎖定,簡單點來說,這是文件的一種安全的更新方式,當一個程序正在對文件進行寫操作時,文件就會進入一種暫時狀態,在這個狀態下,如果另一個程序嘗試讀這個文件,它就會自動停下來等待這個狀態結束。Linux系統提供了很多特性來實現文件鎖定,其中最簡單的方法就是以原子操作的方式創建鎖文件。
用回之前的例子就是,文件鎖就是當文件在寫的時候,阻止其他的需要寫或者要讀文件的進程來操作這個文件。
二、創建鎖文件
創建一個鎖文件是非常簡單的,我們可以使用open系統調用來創建一個鎖文件,在調用open時oflags參數要增加參數O_CREAT和O_EXCL標志,如file_desc = open("/tmp/LCK.test", O_RDWR|O_CREAT|O_EXCL, 0444);就可以創建一個鎖文件/tmp/LCK.test。O_CREAT|O_EXCL,可以確保調用者可以創建出文件,使用這個模式可以防止兩個程序同時創建同一個文件,如果文件(/tmp/LCK.test)已經存在,則open調用就會失敗,返回-1。
如果一個程序在它執行時,只需要獨占某個資源一段很短的時間,這個時間段(或代碼區)通常被叫做臨界區,我們需要在進入臨界區之前使用open系統調用創建鎖文件,然後在退出臨界區時用unlink系統調用刪除這個鎖文件。
注意:鎖文件只是充當一個指示器的角色,程序間需要通過相互協作來使用它們,也就是說鎖文件只是建議鎖,而不是強制鎖,並不會真正阻止你讀寫文件中的數據。
可以看看下面的例子:源文件文件名為filelock1.c,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <errno.h> int main() { const char *lock_file = "/tmp/LCK.test1"; int n_fd = -1; int n_tries = 10; while(n_tries--) { //創建鎖文件 n_fd = open(lock_file, O_RDWR|O_CREAT|O_EXCL, 0444); if(n_fd == -1) { //創建失敗 printf("%d - Lock already present ", getpid()); sleep(2); } else { //創建成功 printf("%d - I have exclusive access ", getpid()); sleep(1); close(n_fd); //刪除鎖文件,釋放鎖 unlink(lock_file); sleep(2); } } return 0; }
同時運行同一個程序的兩個實例,運行結果為:
從運行的結果可以看出兩個程序交叉地對對文件進行鎖定,但是真實的操作卻是,每次調用open函數去檢查/tmp/LCK.test1這個文件是否存在,如果存在open調用就失敗,顯示有進程已經把這個文件鎖定了,如果這個文件不存在,就創建這個文件,並顯示許可信息。但是這種做法有一定的缺憾,我們可以看到文件/tmp/LCK.test1被創建了很多次,也被unlink刪除了很多次,也就是說我們不能使用已經事先有數據的文件作為這種鎖文件,因為如果文件已經存在,則open調用總是失敗。
給我的感覺是,這更像是一種對進程工作的協調性安排,更像是二進制信號量的作用,文件存在為0,不存在為1,而不是真正的文件鎖定。
三、區域鎖定
我們還有一個問題,就是如果同一個文件有多個進程需要對它進行讀寫,而一個文件同一時間只能被一個進程進行寫操作,但是多個進程讀寫的區域互不相關,如果總是要等一個進程寫完其他的進程才能對其進行讀寫,效率又太低,那麼是否可以讓多個進程同時對文件進行讀寫以提高數據讀寫的效率呢?
為了解決上面提到的問題,和出現在第二點中的問題,即不能把文件鎖定到指定的已存在的數據文件上的問題,我們提出了一種新的解決方案,就是區域鎖定。
簡單點來說,區域鎖定就是,文件中的某個部分被鎖定了,但其他程序可以訪問這個文件中的其他部分。
然而,區域鎖定的創建和使用都比上面說的文件鎖定復雜很多。
1、創建區域鎖定
在Linux上為實現這一功能,我們可以使用fcntl系統調用和lockf調用,但是下面以fcntl系統調用來講解區域鎖定的創建。
fctnl的函數原理為:
int fctnl(int fildes, int command, ...);
它對一個打開的文件描述進行操作,並能根據command參數的設置完成不同的任務,它有三個可選的任務:F_GETLK,F_SETLK,F_SETLKW,至於這三個參數的意義下面再詳述。而當使用這些命令時,fcntl的第三個參數必須是一個指向flock結構的指針,所以在實際應用中,fctnl的函數原型一般為:int fctnl(int fildes, int command, struct flock *flock_st);
2、flock結構
准確來說,flock結構依賴具體的實現,但是它至少包括下面的成員:
short l_type;文件鎖的類型,對應於F_RDLCK(讀鎖,也叫共享鎖),F_UNLCK(解鎖,也叫清除鎖),F_WRLCK(寫鎖,也叫獨占鎖)中的一個。
short l_whence;從文件的哪個相對位置開始計算,對應於SEEK_SET(文件頭),SEEK_CUR(當前位置),SEEK_END(文件尾)中的一個。
off_t l_start;從l_whence開始的第l_start個位元組開始計算。
off_t l_len;鎖定的區域的長度。
pid_t l_pid;用來記錄參持有鎖的進程。
成員l_whence、l_start和l_len定義了一個文件中的一個區域,即一個連續的位元組集合,例如:
struct flock region;
region.l_whence = SEEK_SET;
region.l_start = 10;
region.l_len = 20;
則表示fcntl函數操作鎖定的區域為文件頭開始的第10到29個位元組之間的這20個位元組。
3、文件鎖的類型
從上面的flock的成員l_type的取值我們可以知道,文件鎖的類型主要有三種,這里對他們進行詳細的解說。
F_RDLCK:
從它的名字我們就可以知道,它是一個讀鎖,也叫共享鎖。許多不同的進程可以擁有文件同一(或重疊)區域上的讀(共享)鎖。而且只要任一進程擁有一把讀(共享)鎖,那麼就沒有進程可以再獲得該區域上的寫(獨占)鎖。為了獲得一把共享鎖,文件必須以「讀」或「讀/寫」方式打開。
簡單點來說就是,當一個進程在讀文件中的數據時,文件中的數據不能被改變或改寫,這是為了防止數據被改變而使讀數據的程序讀取到錯亂的數據,而文件中的同一個區域能被多個進程同時讀取,這是容易理解的,因為讀不會破壞數據,或者說讀操作不會改變文件的數據。
F_WRLCK:
從它的名字,我們就可以知道,它是一個寫鎖,也叫獨占鎖。只有一個進程可以在文件中的任一特定區域擁有一把寫(獨占)鎖。一旦一個進程擁有了這樣一把鎖,任何其他進程都無法在該區域上獲得任何類型的鎖。為了獲得一把寫(獨占)鎖,文件也必須以「讀」或「讀/寫」方式打開。
簡單點來說,就是一個文件同一區域(或重疊)區域進在同一時間,只能有一個進程能對其進行寫操作,並且在寫操作進行期間,其他的進程不能對該區域進行讀取數據。這個要求是顯然易見的,因為如果兩個進程同時對一個文件進行寫操作,就會使文件的內容錯亂起來,而由於寫時會改變文件中的數據,所以它也不允許其他進程對文件的數據進行讀取和刪除文件等操作。
F_UNLCK:
從它的名字就可以知道,它用於把一個鎖定的區域解鎖。
4、不同的command的意義
在前面說到fcntl函數的command參數時,說了三個命令選項,這里將對它們進行詳細的解說。
F_GETLK命令,它用於獲取fildes(fcntl的第一個參數)打開的文件的鎖信息,它不會嘗試去鎖定文件,調用進程可以把自己想創建的鎖類型信息傳遞給fcntl,函數調用就會返回將會阻止獲取鎖的任何信息,即它可以測試你想創建的鎖是否能成功被創建。fcntl調用成功時,返回非-1,如果鎖請求可以成功執行,flock結構將保持不變,如果鎖請求被阻止,fcntl會用相關的信息覆蓋flock結構。失敗時返回-1。
所以,如果調用成功,調用程序則可以通過檢查flock結構的內容來判斷其是否被修改過,來檢查鎖請求能否被成功執行,而又因為l_pid的值會被設置成擁有鎖的進程的標識符,所以大多數情況下,可以通過檢查這個欄位是否發生變化來判斷flock結構是否被修改過。
使用F_GETLK的fcntl函數調用後會立即返回。
舉個例子來說,例如,有一個flock結構的變數,flock_st,flock_st.l_pid = -1,文件的第10~29個位元組已經存在一個讀鎖,文件的第40~49個位元組中已經存在一個寫鎖,則調用fcntl時,如果用F_GETLK命令,來測試在第10~29個位元組中是否可以創建一個讀鎖,因為這個鎖可以被創建,所以,fcntl返回非-1,同時,flock結構的內容也不會改變,flock_st.l_pid = -1。而如果我們測試第40~49個位元組中是否可以創建一個寫鎖時,由於這個區域已經存在一個寫鎖,測試失敗,但是fcntl還是會返回非-1,只是flock結構會被這個區域相關的鎖的信息覆蓋了,flock_st.l_pid為擁有這個寫鎖的進程的進程標識符。
F_SETLK命令,這個命令試圖對fildes指向的文件的某個區域加鎖或解鎖,它的功能根據flock結構的l_type的值而定。而對於這個命令來說,flock結構的l_pid欄位是沒有意義的。如果加鎖成功,返回非-1,如果失敗,則返回-1。使用F_SETLK的fcntl函數調用後會立即返回。
F_SETLKW命令,這個命令與前面的F_SETLK,命令作用相同,但不同的是,它在無法獲取鎖時,即測試不能加鎖時,會一直等待直到可以被加鎖為止。
5、例子
看了這么多的說明,可能你已經很亂了,就用下面的例子來整清你的思想吧。
源文件名為filelock2.c,用於創建數據文件,並將文件區域加鎖,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開一個文件描述符 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //給文件添加100個『A』字元的數據 for(byte_count = 0; byte_count < 100; ++byte_count) { write(file_desc, byte_to_write, 1); } //在文件的第10~29位元組設置讀鎖(共享鎖) region_1.l_type = F_RDLCK; region_1.l_whence = SEEK_SET; region_1.l_start = 10; region_1.l_len = 20; //在文件的40~49位元組設置寫鎖(獨占鎖) region_2.l_type = F_WRLCK; region_2.l_whence = SEEK_SET; region_2.l_start = 40; region_2.l_len = 10; printf("Process %d locking file ", getpid()); //鎖定文件 res = fcntl(file_desc, F_SETLK, ®ion_1); if(res == -1) { fprintf(stderr, "Failed to lock region 1 "); } res = fcntl(file_desc, F_SETLK, ®ion_2); if(res == -1) { fprintf(stderr, "Failed to lock region 2 "); } //讓程序休眠一分鍾,用於測試 sleep(60); printf("Process %d closing file ", getpid()); close(file_desc); exit(EXIT_SUCCESS); }
下面的源文件filelock3.c用於測試上一個文件設置的鎖,測試可否對兩個區域都加上一個讀鎖,代碼如下:
#include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> int main() { const char *test_file = "test_lock.txt"; int file_desc = -1; int byte_count = 0; char *byte_to_write = "A"; struct flock region_1; struct flock region_2; int res = 0; //打開數據文件 file_desc = open(test_file, O_RDWR|O_CREAT, 0666); if(!file_desc) { fprintf(stderr, "Unable to open %s for read/write ", test_file); exit(EXIT_FAILURE); } //設置區域1的鎖類型 struct flock region_test1; region_test1.l_type = F_RDLCK; region_test1.l_whence = SEEK_SET; region_test1.l_start = 10; region_test1.l_len = 20; region_test1.l_pid = -1; //設置區域2的鎖類型 struct flock region_test2; region_test2.l_type = F_RDLCK; region_test2.l_whence = SEEK_SET; region_test2.l_start = 40; region_test2.l_len = 10; region_test2.l_pid = -1; //
三、解空鎖問題
如果我要給在本進程中沒有加鎖的區域解鎖會發生什麼事情呢?而如果這個區域中其他的進程有對其進行加鎖又會發生什麼情況呢?
如果一個進程實際並未對一個區域進行鎖定,而調用解鎖操作也會成功,但是它並不能解其他的進程加在同一區域上的鎖。也可以說解鎖請求最終的結果取決於這個進程在文件中設置的任何鎖,沒有加鎖,但對其進行解鎖得到的還是沒有加鎖的狀態。
E. Linux文件相關命令
grep命令:
grep命令是非常重要的命令,可以對文本進行查找和搜索
常用參數如下:
常用實例:
1、在多個文件中查找:
grep "file" file_1 file_2 file_3
2、輸出除之外的所有行 -v 選項:
grep -v "file" file_name
3、標記匹配顏色 --color=auto 選項:
grep "file" file_name --color=auto
4、使用正則表達式 -E 選項:
grep -E "[1-9]+"
egrep "[1-9]+"
5、只輸出文件中匹配到的部分 -o 選項:
echo this is a test line. | grep -o -E "[a-z]+."
line.
echo this is a test line. | egrep -o "[a-z]+."
line.
6、統計文件或者文本中包含匹配字元串的行數-c 選項:
grep -c "text" file_name
2
7、輸出包含匹配字元串的行數 -n 選項:
grep "text" -n file_name
或
cat file_name | grep "text" -n
8、多個文件
grep "text" -n file_1 file_2
9、搜索多個文件並查找匹配文本在哪些文件中:
grep -l "text" file1 file2 file3...
10、grep遞歸搜索文件
在多級目錄中對文本進行遞歸搜索:
grep "text" . -r -n
11、忽略匹配樣式中的字元大小寫:
echo "hello world" | grep -i "HELLO"
hello
12、選項 -e 指定多個匹配樣式:
echo this is a text line | grep -e "is" -e "line" -o
is
line
13、也可以使用 -f 選項來匹配多個樣式,在樣式文件中逐行寫出需要匹配的字元。
cat patfile
aaa
bbb
echo aaa bbb ccc ddd eee | grep -f patfile -o
14、在grep搜索結果中包括或者排除指定文件:
只在目錄中所有的.php和.html文件中遞歸搜索字元"main()"
grep "main()" . -r --include *.{php,html}
15、在搜索結果中排除所有README文件
grep "main()" . -r --exclude "README"
16、在搜索結果中排除filelist文件列表裡的文件
grep "main()" . -r --exclude-from filelist
touch abc.txt 創建一個名為abc.txt的文件
touch -r 指定文件時間與參考文件相同
touch -t 201608012234.55[yyyymmddhhmm.ss] abc.txt 更改文件為指定的時間
touch temp 創建一個名為temp的文件
vi編輯器有三種模式,命令行模式、編輯模式、底行模式。
vi 文件名進入命令行模式,Insert進入編輯模式,編輯完成Esc退出編輯模式,:wq進入底行模式並保存修改,:q直接退出保存。
tar命令用於打包壓縮文件,常用的壓縮命令還有bzip2,gzip
bunzip2 file1.bz2 解壓一個叫做 'file1.bz2'的文件
bzip2 file1 壓縮一個叫做 'file1' 的文件
gunzip file1.gz 解壓一個叫做 'file1.gz'的文件
gzip file1 壓縮一個叫做 'file1'的文件
gzip -9 file1 最大程度壓縮
rar a file1.rar test_file 創建一個叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 同時壓縮 'file1', 'file2' 以及目錄 'dir1'
rar x file1.rar 解壓rar包
unrar x file1.rar 解壓rar包
tar -cvf archive.tar file1 創建一個非壓縮的 tarball
tar -cvf archive.tar file1 file2 dir1 創建一個包含了 'file1', 'file2' 以及 'dir1'的檔案文件
tar -tf archive.tar 顯示一個包中的內容
tar -xvf archive.tar 釋放一個包
tar -xvf archive.tar -C /tmp 將壓縮包釋放到 /tmp目錄下
tar -cvfj archive.tar.bz2 dir1 創建一個bzip2格式的壓縮包
tar -xvfj archive.tar.bz2 解壓一個bzip2格式的壓縮包
tar -cvfz archive.tar.gz dir1 創建一個gzip格式的壓縮包
tar -xvfz archive.tar.gz 解壓一個gzip格式的壓縮包
zip file1.zip file1 創建一個zip格式的壓縮包
zip -r file1.zip file1 file2 dir1 將幾個文件和目錄同時壓縮成一個zip格式的壓縮包
unzip file1.zip 解壓一個zip格式壓縮包
which命令用於用戶查找命令所有路徑
命令格式
file命令用於獲取文件屬性
命令格式
file 文件名或目錄名
命令示例:
使用說明
命令格式:cat [-AbeEnstTuv] [--help] [--version] fileName
cat file1 從第一個位元組開始正向查看文件的內容
-n 或 --number:由 1 開始對所有輸出的行數編號。
-b 或 --number-nonblank:和 -n 相似,只不過對於空白行不編號。
-s 或 --squeeze-blank:當遇到有連續兩行以上的空白行,就代換為一行的空白行。
-v 或 --show-nonprinting:使用 ^ 和 M- 符號,除了 LFD 和 TAB 之外。
-E 或 --show-ends : 在每行結束處顯示 $。
-T 或 --show-tabs: 將 TAB 字元顯示為 ^I。
-A, --show-all:等價於 -vET。
-e:等價於"-vE"選項;
-t:等價於"-vT"選項;
使用示例
把 textfile1 的文檔內容加上行號後輸入 textfile2 這個文檔里
cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文檔內容加上行號(空白行不加)之後將內容附加到 textfile3 文檔里
cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文檔內容
cat /dev/null > /etc/test.txt
tac [filename]
從最後一行開始反向查看一個文件的內容,ac與cat命令剛好相反,文件內容從最後一行開始顯示,可以看出 tac 是 cat 的倒著寫。
nl [-bnw] 文件
選項與參數:
-b: 指定行號指定的方式,主要有兩種:
-b a :表示不論是否為空行,也同樣列出行號(類似 cat -n);
-b t :如果有空行,空的那一行不要列出行號(默認值);
-n :列出行號表示的方法,主要有三種:
-n ln :行號在熒幕的最左方顯示;
-n rn :行號在自己欄位的最右方顯示,且不加 0 ;
-n rz :行號在自己欄位的最右方顯示,且加 0 ;
-w :行號欄位的佔用的位數。
more file1 查看一個長文件的內容,支持一頁一頁翻動
運行的時候,支持以下幾個按鍵:
空白鍵 (space):代表向下翻一頁;
Enter :代表向下翻『一行』;
/字串 :代表在這個顯示的內容當中,向下搜尋『字串』這個關鍵字;
:f :立刻顯示出檔名以及目前顯示的行數;
q :代表立刻離開 more ,不再顯示該文件內容。
b 或 [ctrl]-b :代表往回翻頁,不過這動作只對文件有用,對管線無用。
less file1 類似於 'more' 命令,但是它允許在文件中和正向操作一樣的反向操作
less運行時可以輸入的命令有:
空白鍵 :向下翻動一頁;
[pagedown]:向下翻動一頁;
[pageup] :向上翻動一頁;
/字串 :向下搜尋『字串』的功能;
?字串 :向上搜尋『字串』的功能;
n :重復前一個搜尋 (與 / 或 ? 有關!)
N :反向的重復前一個搜尋 (與 / 或 ? 有關!)
q :離開 less 這個程序;
head [-n number]
head -2 file1 查看一個文件的前兩行
tail [-n number]
tail -2 file1 查看一個文件的最後兩行
tail -f /var/log/messages 實時查看被添加到一個文件中的內容
文件許可權列中三位為一組,分別代表相關的用戶、組、其它用戶的許可權
許可權列中三位為一組,分別代表相關的用戶、組、其它用戶的許可權
所以修改許可權可以分別修改或一同修改,系統中許可權分為數字許可權與字元許可權
數字許可權:r=4,w=2,x=1
字元許可權:+ 增加 -去除 a取消所有加上給定的
修改許可權的命令chmod,命令格式:
chmod 許可權 文件名或目錄名 修改許可權格式
chmod -R 許可權 目錄名 遞歸將目錄及其下面所有內容許可權全部修改
chown 改變文件或目錄的屬主(所有者)
chown 用戶名 文件名或目錄名
chown 用戶名.組名 文件名或目錄名
修改所屬組也可用chgrp 命令來完成
當你用ls -l 查看到文件的屬主、屬組為數字時,就表明該文件的創建用戶已被刪除。
文件的特殊許可權
chattr +i(-i) 文件名 鎖定文件(取消鎖定)不可刪除與清空
chattr +a(-a) 文件名 添加內容(只可添加內容)
使用lsattr 文件名 查看文件的特殊許可權
由此可以看出
root用戶默認創建的目錄許可權是755,文件許可權是644
普通用戶默認創建的目錄許可權是775,文件許可權是664
這也是系統默認的比較安全的許可權分配,其實這些默認許可權全部都是由umask值來決定的
系統規定了
文件的許可權值是從666開始計算(默認許可權=許可權值-umask值)
目錄的許可權值是從777開始計算(默認許可權=許可權值-umask值)
文件1的許可權=444 (666-232=434——43(3+1)4)
F. 如何提高linux伺服器的安全策略
安全是IT行業一個老生常談的話題了,處理好信息安全問題已變得刻不容緩。做為運維人員,就必須了解一些安全運維准則,同時,要保護自己所負責的業務,首先要站在攻擊者的角度思考問題,修補任何潛在的威脅和漏洞。主要分五部分展開:賬戶和登錄安全賬戶安全是系統安全的第一道屏障,也是系統安全的核心,保障登錄賬戶的安全,在一定程度上可以提高伺服器的安全級別,下面重點介紹下Linux系統登錄賬戶的安全設置方法。
1、刪除特殊的賬戶和賬戶組 Linux提供了各種不同角色的系統賬號,在系統安裝完成後,默認會安裝很多不必要的用戶和用戶組,如果不需要某些用戶或者組,就要立即刪除它,因為賬戶越多,系統就越不安全,很可能被黑客利用,進而威脅到伺服器的安全。
Linux系統中可以刪除的默認用戶和組大致有如下這些:
可刪除的用戶,如adm,lp,sync,shutdown,halt,news,uucp,operator,games,gopher等。
可刪除的組,如adm,lp,news,uucp,games,dip,pppusers,popusers,slipusers等。
2、關閉系統不需要的服務Linux在安裝完成後,綁定了很多沒用的服務,這些服務默認都是自動啟動的。對於伺服器來說,運行的服務越多,系統就越不安全,越少服務在運行,安全性就越好,因此關閉一些不需要的服務,對系統安全有很大的幫助。具體哪些服務可以關閉,要根據伺服器的用途而定,一般情況下,只要系統本身用不到的服務都認為是不必要的服務。例如:某台Linux伺服器用於www應用,那麼除了httpd服務和系統運行是必須的服務外,其他服務都可以關閉。下面這些服務一般情況下是不需要的,可以選擇關閉: anacron、auditd、autofs、avahi-daemon、avahi-dnsconfd、bluetooth、cpuspeed、firstboot、gpm、haldaemon、hidd、ip6tables、ipsec、isdn、lpd、mcstrans、messagebus、netfs、nfs、nfslock、nscd、pcscd portmap、readahead_early、restorecond、rpcgssd、rpcidmapd、rstatd、sendmail、setroubleshoot、yppasswdd ypserv
3、密碼安全策略在Linux下,遠程登錄系統有兩種認證方式:密碼認證和密鑰認證。密碼認證方式是傳統的安全策略,對於密碼的設置,比較普遍的說法是:至少6個字元以上,密碼要包含數字、字母、下劃線、特殊符號等。設置一個相對復雜的密碼,對系統安全能起到一定的防護作用,但是也面臨一些其他問題,例如密碼暴力破解、密碼泄露、密碼丟失等,同時過於復雜的密碼對運維工作也會造成一定的負擔。密鑰認證是一種新型的認證方式,公用密鑰存儲在遠程伺服器上,專用密鑰保存在本地,當需要登錄系統時,通過本地專用密鑰和遠程伺服器的公用密鑰進行配對認證,如果認證成功,就成功登錄系統。這種認證方式避免了被暴力破解的危險,同時只要保存在本地的專用密鑰不被黑客盜用,攻擊者一般無法通過密鑰認證的方式進入系統。因此,在Linux下推薦用密鑰認證方式登錄系統,這樣就可以拋棄密碼認證登錄系統的弊端。Linux伺服器一般通過SecureCRT、putty、Xshell之類的工具進行遠程維護和管理,密鑰認證方式的實現就是藉助於SecureCRT軟體和Linux系統中的SSH服務實現的。
4、合理使用su、sudo命令su命令:是一個切換用戶的工具,經常用於將普通用戶切換到超級用戶下,當然也可以從超級用戶切換到普通用戶。為了保證伺服器的安全,幾乎所有伺服器都禁止了超級用戶直接登錄系統,而是通過普通用戶登錄系統,然後再通過su命令切換到超級用戶下,執行一些需要超級許可權的工作。通過su命令能夠給系統管理帶來一定的方便,但是也存在不安全的因素,例如:系統有10個普通用戶,每個用戶都需要執行一些有超級許可權的操作,就必須把超級用戶的密碼交給這10個普通用戶,如果這10個用戶都有超級許可權,通過超級許可權可以做任何事,那麼會在一定程度上對系統的安全造成了威協。因此su命令在很多人都需要參與的系統管理中,並不是最好的選擇,超級用戶密碼應該掌握在少數人手中,此時sudo命令就派上用場了。sudo命令:允許系統管理員分配給普通用戶一些合理的「權利」,並且不需要普通用戶知道超級用戶密碼,就能讓他們執行一些只有超級用戶或其他特許用戶才能完成的任務。比如:系統服務重啟、編輯系統配置文件等,通過這種方式不但能減少超級用戶登錄次數和管理時間,也提高了系統安全性。因此,sudo命令相對於許可權無限制性的su來說,還是比較安全的,所以sudo也被稱為受限制的su,另外sudo也是需要事先進行授權認證的,所以也被稱為授權認證的su。
sudo執行命令的流程是:將當前用戶切換到超級用戶下,或切換到指定的用戶下,然後以超級用戶或其指定切換到的用戶身份執行命令,執行完成後,直接退回到當前用戶,而這一切的完成要通過sudo的配置文件/etc/sudoers來進行授權。
sudo設計的宗旨是:賦予用戶盡可能少的許可權但仍允許它們完成自己的工作,這種設計兼顧了安全性和易用性,因此,強烈推薦通過sudo來管理系統賬號的安全,只允許普通用戶登錄系統,如果這些用戶需要特殊的許可權,就通過配置/etc/sudoers來完成,這也是多用戶系統下賬號安全管理的基本方式。
5、刪減系統登錄歡迎信息 系統的一些歡迎信息或版本信息,雖然能給系統管理者帶來一定的方便,但是這些信息有時候可能被黑客利用,成為攻擊伺服器的幫凶,為了保證系統的安全,可以修改或刪除某些系統文件,需要修改或刪除的文件有4個,分別是:/etc/issue、/etc/issue.net、/etc/redhat-release和/etc/motd。/etc/issue和/etc/issue.net文件都記錄了操作系統的名稱和版本號,當用戶通過本地終端或本地虛擬控制台等登錄系統時,/etc/issue的文件內容就會顯示,當用戶通過ssh或telnet等遠程登錄系統時,/etc/issue.net文件內容就會在登錄後顯示。在默認情況下/etc/issue.net文件的內容是不會在ssh登錄後顯示的,要顯示這個信息可以修改/etc/ssh/sshd_config文件,在此文件中添加如下內容即可:Banner /etc/issue.net其實這些登錄提示很明顯泄漏了系統信息,為了安全起見,建議將此文件中的內容刪除或修改。/etc/redhat-release文件也記錄了操作系統的名稱和版本號,為了安全起見,可以將此文件中的內容刪除/etc/motd文件是系統的公告信息。每次用戶登錄後,/etc/motd文件的內容就會顯示在用戶的終端。通過這個文件系統管理員可以發布一些軟體或硬體的升級、系統維護等通告信息,但是此文件的最大作用就、是可以發布一些警告信息,當黑客登錄系統後,會發現這些警告信息,進而產生一些震懾作用。看過國外的一個報道,黑客入侵了一個伺服器,而這個伺服器卻給出了歡迎登錄的信息,因此法院不做任何裁決。
遠程訪問和認證安全
1、遠程登錄取消telnet而採用SSH方式 telnet是一種古老的遠程登錄認證服務,它在網路上用明文傳送口令和數據,因此別有用心的人就會非常容易截獲這些口令和數據。而且,telnet服務程序的安全驗證方式也極其脆弱,攻擊者可以輕松將虛假信息傳送給伺服器。現在遠程登錄基本拋棄了telnet這種方式,而取而代之的是通過SSH服務遠程登錄伺服器。
2、合理使用Shell歷史命令記錄功能 在Linux下可通過history命令查看用戶所有的歷史操作記錄,同時shell命令操作記錄默認保存在用戶目錄下的.bash_history文件中,通過這個文件可以查詢shell命令的執行歷史,有助於運維人員進行系統審計和問題排查,同時,在伺服器遭受黑客攻擊後,也可以通過這個命令或文件查詢黑客登錄伺服器所執行的歷史命令操作,但是有時候黑客在入侵伺服器後為了毀滅痕跡,可能會刪除.bash_history文件,這就需要合理的保護或備份.bash_history文件。
3、啟用tcp_wrappers防火牆Tcp_Wrappers是一個用來分析TCP/IP封包的軟體,類似的IP封包軟體還有iptables。Linux默認都安裝了Tcp_Wrappers。作為一個安全的系統,Linux本身有兩層安全防火牆,通過IP過濾機制的iptables實現第一層防護。iptables防火牆通過直觀地監視系統的運行狀況,阻擋網路中的一些惡意攻擊,保護整個系統正常運行,免遭攻擊和破壞。如果通過了第一層防護,那麼下一層防護就是tcp_wrappers了。通過Tcp_Wrappers可以實現對系統中提供的某些服務的開放與關閉、允許和禁止,從而更有效地保證系統安全運行。
文件系統安全
1、鎖定系統重要文件系統運維人員有時候可能會遇到通過root用戶都不能修改或者刪除某個文件的情況,產生這種情況的大部分原因可能是這個文件被鎖定了。在Linux下鎖定文件的命令是chattr,通過這個命令可以修改ext2、ext3、ext4文件系統下文件屬性,但是這個命令必須有超級用戶root來執行。和這個命令對應的命令是lsattr,這個命令用來查詢文件屬性。對重要的文件進行加鎖,雖然能夠提高伺服器的安全性,但是也會帶來一些不便。例如:在軟體的安裝、升級時可能需要去掉有關目錄和文件的immutable屬性和append-only屬性,同時,對日誌文件設置了append-only屬性,可能會使日誌輪換(logrotate)無法進行。因此,在使用chattr命令前,需要結合伺服器的應用環境來權衡是否需要設置immutable屬性和append-only屬性。另外,雖然通過chattr命令修改文件屬性能夠提高文件系統的安全性,但是它並不適合所有的目錄。chattr命令不能保護/、/dev、/tmp、/var等目錄。根目錄不能有不可修改屬性,因為如果根目錄具有不可修改屬性,那麼系統根本無法工作:/dev在啟動時,syslog需要刪除並重新建立/dev/log套接字設備,如果設置了不可修改屬性,那麼可能出問題;/tmp目錄會有很多應用程序和系統程序需要在這個目錄下建立臨時文件,也不能設置不可修改屬性;/var是系統和程序的日誌目錄,如果設置為不可修改屬性,那麼系統寫日誌將無法進行,所以也不能通過chattr命令保護。
2、文件許可權檢查和修改不正確的許可權設置直接威脅著系統的安全,因此運維人員應該能及時發現這些不正確的許可權設置,並立刻修正,防患於未然。下面列舉幾種查找系統不安全許可權的方法。
(1)查找系統中任何用戶都有寫許可權的文件或目錄
查找文件:find / -type f -perm -2 -o -perm -20 |xargs ls -al查找目錄:find / -type d -perm -2 -o -perm -20 |xargs ls –ld
(2)查找系統中所有含「s」位的程序
find / -type f -perm -4000 -o -perm -2000 -print | xargs ls –al
含有「s」位許可權的程序對系統安全威脅很大,通過查找系統中所有具有「s」位許可權的程序,可以把某些不必要的「s」位程序去掉,這樣可以防止用戶濫用許可權或提升許可權的可能性。
(3)檢查系統中所有suid及sgid文件
find / -user root -perm -2000 -print -exec md5sum {} \;find / -user root -perm -4000 -print -exec md5sum {} \;
將檢查的結果保存到文件中,可在以後的系統檢查中作為參考。
(4)檢查系統中沒有屬主的文件
find / -nouser -o –nogroup
沒有屬主的孤兒文件比較危險,往往成為黑客利用的工具,因此找到這些文件後,要麼刪除掉,要麼修改文件的屬主,使其處於安全狀態。
3、/tmp、/var/tmp、/dev/shm安全設定在Linux系統中,主要有兩個目錄或分區用來存放臨時文件,分別是/tmp和/var/tmp。存儲臨時文件的目錄或分區有個共同點就是所有用戶可讀寫、可執行,這就為系統留下了安全隱患。攻擊者可以將病毒或者木馬腳本放到臨時文件的目錄下進行信息收集或偽裝,嚴重影響伺服器的安全,此時,如果修改臨時目錄的讀寫執行許可權,還有可能影響系統上應用程序的正常運行,因此,如果要兼顧兩者,就需要對這兩個目錄或分區就行特殊的設置。/dev/shm是Linux下的一個共享內存設備,在Linux啟動的時候系統默認會載入/dev/shm,被載入的/dev/shm使用的是tmpfs文件系統,而tmpfs是一個內存文件系統,存儲到tmpfs文件系統的數據會完全駐留在RAM中,這樣通過/dev/shm就可以直接操控系統內存,這將非常危險,因此如何保證/dev/shm安全也至關重要。對於/tmp的安全設置,需要看/tmp是一個獨立磁碟分區,還是一個根分區下的文件夾,如果/tmp是一個獨立的磁碟分區,那麼設置非常簡單,修改/etc/fstab文件中/tmp分區對應的掛載屬性,加上nosuid、noexec、nodev三個選項即可,修改後的/tmp分區掛載屬性類似如下:LABEL=/tmp /tmp ext3 rw,nosuid,noexec,nodev 0 0 其中,nosuid、noexec、nodev選項,表示不允許任何suid程序,並且在這個分區不能執行任何腳本等程序,並且不存在設備文件。在掛載屬性設置完成後,重新掛載/tmp分區,保證設置生效。對於/var/tmp,如果是獨立分區,安裝/tmp的設置方法是修改/etc/fstab文件即可;如果是/var分區下的一個目錄,那麼可以將/var/tmp目錄下所有數據移動到/tmp分區下,然後在/var下做一個指向/tmp的軟連接即可。也就是執行如下操作:
[root@server ~]# mv /var/tmp/* /tmp[root@server ~]# ln -s /tmp /var/tmp
如果/tmp是根目錄下的一個目錄,那麼設置稍微復雜,可以通過創建一個loopback文件系統來利用Linux內核的loopback特性將文件系統掛載到/tmp下,然後在掛載時指定限制載入選項即可。一個簡單的操作示例如下:
[root@server ~]# dd if=/dev/zero of=/dev/tmpfs bs=1M count=10000[root@server ~]# mke2fs -j /dev/tmpfs[root@server ~]# cp -av /tmp /tmp.old[root@server ~]# mount -o loop,noexec,nosuid,rw /dev/tmpfs /tmp[root@server ~]# chmod 1777 /tmp[root@server ~]# mv -f /tmp.old/* /tmp/[root@server ~]# rm -rf /tmp.old
最後,編輯/etc/fstab,添加如下內容,以便系統在啟動時自動載入loopback文件系統:
/dev/tmpfs /tmp ext3 loop,nosuid,noexec,rw 0 0
Linux後門入侵檢測工具rootkit是Linux平台下最常見的一種木馬後門工具,它主要通過替換系統文件來達到入侵和和隱蔽的目的,這種木馬比普通木馬後門更加危險和隱蔽,普通的檢測工具和檢查手段很難發現這種木馬。rootkit攻擊能力極強,對系統的危害很大,它通過一套工具來建立後門和隱藏行跡,從而讓攻擊者保住許可權,以使它在任何時候都可以使用root許可權登錄到系統。rootkit主要有兩種類型:文件級別和內核級別,下面分別進行簡單介紹。文件級別的rootkit一般是通過程序漏洞或者系統漏洞進入系統後,通過修改系統的重要文件來達到隱藏自己的目的。在系統遭受rootkit攻擊後,合法的文件被木馬程序替代,變成了外殼程序,而其內部是隱藏著的後門程序。通常容易被rootkit替換的系統程序有login、ls、ps、ifconfig、、find、netstat等,其中login程序是最經常被替換的,因為當訪問Linux時,無論是通過本地登錄還是遠程登錄,/bin/login程序都會運行,系統將通過/bin/login來收集並核對用戶的賬號和密碼,而rootkit就是利用這個程序的特點,使用一個帶有根許可權後門密碼的/bin/login來替換系統的/bin/login,這樣攻擊者通過輸入設定好的密碼就能輕松進入系統。此時,即使系統管理員修改root密碼或者清除root密碼,攻擊者還是一樣能通過root用戶登錄系統。攻擊者通常在進入Linux系統後,會進行一系列的攻擊動作,最常見的是安裝嗅探器收集本機或者網路中其他伺服器的重要數據。在默認情況下,Linux中也有一些系統文件會監控這些工具動作,例如ifconfig命令,所以,攻擊者為了避免被發現,會想方設法替換其他系統文件,常見的就是ls、ps、ifconfig、、find、netstat等。如果這些文件都被替換,那麼在系統層面就很難發現rootkit已經在系統中運行了。這就是文件級別的rootkit,對系統維護很大,目前最有效的防禦方法是定期對系統重要文件的完整性進行檢查,如果發現文件被修改或者被替換,那麼很可能系統已經遭受了rootkit入侵。檢查件完整性的工具很多,常見的有Tripwire、 aide等,可以通過這些工具定期檢查文件系統的完整性,以檢測系統是否被rootkit入侵。內核級rootkit是比文件級rootkit更高級的一種入侵方式,它可以使攻擊者獲得對系統底層的完全控制權,此時攻擊者可以修改系統內核,進而截獲運行程序向內核提交的命令,並將其重定向到入侵者所選擇的程序並運行此程序,也就是說,當用戶要運行程序A時,被入侵者修改過的內核會假裝執行A程序,而實際上卻執行了程序B。內核級rootkit主要依附在內核上,它並不對系統文件做任何修改,因此一般的檢測工具很難檢測到它的存在,這樣一旦系統內核被植入rootkit,攻擊者就可以對系統為所欲為而不被發現。目前對於內核級的rootkit還沒有很好的防禦工具,因此,做好系統安全防範就非常重要,將系統維持在最小許可權內工作,只要攻擊者不能獲取root許可權,就無法在內核中植入rootkit。
1、rootkit後門檢測工具chkrootkit chkrootkit是一個Linux系統下查找並檢測rootkit後門的工具,它的官方址:http://www.chkrootkit.org/。 chkrootkit沒有包含在官方的CentOS源中,因此要採取手動編譯的方法來安裝,不過這種安裝方法也更加安全。chkrootkit的使用比較簡單,直接執行chkrootkit命令即可自動開始檢測系統。下面是某個系統的檢測結果:
[root@server chkrootkit]# /usr/local/chkrootkit/chkrootkitChecking `ifconfig』… INFECTEDChecking `ls』… INFECTEDChecking `login』… INFECTEDChecking `netstat』… INFECTEDChecking `ps』… INFECTEDChecking `top』… INFECTEDChecking `sshd』… not infectedChecking `syslogd』… not tested
從輸出可以看出,此系統的ifconfig、ls、login、netstat、ps和top命令已經被感染。針對被感染rootkit的系統,最安全而有效的方法就是備份數據重新安裝系統。chkrootkit在檢查rootkit的過程中使用了部分系統命令,因此,如果伺服器被黑客入侵,那麼依賴的系統命令可能也已經被入侵者替換,此時chkrootkit的檢測結果將變得完全不可信。為了避免chkrootkit的這個問題,可以在伺服器對外開放前,事先將chkrootkit使用的系統命令進行備份,在需要的時候使用備份的原始系統命令讓chkrootkit對rootkit進行檢測。
2、rootkit後門檢測工具RKHunter RKHunter是一款專業的檢測系統是否感染rootkit的工具,它通過執行一系列的腳本來確認伺服器是否已經感染rootkit。在官方的資料中,RKHunter可以作的事情有:MD5校驗測試,檢測文件是否有改動
檢測rootkit使用的二進制和系統工具文件 檢測特洛伊木馬程序的特徵碼 檢測常用程序的文件屬性是否異常 檢測系統相關的測試 檢測隱藏文件 檢測可疑的核心模塊LKM 檢測系統已啟動的監聽埠
在Linux終端使用rkhunter來檢測,最大的好處在於每項的檢測結果都有不同的顏色顯示,如果是綠色的表示沒有問題,如果是紅色的,那就要引起關注了。另外,在執行檢測的過程中,在每個部分檢測完成後,需要以Enter鍵來繼續。如果要讓程序自動運行,可以執行如下命令:
[root@server ~]# /usr/local/bin/rkhunter –check –skip-keypress
同時,如果想讓檢測程序每天定時運行,那麼可以在/etc/crontab中加入如下內容:
30 09 * * * root /usr/local/bin/rkhunter –check –cronjob
這樣,rkhunter檢測程序就會在每天的9:30分運行一次。伺服器遭受攻擊後的處理過程安全總是相對的,再安全的伺服器也有可能遭受到攻擊。作為一個安全運維人員,要把握的原則是:盡量做好系統安全防護,修復所有已知的危險行為,同時,在系統遭受攻擊後能夠迅速有效地處理攻擊行為,最大限度地降低攻擊對系統產生的影響。