Linux系统安全及应用

2,374 阅读17分钟

1. 基本安全措施账号安全控制

1.1系统账号的清理

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

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

Snipaste_2022-03-24_14-04-10.png

usermod -s /sbin/nologin 用户名

示例:

Snipaste_2022-03-24_14-18-11.png

1.1.2锁定长期不使用的账号

命令格式(有两种方法):

方法一: passwd -l 用户名      //锁定用户
方法二: usermod -L 用户名     //锁定用户    

方法一: passwd -u 用户名      //解锁用户
方法二: usermod -U 用户名     //解锁用户

示例:

Snipaste_2022-03-24_14-31-07.png

1.1.3删除无用账户

userdel 用户名       //删除用户,但不删除用户的家目录
userdel -r 用户名    //删除用户的同时,删除他的家目录

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

示例:

Snipaste_2022-03-24_14-42-34.png

1.1.4 锁定账号文件passwd、shadow

chattr命令改变文件属性,lsattr命令查看文件底层属性。

命令格式: chattr

常用选项:

  • -a 让文件或目录仅供附加用途。只能追加

  • -i 不得任意更动文件或目录。

 chattr +a 文件或目录     //只允许对文件进行追加操作(适用于日志文件)
 chattr +i 文件或目录     //不能更改、重命名或删除这个文件

说明:

  • -R:递归处理,将指定目录下的所有文件及子目录一并处理。

  • -V:显示指令执行过程。

 chattr [-RV]  [+/-/=<属性>]  文件或目录   //改变文件属性
 
 lsattr  文件或目录     //查看文件底层属性

示例:

Snipaste_2022-03-24_14-55-11.png

1.2密码安全控制

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

  • 设置密码有效期
  • 要求用户下次登录时修改密码 两种方法:
1.[root@localhost ~]# chage -M 30 t4   这种方法适合修改已经存在的用户

2.[root@localhost ~]# vim /etc/login.defs   这种适合以后添加新用户,
   PASS_MAX_DAYS   30

1.2.1对于现有用户——chage命令

命令格式:

 chage  [选项]  用户名

常用选项:

-m:密码可更改的最小天数。为0时代表任何时候都可以更改密码。

-M:密码保持有效的最大天数。

-W:用户密码到期前,提前收到警告信息的天数。

-E:帐号到期的日期。过了这天,此帐号将不可用。

-d:设置”最后一次修改密码的日期“。设置为 0 有特殊意思,表示用户应该在下次登录系统时更改密码。

-i:停滞时期。允许密码过期后多少天内仍能使用,如果一个密码已过期这些天,那么此帐号将不可用。

-l:例出当前的设置。

示例:

  • 示例1(-M最大天数)

Snipaste_2022-03-24_15-02-36.png

  • 示例2(-d强制要求用户下次登录时必须修改密码)

Snipaste_2022-03-24_15-19-30.png

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

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

查看/etc/login.defs文件:

  • 示例(添加新用户,修改配置文件)

Snipaste_2022-03-24_15-06-07.png

Snipaste_2022-03-24_15-08-02.png

1.3 命令历史限制、自动注销

1.3.1命令历史限制

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

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

  • 减少记录的命令条数。
  • 注销时自动清空命令历史,或登录时自动清空命令历史。

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

命令:

减少记录命令的条数:
1.[root@localhost ~]# vim /etc/profile   //进入配置文件修改限制命令条数。适合新用户
   HISTSIZE=200          //修改限制命令为200条,系统默认是1000条profile 
   [root@localhost ~]# source /etc/profile   //刷新配置文件,使文件立即生效
 
2.[root@localhost ~]# export HISTSIZE=200  //适用于当前用户1. 临时修改历史命令条数。只针对当前用户,退出登录后失效。 
   [root@localhost ~]# source /etc/profile  //刷新配置文件,使文件立即生效  
   
3. 注销时自动清空命令:
 [root@localhost ~]# vim ~/.bashrc
  echo "" > ~/.bash_history
     
4. 登录时自动清空历史命令:
[root@localhost ~]# vim ~/.bashrc 
  echo "" > ~/.bash_history

  • 示例 示例一:减少记录命令的条数

Snipaste_2022-03-24_15-38-00.png

Snipaste_2022-03-24_15-39-37.png

Snipaste_2022-03-24_15-39-51.png

Snipaste_2022-03-24_15-40-34.png

示例二:当前用户

Snipaste_2022-03-24_15-52-35.png

示例三:编辑 ~/.bash_logout 文件,注销时自动清空历史命令

Snipaste_2022-03-24_15-57-22.png

示例四:编辑 ~/.bashrc 文件,在登录时清空命令历史

Snipaste_2022-03-24_15-59-47.png

  • 注释:登录和注销两种办法取其一即可

1.3.2自动注销

闲置600秒后自动注销:
[root@localhost ~]#vim .bash_profile    //进入配置文件
    export TMOUT=600    //全局声明超过600秒闲置后自动注销终端
[root@localhost ~]# source .bash_profile   //刷新配置文件
[root@localhost ~]# echo $TMOUT            //查看自动注销时间

解除自动注销:
[root@localhost ~]#vim .bash_profile       //进入配置文件
  # export TMOUT=600  注释掉这条命令,就不会自动注销了

[root@localhost ~]# export TMOUT=600   
#如果不在配置文件输入这条命令,那么是对当前用户生效

示例:

示例一: Snipaste_2022-03-24_16-09-15.png

Snipaste_2022-03-24_16-10-18.png

Snipaste_2022-03-24_16-11-57.png

示例二:

Snipaste_2022-03-24_16-11-12.png

2 用户切换和提权

2.1 用户切换——su命令(加入wheel组)

2.1.1 用户切换——su 命令介绍

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

查看su操作记录:

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

命令格式:

1.用途及用法
用途:Substitute User,切换用户
格式:su - 目标用户(横杠“ - ”代表切换到目标用户的家目录)

root - - - >任意用户,不验证密码
普通用户- - - >其他用户,验证目标用户的密码
带 “ - ” 表示将使用目标用户的登录Shell环境

2.查看su操作记录
安全日志文件:/var/log/secure

3.whoami确定当前用户是谁

4. vim /etc/pam.d/su
   把第六行注释去掉保存退出
   
默认情况下,使用root切换不需要密码
注释两行,所有账号都可以使用,但是root切换时需要密码

gpasswd -a hope wheel  //将用户加入wheel组中

示例一:切换用户

Snipaste_2022-03-24_16-31-00.png

Snipaste_2022-03-24_18-28-33.png

示例二:查看su操作记录

Snipaste_2022-03-24_18-32-09.png

实例三:查看当前用户

Snipaste_2022-03-24_18-32-53.png

示例四:修改配置文件

Snipaste_2022-03-24_18-35-56.png

Snipaste_2022-03-24_18-36-28.png

Snipaste_2022-03-24_18-39-30.png

  • 将用户hope加入到wheel组中
gpasswd -a hope wheel

Snipaste_2022-03-24_18-43-00.png

Snipaste_2022-03-24_18-43-33.png

2.2提升执行权限——sudo命令

2.2.1sudo命令和/etc/sudoers配置文件

sudo 即superuser do,允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。在最早之前,一般用户管理系统的方式是利用su切换为超级用户。但是使用su的缺点之一在于必须要先告知超级用户的密码。

查看sudo操作记录:

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

使用visudo命令,可编辑配置文件/etc/sudoers:

Snipaste_2022-03-24_19-12-54.png

 #用户    登入主机 = (代表用户)     命令
 #user     host=(username)       command
  root       ALL=(ALL)          ALL
  %wheel      ALL=(ALL)         NOPASSWD:ALL
  
 #root表示允许哪个用户。%wheel表示wheel组。
 #第一个ALL表示通过哪些主机登入。
 #第二个ALL表示以哪个用户身份。
 #最后一个ALL表示允许运行哪些命令。
 #NOPASSWD表示使用sudo命令不需要验证密码。
 
 举例说明:
 1.hope    ALL=(root)   /bin/mount
 #表示hope用户通过任何主机登入系统后,可以以root的身份运行mount命令(命令前必须加sudo)。

 2.%wheel    ALL=(ALL)   ALL
 #表示wheel组内的成员通过任何主机登入系统后,可以以任何用户的身份运行所有命令(命令前必须加sudo)。
 
 字段填写说明:
 1.user:可以写用户名或UID。
 2.group:可以写组名或GID。
 3.host:可以写ip或hostname(IP地址或主机名)。
 4.command:
  command name  (命令)
  directory     (文件夹里的命令)
  sudoedit      (可以编辑sudoers这个文件,变相变成管理员)
  Cmnd_Alias    (命令别名)
  
 注:配置文件内支持使用通配符,例如"/sbin/*"表示/sbin/目录下的所有命令。

- sudo命令的用途及用法:

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

用法:sudo 授权命令

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

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

示例:

允许mrhope用户以任何用户的身份运行所有命令。

允许hope用户以root用户的身份运行mount命令。

  • mrhope创建文件失败

Snipaste_2022-03-24_19-37-45.png

  • hope挂载失败

Snipaste_2022-03-24_19-49-24.png

  • visudo修改配置文件

Snipaste_2022-03-24_19-50-03.png

Snipaste_2022-03-24_19-51-43.png

  • mrhope创建文件成功 Snipaste_2022-03-24_19-54-04.png
  • hope用户挂载成功

Snipaste_2022-03-24_19-57-59.png

2.2.2sudo别名

sudo别名有四种类型:

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

示例:

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

 [root@localhost ~]# visudo
 ----------------------------------
Host_Alias MYHOSTS = kgc,localhost
User_Alias MYUSERS = mosanb,hawok
Cmnd_Alias MYCMNDS =/sbin/*,!/sbin/reboot,!/sbin/poweroff,!/sbin/init,!/usr/bin/rm
MYUSERS MYHOSTS=NOPASSWD:MYCMNDS

Snipaste_2022-03-24_21-14-16.png

- 如果配置文件有语法错误,visudo命令会进行提示

Snipaste_2022-03-24_21-29-00.png

2.2.3 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
-rw-r--r--. 1 root root 34 3月  24 21:22 /etc/sudoers.d/test

Snipaste_2022-03-24_21-25-19.png

注:

如果允许用户使用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可以修改配置文件,十分危险

2.2.4 查看sudo操作记录

  • 需要启用 Default logfile 配置
  • 默认日志文件:/var/log/sudo
[root@localhost log]# visudo          //修改配置文件
-----------------------------
Defaults logfile = "/var/log/sudo"       //在最后一行添加 Default logfile 配置

Snipaste_2022-03-24_21-28-22.png

测试查看日志是否正常记录:

[root@localhost ~]# sudo -u mrhope touch /tmp/22.txt 
#以mrhope用户创建文件
[root@localhost ~]# tail -4 /var/log/sudo
Mar 24 21:35:55 : root : TTY=pts/2 ; PWD=/root ; USER=mrhope ;
    COMMAND=/bin/touch /tmp/22.txt
#日志成功记录sudo操作

Snipaste_2022-03-24_21-37-02.png

2.3PAM安全认证

PAM:Pluggable Authentication Modules,插件式的验证模块,Sun公司于1995 年开发的一种与认证相关的通用框架机制。PAM 只关注如何为服务验证用户的 API,通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序一种认证框架,自身不做认证。

官网:www.linux-pam.org/

 [root@localhost ~]#rpm -qi pam     //查看当前系统pam
 [root@localhost ~]#rpm -ql pam     //查看模块
 ​
 [root@localhost ~]#ls /usr/lib64/security/*.so|wc -l   //60个模块是二进制文件,不会直接修改
 60
 ​
 [root@localhost ~]#ls /etc/security/    //和上面的模块配合使用,有些比较简单的模块没有配置文件
 access.conf       console.perms.d  namespace.d     sepermit.conf
 chroot.conf       group.conf       namespace.init  time.conf
 console.apps      limits.conf      opasswd
 console.handlers  limits.d         pam_env.conf
 console.perms     namespace.conf   pwquality.conf
 
 #我们去修改配置文件
 /etc/security
 /etc/pam.d/*
 ​
 ​
 [root@localhost ~]#cd /etc/pam.d/   //这里的文件是应用程序怎么调用模块的
 [root@localhost pam.d]#ls
 atd                     login              smtp
 chfn                    other              smtp.postfix
 chsh                    passwd             sshd
 config-util             password-auth      sssd-shadowutils
 crond                   password-auth-ac   su
 cups                    pluto              sudo
 fingerprint-auth        polkit-1           sudo-i
 fingerprint-auth-ac     postlogin          su-l
 gdm-autologin           postlogin-ac       system-auth
 gdm-fingerprint         ppp                system-auth-ac
 gdm-launch-environment  remote             systemd-user
 gdm-password            runuser            vlock
 gdm-pin                 runuser-l          vmtoolsd
 gdm-smartcard           setup              vsftpd
 ksu                     smartcard-auth     xserver
 liveinst                smartcard-auth-ac
 ​
 [root@localhost pam.d]#cat /etc/pam.d/sshd    //文件类型
 #%PAM-1.0
 auth       required pam_sepermit.so
 auth       substack     password-auth
 auth       include      postlogin
 # Used with polkit to reauthorize users in remote sessions
 -auth      optional     pam_reauthorize.so prepare
 account    required     pam_nologin.so
 account    include      password-auth
 password   include      password-auth
 # pam_selinux.so close should be the first session rule
 session    required     pam_selinux.so close
 session    required     pam_loginuid.so
 # pam_selinux.so open should only be followed by sessions to be executed in the user context
 session    required     pam_selinux.so open env_params
 session    required     pam_namespace.so
 session    optional     pam_keyinit.so force revoke
 session    include      password-auth
 session    include      postlogin
 # Used with polkit to reauthorize users in remote sessions
 -session   optional     pam_reauthorize.so prepare

image-20220305012658912.png PAM提供了对所有服务进行认证的中央机制,适用于本地登录,远程登录,如:telnet,rlogin,fsh,ftp,点对点协议PPP,su等应用程序中,系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;而PAM服务模块的开发者则利用PAM SPI来编写模块(主要调用函数pam_sm_xxxx( )供PAM接口库调用,将不同的认证机制加入到系统中;PAM接口库(libpam)则读取配置文件,将应用程序和相应的PAM服务模块联系起来。重复利用别人的开发的功能,不必自己开发,会话,密码验证等功能,已经做好了调用下就可以了未来通用性,所以有了pam框架。

2.3.1 PAM相关文件

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

2.3.2 PAM工作原理

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

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

PAM认证过程示例:

1.使用者执行/usr/bin/passwd 程序,并输入密码
2.passwd开始调用PAM模块,PAM模块会搜寻passwd程序的PAM相关设置文件,这个设置文件一般是在/etc/pam.d/里边的与程序同名的文件,即PAM会搜寻/etc/pam.d/passwd此设置文件
3.经由/etc/pam.d/passwd设定文件的数据,取用PAM所提供的相关模块来进行验证
4.将验证结果回传给passwd这个程序,而passwd这个程序会根据PAM回传的结果决定下一个动作(重新输入密码或者通过验证)

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

type control module-path arguments
application:指服务名,如:telnet、login、ftp等,服务名字“OTHER”代表所有没有在该文件中明确
配置的其它服务
type:指模块类型,即功能
control :PAM库该如何处理与该服务相关的PAM模块的成功或失败情况,一个关健词实现
module-path: 用来指明本模块对应的程序文件的路径名
Arguments: 用来传递给该模块的参数

配置文件/etc/pam.d/每一行都是一个独立的认证过程。

每一行可以区分为三个字段: 认证类型 、控制类型 、PAM 模块及其参数 。具体如下:

认证类型(module-type):

  • 认证管理(authentication management):接受用户名和密码,进而对该用户的密码进行认证;
  • 帐户管理(account management):检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等;
  • 密码管理(password management):用户修改密码时密码复杂度检查机制等功能;
  • 会话管理(session management):主要是提供对会话的管理和记账。
  • -type 表示因为缺失而不能加载的模块将不记录到系统日志,对于那些不总是安装在系统上的模块有用。

控制类型: 也可以称做 Control Flags,用于 PAM 验证类型的返回结果。

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

PAM 模块及其参数:

  • 默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。

3 系统引导和登录控制

3.1开关机安全控制

3.1.1调整BIOS引导设置原则

  • 将第一引导设备设为当前系统所在硬盘;

  • 禁止从其他设备(光盘、 U盘、网络)引导系统;

  • 将安全级别设为setup,并设置管理员密码。

  • 禁用重启热键:Ctrl+Alt+Delete 避免因用户误操作重启

3.1.2GRUB菜单设置

  • 未经授权禁止修改启动参数

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

3.1.3GRUB限制的实现

文件描述
00_header设置grub默认参数
10_linux系统中存在多个linux版本
20_ppc_terminfo设置tty控制台
30_os_prober设置其他分区中的系统(硬盘中有多个操作系统时设置)
40_custom和41_custom用户自定义的配置

设置GRUB 2加密

由于GRUB 2负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。

在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。

GRUB 2密码支持以下两种格式:

  • 明文密码:密码数据没有经过加密,安全性差。
  • PBKDF2加密密码:密码经过PBKDF2哈希算法进行加密,在文件中存储的是加密后的密码数据,安全性较高。

为GRUB菜单设置密码的两种方式:

  • CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码;
  • CentOS 6系统中,先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令,然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令,最后使用grub2-mkconfig命令生成grub配置文件。(/etc/grub.d/00_header是开机时第一个启动的文件)
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。

使用grub2-mkpasswd-pbkdf2获得加密字符串;

修改/etc/grub.d/00_ header文件中, 添加密码记录;

生成新的grub.cfg配置文件。

方法一:
1.  使用grub2-mkpasswd-pbkdf2生成密钥并复制,然后备份两个配置文件。 
2.  修改/etc/grub.d/00_ header文件中, 添加密码记录,并存并退出 
​
方法二:
直接设置grub2—setpasswd 设置grub密码

1.生成新的grub.cfg文件,然后重启系统

2.验证结果

  • 实验案例 方法一:
 # 步骤1.生成PBKDF2加密口令
 [root@localhost ~]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password: 
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.4A19BFED9FC6A62C5EE60B8B9F6931469765CAF19D2B00B1E9772B6BB715844467BCC3BD732A3C7AD8043620B805839893F1B00786390730FFF2454676CC580A.312466BD865BAE8A5049C0BC55337EAC90B724EBB50293F371DA6478AC269B26568904FA745B2DB4CB3BB0F2C0BA67648B02CF909B0713CA37804461B36802A6
 
 # 步骤2.备份两个配置文件
[root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub2.cfg.bak
[root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak

 # 步骤3.编辑配置文件/etc/grub.d/00_header,将加密口令添加进文件。注意复制口令时不要有空格。
 [root@localhost ~]# vim /etc/grub.d/00_header
 -------------------------------
 cat <<EOF
set superusers="root"
password_pbkdf2 root grub.pbkdf2.sha512.10000.4A19BFED9FC6A62C5EE60B8B9F6931469765CAF19D2B00B1E9772B6BB715844467BCC3BD732A3C7AD8043620B805839893F1B00786390730FFF2454676CC580A.312466BD865BAE8A5049C0BC55337EAC90B724EBB50293F371DA6478AC269B26568904FA745B2DB4CB3BB0F2C0BA67648B02CF909B0713CA37804461B36802A6
EOF
 ​
 # 步骤4.使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
 [root@localhost boot]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-693.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-693.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-98d8d6149a8e4e42bb00cd1defbf5296
Found initrd image: /boot/initramfs-0-rescue-98d8d6149a8e4e42bb00cd1defbf5296.img
done


Snipaste_2022-03-24_21-54-50.png Snipaste_2022-03-24_22-03-28.png Snipaste_2022-03-24_22-04-15.png

Snipaste_2022-03-24_22-05-36.png

Snipaste_2022-03-24_22-16-32.png

Snipaste_2022-03-24_22-20-20.png

Snipaste_2022-03-24_22-23-53.png

方法二:CentOS 7系统中,直接使用 “grub2-setpasswd” 命令设置grub密码。

 [root@localhost ~]# grub2-setpassword    //使用命令直接设置GRUB密码
 Enter password:                          //输入密码
 Confirm password:                        //确认密码

Snipaste_2022-03-24_22-26-56.png

Snipaste_2022-03-24_22-28-13.png

3.2 终端登录安全控制

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

安全终端配置:/etc/securetty

示例:

将终端tty5、tty6注释掉,禁止root用户从这两个终端登录。

 [root@localhost ~]# vi /etc/securetty   //编辑配置文件,将终端tty5、tty6注释掉
 ----------------------
 #tty5
 #tty6

Snipaste_2022-03-24_22-36-43.png

3.2.2 禁止普通用户登录

  • 建立/etc/nologin文件
  • 删除nologin文件或者重启后即恢复正常
 [root@localhost ~]# touch /etc/nologin     //禁止普通用户登录

 [root@localhost ~]# rm -rf /etc/nologin    //取消普通用户登录限制

Snipaste_2022-03-24_22-39-43.png

Snipaste_2022-03-24_22-47-57.png

Snipaste_2022-03-24_22-49-37.png

4 网络端口扫描——nmap工具

4.1 nmap工具

image-20220306025633184.png 网络端口扫描:

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

服务和端口号:

服务端口号
HTTP80
HTTPS443
Telnet23
FTP21
SSH(安全登录)、SCP(文件传输)、端口重定向22
SMTP25
POP3110
WebLogic7001
TOMCAT8080
WIN2003远程登录3389
Oracle数据库1521
MS SQL* SEVER数据库sever1433
MySQL 数据库sever3306

安装nmap:

 [root@localhost ~]# rpm -qa|grep nmap      //查看nmap
 [root@localhost ~]# yum install -y nmap    //安装nmap

nmap命令常用格式

 nmap [扫描类型]  [选项]  <扫描目标>

常用选项和扫描类型

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通而放弃扫描。

用于主机发现的一些用法

-sL: List Scan 列表扫描,仅将指定的目标的IP列举出来,不进行主机发现。  
  
-sn: Ping Scan 只进行主机发现,不进行端口扫描。  
  
-Pn: 将所有指定的主机视作开启的,跳过主机发现的过程。  
  
-PS/PA/PU/PY[portlist]: 使用TCPSYN/ACK或SCTP INIT/ECHO方式进行发现。  
  
-PE/PP/PM: 使用ICMP echo, timestamp, and netmask 请求包发现主机。-PO[protocollist]: 使用IP协议包探测对方主机是否开启。  
  
-n/-R: -n表示不进行DNS解析;-R表示总是进行DNS解析。  
  
--dns-servers <serv1[,serv2],...>: 指定DNS服务器。  
  
--system-dns: 指定使用系统的DNS服务器  
  
--traceroute: 追踪每个路由节点 

Nmap用于端口扫描的一些用法

  -sS/sT/sA/sW/sM:指定使用 TCP SYN/Connect()/ACK/Window/Maimon scans的方式来对目标主机进行扫描。  
  
  -sU: 指定使用UDP扫描方式确定目标主机的UDP端口状况。  
  
  -sN/sF/sX: 指定使用TCP Null, FIN, and Xmas scans秘密扫描方式来协助探测对方的TCP端口状态。  
  
  --scanflags <flags>: 定制TCP包的flags。  
  
  -sI <zombiehost[:probeport]>: 指定使用idle scan方式来扫描目标主机(前提需要找到合适的zombie host)  
  
  -sY/sZ: 使用SCTP INIT/COOKIE-ECHO来扫描SCTP协议端口的开放的情况。  
  
  -sO: 使用IP protocol 扫描确定目标机支持的协议类型。  
  
  -b <FTP relay host>: 使用FTP bounce scan扫描方式  

示例:

 # 分别查看本机开放的TCP端口、UDP端口
 [root@localhost ~]# nmap -sT 127.0.0.1
 [root@localhost ~]# nmap -sU 127.0.0.1
 
 # 检测192.168.80.0/24网段有哪些主机提供HTTP服务
 [root@localhost ~]# nmap -p 80 192.168.80.0/24
 [root@localhost ~]# nmap -p 80 192.168.91.100/24

 # 检测192.168.80.0/24网段有哪些存活主机
 [root@localhost ~]# nmap -n -sP 192.168.80.0/24 

4.2 netstat命令

netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。

命令格式:

 netstat  [选项]

常用选项

-a显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口)。
-n拒绝显示别名,以数字的形式显示相关的主机地址、端口等信息。
-t查看TCP协议相关的信息。
-u显示UDP协议相关的信息。
-p显示与网络连接相关联的进程号、进程名称信息(该选项需要root权限)
-r显示路由表信息。
-l显示处于监听状态(Listen)的网络连接及端口信息。

常用搭配:

 netstat -a       //列出所有端口
 ​
 netstat -at      //列出所有TCP端口
 ​
 netstat -au      //列出所有UDP端口
 ​
 netstat -ax      //列出所有unix端口
 ​
 netstat -lt      //列出处于监听状态的TCP端口
 ​
 netstat -tnlp    //直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名

示例一:netstat -au,列出所有UDP端口

Snipaste_2022-03-24_23-04-52.png

示例二:netstat -tnlp,直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名。

Snipaste_2022-03-24_23-06-11.png