系统安全及应用

1,017 阅读17分钟

本章结构

  • 账号安全控制
  • 系统引导和登录控制
  • 弱口令检测
  • 端口扫描

一、 账号安全基本措施

1. 系统账号清理

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

shell——/sbin/nologin比较特殊,所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。举例来说,各个系统账号中,打印作业有lp这个账号管理,www服务器有apache这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。

usermod -s /sbin/nologin 用户名 修改登录shell类型

1.2 锁定长期不使用的账号

usermod -L 用户名 锁定用户

passwd -l 用户名

1.3 删除无用的账号

userdel [-r] 用户名 加上 -r 才能删除用户的家目录。如果不删除家目录,那么用户被删除后,他的家目录会变成无主文件,文件的属主和属组位显示的是原主人的UID和GID。

1.4 锁定账号文件passwd、shadow

chattr +i /etc/passwd /etc/shadow 锁定文件

2. 密码安全控制

2.1 设置密码有效期

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

对于已有用户可以使用chage命令 chage [选项] 用户名

[root@localhost ~]#  chage lisi       #交互式设置
正在为 lisi 修改年龄信息
请输入新值,或直接敲回车键以使用默认值

	最小密码年龄 [0]: 7
	最大密码年龄 [99999]: 7
	最近一次密码修改时间 (YYYY-MM-DD) [2024-04-18]: 
	密码过期警告 [7]: 6
	密码失效 [-1]: 6
	帐户过期时间 (YYYY-MM-DD) [-1]: 


[root@localhost ~]#chage -M 30 lisi      #设置密码有效期为30[root@localhost ~]# chage -l lisi        #查看用户李四当前设置

2.2 要求用户下次登录时修改密码

chage -d 0 用户名 强制要求用户下次登录时必须修改密码

[root@localhost ~]# chage -d  0 lisi     #强制李四下一次登录一定修改密码(密码符合复杂性要求)

补充:随机生成密码 cat /dev/random | tr -dc [[:alnum:]] |head -c 12 (tr -d 删除)

3. 命令历史限制

Shell 环境的命令历史机制为用户提供了极大的便利,但另一方面也给用户带来了潜在的风险。只要获得用户的命令历史文件,该用户的命令操作过程将会一览无余,如果曾经在命令行输入明文的密码,则无意之中服务器的安全壁垒又多了一个缺口。

3.1 减少记录的命令条数

Bash 终端环境中,历史命令的记录条数由变量 HISTSIZE 控制,默认为 1000 条。通过修改 /etc/profile\color{red}{ /etc/profile } 文件中的 HISTSIZE 变量值,可以影响系统中的所有用户。例如,可以设置最多只记录 200 条历史命令。

临时修改历史命令条数。只针对当前用户,退出登录后失效。
[root@localhost ~]# export HISTSIZE=200  

永久修改历史命令条数。编辑配置文件,设置历史命令条数。
[root@localhost ~]# vim /etc/profile        //设置历史命令条数记录为200条
     HISTSIZE=200 
[root@localhost ~]# source /etc/profile     //刷新配置文件,使文件立即生效
注意:写进 /etc/profile 对全局生效  ;写进.bahsrc只对root生效

3.2 注销时自动清空命令历史

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

临时清除历史命令 history  -c 

注销时自动清空历史命令 
[root@localhost ~]# vim ~/.bash_logout
echo "" > ~/.bash_history

登录时自动清空历史命令
[root@localhost ~]# vim ~/.bashrc
echo "" > ~/.bash_history

4. 终端自动注销

编辑 /etc/profile 文件,设置闲置600秒后自动注销 (不常用)

 [root@localhost ~]#  vim /etc/profile
 .................................
 export  TMOUT=600

二、用户切换和提权

1.su 切换用户

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

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

1.1 切换用户的方式

su - 用户 完全切换

su 用户 不完全切换

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

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

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

限制方法:修改/etc/pam.d/su 文件

  1. 将允许使用su命令的用户加入wheel组。
  2. 启用pam_wheel认证模块。则只有wheel组内的用户可以使用su命令切换用户

su限制.png

注意第二行和第六行

  • 以上两行现在是默认状态(即开启第二行,注释第六行),这种状态下是允许所有用户间使用su命令进行切换的。
  • 两行都注释是允许所有用户都能使用su命令,但root使用su切换到其他普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
  • 如果开启第六行,表示只有root用户和wheel组内的用户才可以使用su命令。
  • 如果注释第二行,开启第六行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。

2. sudo 用户提权

sudo(superuser do)允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录和管理时间,同样也提高了安全性。

在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。sudo于1980年前后推出,sudo使一般用户不需要知道超级用户的密码即可获得权限。

首先超级用户将普通用户的名字、可以执行的特定命令、按照哪种用户或用户组的身份执行等信息,登记在特殊的文件中(通常是 /etc/sudoers ),即完成对该用户的授权(此时该用户称为“sudoer”);在一般用户需要取得特殊权限时,其可在命令前加上“sudo”,此时sudo将会询问该用户自己的密码(以确认终端机前的是该用户本人),回答后系统即会将该命令的进程以超级用户的权限运行。之后的一段时间内(默认为5分钟,可在/etc/sudoers自定义),使用sudo不需要再次输入密码。由于不需要超级用户的密码,部分Unix系统甚至利用sudo使一般用户取代超级用户作为管理帐号,例如Ubuntu、Mac OS X等。

2.1 sudo 命令

用法sudo 授权命令

sudo组成

  • 包:sudo
  • 配置文件:/etc/sudo.conf
  • 执行授权命令:/usr/bin/sudo
  • 时间戳文件:/var/db/sudo
  • 日志文件:/var/log/secure
  • 授权规则配置文件:
    • /etc/sudoers
    • /etc/sudoers.d/*.conf 子配置

sudo特性

  • sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
  • sudo提供了丰富的日志,详细地记录了每个用户干了什么。它能够将日志传到中心主机或者日志服务器
  • sudo使用时间戳文件来执行类似的“检票”系统。当用户调用sudo并且输入它的密码时,用户获得了一张存活期为5分钟的票
  • sudo的配置文件是sudoers文件,它允许系统管理员集中的管理用户的使用权限和使用的主机。它所存放的位置默认是在 /etc/sudoers ,属性必须为0440

查看sudo操作记录

  • 需要启用 Default logfile 配置
  • 默认日志文件:/var/log/sudo.log

2.2 /etc/sudoers配置文件

默认配置文件位置: /etc/sudoers ( /etc/sudo.conf文件不要修改 )

编辑配置文件命令visudo

※注意:编辑sudo的配置文件/etc/sudoers时一般不要直接使用vim(vim /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vim去编辑,但是保存时会自动进行语法检查,有错会有提示。 ( visudo -c 可以检查语法 )

#用户    登入主机    =    (代表用户)     命令
#user  	host       =    (runas)       command
 root       ALL=(ALL)          ALL
%wheel      ALL=(ALL)         NOPASSWD:ALL
  
 #root表示允许哪个用户。%wheel表示wheel组。
 #第一个ALL表示通过哪些主机登入。
 #第二个ALL表示以哪个用户身份。
 #最后一个ALL表示允许运行哪些命令。
 #NOPASSWD表示使用sudo命令不需要验证密码。

 举例说明:
 1.nancy    ALL=(root)   /bin/mount
 #表示nancy用户通过任何主机登入系统后,可以以root的身份运行mount命令(命令前必须加sudo)。
 
 2.%wheel    ALL=(ALL)   ALL
 #表示wheel组内的成员通过任何主机登入系统后,可以以任何用户的身份运行所有命令(命令前必须加sudo)。
wheel组表示管理员组是比较特殊的一个组,在wheel组中的成员可以使用任何命令

 字段填写说明:
 1.user:可以写用户名或UID。
 2.group:可以写组名或GID。
 3.host:可以写iphostnameIP地址或主机名)。
 4.command:
  command name  (命令)
  directory     (文件夹里的命令)
  sudoedit      (可以编辑sudoers这个文件,变相变成管理员)
  Cmnd_Alias    (命令别名)
注:配置文件内支持使用通配符,例如"/sbin/*"表示/sbin/目录下的所有命令。

#启用sudo操作日志
visudo
Defaults logfile = "/var/log/sudo"

sudo命令格式

sudo [-u username] [command] #-u:以哪个用户的身份运行命令

sudo -V #查看相关配置信息

sudo -l #查询授权的sudo操作

2.3 sudo 别名

sudo别名有四种类型:

  • User_Alias(用户)
  • Runas_Alias(代表用户)
  • Host_Alias(登录主机)
  • Cmnd_Alias(命令)

别名格式:必须大写字母,数字可以使用但是不能放在开头

举例:创建用户别名MYUSERS=zhangsan,lisi。
允许这两个用户使用/sbin/下的所有命令,除了reboot、poweroff、init、rm这四个命令。 
(! 表示取反。! /sbin/reboot 表示不允许使用reboot命令。)

[root@localhost ~]# visudo
 ----------------------------------
 User_Alias MYUSERS = zhangsan,lisi
 Host_Alias MYHOSTS = localhost
 Cmnd_Alias MYCMNDS = /sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm

 MYUSERS  MYHOSTS=(root)  NOPASSWD:MYCMNDS

2.4 sudo 子目录

如果对所有用户进行提权都放在/etc/sudoers 一个文件中,非常不便于管理。这时可以在/etc/sudoers.d/ 下创建子目录。例如针对 测试部门的员工进行授权,可以创建/etc/sudoers.d/test;针对hr部门的员工进行授权,可以创建/etc/sudoers.d/hr。便于分类管理。

 [root@localhost ~]# vim /etc/sudoers.d/test          //创建子目录
 zhangsan  ALL=(root)  /bin/mount
 [root@localhost ~]# chmod 440 /etc/sudoers.d/test    //设置权限,加固安全
 [root@localhost ~]# ll /etc/sudoers.d/test
 -r--r----- 1 root root 33 3月   7 17:51 /etc/sudoers.d/test
 
如果允许用户使用sudoedit命令,则该用户能够修改配置文件/etc/sudoers。变相变成管理员,十分危险,建议不要设置该命令。
[root@localhost sudoers.d]#vim /etc/sudoers.d/hr
lisi ALL=(root)  sudoedit
[root@localhost ~]#su lisi
[lisi@localhost root]$ sudoedit /etc/sudoers   //sudoedit可以修改配置文件,十分危险

3. PAM 安全认证

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

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

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

3.1 PAM相关文件

  1. 包名: pam
  2. 模块文件目录:/lib64/security/*.so
  3. 特定模块相关的设置文件:/etc/security/
  4. 应用程序调用PAM模块的配置文件
  • 主配置文件:/etc/pam.conf,默认不存在,一般不使用主配置
  • 为每种应用模块提供一个专用的配置文件:/etc/pam.d/APP_NAME
  • 注意:如/etc/pam.d存在,/etc/pam.conf将失效
  1. man 8 加模块名 : 可以查看帮助

查看某个程序是否支持PAM认证,可以用 ls 命令:

[root@localhost ~]#  ls  /etc/pam.d  | grep  su   #查看su是否支持PAM模块认证
ksu
su
sudo
sudo-i
su-l

3.2 PAM工作原理

PAM认证一般遵循这样的顺序:Service(服务)→PAM(配置文件)→pam_*.so

PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件 ( 位于 /etc/pam.d 下 ) ,最后调用认证文件 ( 位于 /lib64/security 下 ) 进行安全认证。

3.3 专用配置文件/etc/pam.d/ 格式

[root@localhost ~]#  cat  /etc/pam.d/su       #查看su的PAM配置文件
#%PAM-1.0
auth		sufficient	pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth		sufficient	pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth		required	pam_wheel.so use_uid
auth		substack	system-auth
auth		include		postlogin
account		sufficient	pam_succeed_if.so uid = 0 use_uid quiet
account		include		system-auth
password	include		system-auth
session		include		system-auth
session		include		postlogin
session		optional	pam_xauth.so
type验证类型        控制位           要调用的功能           参数    
  • 配置文件 /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/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

3.4 limit

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

[root@localhost ~]#  ulimit -a                #可以看到系统的相关 资源限制 设置
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 7812
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024          #最多只能打开1024个文件
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 7812
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

ulimit -n 10000 #修改限制文件数,但是这样只对当前终端生效

vim /etc/security/limits.conf 可以进行永久修改

缺点:写完需要重启才能生效,所以装好系统后第一时间进行修改

limits 生产中的 建议设置

用户名          限制类型   控制类型         数量
<domain>        <type>   <item>           <value>
*                soft    core            unlimited
*                hard    core            unlimited
*                soft    nproc           1000000
*                hard    nproc           1000000
*                 -      nofile          1000000
*                soft    memlock         32000
*                hard    memlock         32000
*                soft    msgqueue        8192000
*                hard    msgqueue        8192000

*代表所有        - 代表软硬一起设置

三、 系统引导和登录控制

1. 开关机安全控制

1.1 调整BIOS引导设置原则

  • 将第一引导设备设为当前系统所在硬盘;
  • 禁止从其他设备(光盘、 U盘、网络)引导启动系统;
  • 将安全级别设为setup,并设置管理员密码。
  • 禁用重启热键:Ctrl+Alt+Delete,避免因用户误操作重启。

1.2 GRUB限制

  • 使用grub2-mkpasswd-pbkdf2生成密钥
  • 修改/etc/grub.d/00_header文件,添加密码记录
  • 生成新的grub.cfg配置文件

通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

GRUB2 加密

[root@localhost ~]#grub2-setpassword      #直接设置密码

2. 终端登录安全控制

2.1 限制root只在安全终端登录

  • 安全终端配置:/etc/securetty

2.2 禁止普通用户登录

  • 建立/etc/nologin文件
  • 删除nologin文件或者重启后即恢复正常

四、 系统弱口令检测 —— 暴力破解密码

Joth the Ripper,简称JR

  • 一款密码分析工具,支持字典式的暴力破解
  • 通过对 shadow 文件的口令分析,可以检测密码强度
  • 官网网站:www.openwall.com/john/

五、 网络端口扫描 —— nmap扫描

nmap是一个强大的端口扫描类安全评测工具,支持 ping 扫描、多端口检测等多种技术。

网络端口扫描:

控制位描述
SYN建立链接
ACK确认
FIN结束断开
PSH传送 0 数据缓存,上层应用协议
RST重置
URG

namp命令格式:nmap [扫描类型] [选项] <扫描目标>

rpm -qa|grep nmap    #查看nmap
yum install -y nmap  #安装nmap

示例:
#分别查看本机开放的TCP端口、UDP端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1
#检测192.168.80.0/24网段有哪些主机提供HTTP服务
nmap -p 80 192.168.80.0/24
nmap -p 80 192.168.91.100/24
#检测192.168.80.0/24网段有哪些存活主机
nmap -n -sP 192.168.80.0/24