本文重点 系统安全,从多方面进行安全加固 系统调优。
一、账号安全基本措施
系统账号清理
1 、将非登录用户的Shell设为/sbin/nologin
在我们使用Linux系统时,除了用户创建的账号之外,还会产生系统或程序安装过程中产生的许多其他账号,除了超级用户root外,其他账号都是用来维护系统运作的,一般不允许登录,常见的非登录用户有bin、adm、mail、lp、nobody、ftp等。
查看/sbin/nologin文件可以查看到很多的程序用户,这些文件被限制登录。
根据之前的文章可以发现
usermod命令可以改变用户的shell类型
usermod -s /sbin/nologin 用户名 //改变当前用户的shell类型
演示:
修改当前用户的shell的类型,使得无法登录。
2、锁定长期不使用的账号
锁定命令:
锁定:
passwd -l 用户名
usermod -L 用户名
解锁:
passwd -u 用户名
usermod -U 用户名
演示:
3、 删除无用的账号
删除命令:
[root@localhost ~]# userdel -r zhuabo //删除用户的同时把该用户家目录一起删除
[root@localhost ~]# userdel zhuzhu //删除用户,但是保留家目录
[root@localhost ~]# ls /home
zhu zhuzhu
删除用户时一定要加上-r才可以连同家目录一起删除。
- 加上-r才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。
演示:
4、 锁定账号文件passwd、shadow
chattr命令改变文件属性,lsattr命令查看文件底层属性。
chattr [-RV] [+/-/=<属性>] 文件或目录 //改变文件属性
lsattr 文件或目录 //查看文件底层属性
选项说明:
-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示指令执行过程。
属性:
| 属性 | 作用 |
|---|---|
| a(append) | 只允许对文件进行追加操作(适用于日志文件) |
| A | 不允许更新文件的访问时间 |
| c (compressed) | 启用这个属性时,文件在磁盘上会自动压缩 |
| d (dump) | 不能使用dump命令备份文件 |
| D | 设置了目录的D属性时,更改会同步保存在磁盘上 |
| e (extent for mat) | 它表明,该文件使用磁盘上的块的映射扩散 |
| i (immutable) | 在文件上启用这个属性时,我们不能更改、重命名或删除这个文件 |
| j (journaling) | 设置了这个属性时,文件的数据首先保存在日志中,然后再写入文件 |
| S (synchronous) | 设置了这个属性时,变更或更改同步保存到磁盘上 |
演示: 使用”chattr +i“为文件增加i属性,之后不能更改、重命名或删除这个文件。
[root@localhost ~]# chattr +i /etc/passwd //为该文件加上i属性
[root@localhost ~]# lsattr /etc/passwd //查看该文件的地层属性为i
----i----------- /etc/passwd
[root@localhost ~]# useradd zhuzhu //尝试创建新用户,结果失败
useradd:无法打开 /etc/passwd
[root@localhost ~]# chattr -i /etc/passwd //解去该文件i属性
[root@localhost ~]# lsattr /etc/passwd //已解除i底层文件属性
---------------- /etc/passwd
[root@localhost ~]# useradd zhuzhu
密码安全控制
一般通过设置密码规则来控制密码安全,主要设置以下两点:
- 设置密码有效期
- 要求用户下次登录时修改密码
随机生成密码:cat /dev/random | tr -dc [[:alnum]] |head -c 12
/dev/random内有大量随机字符,tr -dc反向删除[[:alnum]]数字字母
chage命令对应现有用户
命令格式:chage [选项] 用户名
| 选项 | 说明 |
|---|---|
| -m | 密码可更改的最小天数。为0时代表任何时候都可以更改密码。 |
| -M | 密码保持有效的最大天数。 |
| -W | 用户密码到期前,提前收到警告信息的天数。 |
| -E | 帐号到期的日期。过了这天,此帐号将不可用。 |
| -d | 设置”最后一次修改密码的日期“。设置为 0 有特殊意思,表示用户应该在下次登录系统时更改密码。 |
| -i | 停滞时期。允许密码过期后多少天内仍能使用,如果一个密码已过期这些天,那么此帐号将不可用。 |
| -l | 例出当前的设置。 |
演示:
chage -M设置的是有效期最大天数
[root@localhost ~]# chage -M 7 zhuzhu //设置zhuzhu用户的密码有效天数
[root@localhost ~]# grep zhuzhu /etc/shadow //查看用户密码文件当前设置
zhuzhu:!!:19831:0:7:7:::
[root@localhost ~]# chage -l zhuzhu //查看当前设置
最近一次密码修改时间 :4月 18, 2024
密码过期时间 :4月 25, 2024
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :7
在密码过期之前警告的天数 :7
chage -d 0 强制要求用户下次登录时必须修改密码。
[root@localhost ~]# grep zhuzhu /etc/shadow
zhuzhu:!!:19831:0:7:7:::
[root@localhost ~]# chage -d 0 zhuzhu //强制密码下次登录时必须修改
[root@localhost ~]# grep zhuzhu /etc/shadow
zhuzhu:!!:0:0:7:7:::
[root@localhost ~]# chage -l zhuzhu
最近一次密码修改时间 :密码必须更改
密码过期时间 :密码必须更改
密码失效时间 :密码必须更改
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :7
在密码过期之前警告的天数 :7
或者可以直接设置
修改/etc/login.defs文件 对于新建用户
对于新建用户,可以修改/etc/login.defs文件里的内容来设置密码规则。
查看/etc/login.defs文件:
参数说明:
- PASS_MAX_DAYS 密码最大有效期
- PASS_MIN_DAYS 两次修改密码的最小间隔时间
- PASS_MIN_LEN 密码最小长度,对于root无效
- PASS_WARN_AGE 密码过期前多少天开始提醒
示例:
修改/etc/login.defs文件,将密码最大有效期修改为15天。
命令历史限制
Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。
命令输入历史:
histsize
该命令可以加-c临时删除命令历史记录里的文件但是重启一下又会恢复,这样这个命令就起不到保护的效果了,所以是无效的。
一般使用两种方式控制命令历史:
-
减少记录的命令条数。
-
注销时自动清空命令历史,或登录时自动清空命令历史
-
在家目录下有 .bash_history 文件,用于记录历史命令。清空该文件即清空了命令历史。
- 但是这样每次清理实在是不太方便,可以先修改历史命令的条数。
1.临时修改:重启会自动恢复默认(不推荐)
2.永久修改历史命令条数。编辑/etc/profile 文件,设置命令记录为200条,这个更改将要影响全局。
- 编辑
~/.bash_logout文件或~/.bashrc文件,在登录和注销时清空命令历史。
在.bash_logout中编辑
echo " "~/.bash_history用来在注销时清空历史命令。![]()
![]()
在
./bashrc文件中编辑echo " " >~/.bash_history用来在开机时清空历史命令。![]()
- 这两者选其一即可 不必两种都设置
终端自动注销
在/etc/profile文件下编辑TMOUT=[时间],设置闲置多少300秒后自动注销。(在生产环境中不太实用)
su 切换用户
su( switch user)命令可以切换用户身份,并且以指定用户的身份执行命令
root 切换至其他用户无须密码,但是非root用户切换时需要密码
查看su操作记录:
系统安全日志/var/log/secure,是记录ssh登陆服务器的日志文件。
命令格式:su [options...] [-] [user [args...]]
切换用户的方式
su - 用户 登录式切换用户,会读取目标用户的配置文件,切换至自已的家目录,完全切换。
su 用户非登录式,即不会读取目标用户的配置文件,不改变当前工作目录, 所以不完全切换。
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。
演示:
su切换用户和su - 切换目录的区别。
当普通用户互相切换需要密码验证,管理员则不需要
限制使用su命令的用户(与PAM 安全认证有关)
su 命令的安全隐患
- 默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。
- 为了加强su 命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su 命令进行切换。
PAM 安全认证
PAM ( Pluggable Authentication Modules )可插拔式认证模块,是一种高效而且灵活便利的用户级别的认证方式,也是当前Linux服务器普遍使用的认证方式。
通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务 配置不同的认证方式,而无需更改服务程序,同时也便于向系统中添加新的认证手段。
官网手册 : www.linux-pam.org/
PAM相关文件
- 包名: pam
- 模块文件目录:/lib64/security/*.so
- 特定模块相关的设置文件:/etc/security/
- man 8 加模块名 : 可以查看帮助
- 应用程序调用PAM模块的配置文件
- 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
- 为每种应用模块提供一个专用的配置文件:
/etc/pam.d/APP_NAME - 注意:如/etc/pam.d存在,/etc/pam.conf将失效
PAM工作原理
PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so
PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件 ( 位于 /etc/pam.d 下 ) ,最后调用认证文件 ( 位于 /lib64/security 下 ) 进行安全认证。
-
配置文件 /etc/pam.d/ 每一行都是一个独立的认证过程
-
每一行可以区分为三个字段
- 认证类型
- 控制类型
- PAM模块及其参数
认证类型(module-type)
- 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证; 验证是否有这个用户
- 账户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过 期,帐号的登录是否有时间段的限制等;
- 密码管理(password management):主要是用来修改用户的密码;
- 会话管理(session management):主要是提供对会话的管理和记账。
控制类型(Control Flags)
- required :验证失败时仍然继续,但返回 Fail
一票否决,表示本模块必须返回成功才能通过认证,但是如果该模块返回失败,失败结果也不会立即通知用户,而是要等到同一type中的所有模块全部执行完毕,再将失败结果返回给应用程序,即为必要条件。
- requisite :验证失败则立即结束整个验证过程,返回 Fail
一票否决,该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一type内的任何模块,而是直接将控制权返回给应用程序。是一个必要条件
- sufficient :验证成功则立即返回,不再继续,否则忽略结果并继续
一票通过,表明本模块返回成功则通过身份认证的要求,不必再执行同一type内的其它模块,但如果本模块返回失败可忽略,即为充分条件,优先于前面的
- optional : 不用于验证,只是显示信息(通常用于 session 类型)可选项
- equired和requisiteoptional :表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略
- include: 调用其他的配置文件中定义的配置
PAM模块及其参数
- 默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
限制使用su命令的用户(通过修改/etc/pam.d/su 文件):
- 将允许使用su命令的用户加入wheel组。
- 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户。
查看/etc/pam.d/su 文件
注意第二行和第六行:
- 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用su命令进行切换的。
- 两行都注释是允许所有用户都能使用su命令,但root使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
- 如果开启第六行,表示只有root用户和wheel组内的用户才可以使用su命令。
- 如果注释第二行,开启第六行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。
演示:
- 编辑 /etc/pam.d/su 文件:vim /etc/pam.d/su,将第二行和第六行都开启,则只有root和wheel组内的用户才能使用 su 命令。
- 由于zhuzhu用户不在wheel组内,使用su命令时拒绝权限。
- 将zhuzhu用户加入wheel组内,就可以成功使用su 命令切换用户了。
limit
功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间