tcp_wrapper,sudo,nsswitch與pam安全解析
tcp_wrapper作為tcp協議的一種封裝機制,主要適用於允許或拒絕某個或某段IP地址對本機訪問,之前講過的關於用戶控件的防火墻應用工具iptables也可以實現這一功能,iptables可以針對所有的應用程序服務進行限制,而txp_wrapper這類的封裝器只能針對於sshd以及vsftpd服務;
判斷一個應用程序是否受tcp_wrapper管制,只需要查看他是否具有libwrap.so這個庫即可;
tcp_wrapper的相關配置文件有/etc/hosts.allow,/etc/hosts.deny
/etc/hosts.allow:針對於允許訪問的IP地址,但也可以寫入拒絕訪問的IP地址;優先級高;
/etc/hosts.deny:針對於拒絕訪問的IP地址,但也可以寫入允許訪問的IP地址;優先級低;
配置文件格式:
daemon_list:client_list [option]
daemon_list:應用程序文件列表,如ssh服務,其文件名稱為sshd;
client_list:允許或拒絕的IP或IP段;不能使用前綴格式的IP地址,如172.16.72.1/16,如果有掩碼則必須寫成172.16.72.1/255.255.255.0的形式;也可以寫成IP段的形式,如172.16.,表示172.16這個網段的所有IP地址;
option:allow,允許訪問;
deny,拒絕訪問;
spawn:生成,發起,執行;
在/etc/hosts.allow中允許172.16.72.2主機訪問172.16.72.6主機的ssh服務
在/etc/hosts.allow中允許172.16.72.2的主機訪問,在/etc/hosts.deny中拒絕所有主機訪問sshd,vsftpd服務;
172.16.72.1想要訪問172.16.72.6的ssh服務
172.16.72.1想要訪問172.16.72.6的vsftpd服務
172.16.72.2想要訪問172.16.72.6的ssh服務
172.16.72.2想要訪問172.16.72.6的vsftpd服務
使用EXCEPT關鍵字,在/etc/hosts.allow中排除172.16.72.2以外的IP地址的訪問;
172.16.72.1訪問:
sudo:
在生產環境中,使用root用戶作為常用用戶是非成危險的操作,容易被別人利用root用戶進行某種破環性的操作,所以在工作當中,使用普通用戶進行管理,在需要使用root用戶時,使用su或者sudo命令臨時切換root權限就是一個較為安全的操作;
su切換用戶,完全切換以及非完全切換;
完全切換:su - username
非完全切換:su username
暫時獲取root權限,當執行完命令後返回bash界面:su -c ‘COMMAND‘
雖然su命令可以幫助我們切換到root用戶下執行,但是這樣也不利於系統的安全性操作,假如一名運維人員被分配到的工作是管理網絡方面的配置,但是如果他使用的是su -c這樣的操作模式,他就不僅僅能對網絡配置文件進行操作了,權限幾乎可以進行任何操作,所以在真正的生產環境中,使用的幾乎都是配置指定命令的sudo;
sudo命令,可以根據/etc/sudoers配置文件中的配置信息,指定哪個用戶可以借用sudo命令使用在root權限下能夠使用的那些命令;
在/etc/sudoers配置文件中,一行只能有一個授權
其格式為:
who where=(whom) what
user client=(runas) COMMANDS
sudo命令:
sudo [option]... command
-u user:以指定的用戶身份運行命令;
-l [command]:列表顯示當前用戶能以sudo的方式運行
的所有命令;
-k:清空緩存,再一次使用sudo就需要輸入密碼;
sudo -k
(第一次執行sudo輸入密碼後,會有緩存保存300秒,這樣300秒內執行sudo就不需要輸入密碼)
/etc/sudoers編寫格式:
who:
user:用戶名;
#uid:指定用戶的uid;
%group:指定組;
%#gid:指定組的gid;
user_alias:事先定義好的用戶別名;
在配置文件中定義別名:
Alias_Type:
User_Alias:設置用戶別名;
Host_Alias:設置sudo範圍別名;
Cmnd_Alias:設置命令別名;
Runas_Alias:一般為root;
設置別名:
Alias_Type NAME=item1,item2....
NAME必須都為大寫;
where:
ALL:表示所有主機皆可用;
ip/hostname:單個主機;
Network Address:網絡地址;
host_alias事先定義過的主機的別名;
whom:授權用戶後續命令的運行著的真實身份,通常是root;
what:此次授權能夠執行的命令;
command:單個命令授權;
directory:指定目錄下所有的命令;
sudoedit:特殊命令,授權其他用戶可以執行sudo命令,並且可以編輯/etc/sudoers文件;
cmnd_alias:事先定義過的命令別名;
示例:設置wjq用戶管理整個系統中的用戶密碼
上圖中,wjq用戶可以修改root密碼,這種操作在現實環境中是不被允許的;
在配置文件中應設置為passwd後不允許跟隨參數root,passwd命令後必須跟隨參數;
如:
類似於passwd這類的可以對root用戶進行修改的特殊命令還有su,sudo等,這兩個命令一旦授權就必須考慮好怎樣排除root登錄的情況,避免普通用戶使用其進行root登錄操作;需要註意的是sudoedit,可以使普通用戶修改/etc/sudoers配置文件;
如:su命令限制
nsswitch與pam:
nsswitch:名稱服務開關,進行名稱解析,將數字符號轉化為計算機能夠識別的語言;
名稱解析,根據特定的信息查找某個已經設置好的存儲庫,查看存儲庫中是否有符合該關鍵字的信 息;如passwd存儲庫,查看用戶相關信息,host存儲庫,查看指定域名或指定IP地址的關聯信息等;
存儲庫的類型有很多種,如文件,關聯型數據庫,非關聯型數據庫,LDAP;
nsswitch的通用框架為上層應用程序提供統一的接口,將數據轉換,從而才能訪問下層不同文件系 統的存儲庫,若是沒有中間層的作用,上層應用程序想要訪問下層不同的文件系統則需要編寫對應文 件系統的程序,而這樣的工作量太大,並不適應於當前環境;
Linux中實現名稱解析的通用框架是通過庫來實現的:
/lib64/libnss*<-->/usr/lib64/libnss*
解析庫的配置是由/etc/nsswitch.conf配置文件進行配置的
格式為:
db: store_format1 store_format2...
如
對passwd,shadow,group,host等進行設置;
查找對應庫中的關鍵字的信息,使用命令getent
passwd庫中的關鍵字只用用戶名以及uid
pam:
pluggable authentication modules 插入式認證模塊
通用的認證框架;
pam認證的功能模塊亦是通過庫來實現,pam的庫都存儲在/lib64/security(CentOS7)
配置文件:
全局認證配置文件:/etc/pam.conf
格式:
application type control module-path module-options
為每一種應用所提供的專用的配置文件:/etc/pam.d/*
格式:
type control module-path module-options
如:
type:
auth:賬戶的認證授權配置有關;
account:表示賬戶類接口,主要負責賬戶合法性檢查,確認帳號是否過期,是否有權限登 錄系統等;
session:服務開始前,服務結束後需要進行的附加操作;
password:修改密碼後,根據密碼復雜度進行的相應操作;
control:
require:隱性的一票否決,若有條目未被滿足,不立刻中斷認證而是繼續查看條目,直到 條目結束才中斷認證;
requisite:顯性的一票否決,若有條目未被滿足則立刻中斷認證;
sufficient:當本條目滿足時,若該條目之前的所有條目都被滿足了,則整個棧立即終止並 立即返回認證成功的信號;如果本條目的驗證失敗,還需要繼續參考其他的條目規 則;一票通過;沒有一票否決;會當做optional對待
optional:無足輕重,不管成功還是失敗都不影響全局;
include:將其他的配置文件中的流程棧包含在當前位置,就好像把其他的配置文件的配置 內容復制到當前文件
substack:運行其他配置文件的流程,但與include不同的是其在子棧中運行,其運行結果 不影響主棧;
status:
user_unknown:用戶未知,無法查找到;
success:成功後返回什麽結果,通常為ok;
default:默認情況下返回什麽結果;
action:返回的動作;ok,N,bad,ignore,die(一票否決),done(一票成功)
如:
module-path:相對路徑,絕對路徑,/lib64/security/*
module-arguments:默認的模塊參數;
tcp_wrapper,sudo,nsswitch與pam安全解析