Linux系统安全
一.账号安全基本措施
1.1、系统账号清理
-
将非登录用户的Shell设为/sbin/nologin
usermod-s/sbin/nologin 用户名
- 锁定长期不使用的账号
[root@localhost ~]# usermod -L 用户名 锁定用户账号
[root@localhost ~]# passwd -l 用户名 锁定用户账号
[root@localhost ~]# usermod -U 用户名 解锁用户账号
[root@localhost ~]# passwd -u 用户名 解锁用户账号
[root@localhost ~]# passwd -S 用户名 查看用户状态
-
删除无用的账号
[root@localhost ~]# userdel -r 用户名
- 锁定账号文件passwd、shadow
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow 锁定文件
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow 解锁文件
[root@localhost ~]# lsattr /etc/passwd /etc/shadow 查看文件状态
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
---------------- /etc/passwd
---------------- /etc/shadow
[root@localhost ~]# useradd lisi
[root@localhost ~]# passwd lisi
更改用户 lisi 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# id lisi
uid=1001(lisi) gid=1001(lisi) 组=1001(lisi)
[root@localhost ~]# chattr +i /etc/passwd /etc/shadow
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
----i----------- /etc/passwd
----i----------- /etc/shadow
[root@localhost ~]# useradd qiaozhi
useradd:无法打开 /etc/passwd
[root@localhost ~]# passwd lisi
更改用户 lisi 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
123passwd: 鉴定令牌操作错误
[root@localhost ~]# chattr -i /etc/passwd /etc/shadow
[root@localhost ~]# lsattr /etc/passwd /etc/shadow
---------------- /etc/passwd
---------------- /etc/shadow
[root@localhost ~]# useradd qiaozhi
[root@localhost ~]# passwd qiaozhi
更改用户 qiaozhi 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
1.2、密码安全控制
-
设置密码有效期
[root@localhost ~]# chage -M 30 用户名 适用于已有用户
18885:0:99999:7:::变成了18885:0:30:7:::
`[root@localhost ~]# cat /etc/shadow|grep lisi
lisi:$6$lI.TDhRs$lqTvhvybf2njN7/7eKS3ff56hEQDzbp0mxKk0yM/OSX6qj97j4lS4P2t44mT2Gf7IoVEA2GXkSv88/btLtkaf1:18885:0:99999:7:::
[root@localhost ~]# chage -M 30 lisi
[root@localhost ~]# cat /etc/shadow|grep lisi
lisi:$6$lI.TDhRs$lqTvhvybf2njN7/7eKS3ff56hEQDzbp0mxKk0yM/OSX6qj97j4lS4P2t44mT2Gf7IoVEA2GXkSv88/btLtkaf1:18885:0:30:7:::`
[root@localhost ~]# vim /etc/login.defs 适用于已有用户
PASS_MAX_DAYS 30
cat /etc/shadow | grep 用户名 查看密码有效日期是否配置成功
这里有效期就变成了30天了
-
强制在下次登录时修改密码
[root@localhost ~]# chage -d 0 用户名 强制要求用户下次登陆时修改密码
1.3、命令历史限制
- 减少记录命令的条数
减少记录命令的条数:
[root@localhost ~]# vim /etc/profile 编辑全局变量配置文件
export HISTSIZE=10 默认1000条 输入=10
:wq
[root@localhost ~]# source /etc/profile 相当使/etc/profile内的命令重载一遍
[root@promote ~]#history
history -c 临时清除
- 注销时自动情况命令历史
[root@localhost ~]# vim ~/.bashrc
echo " " > ~/.bash_history
:wq
reboot
history
[root@localhost ~]# vim ~/.bashrc
[root@localhost ~]# source .bashrc
[root@localhost ~]# reboot
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(haoyang1) at 20:26:45.
Type `help' to learn how to use Xshell prompt.
[C:\~]$
[C:\~]$
[C:\~]$
Connecting to 192.168.32.99:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Wed Sep 15 20:27:12 2021
[root@localhost ~]# history
1 history
1.4、终端自动注销
闲置600秒后自动注销:
[root@localhost ~]#vim .bash_profile 编辑全局变量配置文件
export TMOUT=60 输出timeout=60
[root@localhost ~]# source .bash_profile 刷新
[root@localhost ~]# echo $TMOUT 查看注销时间
[root@localhost ~]# vim .bash_profile
[root@localhost ~]# source .bash_profile
[root@localhost ~]# echo $TMOUT
60
二.使用su命令切换用户
2.1、su命令用途及用法
用途:Substitute User,切换用户
格式:su -目标用户
[root@localhost ~]# su - lisi
上一次登录:三 9月 15 20:52:09 CST 2021pts/0 上
[lisi@localhost ~]$ pwd
/home/lisi
[lisi@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/lisi/.local/bin:/home/lisi/bin
2.2、密码验证
- root—任意用户,不验证密码
- 普通用户—其他用户,验证目标用户的密码
- su - root 带-选项表示将使用目标用户的登陆Shell环境
2.3、限制使用su命令的用户
- 将允许使用su命令的用户加入wheel组
- 启用pam_wheel认证模块
gpasswd -a 用户名 wheel 将用户名加入到wheel组中
vim /etc/pam.d/su
auth sufficient pam_rootok.so
............
#auth required pam_wheel.so use_uid
#%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
三.Linux中的PAM安全认证
1.su命令的安全隐患
默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险为了加强su命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su命令进行切换
2.PAM(Pluggable Authentication Modules)可插拔式认证模块
是一种高效而且灵活便利的用户级别的认证方式
也是当前Linux服务器普遍使用的认证方式
3.PAM认证原理
一般遵循的顺序
Service(服务)->PAM(配置文件)一pam_*.so
首先要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证
用户访问服务器时,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证
不同的应用程序所对应的PAM模块是不同的
4.PAM认证的构成
查看某个程序是否支持PAM认证,可以用ls命令
示例:查看su是否支持PAM模块认证
Is /etc/pam.d | grep su
查看su的PAM配置文件:cat/etc/pam.d/su
每一行都是一个独立的认证过程
每一行可以区分为三个字段
认证类型
控制类型
PAM模块及其参数
cat /etc/pam.d/system-auth
第一列代表PAM认证模块类型
auth;对用户身份进行识别,如提示输入密码,判断是否为root
accounl:对账号各项属性进行检查,如是否允许登录系统,帐号是否已经过期,是否达到最大用户数等。
password:使用用户信息来更新数据,如修改用户密码。
session:定义登录前以及退出后所要进行的会话操作管理,如登录连接信息,用户数据的打开和关闭,挂载文件系统。能连接几个终端
第二列代表PAM控制标记
required:表示需要返回一个成功值,如果返回失败,不会立刻将失败结果返回,而是继续进行同类型的下一验证,所有此类型的模块都执行完成后,再返回失败。
requisite:与required类似,但如果此模块返回失败,则立刻返回失败并表示此类型失败。
sufficient:如果此模块返回成功,则直接向程序返回成功,表示此类成功,如果失败,也不影响这类型的返回值
optional:不进行成功与否的返回,也不影响这类型的返回值。一般不用于验证,只是显示信息(通常用于session类型),
include:表示在验证过程中调用其他的PAM配置文件。
比如很多应用通过完整调用/etc/pam.d/ayatem-auth(主要负责用户登录系统的认证工作)来实现认证而不需要重新逐一去写配置项。
第三列代表PAM模块,默认是在/lib64/security/目录下,如果不在此默认路径下,要填写绝对路径。同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
第四列代表PAM模块的参数,这个需要根据所使用的模块来添加。
传递给模块的参数。参数可以有多个,之间用空格分隔开
5.PAM安全认证流程
控制类型也称做Control Flags,用于PAM验证类型的返回结果
1.required验证失败时仍然继续,但返回Fail
2.requisite验证失败则立即结束整个验证过程,返回Fail
3.sufficient验证成功则立即返回,不再继续,否则忽略结果并继续
4.optional不用于验证,只显示信息
四.使用sudo机制提权
4.1、sudo命令用途及用法
用途:以其他用户身份(如root)执行授权命令
用法:sudo 授权命令
4.2、配置授权
visudo 或者 vim /etc/sudoers
格式:用户 主机名列表=命令程序列表
可以使用通配符“ * ”号任意值和“ !”号进行取反操作。
4.3、别名创建
[root@localhost ~]# vim /etc/sudoers
Host_Alias MYHOST = localhost
User_Alias MYUSER = zhangsan,lisi,liwu
Cmnd_Alias MYCMD = /usr/sbin/useradd,/usr/bin/passwd
MYUSER MYHOST = NOPASSWD : MYCMD
[lisi@localhost root]$ sudo useradd liba
[lisi@localhost root]$ id liba
uid=1005(liba) gid=1005(liba) 组=1005(liba)
[lisi@localhost root]$ sudo passwd liba
更改用户 liba 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
4.4、查看sudo操作记录
[root@localhost ~]# vim /etc/sudoers
Defaults logfile = /var/log/sudo //将该命令添加至最后一行:wq保存并退出即可
五.开关机安全控制
5.1、调整BIOS引导设置原则
- 将第一引导设备设为当前系统所在硬盘
- 禁止从其他设备(光盘、 U盘、网络)引导系统
- 将安全级别设为setup,并设置管理员密码
5.2、GRUB限制及实现
方法1:直接设置grub2—setpasswd 设置grub密码
方法2
- 通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。
- 可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
[root@localhost ~]# grub2-mkpasswd-pbkdf2
输入口令:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.2D96787097EB717901FC663B72435E8E3A20D4C293A4977486A09E9039535711B402A5135FA758CADF5A6FCAA9E0354FFF336C44379EE7C36A2ED144178058E9.EEFD95507926800D13491280B75E30A8049C08A7EA007032F3E083B38C9A5B29530D1A2A716AF174FEA05F898D69BA2C6E26F92615511BEFECFB3EAA0D0AD05C
[root@localhost grub.d]# vim 00_header
把grub2-mkpasswd-pbkdf2 查看的内容复制过来[root@localhost grub.d]# grub2-mkconfig -o /boot/grub2/grub.cfg生成新的grub.cfg 文件
[root@localhost grub.d]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
/etc/grub.d/00_header: line 361: warning: here-document at line 359 delimited by end-of-file (wanted `EOF')
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-4bf736ee567f4452a7da314101d15437
Found initrd image: /boot/initramfs-0-rescue-4bf736ee567f4452a7da314101d15437.img
error: out of memory.
error: syntax error.
error: Incorrect command.
error: syntax error.
Syntax error at line 143
Syntax errors are detected in generated GRUB config file.
Ensure that there are no errors in /etc/default/grub
and /etc/grub.d/* files or please file a bug report with
/boot/grub2/grub.cfg.new file attached.
六.系统弱口令检测与网络端口扫描
6.1、系统弱口令
解压
[root@localhost opt]#tar zxvf john-1.8.0.tar.gz
安装软件编译工具
[root@localhost src]#yum install gcc gcc-c++ make -y
进行编译安装
[root@localhost src]#make clean linux-x86-64
准备待破解的密码文件
[root@localhost src]#cd .. 切换至上级目录
[root@localhost john-1.8.0]#cp /etc/shadow /opt/shadow.txt 准备密码文件
执行暴力破解
[root@localhost john-1.8.0]#cd /opt/john-1.8.0/run/
[root@localhost run]#./john /opt/shadow.txt
[root@localhost src]# yum install gcc gcc-c++ make -y
[root@localhost src]# make clean linux-x86-64
[root@localhost src]# cd ..
[root@localhost john-1.8.0]# ls
doc README run src
[root@localhost john-1.8.0]# cp /etc/shadow /opt/shadow.txt
[root@localhost john-1.8.0]# ls /opt/
john-1.8.0 john-1.8.0.tar.gz rh shadow.txt
[root@localhost john-1.8.0]# cd /opt/john-1.8.0/run/
[root@localhost run]# ls
ascii.chr john lm_ascii.chr makechr relbench unique
digits.chr john.conf mailer password.lst unafs unshadow
[root@localhost run]# ./john /opt/shadow.txt
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
123123 (liba)
123123 (root)
123123 (kehuailunnade)
3g 0:00:00:46 100% 2/3 0.06478g/s 200.4p/s 221.1c/s 221.1C/s leslie..boston
Use the "--show" option to display all of the cracked passwords reliably
Session completed
6.2、网络端口扫描
一.NMAP概述:
1.是一个强大的端口扫描类安全评测工具,支持 ping 扫描、多端口检测等多种技术
2.官方网站:http://nmap.org/
3.CentOS 7.7光盘中安装包nmap-6.40-7.el7.x86_64.rpm
二.安装 NMAP 软件包
yum install -y nmap //然后安装nmap软件包
三.nmap命令常用选项与对应扫描类型
常见 的选 项 | 选项的作用 |
-p | 指定扫描的端口。 |
-n | 禁用反向DNS解析(以加快扫描速度) |
-sS | TCP的SYN扫描(半开扫描),只向目标发出SYN数据包,如果收到SYNACK响应包就认为目标端口正在监听,并立即断开连接; 否则认为目标端口并未开放。 |
-sT | TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否 则认为目标端口并未开放。 |
-sF | TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而 忽略了其他形式的TCP攻击包。这种类型的扫描可间接检测防火墙的健壮性。 |
-sU | UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。 |
-sP | ICMP扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。 |
-P0 | 跳过ping检测,这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法ping通而放 弃扫描。 |
[root@localhost ~]# nmap -sT 127.0.0.1查看本机开放的TCP端口
[root@localhost ~]# nmap -sU 127.0.0.1 查看本机开放的UDP端口
[root@localhost ~]# nmap -n -sP 192.168.32.0/24 检测192.168.32.0/24网段有多少存活的主机
[root@localhost ~]# nmap -sT 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-22 21:14 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00063s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.05 seconds
[root@localhost ~]# nmap -sU 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-22 21:16 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00012s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
111/udp open rpcbind
5353/udp open|filtered zeroconf
Nmap done: 1 IP address (1 host up) scanned in 49.21 seconds
[root@localhost ~]# nmap -n -sP 192.168.32.0/24
Starting Nmap 6.40 ( http://nmap.org ) at 2021-09-22 21:18 CST
Nmap scan report for 192.168.32.1
Host is up (0.00071s latency).
MAC Address: 00:50:56:C0:00:08 (VMware)
Nmap scan report for 192.168.32.2
Host is up (0.000087s latency).
MAC Address: 00:50:56:E7:1B:08 (VMware)
Nmap scan report for 192.168.32.254
Host is up (0.00013s latency).
MAC Address: 00:50:56:EC:A5:43 (VMware)
Nmap scan report for 192.168.32.96
Host is up.
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.00 seconds