0x00 前言
在linux服務器隨處可見的網絡環境中,網絡運維人員保障Linux安全就成了必要條件。當然現在有很多的硬件防火牆以及WAF,但是那不是小資企業可以hold住的,本文從軟件以及服務配置方面簡單總結Linux安全防護。
0x01 使用軟件級別安全防護
1、使用SELinux
SELinux是用來對Linux進行安全加固的,它可以讓你指定誰可以增加文件,誰只可以刪除文件,或者誰還可以移動文件,從文件的層次上來說,它相當於一個ACL;
配置文件:/etc/selinux/config (centos7系統)
狀態:getenforce 與 setenforce命令可以修改
disabled:關閉策略
permissive:啓用SELinux但是即使違反了策略它也會讓你繼續操作;僅僅一個記錄功能
enforcing:啓用SELinux,違反策略時阻止你的操作
查看文件標籤:ls -Z
在文件所屬組的後面就是我們文件的標籤,它表示SELinux對這個文件的策略
修改策略:chcon與semanage
恢復文件標籤:restorecon
常見場景分析:
當我們需要配置一個Web目錄時,如果Web目錄不是默認的目錄,訪問可能出現403
這個時候,我們需要將我們的Web目錄的標籤修改爲httpd_sys_content_t
2、使用iptables
Iptables是一個應用框架,它允許用戶爲自己系統建立一個強大的防火牆。它是用來設置、維護和檢查Linux內核中IP包過濾規則的。
配置文件:/etc/sysconfig/iptables-config (centos7系統)
這裏貼出一個在博客園的關於iptables的使用:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
3、使用firewall
在centos7中,防火牆具備很強的軟件防護功能,在默認程度上:
默認開啓了dhcpv6客戶端以及ssh防火牆功能;
防火牆具備很多功能,同時他具備圖形界面與命令行界面兩種模式,對於基本的防火牆配置,個人推薦使用命令行模式,當我們需要配置一些負責的規則策略時,就可以使用我們的圖形界面:
4、使用***檢測系統
IDS:***檢測系統,在linux中有針對它的開源的***檢測系統:Snort;
0x02 安全配置服務
1、SSH訪問控制
儘可能的取消telnet登錄,採用ssh進行登錄;
ssh配置文件:/etc/ssh/sshd_config
修改默認端口:Port 10512
不允許使用空密碼:PermitEmptyPasswords no
不允許root用戶登錄:PermitRootLogin no
不允許輸入密碼登錄:PasswordAuthentication no (可以很好的防止爆破,但是如果密鑰文件泄漏則會出現安全問題,當然可以通過其他方式來進行防禦)
重新生成密鑰:KeyRegenerationInterval 1h (如果我們使用密鑰進行登陸,可以設置多少時間後密鑰重新生成)
密鑰加密方式:RSAAuthentication yes (是否使用RSA進行加密)
2、禁用不必要的服務及用戶
在我們的Linux系統中有很多用戶不需要的服務和應用,然而這些服務還是會運行,這樣會導致***者利用這些服務的漏洞來進行***,最好的辦法就是停止這些服務。
比如我們的Linux服務器只是一臺Web服務器,那麼就不需要ftp、smtp等服務我們就可以關閉;當然我們也可以讓服務不允許通過防火牆,這樣通過防火牆來保護我們的服務器也可以。
任務 | 舊指令 | 新指令 |
---|---|---|
使某服務自動啓動 | chkconfig --level 3 httpd on | systemctl enable httpd.service |
使某服務不自動啓動 | chkconfig --level 3 httpd off | systemctl disable httpd.service |
檢查服務狀態 | service httpd status | systemctl status httpd.service(服務詳細信息) systemctl is-active httpd.service(僅顯示是否 Active) |
顯示所有已啓動的服務 | chkconfig --list | systemctl list-units --type=service |
啓動某服務 | service httpd start | systemctl start httpd.service |
停止某服務 | service httpd stop | systemctl stop httpd.service |
重啓某服務 | service httpd restart | systemctl restart httpd.service |
在linux系統中,系統運行所必須的服務
服務名稱 | 說明 |
---|---|
acpid | 用於電源管理,對於筆記本和臺式電腦很重要 |
apmd | 高級電源能源管理服務,可用於監控電腦 |
kudzu | 檢測硬件是否變化的服務 |
crond | 爲Linux下自動安排的進程提供運行服務 |
iptables/firewall | Linux內置的防火牆 |
xinetd | 支持多種網絡服務的核心守護進程 |
syslog | 記錄系統的日誌服務 |
network | 網絡服務,要用網必須啓動這個服務 |
同時,一臺新的Linux操作系統中有很多我們用不到的角色用戶,我們同樣可以刪除這些用戶,或者將這些用戶設置爲不能登錄系統;
可被刪除的用戶:adm、lp、sync、shutdown、halt、operator、games
userdel adm
groupdel adm
可被刪除的用戶組:adm、lp、games、dip等;
當然具體的需要還是要根據用戶的選擇,同時我們也可以修改用戶的bash文件禁止用戶登錄系統也是防護方式的一種。
#!bash
usermod -s /sbin/nologin username
3、使用全盤加密
加密的數據更難被竊取,在安裝Linux系統的時候我們可以對整個系統進行加密,採用這種方式,即使有人進入了我們的系統,也不能得到我們的數據;
4、Web應用配置
提供Web服務時,需要更新我們組件的補丁,防止利用已知漏洞來進行***;
嚴格限制權限,防止得到Web Shell以後直接得到系統權限;
限制Web用戶只能訪問Web目錄,不能訪問其他目錄;
嚴格控制提供上傳點的文件類型
等等
5、系統安全
使用su 與 sudo命令時:
su:切換用戶
sudo:提升權限,所以sudo是su的特定一種形態
這裏是指定可以使用su命令的用戶
注意紅色圈起來的一行,就是啓用pam_shell認證,這個時候沒有加入wheel的用戶就不能使用su命令了!
對於sudo的一些配置vim /etc/sudoers在centos7中,如果你不想修改原來的配置文件,你可以將這一行includedir /etc/sudoers.d的註釋去掉,然後在/etc/sudoers.d/目錄下寫我們的配置文件
刪除提示信息
在linux的4個文件中存在提示系統的一些信息:
/etc/issue,/etc/issue.net:這兩個文件記錄了操作系統的名稱及版本號,用戶通過本地終端就會顯示/etc/issue文件中內容,通過ssh或telnet登錄就會顯示/etc/issue.net的文件內容;
/etc/redhat-release:這個文件也記錄了操作系統名稱和版本號;
/etc/motd:這個文件是系統的公告信息,每次用戶登錄後就會顯示在終端上;
0x00 文件安全
文件的s、t、i、a權限
首先說一下關於文件的命令:ls more cat less head touch rm rmdir cd mkdir等等 對於一些文件我們希望它只有特定的用戶可以訪問,其他用戶不可以訪問,或者一個文件只能擁有着可以操作其他用戶就不能操作這個時候我們應該怎麼辦?在linux系統中,對於文件和文件夾有一個s、t、i、a的權限,可以幫助我們做到這些;
例如這裏的passwd命令,它的擁有者有一個s的權限,這個權限是什麼意思呢!它代表普通用戶在執行passwd這個命令時暫時擁有這個文件本身所屬用戶的權限。
我這裏解釋一下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
針對文件以及文件夾我們在新建的時候,通常會有一個默認的權限:
我們會發現文件夾是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獲取文件的權限沒有什麼可說的,這裏詳細說一下對文件權限的設置:
首先是參數:
<pre class="prettyprint linenums prettyprinted" style="">
- #!bash
-
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
- -b:刪除所有的acl參數
- -k:刪除預設的acl參數
- -n:不重新判斷是否有效
- -d:設置預設的acl參數(只針對目錄,在目錄中的新建文件同樣使用此acl)
- -R: 遞歸設置後面的acl參數
- -x:刪除後面指定的acl參數
- -m:設置後面指定的acl參數
</pre>
針對acl參數:
<pre class="prettyprint linenums prettyprinted" style="">
- #!bash
- [u/g/o]:[username/groupname/空]:[rwx] filename
</pre>
下面看實例:
我們再設置一個對其他用戶完全沒有權限的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行
#!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
如果我們是想給不同的用戶設置history配置,我們就可以在相對應的賬戶家目錄中的.bash_profile文件中進行編輯,然後重新登錄系統就修改成功;
當然在Linux系統中其實還有一個命令可以幫助我們記錄我們所操作過的命令:script
script這個命令不但可以記錄我們執行的命令,還可以記錄我們執行命令後的返回結果,但是隨着命令的執行這個文件會越來越大,所以這個命令使用的很少;
0x01 用戶密碼安全
密碼策略
在禁用不必要的服務及用戶中,我們已經說過關於刪除一些無用的用戶(http://drops.wooyun.org/tips/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 | 列出當前設置 |