系统安全及应用
一、账号安全控制
1、账号安全基本措施
(1)系统账号清理
·将非登录用户的Shell设为/sbin/nologin
usermod -s /sbin/nologin 用户名
·锁定长期不使用的账号
usermod -L 用户名
passwd -l 用户名
passwd -S 用户名 #查看用户账号状态
·删除无用的账号
userdel [-r] 用户名
·锁定账号文件passwd、shadow
chattr +i /etc/passwd /etc/shadow #锁定账号及密码文件
lsattr /etc/passwd /etc/shadow #查看账号及密码文件
chattr -i /etc/passwd /etc/shadow #解锁账号及密码文件
(2)密码安全控制
①设置密码有效期
1.修改密码配置文件,适用于新建用户
vi /etc/login.defs
修改PASS_MAX_DAYS 30
2.修改已有用户的密码有效期
chage -M 30 用户名
可通过命令cat /etc/shadow | grep 用户名,查看该用户密码相关信息
②强制用户登录时修改密码
chage -d 0 用户名 #将shadow文件中的第三个字段修改为0,强制在下次登录时修改密码
2、命令历史限制
(1)减少记录的命令条数
vi /etc/profile
修改HISTSIZE=n,n为修改条数
或末行添加export HISTSIZE=n
完成修改后source /etc/profile刷新,系统将重新读取该文件
(2)登录时自动清空命令历史
vi /etc/.bashrc
末行添加echo "" > ~./bash_histroy
(3)终端自动注销
设置闲置账户的自动注销是保护系统安全的的有效手段之一
vi /etc/profile
修改TMOUNT=n,n为无操作的秒数,若n秒无操作,账户将自动注销
完成修改后source /etc/profile刷新,系统将重新读取该文件
3、su命令的使用及限制
(1)用途及用法
用途:Substitute User,切换用户
格式:
su - 目标用户 #切换至目标用户的登录Shell环境
su 目标用户 #切换至目标用户并保留在当前目录
(2)密码验证
root切换至任意用户,不验证密码
普通用户切换至其他用户,验证目标用户的密码
(3)限制使用su命令的用户
将允许使用su命令的用户加入wheel组
启用pam_wheel认证模块
gpasswd -a 用户名 wheel #将该用户加入到wheel组
vi /etc/pam.d/su
开启第二行以及第六行pam模块, #为注释状态,删除#即为开启状态
auth sufficient pam_rootok.so
......
......
......
auth required pam_wheel.so use_uid
启动pam_wheel认证后,未加入到wheel组内的用户才能使用su命令,root用户也将禁用su命令。
注1:以上两行的默认状态是开启第一行,注释第二行,这种状态下是允许所有用户间使用su命令切换的。
注2:两行都注释也是运行所有用户都能使用su命令,但root下使用su切换到普通用户需要输入密码;如果第一行不注释,则root使用su切换普通用户就不需要输入密码(pam_rootok.so模块的主要作用是使uid为0的用户,即root用户能够直接通过认证而不用输入密码)。
注3:如果开启第二行,表示只有root用户和wheel组内的用户才可以使用su命令。
注4:如果注释第一行,开启第二行,表示只有wheel组内的用户才能使用su命令,root用户也被禁用su命令。
4、Linux中的PAM安全认证
(1)su命令的安全隐患
默认情况下,任何用户都允许使用su命令,有机会反复尝试其他用户(如root)的登录密码,带来安全风险
为了加强su命令的使用控制,可借助于PAM认证模块,只允许极个别用户使用su命令进行切换
(2)PAM(Pluggable Authentication Mosules)
PAM是一种高效而且灵活便利的用户级别的认证方式
也是当前Linux服务器普遍使用的认证方式
Linux-PAM,是Linux可插拔式认证模块,是一套可定制、可动态加载的共享库,使本地系统管理员可以随意选择程序的认证方式。
PAM使用/etc/pam.d/下的配置文件,来管理对程序的认证方式。应用程序调用相应的PAM配置文件,从而调用本地的认证模块,模块放置在/lib64/security下,以加载动态库的形式进行认证。比如使用su命令时,系统会提示输入root用户的密码,这就是su命令通过调用PAM模块实现的
(3)PAM认证原理
1.PAM认证一般遵循的顺序:Service(服务)-->PAM(配置文件)-->pam_*.so
2.PAM认证首先要确定哪一项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于/lib64/security下)进行安全认证
3.用户访问服务器时,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证,不同的应用程序所对应的PAM模块是不同的
(4)PAM认证的构成
查看某个程序是否支持PAM认证,可以用 ls 命令
例如:ls /etc/pam.d | grep su
查看su的PAM配置文件:cat /etc/pam.d/su
每一行都是一个独立的认证过程,它们按从上往下的顺序依次由PAM模块调用
每一行可以区分为三个字段:认证类型、控制类型、pam模块及其参数
第一列代表PAM认证模块类型
字段 | 说明 |
---|---|
auth | 对用户身份进行识别,如提示输入密码,判断是否为root |
account | 对账号各项属性进行检查,如是否允许登录系统,账号是否已经过期,是否达到最大用户数等 |
passwoed | 使用用户信息来更新数据,如修改用户密码 |
session | 定义登录前以及推出后所要进行的会话操作管理,如登录连接信息,用户数据的打开和关闭,挂载文件系统 |
第二列代表PAM控制标记
字段 | 说明 |
---|---|
required | 表示需要返回一个成功值,如果返回失败,不会立刻将失败结果返回,而是继续进行同类型的下一验证,所有此类型的模块都执行完成后,再返回失败 |
requisite | 与required类似,但如果此模块返回失败,则立刻返回失败并表示此类型失败 |
sufficient | 如果此模块返回成功,则直接向程序返回成功,表示此类成功,如果失败,也不影响这类型的返回值 |
optional | 不进行成功与否的返回,一般不用于验证,只是显示信息(通常用于session类型) |
include | 表示在验证过程中调用其他的PAM配置文件,比如很多应用通过完整调用/etc/pam.d/system-auth(主要负责用户登录系统的认证工作)来实现认证而不需要重新逐一去写配置项 |
第三列代表PAM模块,默认实在/lib64/security/目录下,若不在此默认路径下,要填写绝对路径。
同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数
第四列代表PAM模块的参数,这个需要根据所使用的模块来添加
传递给模块的参数,参数可以有多个,之间用空格分隔开
(5)PAM安全认证流程
控制类型也称作Control Flags,用于PAM验证类型的返回结果
required验证失败时仍然继续,但返回Fail
1.required验证失败时仍然继续,但返回Fail
2.requisite验证失败则立即结束整个验证过程,返回Fail
3.sufficient验证成功则立即返回,不再继续,否则忽略结果并继续
4.optional不用于验证,只显示信息(通常用于session类型)
(6)控制标记的说明
required:表示该行以及所涉及模块的成功是用户通过鉴别的【必要条件】。换句话说,只有当对应于应用程序的所有带required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立即将错误消息返回给应用程序,而是在所有此类模型都调用完毕后才将错误消息返回给调用它的程序。
反正说白了,就是必须将所有的此类型模块都执行一次,其中任何一个模块验证出错,验证都会继续进行,并在执行完成之后才返回错误信息。这样做的目的就是不让用户知道自己被哪个模块拒绝,通过一种隐蔽的方式来保护系统服务。就像设置防火墙规则的时候将拒绝类的规则都设置为drop一样,以致于用户在访问网络不成功的时候无法准确判断到底是被拒绝还是目标网络不可达。
requisite:与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别。不同之处在于其一旦失败就不再执行堆中后面的其他模块,并且鉴别过程到此结束,同时也会立即返回错误信息。与上面的required相比,似乎要显得更光明正大一些。
sufficient:表示该行以及所涉及模块验证成功是用户通过鉴别【充分条件】。也就是说只要标记为sufficient的模块一旦验证成功,那么PAM便立即向应用程序返回成功结果而不必尝试任何其他模块。即便后面的层叠模块使用了requisite或者required控制标志也是一样。当标记为sufficient的模块失败时,sufficient模块会当做optional对待。因此拥有sufficient标志位的配置项在执行验证出错的时候并不会导致整个验证失败,但执行验证成功只是则大门敞开,所以该控制位的使用务必慎重。
optional:它表示即便该行所涉及的模块验证失败用户仍能通过认证。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。也即是说几班本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用该标志,PAM框架会忽略这个模块产生的验证错误,继续顺序执行下一层叠模块。
PAM实例:
控制标记 | 模块顺序 | 用户1 | 用户2 | 用户3 | 用户4 |
---|---|---|---|---|---|
auth required | 模块1 | pass | fail | pass | pass |
auth sufficient | 模块2 | pass | pass | fail | pass |
auth requisite | 模块3 | pass | pass | pass | fail |
结果 | - | pass | fail | pass | pass |
5、使用sudo机制提升权限
(1)sudo命令的用途及用法
用途:以其他用户身份(如root)执行授权的命令
用法:sudo 授权命令
(2)配置sudo授权
visudo
或
vi /etc/sudoers #此文件的默认权限为440,保存退出时必须执行“wq!”命令来强制保存退出
(3)语法格式:
用户 主机名=命令程序列表
用户 主机名=(用户) 命令程序列表
字段 | 说明 |
---|---|
用户 | 直接授权指定的用户名,或采用“%组名”的形式(授权一个组的所有用户)。 |
主机名 | 使用此规则的主机名。没配置过主机名时可用localhost(默认主机名),有配过主机名则用实际的主机名,ALL则代表所有主机 |
(用户) | 用户能够以何种身份来执行命令。此项可省略,缺省时以root用户的身份来运行命令 |
命令程序列表 | 允许授权的用户通过sudo方式执行的特权命令,需填写命令程序的完整路径,多个命令之间以逗号“,”进行分割。ALL则代表系统中的所有命令 |
可使用通配符“ * ”表示所有,取反符号“!”表示排除
例如:Jerry localhost=/sbin/*,!/sbin/poweroff
表示jerry用户操作localhost主机可使用sbin目录下的除poweroff以外的所有命令
注:Jerry仍可使用init、shutdown等命令执行关机操作,因此限制命令需做到全面无漏,否则限制影响十分有限。
(4)设置别名
使用关键字User_Alias、Host_Alias、Cmds_Alias来进行设置别名(别名必须为大写)
User_Alias USERS=Tom,Jerry,Mike
Host_Alias HOSTS=localhost,bogon
Cmnd_Alias CMDS=/sbin/ifconfig,/usr/sbin/useradd,/usr/sbin/userdel
USERS HOST=CMDS
(5)无需密码验证
正常情况下,第一次使用sudo命令需输入密码验证,有效期为五分钟,过期后使用sudo需再次输入密码验证。
可以设置特定用户无需密码验证
Mike ALL=(ROOT)NOPASSWD:/bin/kill,/usr/bin/killall
也可设置组用户无需密码验证
%wheel ALL=NOPASSWD:ALL
以及所有用户无需密码验证
USERS HOSTS=NOPASSWD:CMDS
(6)查看sudo操作记录
需启用Defaults logfile配置
默认日志文件:/var/log/sudo
visudo #进入sudo配置文件
Defaults logfile="/var/log/sudo" #启动Defaults logfile
tail /var/log/sudo #查看sudo末尾10行记录
(7)查询授权的sudo操作
sudo -l
二、系统引导和登录控制
1、开关机安全控制
(1)调整BIOS引导设置
将第一引导设备设为当前系统所在硬盘
禁止从其他设备(光盘、U盘、网络)引导系统
将安全级别设为setup,并设置管理员密码
(2)GRUB限制
通常情况下,在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,也可进入急救模式修改用户密码,这对服务器是一个极大的安全威胁。为此,可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
使用grub2-mkpasswd-pbkdf2生成密钥
修改/etc/grub.d/00_header文件,添加密码记录
生成新的grub.cfg配置文件
grub2-mkpasswd-pbkdf2 #根据提示设置GRUB菜单的密码
PBKDF2 hash of your password is grub.pbkdf2…… #省略部分内容为加密生成的密码字符串
cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak #制作备份
cp /etc/grub.d/00_header /etc/grub.d/00_header.bak #制作备份
vim /etc/grub.d/00_header
cat << EOF
set superusers="root" #设置超级用户为root
password_pbkdf2 root grub.pbkdf2…… #设置密码,省略部分内容为经过加密生成的密码字符串
EOF
grub2-mkconfig -o /boot/grub2/grub.cfg #生成新的grub.cfg
到此完成配置修改工作,重启后进入GRUB菜单时,按e键将需要输入账号密码才能修改引导参数。
2、终端登录安全控制
(1)限制root只在安全终端登录
安全终端配置:/etc/securetty
vi /etc/securetty
将tty5,tty6前加“#”将其注释,表示禁止root用户从终端tty5、tty6登录
(2)禁止普通用户登录
建立/etc/nologin
touch /etc/nologin
删除nologin文件或重启后即恢复正常
rm -rf /etc/nologin
三、弱口令检测
1、暴力破解工具-JR
John the Ripper是一款开源的密码破解工具,可使用密码字典(包含各种密码组合的列表文件)来进行暴力破解。通过对shadow文件的口令分析,可以检测密码强度。
官方网站:http://www.openwall.com/john/
2、安装JR工具
安装方法:make clean 系统类型
主程序文件为john
3、检测弱口令账号
获得Linux/Unix服务器的shadow文件
执行john程序,将shadow文件作为参数
4、密码文件的暴力破解
准备好密码子弹文件,默认为password.lst
执行john程序,结合--wordlist=字典文件
5、模拟暴破步骤
1.解压工具包
cd /opt
tar zxf john-1.8.0.tar.gz
2.安装软件编译工具
yum install -y gcc gcc-c++ make
3.切换到src子目录
cd /opt/john-1.8.0/src
4.进行编译安装
make clean linux-x86-64
5.准备待暴破的密码文件
cp /etc/shadow /opt/shadow.txt
6.执行暴力破解
cd /opt/john-1.8.0/run
./john /opt/shadow.txt
7.查看已破解出的账户列表
./john --show /opt/shadow.txt
8.使用密码字典文件
使用> john.pot #清空已破解出的账户列表以便重新分析
./john --wordlist=./password.list /opt/shadow.txt #使用指定的字典文件进行破解
9.添加字典内容
若密码无法被暴力破解说明字典中没有该密码记录,可以进入字典文件(/opt/john-1.8.0/run/password.list)中手工输入添加,字典内容的丰富程度与破解能力成正比
四、端口扫描
1、网络扫描工具-NMAP
NMAP是一个强大的端口扫描类安全评测工具,支持ping扫描、多端口检测等多种技术。
2、安装NMAP软件包
rpm -qa | grep nmap #检查是否已安装
yum install -y namp #若未安装,进行yum安装
3、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通而放弃扫描 |
4、常规检测方式
netstat -natp #查看正在运行的使用TCP协议的网络状态信息
netstat -naup #查看正在运行的使用UDP协议的网络状态信息
分别查看本机/其他主机开放的TCP、UDP端口
nmap -sT 127.0.0.1
nmap -sU 127.0.0.1
检测192.168.80.0/24网段有哪些主机提供HTTP服务
nmap -p 80 192.168.80.0/24
检测192.168.80.0/24网段有哪些存活主机
nmap -n -sP 192.168.80.0/24
5、netstat命令常用选项
常用选项 | 说明 |
---|---|
-a | 显示主机中所有活动的网络连接信息(包括监听、非监听状态的服务端口) |
-n | 以数字的形式显示相关的主机地址、端口等信息 |
-t | 查看TCP相关的信息 |
-u | 显示UDP协议相关的信息 |
-p | 显示与网络连接相关联的进程号、进程名称信息(该选项需要root权限) |
-r | 显示路由表信息 |
-l | 显示处于监听状态的网络了解及端口信息 |