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