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 `##修改密码配置文件,适用于新建用户`
法二
[root@localhost ~]# chage -M 30 zhangsan `##适用于已有的用户`
[root@localhost ~]# cat /etc/shadow | grep zhangsan `##查看shadow文件的zhnagsan的那一行`
1.2.2要求用户下次登录时修改密码
chage ##修改账号和密码有效期限
语法:chage [参数] [数值] username
常用参数
| 选项 | 说明 |
|---|---|
| l | 列出当前用户过期时间设置信息 |
| m | 密码可以更改的最小天数,为0时任何时候都能更改 |
| M | 密码保持有效的最大天数 |
| E | 设置用户的过期时间 过了这些天账号将不可用 0表示马上过期 -1表示永不过期 |
| d | 上一次更改的日期 |
[root@localhost ~]# chage -d 0 zhangsan `##下次登录时强制请求修改密码`
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
[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环境`
上一次登录:二 8月 9 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
密码:
上一次登录:二 8月 9 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
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 8月 9 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则代表系统中的所有命令
使用关键字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
启用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密码
- 方法二:
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
3.2 终端登录安全控制
3.2.1 限制root只在安全终端登录
- 安全终端配置:/etc/securetty
示例:
将终端tty5、tty6注释掉,禁止root用户从这两个终端登录。
[root@localhost ~]# vi /etc/securetty //编辑配置文件,将终端tty5、tty6注释掉
----------------------
#tty5
#tty6
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
- 网络端口扫描:
| 控制位 | 描述 |
|---|---|
| SYN | 建立链接 |
| ACK | 确认 |
| FIN | 结束断开 |
| PSH | 传送 0 数据缓存,上层应用协议 |
| RST | 重置 |
| URG | 紧急 |
- 服务和端口号:
| 服务 | 端口号 |
|---|---|
| HTTP | 80 |
| HTTPS | 443 |
| Telnet | 23 |
| FTP | 21 |
| SSH(安全登录)、SCP(文件传输)、端口重定向 | 22 |
| SMTP | 25 |
| POP3 | 110 |
| WebLogic | 7001 |
| TOMCAT | 8080 |
| WIN2003远程登录 | 3389 |
| Oracle数据库 | 1521 |
| MS SQL* SEVER数据库sever | 1433 |
| MySQL 数据库sever | 3306 |
- 安装nmap:
[root@localhost ~]# rpm -qa|grep nmap //查看nmap
[root@localhost ~]# yum install -y nmap //安装nmap
复制代码
- nmap命令常用格式
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通而放弃扫描。 |
-
用于主机发现的一些用法
- -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