在linux服務器隨處可見的網絡環境中,網絡運維人員保障Linux安全就成了必要條件。固然如今有不少的硬件防火牆以及WAF,可是那不是小資企業能夠hold住的,本文從軟件以及服務配置方面簡單總結Linux安全防禦。html
SELinux是用來對Linux進行安全加固的,它可讓你指定誰能夠增長文件,誰只能夠刪除文件,或者誰還能夠移動文件,從文件的層次上來講,它至關於一個ACL;linux
配置文件:/etc/selinux/config (centos7系統)shell
狀態:getenforce 與 setenforce命令能夠修改vim
disabled:關閉策略centos
permissive:啓用SELinux可是即便違反了策略它也會讓你繼續操做;僅僅一個記錄功能安全
enforcing:啓用SELinux,違反策略時阻止你的操做bash
查看文件標籤:ls -Z服務器
在文件所屬組的後面就是咱們文件的標籤,它表示SELinux對這個文件的策略網絡
修改策略:chcon與semanage框架
恢復文件標籤:restorecon
常見場景分析:
當咱們須要配置一個Web目錄時,若是Web目錄不是默認的目錄,訪問可能出現403
這個時候,咱們須要將咱們的Web目錄的標籤修改成httpd_sys_content_t
Iptables是一個應用框架,它容許用戶爲本身系統創建一個強大的防火牆。它是用來設置、維護和檢查Linux內核中IP包過濾規則的。
配置文件:/etc/sysconfig/iptables-config (centos7系統)
這裏貼出一個在博客園的關於iptables的使用:
http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html
在centos7中,防火牆具有很強的軟件防禦功能,在默認程度上:
默認開啓了dhcpv6客戶端以及ssh防火牆功能;
防火牆具有不少功能,同時他具有圖形界面與命令行界面兩種模式,對於基本的防火牆配置,我的推薦使用命令行模式,當咱們須要配置一些負責的規則策略時,就可使用咱們的圖形界面:
IDS:***檢測系統,在linux中有針對它的開源的***檢測系統:Snort;
儘量的取消telnet登陸,採用ssh進行登陸;
ssh配置文件:/etc/ssh/sshd_config
修改默認端口:Port 10512
不容許使用空密碼:PermitEmptyPasswords no
不容許root用戶登陸:PermitRootLogin no
不容許輸入密碼登陸:PasswordAuthentication no (能夠很好的防止爆破,可是若是密鑰文件泄漏則會出現安全問題,固然能夠經過其餘方式來進行防護)
從新生成密鑰:KeyRegenerationInterval 1h (若是咱們使用密鑰進行登錄,能夠設置多少時間後密鑰從新生成)
密鑰加密方式:RSAAuthentication yes (是否使用RSA進行加密)
在咱們的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
加密的數據更難被竊取,在安裝Linux系統的時候咱們能夠對整個系統進行加密,採用這種方式,即便有人進入了咱們的系統,也不能獲得咱們的數據;
提供Web服務時,須要更新咱們組件的補丁,防止利用已知漏洞來進行***;
嚴格限制權限,防止獲得Web Shell之後直接獲得系統權限;
限制Web用戶只能訪問Web目錄,不能訪問其餘目錄;
嚴格控制提供上傳點的文件類型
等等
使用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:這個文件是系統的公告信息,每次用戶登陸後就會顯示在終端上;
首先說一下關於文件的命令: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參數相反,系統會保留數據塊,以便方便回收 |
因此做爲一個網絡安全運維人員,咱們必須對文件進行嚴格的配置,這裏只是一些針對文件自己是安全設置,不一樣的文件具備不一樣的讀寫執行等權限,接下來咱們就針對不一樣用戶對不一樣文件的讀寫執行來作一個描述;
針對文件以及文件夾咱們在新建的時候,一般會有一個默認的權限:
咱們會發現文件夾是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="">
setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
</pre>
針對acl參數:
<pre class="prettyprint linenums prettyprinted" style="">
</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這個命令不但能夠記錄咱們執行的命令,還能夠記錄咱們執行命令後的返回結果,可是隨着命令的執行這個文件會愈來愈大,因此這個命令使用的不多;
在禁用沒必要要的服務及用戶中,咱們已經說過關於刪除一些無用的用戶(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 | 列出當前設置 |