小議Linux安全防護(二)

wyzsk發表於2020-08-19
作者: Blood_Zero · 2016/01/20 10:27

0x00 檔案安全


檔案的s、t、i、a許可權

首先說一下關於檔案的命令:ls more cat less head touch rm rmdir cd mkdir等等 對於一些檔案我們希望它只有特定的使用者可以訪問,其他使用者不可以訪問,或者一個檔案只能擁有著可以操作其他使用者就不能操作這個時候我們應該怎麼辦?在linux系統中,對於檔案和資料夾有一個s、t、i、a的許可權,可以幫助我們做到這些;

p1

例如這裡的passwd命令,它的擁有者有一個s的許可權,這個許可權是什麼意思呢!它代表普通使用者在執行passwd這個命令時暫時擁有這個檔案本身所屬使用者的許可權。

p2

我這裡解釋一下SUID 與 SGID

SUID僅可用在“二進位制檔案(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

針對檔案以及資料夾我們在新建的時候,通常會有一個預設的許可權:

p3

我們會發現資料夾是755,而我們的檔案是644,這是為什麼呢,原因就是在linux中預設的umask許可權,這個umask一般在我們的/etc/profile

p4

umask值:022代表什麼意思呢,umask其實是許可權的補碼,就是在777許可權上減去的值,所以我們資料夾的許可權是7-0/7-2/7-2=755,那為什麼我們檔案的是644呢,因為建立檔案的時候還需要減去一個預設的執行許可權1,所以檔案的許可權就是7-1/7-3/7-3=644

平時我們修改檔案許可權的常用命令有這些:chmodchownchattr等,但是對於檔案還有一個ACL(訪問控制列表)機制,下面就以Centos7中來介紹一下檔案的訪問控制,對於ACL常見的命令有3個:setfaclgetfaclchacl

p5

透過上圖我們可以發現對檔案的描述是一樣的,檔名、擁有著、所屬組、以及他們對應的許可權;對於getfacl獲取檔案的許可權沒有什麼可說的,這裡詳細說一下對檔案許可權的設定:

首先是引數:

#!bash
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...

-b:刪除所有的acl引數
-k:刪除預設的acl引數
-n:不重新判斷是否有效
-d:設定預設的acl引數(只針對目錄,在目錄中的新建檔案同樣使用此acl)
-R: 遞迴設定後面的acl引數
-x:刪除後面指定的acl引數
-m:設定後面指定的acl引數

針對acl引數:

#!bash
[u/g/o]:[username/groupname/空]:[rwx] filename

下面看例項:

p6

我們再設定一個對其他使用者完全沒有許可權的acl

p7

這裡再新增一個可以讀可執行卻沒有寫許可權的使用者acl,

p8

這就是檔案訪問控制的魅力,你希望這個檔案對那些使用者有什麼許可權都可以透過這樣來進行設定;

檔案的共享

提供檔案共享的服務Samba、NFS、Ftp等等,這些都可以作為Linux中檔案的共享功能;提供服務時需要注意目錄的許可權控制,這裡我們將一下Linux中與cp命令相對應的一個命令scp,它可以遠端來傳輸檔案,並且基於ssh登入是一個安全的檔案傳輸通道;常常用於我們的兩臺伺服器之間的檔案傳輸,比如我們的備份日誌(透過crontab來實現)

p9

傳一個檔案到我們的遠端伺服器上面:

p10

從遠端伺服器上面獲取一個檔案:

p11

如果我們不想在每次獲取檔案或者傳輸檔案的時候輸入密碼,我們可以使用ssh建立金鑰認證來進行傳輸,一般在我們備份日誌檔案中也是透過這樣的方式來進行備份;

p12

制定一個定時任務crontab -e每2分鐘向伺服器傳送一個test.txt的檔案

p13

我們這麼做的目的或者說這麼做了對伺服器有什麼安全性嘛,其實scp命令就是一個透過ssh的傳輸功能,我們可以在ssh結合firewall做一些限制,比如只允許哪些IP或IP段訪問我們的伺服器,這樣我們就可以控制哪些可信的pc或伺服器訪問;

同時我們也可以透過SSH定時更新我們的金鑰檔案來防止我們的金鑰檔案洩漏;

這麼做比我們使用ftp、samba等來傳輸檔案更加安全可靠;

命令記錄功能

在Linux系統中,有一個很重要的命令可以幫助我們曾經使用過的命令記錄,但是也許有的時候我們並不需要這個功能,或者某些使用者需要某些使用者不需要,這個時候我們可以都配置檔案進行配置:

配置檔案:/etc/bashrc

在裡面加入這4行

#!bash
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檔案中新增如下程式碼:

#!bash
#history
USER_IP=`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
DT=`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

p14

如果我們是想給不同的使用者設定history配置,我們就可以在相對應的賬戶家目錄中的.bash_profile檔案中進行編輯,然後重新登入系統就修改成功;

當然在Linux系統中其實還有一個命令可以幫助我們記錄我們所操作過的命令:script

p15

p16

script這個命令不但可以記錄我們執行的命令,還可以記錄我們執行命令後的返回結果,但是隨著命令的執行這個檔案會越來越大,所以這個命令使用的很少;

0x01 使用者密碼安全


密碼策略

在禁用不必要的服務及使用者中,我們已經說過關於刪除一些無用的使用者(/tips/?id=11801),但是linux作為一個多使用者的系統,我們還是不可避免的會去新增很多使用者,我們不能保證每一個使用者具有很好的安全意識,所以只能在使用者的密碼以及使用者的遠端訪問上做一些限制,我們先介紹Linux使用者密碼策略;

關於密碼策略,我這裡只從簡單的配置檔案說,對於Centos系列中使用pam認證機制不是本文的討論範圍;

配置檔案:vim /etc/login.defs

#!bash
MAIL_DIR        /var/spool/mail         #郵件目錄

PASS_MAX_DAYS   99999                   #密碼過期最大時間,99999代表永久有效
PASS_MIN_DAYS   0                       #是否可修改密碼,0代表可修改,非0代表多少天后修改
PASS_MIN_LEN    5                       #密碼最小長度,使用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 列出當前設定
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章