Linux系统安全及应用

142 阅读16分钟

1. 账号安全控制

1.1 系统账号清理

  • 将非登录用户的shell设为/sbin/nologin
usermod -s /sbin/nologin 用户名
  • 锁定长期不使用的账户
usermod -L 用户名
passwd -l 用户名`
  • 删除无用的账号
userdel [-r] 用户名
  • 锁定账号文件passwd、shadow
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow  `##锁定账号文件`
[root@localhost ~]# lsattr /etc/passwd /etc/shadow   `##锁定文件并查看状态`
----i----------- /etc/passwd
----i----------- /etc/shadow  
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow  `##解锁文件`
[root@localhost ~]# lsattr /etc/passwd /etc/shadow  `##锁定文件并查看状态`
---------------- /etc/passwd
---------------- /etc/shadow
`这两个文件被锁了以后用户也会无法创建`

1.2密码安全控制

1.2.1 设置密码有效期

法一

[root@localhost ~]# vim /etc/login.defs  `##修改密码配置文件,适用于新建用户`

image.png

法二

[root@localhost ~]# chage -M 30 zhangsan `##适用于已有的用户`
[root@localhost ~]# cat /etc/shadow | grep zhangsan  `##查看shadow文件的zhnagsan的那一行`

image.png

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

    chage ##修改账号和密码有效期限
    语法:chage [参数] [数值] username

常用参数

选项说明
l列出当前用户过期时间设置信息
m密码可以更改的最小天数,为0时任何时候都能更改
M密码保持有效的最大天数
E设置用户的过期时间 过了这些天账号将不可用 0表示马上过期 -1表示永不过期
d上一次更改的日期
[root@localhost ~]# chage -d 0 zhangsan  `##下次登录时强制请求修改密码`

image.png

1.3 账号安全基本措施

1.3.1常用四个系统配置文件

/etc/profile
系统环境变量得配置文件(全局有效)  环境变量  PATH   HISTSIZE
开机时,用户登录会自动加载

/etc/bashrc
全局有效,用户在切换shell环境时也会自动加载此文件中的配置
source 刷新

~/.bash_profile
只针对当前用户有效
echo ''>  ~/.bash_history放在当前文件夹中
当前用户开机后首次登录系统时会执行一次这个命令

~/ . bashrc
只针对当前用户有效
echo ' ' > ~/ .bash_ history
当前用户每次登录或者切换shell环境时都会执行一次命令

1.3.1 命令历史限制

[root@localhost ~]# history -c  `##临时清空历史命令`
[root@localhost ~]# vim /etc/profile
export HISTSI本E=200  `##减少记录的命令条数`
[root@localhost ~]# source /etc/profile 
[root@localhost ~]# vim ~/.bashre  
echo " " > -/.bash_ history  `##添加这一行后登录时自动清空命令历史`

1.3.2 终端自动注销

[root@localhost ~]# vim /etc/profile

image.png

[root@localhost ~]# source /etc/proflie  `##刷新配置文件`

2.系统引导和登录控制

2.1 使用su命令切换用户

2.1.1 切换用户

格式 su [-] 目标用户

[root@localhost ~]# pwd
/root
[root@localhost ~]# su wangwu  `##该方法切换用户不会改变目录`
[wangwu@localhost root]$ pwd
/root
[root@localhost ~]# su - wangwu  `##该方法切换用户会进入当前用户的家目录,并自动加载shell环境`
上一次登录:二 89 17:12:30 CST 2022pts/0 上
[wangwu@localhost ~]$ pwd
/home/wangwu

2.1.2密码验证

root→任意用户,不验证密码

[root@localhost ~]# su wangwu
[wangwu@localhost root]$ 

普通用户→其他用户,验证目标用户的密码

[wangwu@localhost ~]$ su - root
密码:
上一次登录:二 89 14:11:59 CST 2022tty2 上
[root@localhost ~]# whoami
root

2.1.3 限制使用su命令的用户

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

[root@localhost ~]# gpasswd -a wangwu wheel
正在将用户“wangwu”加入到“wheel”组中
[root@localhost ~]# id wangwu
uid=1003(wangwu) gid=1003(wangwu) 组=1003(wangwu),`10(wheel)  ##已经将用户加入到wheel组中`  

启用pam_ wheel认证模块

[root@localhost ~]# vim /etc/pam.d/su

image.png

2.2 PAM安全认证

2.2.1 Linux中的PAM安全认证

su命令的安全隐患

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

PAM(Pluggable Authentication Modules)可插拔式认证模块

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

2.2.2 PAM认证原理

  • 一般遵循的顺序

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

  • 用户访问服务器时,服务器的某-个服务程序把用户的请求发送到PAM模块进行认证

  • 不同的应用程序所对应的PAM模块是不同的

2.2.3 PAM认证的构成

  • 查看某个程序是否支持PAM认证,可以用ls命令
示例:查看su是否支持PAM模块认证
[root@localhost ~]# ls /etc/pam.d | grep su
su
sudo
sudo-i
su-l
  • 查看su的PAM配置文件
[root@localhost ~]# cat /etc/pam.d/su
#%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

`每一行都是一个独立的认证过程`
`每行可以区分为三个子段
    认证类型
        auth:对用户身份进行识别。如提示输入密码,判断是否为root
        account:对账号各项属性进行检查。如是否允许登录系统。帐号是否已经过期。是否达到最大用户数等。
        password:使用用户信息来更新数据,如修改用户密码。
        session:定义登录前以及退出后所要进行的会话操作管理。如登录连接信息。用户数据的打开和关闭,挂载文件系统。

    控制类型
        required:表示需要返回一个成功值。如果返回失败,不会立刻将失败结果返回,而是堆继续进行同类型的下一验证。所有此类型的模块都执行完成后,再返回失败。
        reqpuintae:与required相似。但如果此模块返回失败,则立刻返回失败并表示此类型失败
        sufficient:如果此模快返回成功,则直接向程序退回成功,表示此类成功,如果失败,也不影响这类型的返回值。
        optional:不进行成功与否的返回。一般不用于验证。只是显示信息(通常用于session类型)
        include:表示在验证过程中调用其他的PAM配置文件。比如很多应用通过完整调用/ect/pam. d/system-auth(主要负责用户登录系统的认证工作) 来实现认证而不需要重新逐去写配置项。

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

2.3使用sudo机制提升权限

2.3.1 sudo命令的用途及用法

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

用法 :sudo 授权命令
[root@localhost opt]# touch 1.txt
[root@localhost opt]# ls
1.txt
[root@localhost opt]# su wangwu
[wangwu@localhost opt]$ ll
总用量 0
-rw-r--r-- 1 root root 0 89 18:46 1.txt
[wangwu@localhost opt]$ rm 1.txt
rm:是否删除有写保护的普通空文件 "1.txt"?y
rm: 无法删除"1.txt": 权限不够
[wangwu@localhost opt]$ sudo rm 1.txt

我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:

    #1) 尊重别人的隐私。
    #2) 输入前要先考虑(后果和风险)。
    #3) 权力越大,责任越大。

[sudo] wangwu 的密码:
[wangwu@localhost opt]$ ls
[wangwu@localhost opt]$ 

2.4 使用sudo机制提升

visudo 或 vim /etc/sudoors(此文件的默认权限为440. 保存退出时必领执行" :wq! "命令来强制操作)
语法格式:
用户 主机名 = 命令程序列表
用户 主机名 (用户) = 命令程序列表

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

image.png

使用关键字User_ Alias Host_Alias Cmnd_ Alias 来进行设置别名(别名必须为大写)

User_Alias USERS=zhangan, lisi,wangwu
Host_Alias HOSTS = localhost
Cmnd_Alias CMNDS = /sbin/ifconfig,/usr/sbin/usradd,/usr/sbin/userdel
USERS HOSTS=CMNDS

image.png

启用audo操作日志
vigudo
Defaults logfile ="/var/log/sudo" 

3 系统引导和登录控制

3.1 开关机安全控制

3.1.1 调整BIOS引导设置原则

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

3.1.2 GRUB限制

  • 未经授权禁止修改启动参数
  • 未经授权禁止进入指定系统

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

3.1.3 GRUB菜单加密的实现

定义每个菜单项的所有脚本都存放在/etc/grub.d目录中,这些脚本的名称必须有两位的数字前缀,其目的是构建GRUB 2菜单时定义脚本的执行顺序以及相应菜单项的顺序,比如00_header文件首先被读取。

文件描述
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是开机时第一个启动的文件)
  • 方法一:

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

 [root@localhost ~]# grub2-setpassword    //使用命令直接设置GRUB密码

image.png

  • 方法二:

CentOS 6系统中,先要使用grub2-mkpasswd-pbkdf2命令生成PBKDF2加密口令, 然后在/etc/grub.d/00_header文件中添加超级用户和PBKDF2加密口令, 最后使用grub2-mkconfig命令生成grub配置文件。

 # 步骤1.备份两个配置文件
 [root@localhost ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
 [root@localhost ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
 
 # 步骤2.生成PBKDF2加密口令
 [root@localhost ~]# grub2-mkpasswd-pbkdf2   //使用哈希算法生成密码
 输入口令:
 Reenter password: 
 PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
 
 # 步骤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.D9BDDD44312FD353436E03F2F73F643A0DD6FB59D989ECAAADB911E95846A477137A73DCEA248BFD6FF02BE2D52052E3790AEE175B10AA7634C6B66D1D9173C7.B15B5DC77367D1960086506C3E39A718477F1D326B6548577D992BB383DBA0E3AF7EFD3E67DD768E33B391C6AC1FAC1C6BB4CFF492D2046A651DF5986ACAE35A
 EOF
 
 # 步骤4.使用 grub2-mkconfig 命令生成新的 grub.cfg 配置文件。
 [root@localhost ~]# 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-869778d6675742a5968d2ea8c0e087b2
 Found initrd image: /boot/initramfs-0-rescue-869778d6675742a5968d2ea8c0e087b2.img
 done

image.png

image.png

3.2 终端登录安全控制

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

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

示例:

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

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

image.png

3.2.2 禁止普通用户登录

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

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

4.1 nmap工具

  • 一款强大的网络端口扫描、安全、检测工具
  • 官方网站:[Nmap: the Network Mapper - Free Security Scanner]
  • CentOS 7.3光盘中安装包 nmap-6.40-7.el7.x86_64.rpm

image-20220110110235407.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 [扫描类型]  [选项]  <扫描目标>
复制代码
  • 常用选项和扫描类型
扫描类型和选项作用
-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通而放弃扫描。
  • 用于主机发现的一些用法

    • -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端口,且加上程序名

  • 示例:

1)netstat -lt,列出处于监听状态的TCP端口。

 [root@localhost ~]# 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 0.0.0.0:shell           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 [::]:shell              [::]:*                  LISTEN

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

 [root@localhost ~]# netstat -tnlp
 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      1462/dnsmasq        
 tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1113/sshd           
 tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1111/cupsd          
 tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1394/master         
 tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      798/rsyslogd        
 tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
 tcp6       0      0 :::22                   :::*                    LISTEN      1113/sshd           
 tcp6       0      0 ::1:631                 :::*                    LISTEN      1111/cupsd          
 tcp6       0      0 ::1:25                  :::*                    LISTEN      1394/master         
 tcp6       0      0 :::514                  :::*                    LISTEN      798/rsyslogd