Linux安全防護(2)
前一篇:請點擊這里
0x02 文件安全
文件的s、t、i、a權限
首先說一下關于文件的命令:ls more cat less head touch rm rmdir cd mkdir等等
對于一些文件我們希望它只有特定的用戶可以訪問,其他用戶不可以訪問,或者一個文件只能擁有著可以操作其他用戶就不能操作這個時候我們應該怎么辦?在linux系統中,對于文件和文件夾有一個s、t、i、a的權限,可以幫助我們做到這些;
例如這里的passwd命令,它的擁有者有一個s的權限,這個權限是什么意思呢!它代表普通用戶在執行passwd這個命令時暫時擁有這個文件本身所屬用戶的權限。
參數 |
說明 |
|
針對文件的影響 |
針對文件夾的影響 |
|
s |
文件所屬者和組設置 SUID 和 SGID 權限,文件在被設置了 s 權限后將以 root 權限來運行,運行完成后退出 root 類似我們的 sudo ,當然在設置 s 權限前,文件的用戶以及文件所屬組必須先設置 x 權限,否則文件的權限就是 S , S 代表 s 權限沒有生效 SUID=4 GUID=2 chmod 4764 filename |
對文件夾同樣有效 |
t |
無效 |
讓具有 t 權限目錄下的文件只能被問及的擁有折以及 root 用戶刪除 ( 移動 / 重命名 ) ,其他用戶只能具備讀寫的權限; chmod +t dirname |
i |
不可修改權限,文件設置了這個權限后,所有用戶都不能對其進行修改操作, root 用戶也不能修改 chattr +i filename |
同樣有效 |
a |
只能追加權限,對日志文件很實用 chattr +a filename |
同樣有效 |
我這里解釋一下SUID 與 SGIDSUID僅可用在“二進制文件(binary file)”,SUID因為是程序在執行過程中擁有文件擁有者的權限,因此,它僅可用于二進制文件,不能用在批處理文件(shell腳本)上。這是因為shell腳本只是將很多二進制執行文件調進來執行而已。所以SUID的權限部分,還是要看shell腳本調用進來的程序設置,而不是shell腳本本身。當然,SUID對目錄是無效的。這點要特別注意。
SGID進一步而言,如果s的權限是在用戶組,那么就是Set GID,簡稱為SGID。
文件:如果SGID設置在二進制文件上,則不論用戶是誰,在執行該程序的時候,它的有效用戶組(effective group)將會變成該程序的用戶組所有者(group id)。
目錄:如果SGID是設置在A目錄上,則在該A目錄內所建立的文件或目錄的用戶組,將會是此A目錄的用戶組。
上面介紹了關于s與t權限的一些東西,這里再說一下a與i權限,在linux中還有chattr這個命令,與他對應的還有一個lsattr命令chattr這個命令常用于鎖定文件的
chattr |
|
參數 |
說明 |
-a |
只能向文件中添加數據,不能刪除,修改 |
-i |
設定文件不能被刪除,修改,重命名 |
-c |
設定文件是否經過壓縮再存儲,讀取時需要經過解壓縮 |
-s |
安全地刪除文件或目錄,文件刪除后全部收回硬盤空間 ( 不可恢復 ) |
-u |
與 -s 參數相反,系統會保留數據塊,以便方便回收 |
所以作為一個網絡安全運維人員,我們必須對文件進行嚴格的配置,這里只是一些針對文件本身是安全設置,不同的文件具有不同的讀寫執行等權限,接下來我們就針對不同用戶對不同文件的讀寫執行來做一個描述;
文件的ACL
針對文件以及文件夾我們在新建的時候,通常會有一個默認的權限:
我們會發現文件夾是755,而我們的文件是644,這是為什么呢,原因就是在linux中默認的umask權限,這個umask一般在我們的/etc/profile
umask值:022代表什么意思呢,umask其實是權限的補碼,就是在777權限上減去的值,所以我們文件夾的權限是7-0/7-2/7-2=755,那為什么我們文件的是644呢,因為創建文件的時候還需要減去一個默認的執行權限1,所以文件的權限就是7-1/7-3/7-3=644
平時我們修改文件權限的常用命令有這些:chmod、chown、chattr等,但是對于文件還有一個ACL(訪問控制列表)機制,下面就以Centos7中來介紹一下文件的訪問控制,對于ACL常見的命令有3個:setfacl、getfacl、chacl
通過上圖我們可以發現對文件的描述是一樣的,文件名、擁有著、所屬組、以及他們對應的權限;對于getfacl獲取文件的權限沒有什么可說的,這里詳細說一下對文件權限的設置:
首先是參數:
setfacl [-bkndRLP] { -m|-M|-x|-X … } file …
-b:刪除所有的acl參數
-k:刪除預設的acl參數
-n:不重新判斷是否有效
-d:設置預設的acl參數(只針對目錄,在目錄中的新建文件同樣使用此acl)
-R: 遞歸設置后面的acl參數
-x:刪除后面指定的acl參數
-m:設置后面指定的acl參數
針對acl參數:
[u/g/o]:[username/groupname/空]:[rwx] filename
下面看實例:
我們再設置一個對其他用戶完全沒有權限的acl
這里再添加一個可以讀可執行卻沒有寫權限的用戶acl,
這就是文件訪問控制的魅力,你希望這個文件對那些用戶有什么權限都可以通過這樣來進行設置;
文件的共享
提供文件共享的服務Samba、NFS、Ftp等等,這些都可以作為Linux中文件的共享功能;提供服務時需要注意目錄的權限控制,這里我們將一下Linux中與cp命令相對應的一個命令scp,它可以遠程來傳輸文件,并且基于ssh登錄是一個安全的文件傳輸通道;常常用于我們的兩臺服務器之間的文件傳輸,比如我們的備份日志(通過crontab來實現)
傳一個文件到我們的遠程服務器上面:
從遠程服務器上面獲取一個文件:
如果我們不想在每次獲取文件或者傳輸文件的時候輸入密碼,我們可以使用ssh建立密鑰認證來進行傳輸,一般在我們備份日志文件中也是通過這樣的方式來進行備份;
制定一個定時任務crontab -e 每2分鐘向服務器發送一個test.txt的文件
我們這么做的目的或者說這么做了對服務器有什么安全性嘛,其實scp命令就是一個通過ssh的傳輸功能,我們可以在ssh結合firewall做一些限制,比如只允許哪些IP或IP段訪問我們的服務器,這樣我們就可以控制哪些可信的pc或服務器訪問;
同時我們也可以通過SSH定時更新我們的密鑰文件來防止我們的密鑰文件泄漏;
這么做比我們使用ftp、samba等來傳輸文件更加安全可靠;
命令記錄功能
在Linux系統中,有一個很重要的命令可以幫助我們曾經使用過的命令記錄,但是也許有的時候我們并不需要這個功能,或者某些用戶需要某些用戶不需要,這個時候我們可以都配置文件進行配置:
配置文件:/etc/bashrc
在里面加入這4行
HISTFILESIZE = 1000 # 保存命令的記錄總數
HISTSIZE = 1000 #history 命令輸出的命令總數
HISTTIMEFORMAT = ‘%F %T’ # 定義時間顯示格式
export HISTTIMEFORMAT # 載入
#################################################################################
HISTFILE =/ root / test # 里面命令保存目錄
export HISTFILE # 載入,重新登陸用戶生效
export HISTCONTROL # 忽略重復的命令
export HISTIGNORE = “[ ]*:&:bg:fg:exit” # 忽略冒號分割這些命令
我們如果不想使用保存命令將記錄總數設置為0就可以了;
這里提供一個“高性能構建Linux服務器”中提到的一個使用history記錄用戶的操作,在/etc/profile文件中添加如下代碼:
#history
`who -u am i
2>/dev/null | awk ‘{print $NF}’ | sed -e ‘s/[()]//g’`
# 這句話就是先獲取用戶及 IP 信息,將標準錯誤輸出到黑洞當中,然后使用 awk 命令獲取最后一組參數,再通過 sed 將 () 替換掉;HISTDIR =/ usr / share /. history
# 判斷 IP
if[-z$USER_IP]
then
USER_IP = `hostname`
fi
# 判斷是否存在日志目錄
if[!-d$HISTDIR]
then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
# 生成日志日文件
if [ ! -d $HISTDIR / ${LOGNAME} ]
then
mkdir -p $HISTDIR / ${LOGNAME}
chmod 300 $HISTDIR / ${LOGNAME}
fi
export HISTSIZE = 4000
`date
+%Y%m%d_%H%M%S`
export HISTFILE = “$HISTDIR/${LOGNAME}/${USER_IP}.history.$DT”
export HISTTIMEFORMAT = “[%Y.%m.%d %H:%M:%S]”
chmod 600 $HISTDIR / ${LOGNAME} /*. history * 2 >/ dev / null
如果我們是想給不同的用戶設置history配置,我們就可以在相對應的賬戶家目錄中的.bash_profile文件中進行編輯,然后重新登錄系統就修改成功;
當然在Linux系統中其實還有一個命令可以幫助我們記錄我們所操作過的命令:script
script這個命令不但可以記錄我們執行的命令,還可以記錄我們執行命令后的返回結果,但是隨著命令的執行這個文件會越來越大,所以這個命令使用的很少;
0x03 用戶密碼安全
密碼策略
在禁用不必要的服務及用戶中,我們已經說過關于刪除一些無用的用戶,但是linux作為一個多用戶的系統,我們還是不可避免的會去新增很多用戶,我們不能保證每一個用戶具有很好的安全意識,所以只能在用戶的密碼以及用戶的遠程訪問上做一些限制,我們先介紹Linux用戶密碼策略;
關于密碼策略,我這里只從簡單的配置文件說,對于Centos系列中使用pam認證機制不是本文的討論范圍;
配置文件:vim /etc/login.defs
MAIL_DIR / var / spool / mail # 郵件目錄
PASS_MAX_DAYS 99999 # 密碼過期最大時間, 99999 代表永久有效
PASS_MIN_DAYS 0 # 是否可修改密碼, 0 代表可修改,非 0 代表多少天后修改
pam_creacklib
module,
這個參數不生效PASS_WARN_AGE 7 # 密碼失效前多少天在用戶登錄時通知用戶修改密碼
UID_MIN 1000 #UID 的最小值
UID_MAX 60000 #UID 的最大值
SYS_UID_MIN 201 # 系統 UID 的最小值
SYS_UID_MAX 999 # 系統 UID 的最大值
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes # 是否創建家目錄
UMASK 077 #umask 的值
USERGROUPS_ENAB
yes
# 當值為 yes ,沒有 -g 參數自動創建名稱和用戶名相同的組ENCRYPT_METHOD
SHA512
# 加密方式這個就是我們的用戶密碼策略,我們可以通過修改配置文件來對用戶密碼策略進行修改,也可以通過命令來進行修改:chage
chage |
|
參數 |
說明 |
-m |
密碼可更改的最小天數,為 0 代表任何時候都可以修改 |
-M |
密碼保持有效的最大天數 |
-w |
用戶密碼到期前,提前受到警告信息的天數 |
-E |
賬號到期的日期,超過這個時間,賬號就不能使用 |
-d |
上一次更改的日期 |
-i |
停滯時間,如果密碼已過期多少天,賬號不能使用 |
-l |
列出當前設置 |
大家多多指教!