36tcp_wrapper、sudo、nsswitch、pam

tcp_wrapper:

庫文件:libwrap.so


tcp封裝器;


判斷一個服務或應用程序是否受tcp_wrapper的訪問控制:

1.對於動態鏈接至libwrap.so庫的應用程序:

# ldd /PATH/TO/APP_FILE | grep libwrap


2.對於靜態編譯的庫文件應用至程序中,能夠接受tcp_wrapper的訪問控制:

利用strings命令查看某個應用程序,從中過濾/etc/hosts.deny或/etc/hosts.allow,如果有此類信息,則說明其受tcp_wrapper控制;

# strings COMMAND


openssh/dropbear

httpd

named

mysql/MariaDB

vsftpd

nfs

samba


常見的基於tcp_wrapper進行訪問控制的服務:sshd,vsftpd


tcp_wrappers的配置文件:

/etc/hosts.allow, /etc/hosts.deny


匹配順序:

/etc/hosts.allow --> /etc/hosts.deny --> 默認規則(允許所有)


獲取配置文件幫助的方法:

~]# man hosts.allow

~]# man hosts.deny

~]# man hosts_options (推薦)


配置文件的格式:

daemon_list : client_list [[[: option] : option] ...]


daemon_list:

注意:必須是應用程序文件的名稱;即存放於/usr/sbin目錄中的文件名;


1.單個應用程序文件名稱:

如:vsftpd

2.程序文件的名稱列表,以逗號分隔:

如:sshd, vsftpd

3.ALL:不加區分的表示所有受tcp_wrapper控制的應用程序;


client_list:

1.單個IP地址或主機名,如果使用主機名,則必須保證本機可以解析;

2.網絡地址:以前綴長度表示的掩碼無效(172.16.0.0/16)

a) 如果有掩碼,則必須使用完整格式的掩碼;

如:172.16.0.0/255.255.0.0

b) 可以使用簡短格式:

如:172.16.

3.內置的訪問控制列表:

ALL:所有的主機;

KNOWN:所有能被當前主機正確解析的主機名;

UNKNOWN:所有不能被當前主機正確解析的主機名;

PARANOID:正向解析和反向解析結果不一致所有主機;


: option

deny:拒絕,主要用於hosts.allow文件,定義拒絕訪問規則;

allow:允許,主要用於hosts.deny文件,定義允許訪問規則;

spawn:生成,發起,執行;


問題:

拒絕172.16.69.1主機訪問172.16.72.1的ftp服務;


使用EXCEPT關鍵字,配置例外的client;


示例:

在172.16.0.0/16網段中除了172.16.69.1之外的其餘主機都可以訪問FTP;

/etc/hosts.deny:

vsftpd : ALL EXCEPT 172.16. EXCEPT 172.16.69.1


spawn使用示例:

sshd, vsftpd : ALL : spawn /bin/echo $(date +%F-%T) %c attempt login %s >> /var/log/tcpwrapper.log


%c: Client  information:  user@host,  user@address,  a  host name, or just an address, depending on how much information is available.

 

%s: Server  information:  daemon@host, daemon@address, or just a daemon name, depending on how much information is available.












sudo:

su: switch user,切換用戶;

完全切換:su -l username, su - username

非完全切換:su username


su - user -c 'COMMAND'


sudo:

sudo, sudoedit — execute a command as another user


以另外一個用戶的身份執行指定的命令;通常情況下,此處的另一個用戶指的是root用戶;


授權機制:sudo的授權配置文件,/etc/sudoers


對於此配置文件,共分爲兩類內容:

1.別名的定義:定義內建變量;

2.用戶規格:其實就是授權項,其中可以調用定義過的別名;


用戶規格(授權項):

每行只能有一個授權項;

其格式爲:

who  where=(whom)  what

user client=(runas) commands


注意:通過編輯/etc/sudoers文件完成的授權,只能通過sudo命令來啓用;


sudo命令:

sudo [option]... command

-u user:以指定的用戶身份運行命令;

-l[l] [command]:列表顯示當前用戶能以sudo方式運行的所有命令;


/etc/sudoers文件的編寫格式:

who: 此次sudo配置的授權目標用戶;

username:單個用戶的用戶賬戶名稱;

#uid:單個用戶的UID;

%groupname:指定組內的所有用戶賬戶;

%#gid:以"gid"爲GID的組內的所有用戶賬戶;

user_alias:事先定義過的用戶賬戶的別名;


where:定義被授權訪問的客戶端主機;

ip/hostname:單個主機;

Network Address:網絡地址;

host_alias:事先定義過的主機的別名;


whom:授權用戶後續命令的運行者的真實身份;通常是root;


what:此次授權能夠運行的命令;

command:單個命令;

directory:指定目錄下所有的命令;

sudoedit:特殊命令,用於授權其他用戶可以執行sudo命令,並且可以編輯/etc/sudoers文件;

cmnd_alias:實現定義過的命令的別名;


示例:

zhangsan ALL=(root) /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root



定義別名的方法:

Alias_Type ALIASNAME = item1, item2, ...


Alias_Type:

User_Alias:

Host_Alias:

Runas_Alias:

Cmnd_Alias:


ALIASNAME:別名的名稱必須全部使用大寫字母;


User_Alias USERADMINUSERS = tom, jerry, centos, suse, %myclass


Cmnd_Alias USERADMINCOMMANDS = /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root, /usr/sbin/usermod


USERADMINUSERS ALL=(root) USERADMINCOMMANDS


常用的標籤:

PASSWD

NOPASSWD


Cmnd_Alias USERADMINCOMMANDS = NOPASSWD: /usr/sbin/useradd, PASSWD: /usr/sbin/userdel, /usr/bin/passwd [a-zA-Z0-9]*, ! /usr/bin/passwd root, /usr/sbin/usermod


特別強調:

諸如passwd,su,sudo,sudoedit等之類的特殊的命令,在使用sudo授權時務必要考慮全面,否則可能爲系統引入安全隱患;需要格外注意!!!













nsswitch & pam:

nsswitch:Name Service Switch,名稱服務開關;

名稱解析:將人類使用的自然語言的符號轉換成計算機能夠使用的數字符號


解析:根據已知的信息(關鍵字,key)查找某個特定的存儲庫,從而能夠獲取到與該關鍵字有關的其他信息的過程;


存儲庫:文件,SQL,NoSQL,LDAP,...


login: 

文件:文件系統,系統調用;

SQL:SQL接口;

NoSQL:NoSQL接口;

...


通用框架:爲應用程序提供簡潔高效的接口;代理程序;

作用:承上啓下;


承上:提供統一的配置和調用接口;

啓下:用戶與各種形式的存儲進行交互;


在Linux中實現名稱解析的通用框架:庫

/lib64/libnss*, /usr/lib64/libnss*


框架:

libnss3.so

驅動(接口):

libnss_files.so, libnss_dns.so, libnss_db.so , ...


爲每種用到解析庫的應用程序,通過一個配置文件定義其配置:

/etc/nsswitch.conf


文件的格式:


db: store_format1 store_format2 ....


每種存儲中都可以根據查找鍵進行查找,並且會返回狀態;

STATUS => success | notfound | unavail | tryagain


對於每種狀態返回值,都有響應的行爲(ACTION):

ACTION => return | continue


默認情況下,對於success狀態的行爲是return;對於其他狀態的行爲都是continue;


可以自定義狀態和行爲的關係:

[STATUS=ACTION]

將此項放置於對應的存儲格式之後即可;


hosts: files nis [NOTFOUND=return] dns


getent命令:

getent - get entries from Name Service Switch libraries


getent database [key]















pam:

pluggable authentication modules;通用的認證框架;


其功能實現同樣通過庫;


模塊的存放路徑:/lib64/security/*


配置文件:

全局認證配置文件:/etc/pam.conf

格式:

application type control module-path module-arguments


爲每種應用提供的專用的配置文件:/etc/pam.d/*APP_NAME*

格式:

type control module-path module-arguments


type:

auth:與賬號的認證和授權有關;

account:與賬號的管理相關,但與認證無關的功能;

password:與用戶修改密碼時密碼的複雜度有關的功能;

session:用戶獲取到服務之前或使用服務完成之後需要進行附加操作;


control:

required:如果本條目沒有被滿足,那麼最終本次的認證一定失敗;但是本次認證過程並不中斷;整個棧運行完畢之後必定返回"認證失敗"的信號;具備隱形的一票否決;

requisite:如果本條目沒有被滿足,那麼本次認證一定失敗;而且整個棧立即終止並返回"認證失敗"信號;顯示的一票否決;

sufficient:如果本條目的條件被滿足,且本條目之前沒有任何的required條目判斷爲失敗,則整個棧立即終止並返回"認證成功"信號;如果本條目的驗證失敗,還需要繼續參考其他的條目規則;一票通過;

optional:可選的,無足輕重的表決;

include:將其他的配置文件中的流程棧包含在當前位置,就好像把其他的配置文件的配置內容複製到當前文件一樣;

substack:運行其他配置文件的流程,但與include不同的是,其在子棧中運行,其運行結果不影響主棧;


status:user_unknown, success, default, ...

action: ok, N, bad, die, done, ignore, reset, ...


module-path: 相對路徑,絕對路徑,/lib64/security/*


module-arguments: 默認的模塊參數;


pam_shells.so模塊的認證功能:

auth required pam_shells.so


/etc/shells文件中是否包含用戶默認的登錄shell;


pam_limits.so

pam_listfile.so

pam_time.so


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章