一、账号安全基本措施

1、系统账号清理

  • 将非登录用户的Shell设为/sbin/nologin,禁止用户登录

    usermod -S /sbin/nologin 用户名
  • 锁定长期不使用的账号
    usermod -L 用户名
    passwd -l 用户名
    passwd -S 用户名
  • 删除无用的账号
    userdel [-r] 用户名
  • 锁定账号文件passwd、shadow
    chattr +i /etc/passwd /etc/shadow   #锁定文件
    lsattr /etc/passwd /etc/shadow      #查看文件状态
    chattr -i /etc/passwd /etc/shadow   #解锁文件

    Snipaste_20211129_172605.png
    ::: hljs-center

锁定文件、查看文件状态和解锁文件的操作

:::

2、密码安全控制

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

Snipaste_20211201_015752.png
::: hljs-center

创建新用户

:::

修改密码配置文件,一般用于新用户:
vi /etc/login.defs
PASS_MAX_DAYS n  #进入vi编辑器,修改密码有效最大天数n。

Snipaste_20211201_011229.png

Snipaste_20211201_010402.png
::: hljs-center

新用户设置密码有效期

:::

直接修改密码有效期,适用于已有用户:
chage -M 指定天数 用户名   
cat /etc/shadow | grep 用户名

Snipaste_20211201_013515.png
::: hljs-center

已有用户,直接修改密码有效期

:::

强制在下次登陆时修改密码:
chage -d 0 用户名
cat /etc/shadow | grep 用户名  

Snipaste_20211201_022024.png
::: hljs-center

强制在下次登陆时修改密码

:::
Snipaste_20211201_081858.png
::: hljs-center

重启后xiaoming用户使用原有密码无法登录,需修改密码

:::

3、命令历史限制

  • 减少记录的命令条数
    vi /etc/profile
    exporrt HISTSIZE=n

    Snipaste_20211201_083350.png
    Snipaste_20211201_083010.png
    ::: hljs-center

记录的命令条数

:::

  • 登录时自动清空命令历史
    vi .bashrc
    echo " " > ~/.bash_history

    Snipaste_20211201_085927.png
    Snipaste_20211201_093250.png

::: hljs-center

登录时自动清空命令历史

:::
Snipaste_20211201_093945.png
::: hljs-center

查看一下历史命令Snipaste_20211201_104109.png

:::

4、终端自动注销

vi /etc/profile
export TMOUT=n #进入vi编辑器设置限制n秒后自动注销
source /etc/profile #重新加载配置文件

Snipaste_20211201_104109.png
Snipaste_20211201_104658.png
::: hljs-center

设置终端自动注销

:::

二、使用su命令切换用户

1、su命令用途及用法

  • 用途: Substitute User ,切换用户
  • 格式: su - 目标用户 (# 带-选项表示将使用目标用户的登录Shell环境)

    2、密码验证

  • root切换任意用户,不验证密码
  • 普通用户切换其他用户,需验证目标用户的密码。

Snipaste_20211201_111112.png
::: hljs-center

su命令切换用户

:::

3、限制使用su命令的用户

●将允许使用su命令的用户加入wheel组
●启用pam_wheel认证模块

gpasswd -a 用户名 wheel  #将指定用户加入wheel组

vi /etc/pam.d/su  #进入设置su使用命令

Snipaste_20211201_115413.png
::: hljs-center

将允许使用su命令的用户加入wheel组

:::

Snipaste_20211201_112409.png
::: hljs-center

启用pam wheel认证模块

:::

Snipaste_20211201_113400.png
::: hljs-center

限制使用su命令的用户

:::

4、查看su操作记录

  • 安全日志文件: /var/log/secure.

Snipaste_20211201_120232.png
::: hljs-center

查看安全日志文件

:::

5、在/etc/ pam.d/su文件里设置禁正用户使用su命令

vim /etc/pam.d/su
2// auth sufficient pam_ rootok.so

6// #auth required pam wheel.so use uid

(a) 以上两行是默认状态(即开启第一-行,注释第二行),这种状态下是允许所有用户间使用su命令进行切换的

(b) 两行都注释也是运行所有用户都能使用su命令,但root.下使用su切换到其他普通用户需要输入密码;
如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam_ rootok. so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)

(c) 如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令

(d) 如果注释第一行,开启第二行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令

三、Linux的PAM认证

1、su命令的安全隐患

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

    2、PAM可插拔式认证模块

    • 是一种高效而且灵活便利的用户级别的认证方式。
    • 也是当前Linux服务器普遍使用的认证方式。

      3、PAM认证原理

    • 一般遵循的规律

      Service(服务)→ PAM(配置文件)→ pam_*.so

    • 首先要确定哪一项服务,然后加载相应的 PAM 的配置文件(位于 /etc/pam.d 下),最后调用认证文件(位于 /lib64/security 下)进行安全认证。
    • 用户访问服务器时,服务器的某一个服务程序把用户的请求发送到 PAM 模块进行认证。
    • 不同的应用程序所对应的PAM模块是不同的。
    • 如果想要查看某个程序是否支持 PAM 认证,可以使用 ls 命令,进行查看 /etc/pam.d/。
      ==PAM的配置文件中的每一行都是一个独立的认证过程,它们按从上往下的顺序依次由PAM模块调用。==

      4、PAM每一列名称的含义

      Snipaste_20211201_122849.png
      ::: hljs-center

PAM列表

:::

(1)、PAM第一列 —— PAM认证模块类型

  • ==auth==: 对用户身份进行识别,如提示输入密码,判断是否为root。

  • ==account==: 对账号各项属性进行检查,如是否允许登录系统,帐号是否已经过期,是否达到最大用户数等。

  • ==password==: 使用用户信息来更新数据,如修改用户密码。

  • ==session==: 定义登录前以及退出后所要进行的会话操作管理,如登录连接信息,用户数据的打开和关闭,挂载文件系统。

(2)、PAM第二列 —— PAM控制标记

  • ==required==: 表示需要返回一个成功值,如果返回失败,不会立刻将失败结果返回,而是继续进行同类型的下一验证,所有此类型的模块都执行完成后,再返回失败。

  • ==requisite==: 与required类似,但如果此模块返回失败,则立刻返回失败并表示此类型失败。

  • ==sufficient==: 如果此模块返回成功,则直接向程序返回成功,表示此类成功,如果失败,也不影响这类型的返回值。

  • ==optional==: 不进行成功与否的返回,一般不用于验证,只是显示信息(通常用于session 类型)。

  • ==include==: 表示在验证过程中调用其他的PAM配置文件。比如很多应用通过完整调用/etc/pam.d/system-auth(主要负责用户登录系统的认证工作)来实现认证而不需要重新逐一去写配置项。

(3)、PAM第三列 —— PAM模块

  • 默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径

  • 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

    (3)、PAM第四列 —— PAM模块的参数

  • 根据所使用的模块进行添加,传递给模块的参数,参数可以有多个,之间用空格分隔开。

    5、PAM安全认证流程

    ==控制类型也称做Control Flags,用于PAM验证类型的返回结果==
    (1)、required验证失败时仍然继续,但返回Fail。
    (2)、requisite验证失败则立即结束整个验证过程,返回Fail。
    (3)、sufficient验证成功则立即返回,不再继续,否则忽略结果并继续。
    (4)、optional不用于验证,只显示信息 (通常用于session类型)。

Snipaste_20211130_135803.png
::: hljs-center

PAM安全认证流程图

:::

==required== : 表示该行以及所涉及模块的成功是用户通过鉴别的[必要条件]。也就是说,只有当对应于应用程序的所有带requi red标记的模块全部成功时,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有此类型模块都调用完毕后才将错误消息返回调用他的程序,即必须将所有的此类型模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自已被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。
==requisite==: 与required相仿, 只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。与上面的required相比,似乎要显得更光明正大一些。
==sufficient==: 表示该行以及所涉及模块验证成功是用户通过鉴别的[充分条件]。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。即便后面的层叠模块使用了requisite或者required控制标志也是一样。当标记为sufficient的模块失败时,sufficient模块会当做optional对待。因此拥有sufficient标志位的配置项在执行验证出错的时候并不会导致整个验证失败,但执行验证成功之时则大门敞开。所以该控制位的使用务必慎重。
==optional==: 表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。即不管本行指定的模块验证失成功还是失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一个层叠模块。

四、sudo机制提升权限

1、sudo命令的用途及用法

用途:以其他用户身份(如root)执行授权的命令

用法:sudo 授权命令

2、配置sudo授权

  • visudo 或者 vi /etc/sudoers
    (此文件的默认权限为440,保存退出时必须执行 “:wq!”命令来强制操作)

Snipaste_20211201_131904.png
Snipaste_20211201_131757.png
::: hljs-center

配置sudo授权

:::

  • 记录格式:用户 主机名=(用户)命令程序列表
    例:Tom ALL=/ sbin/ ifconfig

==用户==: 直接授权指定的用户名,或采用“。组名"的形式(授权一个组的所有用户)。

==主机名==: 使用此规则的主机名。没配置过主机名时可localhost,有配过主机名则用实际的主机名,ALI则代表所有主机。

==(用户)==: 用户能够以何种身份来执行命令。此项可省略,缺省时以root用户的身份来运行命令。

==命令程序列表==: 允许授权的用户通过sudo方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号“,”进行分隔。ALL则代表系统中的所有命令。

通配符“*”表示所有;“!”取反符号,表示排除。
%wheel ALL=NOPASSWD:ALL  #表示wheel组成员无需验证密码即可使用sudo执行任何命令

4、查看sudo操作记录

==需启用 Defaults logfile 配置==
默认日志文件:/var/log/sudo
![Snipaste_20211130_154523.png]

5、查看授权的sudo操作

sudo -l

Snipaste_20211201_132553.png

::: hljs-center

查看授权的sudo操作

:::

五、开关机安全机制

1、调整BIOS引导设置

  • 将第一引导设备设为当前系统所在盘
  • 禁止从其他设备(光盘、U盘、网络)引导系统
  • 将安全级别设为setup,并设置管理员密码

    2、GRUB限制

    • 使用 grub2-mkpasswd-pbkdf2 密钥
    • 修改 /etc/grub.d/00_header 件中,添加密码记录
    • 生成新的 grub.cfg 配置文件
      注:限制更改GRUB 引导参数
      通常情况下在系统开机进入GRUB菜单时,按 e 键可以查看并修改GRUB引导参数,这对服务器是–个极大的威胁。
      可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

六、终端登录安全控制

1、限制root只在安全终端登录

安全终端配置:/etc/securetty

vi /etc/securetty
······
#tty5
#tty6 #禁止root用户从tty5和tty6登录

2、禁止普通用户登录

  • 建立/etc/nologin文件
  • 删除nologin文件或重启后即恢复正常
    touch /etc/nologin  #禁止普通用户登录
    rm -rf /etc/nologin  #取消上述登录限制

七、网络端口扫描

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

安装NMAP软件包

rpm -qa | grep nmap
yum install -y nmap

1、NMAP

namp 【扫描类型】【选项】<扫描目标>

• 一款强大的网络扫描、安全检测工具

• 官方下载网站: htp://nmap.org/

• CentOS 7.3光盘中安装包nmap-6.40-7.el7 .x86_ 64.rpm

2、NMAP常用的选项和扫描类型

选项 扫描类型
-p 指定扫描的端口
-n 禁用反向DNS 解析(以加快扫描速度)
-sS TCP的SYN扫描(半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放
-sT TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放
-sF TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对sYN数据包进行简单过滤,而忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性
-sU UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢
-sP ICMP 扫描,类似于ping 检测,快速判断目标主机是否存活,不做其他扫描
-P0 跳过ping检测,这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法ping通而放弃扫描
netstat -natp       #查看正在运行的使用TCP协议的网络状态信息

netstat -naup       #查看正在运行的使用UDP协议的网络状态信息

3、natstat命令常用选项:

选项 作用
-a 显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)
-n 以数字的形式显示相关的主机地址、端CI等信息
-t 查看TCP相关的信息
-u 显示UDP协议相关的信息
-P 显示与网络连接相关联的进程号、进程名称信息( 该选项需要root 权限)
-r 显示路由表信息
-l 显示处于监听状态的网络连接及端口信息
netstat -natp        #查看正在运行的使用TCP协议的网络状态信息
netstat -naup        #查看正在运行的使用UDP协议的网络状态信息
nmap -sT 127.0.0.1   #查看本机开放的TCP端口
nmap -sU 127.0.0.1   #查看本机开放的UDP端口