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