Linux系统安全及应用

148 阅读13分钟

系统安全控制

系统账号清理

将非登录用户的shell设为/sbin/nologin
usermod -s /sbin/nologin
锁定长期不使用的账号
usermod -L 用户名 passwd -l 用户名
passwd -S 用户名
删除无用的账户
userdel [-r] 用户名  ###删除连带家目录-r
锁定账户文件passwd、shadow(锁定passwd文件就不能再更改添加用户等相关的操作)
chattr +i /etc/passwd  /etc/shadow  ###锁定文件
lsattr  /etc/passwd  /etc/shadow   ###查看状态
chattr -i /etc/passwd  /etc/shadow  ###解锁文件

chattr +i /etc/passwd锁定用户目录 QQ截图20220809232646.png userdel li 无法删除用户 QQ截图20220809233710.png chattr +i /etc/shadow 锁定密码文件并修改密码 QQ截图20220809234505.png lsattr -i 解锁 QQ截图20220809234916.png

账号密码安全控制

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

vi  /etc/login.defs ###修改密码配置文件适用于新建用户

PASS_MAX_DAYS  XX ###打开login.defs文件后修改密码有效期时间,xx表示天数

chage  -M 30 用户名  ###适用于已有用户

cat  /etc/shadow |grep lisi

chage -d 0 用户名 ###强制在下次登录是更改密码

###shadow文件中的第三个字段被自改为0

cat  /etc/shadow |grep zhangsan

修改login.defs文件 QQ截图20220810215406.png

命令历史限制

减少记录的命令条数(100-200历史信息足够日常使用)

可以使用ctrl+r,然后敲关键字,联想之前的命令,要是当前联想的不对,可以继续按ctrl+r翻滚命令

QQ截图20220810220533.png histor也可以查找到历史操作的命令

QQ截图20220810220709.png history显示历史命令以后可以加上!+序号可以再次执行命令 QQ截图20220810220951.png 修改vim /etc/profile文件可以设置历史命令条数 QQ截图20220810222444.png QQ截图20220810221743.png

登录时自动清空历史命令

history-c临时清空当前系统的所有历史命令(并不能永久的清空) QQ截图20220810223504.png 为什么临时删除历史命令,重启以后还能找到? QQ截图20220810224141.png 系统中常用的四个配置文件

对所有的用户都有效
/etc/profile  //系统环境变量配置文件(设置环境变量)
开机时用户首次登录会自动载入(只会加载1次)如果想重新加载profile可以使用source   .  
/etc/bashrc   //
用户在切换 shell 环境时也会自动加载此文件中的配置

只针对当前用户有效
~/.bash_profile
~/.bashrc(切换环境时也会自动加载)

如果只想第一次次登录清空一次历史命令就把文件写入.bash_profile

写入以后保存信息 QQ截图20220810231602.png 此时检查历史命令还是存在的 QQ截图20220810231741.png 重启以后历史命令就被自动的删除了 QQ截图20220810232008.png

如果想切换一次 shell 环境就清空一次历史命令就写入bashcr

QQ截图20220810230710.png

终端自动注销

显示100秒后会自动注销

编辑30秒退出终端 QQ截图20220813164535.png QQ截图20220813164506.png

QQ截图20220813164705.png

su命令

用途及用法

用途:切换用户

用法:su -目标用户

su有两种用法:

1.root超级管理员用户切换用户不要登录密码可以直接操作

QQ截图20220810233141.png 普通用户切换到超级管理员用户必须输入密码验证才能使用root用户

QQ截图20220810233254.png 2.加 -让登录的用户加载shell环境

QQ截图20220810234243.png 不加-默认登录的用户还是超级管理员用户

QQ截图20220810234354.png

QQ截图20220810234643.png

用su命令切换用户

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

为什么要使用wheel组成员?

也就是说如果你不是 wheel 组成员,那就没有 root 身上任何的特权。 也因为这样,使用 wheel 组成员用户的话,会尽量减少对系统 “摧毁性” 破坏的概率和风险。 如今大多数的 Linux 发行版本中,仍然保留了 wheel 这个组,虽然它已经不像当初设计出来的那样必要了,但是有些老玩家还是忠于这种旧式经典风格的,所以他们经常还是依旧让 wheel 组发挥着以往的作用。 QQ截图20220809233710.png 添加组 QQ截图20220811172827.png

QQ截图20220811173019.png /etc/pam.d/su开启pam服务 QQ截图20220811173412.png

QQ截图20220811173338.png 只要不在wheel组中有密码也无法登录 QQ截图20220811174706.png 只要在wheel组中有密码就可以登录root QQ截图20220811175013.png 详情查看注释 QQ截图20220811173412.png

QQ截图20220811222935.png

pam_wheel认证模块

PAM 的全称为“可插拔认证模块(Pluggable Authentication Modules)”。设计的初衷是将不同的底层认证机制集中到一个高层次的API中,从而省去开发人员自己去设计和实现各种繁杂的认证机制的麻烦。如果没有 PAM ,认证功能只能写在各个应用程序中,一旦要修改某个认证方法,开发人员可能不得不重写程序,然后重新编译程序并安装;有了 PAM ,认证的工作都交给 PAM ,程序主体便可以不再关注认证问题了:“ PAM 允许你进来,那你就进来吧。” PAM架构

QQ截图20220811223639.png pam 认证原理

PAM 认证一般遵循这样的顺序:
   Service(服务) →PAM( 配置文件) →pam_*.so。
PAM 认证首先要确定那一项服务,然后加载相应的PAM的配置文件( 位于/etc/pam.d 下) 
最后调用认证文件( 位于/lib/security 下) 进行安全认证。

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回传的结果决定下一个动作(重新输入密码或者通过验证)

pam认证的构成 要查看某个程序是否支持pamr认证,可以使用ls命令 QQ截图20220811231422.png 查看supam配置文件

每一行都是一个独立的认证过程
每一行可以区分为三个字段
认证类型
控制类型
pam模块及其参数

QQ截图20220811232334.png pam验证控制类型

验证控制类型也可以称做Control Flags,用于PAM验证类型的返回结果,具体有以下四种:

OIP-C.jpg

1、required:验证失败时仍然继续,但返回Fail(用户不会知道哪里失败)。
2、requisite:验证失败则立即结束整个验证过程,返回Fail。
3、sufficient:验证成功则立即返回,不再继续,否则忽略结果并继续。
4、optional:无论验证结果如何,均不会影响(通常用于session类型)。

sudo提升权限

su命令的缺点

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

sudo命令命令的用途及用法

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

用法:sudo 授权命令

配置sudo授权

visudo或者`Vi /etc/sudoers

语法格式

用户  主机名=命令程序列表
用户  主机名=(用户)命令程序列表

用户:直接授权指定的用户名,或者采用(%组名)的形式(授权一个组的所有用户)

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

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

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

举例: Tom ALL=/sbin/ifconfig

wang localhost=/sbin/*,!/sbin/reboot/,sbin/paweroff (通配符 * 代表所有 取反符号!表示排除 如果不再wheelZ组里面也没有权限就无法使用一些命令 QQ截图20220813152457.png 直接修改用户权限 QQ截图20220813152731.png QQ截图20220813152717.png 更改权限以后就可以使用命令 QQ截图20220813152910.png QQ截图20220813152924.png

启动sudo操作日志

QQ截图20220813161038.png QQ截图20220813161108.png 切换别的用户操作 QQ截图20220813161135.png

QQ截图20220813161234.png

QQ截图20220813161325.png 日志会收集用户操作的所有细节 QQ截图20220813161336.png 普通用户时无法查看日志的 没有权限 QQ截图20220813161748.png 普通用户想知道自己可以使用的权限可以使用sudo -l来查看可用的权限

QQ截图20220813163657.png

开关机安全控制

调整BIOS引导设置

1.将第一引导设备设置为当前系统所在硬盘

2.禁止从其它设备(光盘,U盘,网络)引导系统

3.将安全级别设为setuo并设置管理员密码

GRUB限制

使用grub2-mkpasswd-pbkdf2生成密钥

修改/etc/grub.d/00_header文件,添加密钥记录

生成新的grub.cfg配置文件

pbkdf2加密方式生成一个密码 QQ截图20220813203925.png /etc/grub.d查看一下配置文件 QQ截图20220813205504.png 进入配置文件添加一开始设置密码生成的密钥 QQ截图20220813205543.png QQ截图20220813205003.png 复制一分文件出错了直接复制回源文件

QQ截图20220813205842.png 使用grub2-mkconfig -o重新生成grub配置文件 QQ截图20220813210227.png 进入菜单界面按E进入后输入密码即可 QQ截图20220813210633.png

终端登录安全控制

限制root只在安全终端登录

安全中端配置:/etc/securetty

需要限制哪一个运行级别直接加#号注释吊即可 QQ截图20220813214725.png 限制普通用户登录(可以防止维修时有人登录)

QQ截图20220813215140.png

QQ截图20220813215226.png 如果需要允许普通用户登录直接删掉建立的文件即可 QQ截图20220813215609.png QQ截图20220813215503.png

系统弱口令监测

JR

简介 一款免费、开源的暴力密码破解器,它有多平台版本,支持目前大多数的加密算法,如DES、MD4、MD5等。该软件破解密码方式简单而粗暴,理论上只要时间上面允许,该软件可以破译绝大多数用户密码。John the Ripper免费的开源软件,支持目前大多数的加密算法,如DES、MD4、MD5等。它支持多种不同类型的系统架构,包括Unix、Linux、Windows、DOS模式、BeOS和O

安装JR工具

  • 安装方法make clean系统类型
  • 主程序文件为john

检测弱口令账号

  • 获得Linux/Unix服务器的shadow文件
  • 执行john程序,将shadow文件作为参数

密码文件的暴力破解

  • 准备好密码字典文件,默认为password.lst
  • 执行john程序,结合--wordlist=字典文件

直接安装软件即可 QQ截图20220813220815.png

QQ截图20220813221009.png

网络端口扫描

网络扫描——NMAP

  • NMAP是一个强大的端口扫描类安全评测工具,支持 ping 扫描、多端口检测等多种技术。 -官方网站Nmap: the Network Mapper - Free Security Scanner
  • CentOS 7.3光盘中安装包 nmap-6.40-7.el7.x86_64.rpm
  • 安装NMAP软件包
[root@localhost ~]# rpm -qa|grep nmap     //查看nmap 
[root@localhost ~]# yum install -y nmap   //安装nmap

nmap命令常用格式

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

nmap命令常用的选项和扫描类型

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

QQ截图20220814122723.png

QQ截图20220814122852.png

QQ截图20220814122953.png 例子:

# 分别查看本机开放的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

netstat

该 netstat 的命令用来显示网络状态

传统上,它用于问题确定而不是性能测量。但是,netstat 命令可用于确定网络上的流量,以确定性能问题是否是由于网络拥塞引起的。

在 netstat 的关于所配置的网络接口,诸如以下的流量命令显示信息:

  • 与所有sockets关联的任何协议控制块的地址以及所有sockets的状态
  • 通信子系统中接收,传输和丢弃的数据包数
  • 每个接口的累积统计信息
  • 路线及其状态

命令格式:

netstat    [选项]

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端口,且加上程序名
[root@localhost run]#netstat -lt   //列出处于监听状态的TCP端口
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     
tcp        0      0 localhost.locald:domain 0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 localhost:ipp           0.0.0.0:*               LISTEN     
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 localhos:x11-ssh-offset 0.0.0.0:*               LISTEN     
tcp        0      0 localhost:6011          0.0.0.0:*               LISTEN     
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN     
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN     
tcp6       0      0 localhos:x11-ssh-offset [::]:*                  LISTEN     
tcp6       0      0 localhost:6011          [::]:*                  LISTEN  
[root@localhost run]#netstat -tnlp   //直接使用ip地址列出所有处于监听状态的TCP端口,且加上程序名
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1445/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1224/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1225/cupsd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1381/master         
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      3545/sshd: root@pts 
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      4473/sshd: root@pts 
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1224/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1225/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1381/master         
tcp6       0      0 ::1:6010                :::*                    LISTEN      3545/sshd: root@pts 
tcp6       0      0 ::1:6011                :::*                    LISTEN      4473/sshd: root@pts 

[root@localhost run]#netstat -at   //列出所有TCP端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN     
tcp        0      0 localhost.locald:domain 0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN     
tcp        0      0 localhost:ipp           0.0.0.0:*               LISTEN     
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN     
tcp        0      0 localhos:x11-ssh-offset 0.0.0.0:*               LISTEN     
tcp        0      0 localhost:6011          0.0.0.0:*               LISTEN     
tcp        0      0 localhost.localdoma:ssh 192.168.85.1:55533      ESTABLISHED
tcp        0     52 localhost.localdoma:ssh 192.168.85.1:49317      ESTABLISHED
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN     
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN     
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN     
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN     
tcp6       0      0 localhos:x11-ssh-offset [::]:*                  LISTEN     
tcp6       0      0 localhost:6011          [::]:*                  LISTEN