Linux系统安全及应用


文章目录


1账号安全基本措施

系统账号清理

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

    禁止非登录用户通过Shell访问系统

    bash 复制代码
    usermod -s /sbin/nologin 用户名
  • 锁定长期不使用的账号

    对长期不活跃的账号进行锁定,避免潜在的安全风险。

    bash 复制代码
    usermod -L 用户名  # 锁定用户
    passwd -l 用户名  # 锁定密码
    passwd -S 用户名  # 查看账号状态
  • 删除无用的账号

    清理无用的账号,保持系统用户列表的简洁和安全。

    bash 复制代码
    userdel [-r] 用户名  # 使用-r选项同时删除用户的主目录
  • 锁定账号文件passwd、 shadow

    锁定关键系统文件以防止未授权的更改。

    bash 复制代码
    chattr +i /etc/passwd /etc/shadow  # 锁定文件
    lsattr /etc/passwd /etc/shadow  # 查看文件属性
    chattr -i /etc/passwd /etc/shadow  # 解锁文件

密码安全控制

  • 设置密码有效期

    强制用户定期更新密码,提升密码的安全性。

    新建用户: 修改全局密码策略,适用于所有新建用户。

    bash 复制代码
    [root@localhost ~]# vi /etc/login.defs # 修改配置文件
    PASS_MAX_DAYS  30  # 密码有效期为30天

    已有用户: 针对特定用户设置密码有效期。

    bash 复制代码
    [root@localhost ~]# chage -M 30 lisi  
    # 设置用户lisi密码有效期为30天
    [root@localhost ~]# cat /etc/shadow | grep lisi  
    # 查看用户lisi的密码信息
  • 要求用户下次登录时修改密码

    强制用户在下次登录时更新密码,提升安全性。

    bash 复制代码
    [root@localhost ~]# chage -d 0 zhangsan  
    # 将用户zhangsan的密码修改日期设置为0
    
    [root@localhost ~]# cat /etc/shadow | grep zhangsan  
    # 验证更改

命令历史限制

  • 减少记录的命令条数

    限制历史命令记录数量,减少敏感信息的暴露。

    bash 复制代码
    [root@localhost ~]# vi /etc/profile
    export HISTSIZE=200  # 设置历史记录条数为200
    [root@localhost ~]# source /etc/profile  # 使更改生效
  • 登录时自动清空历史

    在每次登录时自动清空命令历史记录,防止命令泄露。

    bash 复制代码
    [root@localhost ~]# vi ~/.bashrc
    ##在文件中插入:输入空字符覆盖文件实现清空
    echo "" > ~/.bash_history 

终端自动注销

  • 闲置600秒后自动注销

    设置终端闲置600秒后自动注销,防止长时间未操作的会话被利用。

bash 复制代码
[root@localhost ~]# vi /etc/profile
export TMOUT=600  # 设置超时时间为600秒
[root@localhost ~]# source /etc/profile  # 使更改生效

拓展:两个profile文件的问题修复过程

  1. 注销时间设置太短导致无法输入命令

    解决办法:在另一台机器上使用scp命令,将本机正常机器profile传输覆盖到故障机器的同名文件。

    bash 复制代码
    scp /etc/progile root@192.168.10.11:/etc/profile
  2. 误删了profile文件,除最基础命令外其余命令都无法使用

    解决办法:同样方式,复制使用另一台机器的文件,在本机操作,拷贝正常机器的profile文件到本机再source。

    bash 复制代码
    scp /etc/progile root@192.168.10.12:/etc/profile

2使用su命令切换用户

用途

su是Substitute User的缩写,用于切换用户身份

格式

bash 复制代码
su - 目标用户  # 使用目标用户的登录shell环境

密码验证

  • root用户:任意用户切换到root时,不验证密码
  • 普通用户:切换到其普通用户时,需要验证目标用户的密码
bash 复制代码
##带-选项表示将使用目标用户的登录shell环境
[test@localhost ~]# su - root  # 切换到root用户
[root@localhost ~]# whoami
root  # 验证当前用户为root、

3限制使用su命令的用户

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

    仅允许wheel组内的用户使用su命令切换到其他用户。

  • 启用pam_wheel认证模块(PAM系统相关的认证权限管理)

    通过PAM模块控制su命令的使用权限

    bash 复制代码
    [root@localhost ~]# vi /etc/pam.d/su
    #%PAM-1.0
    auth   sufficient pam_rootok.so  # 如果是root用户,直接通过
    auth   required pam_wheel.so use_uid  # 仅允许wheel组成员使用su
  • 查看su操作记录

    su命令的操作记录保存在安全日志文件/var/log/secure中。

4Linux中的PAM安全认证

介绍

  • PAM(Pluggable Authentication Modules),可插拔式认证模块
  • 是一种高效而且灵活便利的用户级别的认证方式
  • 也是当前Linux服务器普遍使用的认证方式
  • 配置文件每一行配置定义了一个认证过程,这些认证过程按照从上往下的顺序依次执行
  • PAM 通过模块化的设计,使得系统管理员可以灵活地配置和定制认证过程,以满足不同的安全需求

su命令的安全隐患

安全隐患

默认情况下,任何用户都允许使用 su 命令

其他用户有机会反复尝试其他用户(如root) 的登录密码,带来安全风险

解决办法

使用 PAM 认证模块限制 su 命令的使用

为了加强 su 命令的使用控制,借助于PAM认证模块,只允许极个别用户使用 su 命令切换用户身份,减少安全风险

PAM认证原理和构成

  • 认证流程

    流程大致为:

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

    PAM模块的认证流程一般遵循以下步骤顺序:

    1. 确定服务程序
    2. 加载相应的PAM配置文件PAM(位于/etc/pam.d下)
    3. 调用认证模块(位于/lib64/security下)进行安全认证

用户访问服务器时,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证,不同的应用程序所对应不同的PAM模块。

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

    bash 复制代码
    ls /etc/pam.d | grep su  # 检查 su 是否支持 PAM 认证
  • 查看su的PAM配置文件

    可以通过查看 /etc/pam.d/su 文件了解具体的 PAM 认证过程。文件中的每一行代表一个独立的认证过程,通常分为以下三个字段:

    • 认证类型(auth, account, password, session)
    • 控制类型(required, requisite, sufficient, optional)
    • PAM 模块及其参数(如 pam_wheel.so)

PAM安全认证流程

控制类型(Control Flags)

用于指定PAM验证模块的返回结果出来方式:

  1. required:验证失败时仍然继续,但返回 Fail 。
  2. requisite:验证失败则立即结束整个验证过程,返回 Fail 。
  3. sufficient:验证成功则立即返回,不再继续,否则继续执行其他认证。
  4. optional:用于会话控制(session),不直接用于验证,只显示信息。

PAM 配置文件结构说明

  1. 第一列:PAM 模块类型
    • auth :用于用户身份验证,比如输入密码并验证是否是 root 用户。
    • account:检查用户账号的属性,例如是否允许登录、账号是否过期、用户数量是否达到上限等。
    • password:处理用户密码的更新,例如修改密码。
    • session:管理用户会话,例如记录登录信息、挂载文件系统等。
  2. 第二列:PAM 控制标记
    • required:该标记的模块必须成功才能继续认证。如果失败,认证过程不会立刻停止,而是执行该类型的所有模块后返回失败信息。这种方式隐藏了哪个模块失败,以增强安全性。
    • requisite :类似 required,但如果此模块失败,认证过程立即停止并返回失败信息。
    • sufficient:如果此模块成功,立即返回成功,不再执行后续的相同类型的模块。如果失败,不影响最终结果。
    • optional:无论此模块成功与否,认证过程都将继续。通常用于非关键的认证操作。
    • include :在当前配置文件中包含其他 PAM 配置文件的内容。例如,可以调用 /etc/pam.d/system-auth 来处理系统认证。
  3. 第三列:PAM 模块
    • 指定使用的 PAM 模块。通常位于 /lib64/security/ 目录下,如果在其他路径,需要提供绝对路径。
    • 同一个模块可以出现在不同类型中,每个类型调用该模块时的行为可能不同。
  4. 第四列:PAM 模块的参数
    • 传递给模块的参数,可以根据所使用的模块配置多个参数,参数之间用空格分隔。

PAM 控制标记的补充说明

  • required :该标记的模块必须成功才能通过认证,即所有带 required 标记的模块都必须成功,否则认证失败。但错误信息会在所有此类型模块执行完成后返回。
  • requisite:如果此模块失败,认证过程立即停止并返回错误信息,不再执行后续模块。
  • sufficient:只要此模块成功,认证立即返回成功结果,并跳过后续模块。如果失败,认证过程继续但不影响最终结果。
  • optional:无论此模块成功与否,认证过程都将继续,因此不影响最终认证结果。

PAM 实例

以下是 PAM 认证过程中,使用不同控制标记对用户进行身份验证的示例:

模块类型 控制标记 模块 用户1 用户2 用户3 用户4
auth required 模块1 pass fail pass pass
auth substack 模块2 pass pass fail pass
auth required 模块3 pass pass pass fail
结果 pass fail pass pass

在上表中,不同用户经过不同模块的认证后,最终结果为 passfail,这取决于每个模块的认证结果和控制标记的作用。

5使用sudo机制提升权限

su命令的缺点

  • 使用 su 命令切换用户时,可能暴露用户密码,且没有详细的操作记录。

sudo命令的用途及用法

  • 用途

    通过 sudo 以其他用户身份(如 root )执行授权的命令。

  • 用法

    bash 复制代码
    sudo 授权命令  # 以指定身份执行命令

配置sudo授权

  • 编辑 sudoers 文件

    使用 visudo 命令或者 vi /etc/sudoers 修改 /etc/sudoers 文件。

    修改后保存时,如果使用 vi,需要强制保存(:wq!)以避免权限问题。

  • 语法格式

    bash 复制代码
    用户 主机名=命令程序列表
    用户 主机名=(用户) 命令程序列表

    字段解释

    • 用户:直接授权指定的用户名,或采用"%组名"的形式(授权一个组的所有用户)。
    • 主机名:使用此规则的主机名。没配置过主机名时可用localhost,有配过主机名则用实际的主机名,ALL则代表所有主机
    • (用户):用户能够以何种身份来执行命令。此项可省略,缺省时以root用户的身份来运行命令
    • 命令程序列表:允许授权的用户通过sudo方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号","进行分隔。ALL则代表系统中的所有命令
  • 示例1

    bash 复制代码
    [root@localhost ~]# visudo
    
    ## 为wheel组成员设置权限,允许组内成员无需密码即可执行任何命令
    %wheel ALL=NOPASSWD:ALL
    
    ## 为用户jerry授权,只允许在本地主机上使用ifconfig命令
    jerry localhost=/sbin/ifconfig
    
    ## 为用户syrianer授权,允许其使用/sbin目录下的所有命令,
    ## 除了reboot和poweroff命令
    syrianer localhost=/sbin/*,!/sbin/reboot,!/sbin/poweroff
    
    ## 定义命令别名
    Cmnd_Alias PKGTOOLS=/bin/rpm,/usr/bin/yum
    
    ## 为用户mike授权,只允许使用定义的PKGTOOLS命令别名中的命令
    mike localhost=PKGTOOLS
  • 示例2

    为特定用户设置 sudo 权限

    bash 复制代码
    ## 允许用户 Tom 在所有主机上执行 ifconfig 命令
    Tom ALL=/sbin/ifconfig
    
    ## 允许用户 Jerry 在 localhost 主机上执行 /sbin 目录下的所有命令,
    ## 但排除 reboot 和 poweroff 命令
    Jerry localhost=/sbin/*,!/sbin/reboot,!/sbin/poweroff

    为组设置 sudo 权限

    bash 复制代码
    ## 允许 wheel 组的所有成员无需密码验证即可使用 sudo 执行任何命令
    %wheel ALL=NOPASSWD: ALL

    为特定用户设置 root 权限的命令

    bash 复制代码
    ## 允许用户 Mike 以 root 身份执行 kill 和 killall 命令,且无需密码
    Mike ALL=(root) NOPASSWD: /bin/kill, /usr/bin/killall

    使用别名配置

    为了简化管理,可以使用别名来定义用户、主机和命令,必须使用大写字母。

    bash 复制代码
    ## 定义用户别名
    User_Alias USERS=Tom,Jerry,Mike
    
    ## 定义主机别名
    Host_Alias HOSTS=localhost,bogon
    
    ## 定义命令别名
    Cmnd_Alias CMNDS=/sbin/ifconfig,/usr/sbin/useradd,/usr/sbin/userdel
    
    ## 为定义的用户组在指定主机上授权指定命令
    USERS HOSTS=CMNDS
  • 使用 sudo 执行命令

    在配置完 sudo 权限后,用户可以使用 sudo 命令执行特权操作。例如:

    bash 复制代码
    ## 使用 Tom 用户登录并配置网络接口
    su - Tom
    /sbin/ifconfig ens33:0 192.168.1.11/24
    
    ## 使用 sudo 执行 ifconfig 命令(需验证用户密码)
    sudo /sbin/ifconfig ens33:0 192.168.1.11/24
    
    ## 查看当前用户的 sudo 权限
    sudo -l

    注意:初次使用 sudo 时,系统会提示用户输入密码。默认情况下,密码的验证结果会在 5 分钟内保持有效,期间执行的后续 sudo 命令无需再次输入密码。

查看sudo操作记录

  • 启用 Defaults logfile 配置(启用 sudo 操作日志)

    需要在 /etc/sudoers 文件中启用日志记录功能。

    使用 visudo 命令来编辑 sudoers 文件,以避免语法错误。

    bash 复制代码
    [root@localhost ~]# visudo
    ## 配置日志文件路径(默认)
    Defaults logfile = "/var/log/sudo"

    启用日志配置后,所有使用 sudo 执行的命令都会被记录在指定的日志文件中。

    bash 复制代码
    [root@localhost ~]# tail /var/log/sudo
    ## 查看最近的sudo操作记录
    ## 2023年8月24日23:59:44,用户jerry以root身份执行了ifconfig命令
    Aug 24 23:59:44 : jerry :TTY=pts/0; PWD=/home/jerry :USER=root; COMMAND=/sbin/ifconfig ens33:0 192.168.1.11/24
    ## 2023年8月25日00:00:46,用户syrianer以root身份执行了自定义命令list
    Aug 25 00:00:46 syrianer :TTY=pts/1; PWD=/home/syriader; USER=root; COMMAND=list
  • 查询授权的sudo操作

    使用 sudo -l 命令来查看当前用户被授权执行的命令列表,以及在什么情况下可以使用这些命令。

    示例:显示当前用户的所有 sudo 权限,包括可以执行的命令和是否需要密码等信息。

    bash 复制代码
    ## 查询当前用户的sudo权限
    [user@localhost ~]$ sudo -l

6终端登录安全控制

限制root只在安全终端登录

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

    通过编辑 /etc/securetty 文件,可以指定允许 root 用户登录的终端设备。有助于增强系统安全性,防止未经授权的设备获取 root 权限。

    bash 复制代码
    [root@localhost ~]# vi /etc/securetty
    ## 允许 root 用户通过 tty1 和 tty2 终端登录
    tty1 
    tty2 
    ## 禁止通过 tty5 和 tty6 登录
    #tty5
    #tty6

禁止普通用户登录

  • 建立/etc/nologin文件

  • 删除nologin文件或重启后即恢复正常(限制解除)

    bash 复制代码
    ## 创建 /etc/nologin 文件以禁止普通用户登录
    [root@localhost ~]# touch /etc/nologin
    
    ## 删除 /etc/nologin 文件以取消登录限制
    [root@localhost ~]# rm -rf /etc/nologin

7限制更改 GRUB 引导参数

在系统开机进入 GRUB 菜单时,按 e 键可以查看并修改 GRUB 引导参数。这对于服务器安全构成了一定的威胁。为了防止未经授权的修改,可以为 GRUB 菜单设置密码,只有提供正确的密码才允许更改引导参数。

1. 生成 GRUB 密码

首先,使用 grub2-mkpasswd-pbkdf2 命令生成加密密码:

bash 复制代码
grub2-mkpasswd-pbkdf2

根据提示设置密码,系统会生成一段类似如下的加密字符串:

bash 复制代码
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.......

2. 备份重要配置文件

在继续之前,建议备份 GRUB 配置文件和相关文件,以防出现问题:

bash 复制代码
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
cp /etc/grub.d/00_header /etc/grub.d/00_header.bak

3. 编辑 GRUB 配置文件

编辑 /etc/grub.d/00_header 文件,添加用户和密码配置:

bash 复制代码
vim /etc/grub.d/00_header

## 在文件中添加以下内容
cat << EOF
set superusers="root"                 # 设置 GRUB 的超级用户,用户名为 root
password_pbkdf2 root grub.pbkdf2......    # 设置超级用户的密码(此处为加密后的密码字符串)
EOF

将上述代码中的 grub.pbkdf2...... 替换为实际生成的加密字符串。

4. 生成新的 GRUB 配置文件

完成编辑后,生成新的 GRUB 配置文件以应用更改:

bash 复制代码
grub2-mkconfig -o /boot/grub2/grub.cfg

5. 验证设置

重新启动系统,进入 GRUB 菜单时,按 e 键尝试修改引导参数。此时,系统会要求输入配置的用户名和密码,才能进行进一步操作。

8系统弱口令检测-Joth the Ripper工具

介绍

  • (国内不太用)
  • John the Ripper (简称JR)是一款强大的密码分析工具,广泛用于检测系统中的弱口令。它通过分析 /etc/shadow 文件中的密码哈希值,尝试使用字典或暴力破解方法来检测密码强度。
  • 使用时可以对目标文件进行不同类型的攻击,包括字典攻击、混合攻击和暴力攻击等。
  • 官网:http://www.openwall.com/john/

流程步骤

bash 复制代码
#解压工具包
cd /opt
tar zxf john-1.8.0.tar.gz
#安装软件编译工具
yum install -y gcc gcc-c++ make
#切换到src子目录
cd /opt/john-1.8.0/src
#进行编译安装
make clean linux-x86-64
#准备待破解的密码文件
cp /etc/shadow /opt/shadow.txt
#执行暴力破解
cd /opt/john-1.8.0/run
./john /opt/shadow.txt
#查看已破解出的账户列表
./john --show /opt/shadow.txt

#使用密码字典文件
> john.pot 		#清空已破解出的账户列表,以便重新分析
./john --wordlist=./password.lst /opt/shadow.txt		#使用指定的字典文件进行破解

9网络端口扫描-NMAP工具

介绍

  • 一款用于网络发现和安全审计的工具。支持多种扫描技术,能够快速探测网络中的主机和服务(检测暴露的端口)。
  • 官网:http://nmap.org/
  • CentOS 7.3光盘中安装包为:nmap-6.40-7.el7.x86_64.rpm
  • 也可使用 YUM 直接安装

格式

bash 复制代码
nmap [扫描类型] [选项] <扫描目标...>

常用的扫描类型

  • 如:-sS、-sT、-sF、-sU、-sP、-P0

示例

  • 分别查看本机开放的TCP端口、UDP端口

    bash 复制代码
    nmap -sT 127.0.0.1  ## TCP连接扫描
    nmap -sU 127.0.0.1  ## UDP扫描
  • 检测192.168.4.0/24网段有哪些主机提供FTP服务

    bash 复制代码
    nmap -p 21 192.168.4.0/24
  • 检测192.168.4.0/24网段有哪些存活主机

    bash 复制代码
    nmap -n -sP 192.168.4.0/24

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

相关推荐
m0_748244837 分钟前
StarRocks 排查单副本表
大数据·数据库·python
NiNg_1_2348 分钟前
Hadoop中MapReduce过程中Shuffle过程实现自定义排序
大数据·hadoop·mapreduce
雨中rain11 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
B站计算机毕业设计超人13 分钟前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
-KamMinG21 分钟前
Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
运维·grafana
沛沛老爹23 分钟前
什么是 DevOps 自动化?
大数据·ci/cd·自动化·自动化运维·devops
Bessssss30 分钟前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish30 分钟前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个32 分钟前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&33 分钟前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops