Linux 系统安全及应用 账号安全和引导登录

171 阅读13分钟

本文重点 系统安全,从多方面进行安全加固 系统调优。

一、账号安全基本措施

系统账号清理

1 、将非登录用户的Shell设为/sbin/nologin

在我们使用Linux系统时,除了用户创建的账号之外,还会产生系统或程序安装过程中产生的许多其他账号,除了超级用户root外,其他账号都是用来维护系统运作的,一般不允许登录,常见的非登录用户有bin、adm、mail、lp、nobody、ftp等。

查看/sbin/nologin文件可以查看到很多的程序用户,这些文件被限制登录。

image.png

根据之前的文章可以发现usermod命令可以改变用户的shell类型

usermod -s /sbin/nologin 用户名     //改变当前用户的shell类型

演示:

修改当前用户的shell的类型,使得无法登录。

image.png

2、锁定长期不使用的账号

锁定命令:

锁定:  
passwd -l 用户名    
usermod -L 用户名

解锁:
passwd -u 用户名
usermod -U 用户名

演示:

image.png

3、 删除无用的账号

删除命令:

[root@localhost ~]# userdel -r zhuabo    //删除用户的同时把该用户家目录一起删除
[root@localhost ~]# userdel zhuzhu       //删除用户,但是保留家目录
[root@localhost ~]# ls /home
zhu  zhuzhu
删除用户时一定要加上-r才可以连同家目录一起删除。
  • 加上-r才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。

演示:

image.png

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

image.png

密码安全控制

一般通过设置密码规则来控制密码安全,主要设置以下两点:

  • 设置密码有效期
  • 要求用户下次登录时修改密码

随机生成密码: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     //查看当前设置
最近一次密码修改时间					:418, 2024
密码过期时间					:425, 2024
密码失效时间					:从不
帐户过期时间						:从不
两次改变密码之间相距的最小天数		:0
两次改变密码之间相距的最大天数		:7
在密码过期之前警告的天数	:7

image.png

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

image.png

或者可以直接设置

image.png

修改/etc/login.defs文件 对于新建用户

对于新建用户,可以修改/etc/login.defs文件里的内容来设置密码规则。

查看/etc/login.defs文件:

image.png 参数说明:

  • PASS_MAX_DAYS 密码最大有效期
  • PASS_MIN_DAYS 两次修改密码的最小间隔时间
  • PASS_MIN_LEN 密码最小长度,对于root无效
  • PASS_WARN_AGE 密码过期前多少天开始提醒

示例:

修改/etc/login.defs文件,将密码最大有效期修改为15天。

image.png

image.png

命令历史限制

Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在 的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在 命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。 Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改/etc/profile 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设 置最多只记录 200 条历史命令。

命令输入历史:histsize

该命令可以加-c临时删除命令历史记录里的文件但是重启一下又会恢复,这样这个命令就起不到保护的效果了,所以是无效的。 image.png

一般使用两种方式控制命令历史:

  • 减少记录的命令条数。

  • 注销时自动清空命令历史,或登录时自动清空命令历史

  • 在家目录下有 .bash_history 文件,用于记录历史命令。清空该文件即清空了命令历史。

image.png

  • 但是这样每次清理实在是不太方便,可以先修改历史命令的条数。

1.临时修改:重启会自动恢复默认(不推荐) image.png

2.永久修改历史命令条数。编辑/etc/profile 文件,设置命令记录为200条,这个更改将要影响全局。 image.png image.png

  • 编辑 ~/.bash_logout 文件或~/.bashrc文件,在登录和注销时清空命令历史。

在.bash_logout中编辑echo " "~/.bash_history用来在注销时清空历史命令。 image.png image.png image.png

./bashrc文件中编辑echo " " >~/.bash_history用来在开机时清空历史命令。 image.png image.png

  • 这两者选其一即可 不必两种都设置

终端自动注销

/etc/profile文件下编辑TMOUT=[时间],设置闲置多少300秒后自动注销。(在生产环境中不太实用) image.png image.png

su 切换用户

su( switch user)命令可以切换用户身份,并且以指定用户的身份执行命令

root 切换至其他用户无须密码,但是非root用户切换时需要密码

查看su操作记录:

系统安全日志/var/log/secure,是记录ssh登陆服务器的日志文件。

命令格式:su [options...] [-] [user [args...]]

切换用户的方式

su - 用户 登录式切换用户,会读取目标用户的配置文件,切换至自已的家目录,完全切换。

su 用户非登录式,即不会读取目标用户的配置文件,不改变当前工作目录, 所以不完全切换。

注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。

演示:

su切换用户和su - 切换目录的区别。 image.png

当普通用户互相切换需要密码验证,管理员则不需要 image.png image.png

 限制使用su命令的用户(与PAM 安全认证有关)

su 命令的安全隐患

  • 默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险。
  • 为了加强su 命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su 命令进行切换。

PAM 安全认证

PAM ( Pluggable Authentication Modules )可插拔式认证模块,是一种高效而且灵活便利的用户级别的认证方式,也是当前Linux服务器普遍使用的认证方式。

通过提供一些动态链接库和一套统一的API,将系统提供的服务 和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务 配置不同的认证方式,而无需更改服务程序,同时也便于向系统中添加新的认证手段。

官网手册 : www.linux-pam.org/

PAM相关文件

  1. 包名: pam
  2. 模块文件目录:/lib64/security/*.so
  3. 特定模块相关的设置文件:/etc/security/
  4. man 8 加模块名 : 可以查看帮助
  5. 应用程序调用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 下 ) 进行安全认证。

image.png

  • 配置文件 /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 文件

image.png 注意第二行和第六行:

  • 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用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 命令。

image.png

  • 由于zhuzhu用户不在wheel组内,使用su命令时拒绝权限。

image.png

  • 将zhuzhu用户加入wheel组内,就可以成功使用su 命令切换用户了。

image.png

limit

功能:在用户级别实现对其可使用的资源的限制,例如:可打开的文件数量,可运行的进程数量,可用内存空间