目录
一、账号安全控制
1.1 系统账号
1.1.1 将非登录用户设为无法登录
在Linux中,无法登陆的用户比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。一般程序用户就不用登录系统,而可以使用系统资源。
usermod -s /sbin/nologin 用户名
或
chsh -s /sbin/nologin 用户名
这两个命令均可以修改用户的登录shell
1.1.2 锁定用户
具体方法:
usermod -L 用户名 #锁定账号
usermod -U 用户名 #解锁账号
passwd -l 用户名 #锁定账号
passwd -u 用户名 #解锁账号
1.1.3 删除用户
具体方式:
userdel -r 用户名
#-r选项可以同时删除用户的家目录,防止后续创建同名用户导致的错误
1.1.4 锁定配置文件
由于直接修改/etc/passwd以及/etc/shadow文件过于危险所以可以锁定配置文件来防止随意修改
具体方式:
chattr +i /etc/passwd /etc/shadow # +i选项可以让文件处于只读状态,不可被删除修改等
chattr -i /etc/passwd #-I即为去除I属性
lsattr /etc/passwd #可以查看配置文件的属性权限
chattr有两个属性:-a 让文件或目录只可以被追加; -i 让文件只可被读
1.2 密码安全
1.2.1 对于新建用户的密码规则
在/etc/login.defs中可以看到对于新建用户的密码规则
[root@localhost ~]# vim /etc/login.defs
#适用于修改后生效后修改的用户
...
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
[root@localhost ~]# tail -5 /etc/shadow
#修改密码有效期限
PASS_MAX_DAYS #密码最大有效天数
PASS_MIN_DAYS #修改一次密码最少间隔天数
PASS_MIN_LEN #密码最小长度
PASS_WARN_AGE #密码过期前多少天提醒
1.2.1 对于已存在用户的密码规则
chage [选项] 用户名
-m:密码可更改的最小天数。为零时代表任何时候都可以更改密码。
-M:密码保持有效的最大天数。
-w:用户密码到期前,提前收到警告信息的天数。
-E:帐号到期的日期。过了这天,此帐号将不可用。
-d:上一次更改的日期。
-i:停滞时期。如果一个密码已过期这些天,那么此帐号将不可用。
-l:例出当前的设置。由非特权用户来确定他们的密码或帐号何时过期。
chage -d 0 zhangsan
#强制张三下一次登录一定修改密码(密码需符合复杂性要求)
chage -M 30 lisi
#设置密码有效期为30天
cat /etc/shadow|tail -1
lisi:!!:19055:0:30:7:::
第5字段
1.3 命令历史记录
命令历史机制为用户提供了极大的便利,同时也带来了风险,若被调出命令历史而被人利用后果不堪设想,所以可以为命令历史记录添加一些设置。
history -c #清理当前终端的历史记录(临时修改)
永久清除历史记录
vim ~/.bashrc #进入个人登录配置文件
echo " " > ~/.bash_history #每次登录就把history文件清空
修改历史命令记录最大条数
vim /etc/profile
HISTSIZE=200 #修改最大条数为200
1.4 系统变量
使用 ` env ` 可以查看系统变量
a=10
echo $a #显示出a=10
bash #建立bash子进程
echo $a #显示不出a=10,没有继承
exit
export a=10
echo $a
bash
echo $a #可以显示出继承的变量a=10
二、切换用户su与提权用户sudo
2.1 切换用户——su命令
su命令即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
su [选项] [-] [用户名]
su [选项] [用户名] #非登录式切换,不会读取目标用户的配置文件,不改变当前工作目录
su [选项] - [用户名] #登录式切换,会读取目标用户的配置文件,切换至自已的家目录
查看su操作记录
安全日志文件:/var/log/secure
不完全登录
su lisi
没有读取lisi用户的配置文件,并且没有更换工作目录
完全登录
su - lisi
读取了lisi用户的配置文件,并且更换工作目录至家目录
2.2 提权用户——sudo命令
由于生产环境中,我们有可能会需要使用一些超级管理员权限,但是来回切换账号导致过于麻烦,而sudo命令则很好的解决了这个问题,可以给予普通用户特殊的权限,同时也可以给组权限。
通过` sudo -l ` 命令可以查看当前用户有哪些特殊权限
配置文件(权限一定为440)
sudo的配置文件为/etc/sudoers 或 在/etc/sudoers.d/ 下新建文件夹想要修改配置文件可以使用:vim /etc/sudoers 或 vim /etc/sudoers.d/* 或 visudo
同时,使用 visudo -c 还可以用于检查配置文件中是否有语法错误
建议使用 visudo
配置说明
用户 主机=(root) 开放的命令对哪个用户 IP或主机名,不写代表任意;用户身份,默认以root cmd1的绝对路径,cmd2,...
操作演示:
给lisi用户开放mount挂载
1.lisi用户没有mount权限
2.登录超级管理员,修改配置文件visudo,并且检测配置文件
3.登录lisi用户,使用提权命令
配置的一些注意事项
配置命令时:
1. 尽量注释掉root ALL=(ALL) ALL ,因为超级管理员不一定叫root
2.在配置命令前加上NOPASSWD:cmd1 cmd2... 可以让用户在使用提权命令时无需输入密码。
3.在配置多个命令时,排在最后的优先级最高
命令支持通配符而产生的严重问题:由于sudo命令的配置文件中,填写命令时可以使用通配符,所以当想给用户开放/usr/bin下的所有命令时,通常会写/usr/bin/*,而这样则会导致用户拥有所有命令,只需要该用户在使用其他无权命令时,写/usr/bin下的任意一个命令即可。
以下为解决方案:
三、PAM安全认证
3.1 什么是PAM
PAM(Pluggable Authentication Modules),是Linux系统可插拔认证模块。
通过提供一些动态链接库和一套统一的API 接口,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。
3.2 为什么要用PAM
Linux系统使用su命令存在安全隐患,默认情况下,任何用户都允许使用su命令,从而有机会反复尝试其他用户(包括root)的登录密码,带来安全风险。
为了加强su命令的使用控制,可以借助于PAM认证模块,只允许极个别用户使用su命令进行切换
3.3 PAM认证原理
- PAM认证一般遵循的顺序: Service(服务) -> PAM(配置文件) -> pam_*.so(模块)
- PAM认证首先需要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(/etc/security下)进行安全认证
- 用户访问服务器的时候,服务器的某一服务程序把用户的请求发送到PAM模块进行认证。不同的应用程序所对应的PAM模块也不同。
3.4 PAM配置文件
PAM认证的顺序是先找配置文件再找模块,而只有较强的功能模块才会有配置文件,因此配置文件的数量小于功能模块的数量。
配置文件分为两种:
- 主配置文件:/etc/security/,只有功能强大的pam模块才有主配置文件
- 次要配置文件(优先级大于主配置文件):/etc/pam.d/
配置次要配置文件中的su,
每一行都是一个独立的认证过程;
每一行可以区分为三个字段: 认证类型、控制类型、PAM 模块及其参数;
如下图:
第一列:模块类型(module-type)
- Auth 账号的认证和授权
- Account 帐户的有效性,与账号管理相关的非认证类的功能,如:用来限制/允许用户对某个服务的访问时间,限制用户的位置(例如:root用户只能从控制台登录)
- Password 用户修改密码时密码复杂度检查机制等功能
- Session 用户会话期间的控制,如:最多打开的文件数,最多的进程数等
- -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用
第二列:控制类型(Control)
- required :一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件
- requisite :一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略include: 调用其他的配置文件中定义的配置
- optional 可选项
第三列:PAM模块及其参数
默认PAM模块在/usr/lib64/security/目录下,若不在此路径下,则需要输入绝对路径。
同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
3.5 Limit ***
limit是PAM功能模块的一种,limit模块是PAM功能模块中很重要的一个模块。
3.5.1 Limit的功能
在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间。
3.5.2 Limit模块相关命令
ulimit是linux shell的内置命令,它具有一套参数集,用于对shell进程及其子进程进行资源限制。
ulimit的设定值是 per-process 的,也就是说,每个进程有自己的limits值。使用ulimit进行修改,立即生效。
ulimit只影响shell进程及其子进程,用户登出后失效。
可以在profile中加入ulimit的设置,变相的做到永久生效。
ulimit [选项]
ulimit -a 显示当前所有资源的限制
ulimit -c 设置core文件的最大大小,单位为blocks
ulimit -n 设置可以打开的最大文件描述符数
ulimit -u 设置用户可创建的最大进程数
ulimit -m 设置单个进程的物理内存限制,单位为KB
ulimit -v 设置单个进程的虚拟内存限制,单位为KB
ulimit -s 设置单个栈的最大大小,单位为blocks
ulimit -f 设置单个文件的最大大小,单位为blocks