目录
1. 账号安全控制
1.1 系统账号清理
1.2密码安全控制
1.2.1 设置密码有效期
1.2.2要求用户下次登录时修改密码
1.3 账号安全基本措施
1.3.1常用四个系统配置文件
1.3.1 命令历史限制
1.3.2 终端自动注销
2.系统引导和登录控制
2.1 使用su命令切换用户
2.1.1 切换用户
2.1.2密码验证
2.1.3 限制使用su命令的用户
2.2 PAM安全认证
2.2.1 Linux中的PAM安全认证
2.2.2 PAM认证原理
2.2.3 PAM认证的构成
2.3使用sudo机制提升权限
2.3.1 sudo命令的用途及用法
2.4 使用sudo机制提升
3 系统引导和登录控制
3.1 开关机安全控制
3.1.1 调整BIOS引导设置原则
3.1.2 GRUB限制
3.1.3 GRUB菜单加密的实现
3.2 终端登录安全控制
3.2.1 限制root只在安全终端登录
3.2.2 禁止普通用户登录
4 网络端口扫描——nmap工具
4.1 nmap工具
4.2 netstat命令
usermod -s /sbin/nologin 用户名
usermod -L 用户名
passwd -l 用户名`
userdel [-r] 用户名
[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
`这两个文件被锁了以后用户也会无法创建`
法一
[root@localhost ~]# vim /etc/login.defs `##修改密码配置文件,适用于新建用户`
法二
[root@localhost ~]# chage -M 30 zhangsan `##适用于已有的用户`
[root@localhost ~]# cat /etc/shadow | grep zhangsan `##查看shadow文件的zhnagsan的那一行`
chage ##修改账号和密码有效期限
语法:chage [参数] [数值] username
常用参数
选项 | 说明 |
---|---|
l | 列出当前用户过期时间设置信息 |
m | 密码可以更改的最小天数,为0时任何时候都能更改 |
M | 密码保持有效的最大天数 |
E | 设置用户的过期时间 过了这些天账号将不可用 0表示马上过期 -1表示永不过期 |
d | 上一次更改的日期 |
[root@localhost ~]# chage -d 0 zhangsan `##下次登录时强制请求修改密码`
/etc/profile
系统环境变量得配置文件(全局有效) 环境变量 PATH HISTSIZE
开机时,用户登录会自动加载
/etc/bashrc
全局有效,用户在切换shell环境时也会自动加载此文件中的配置
source 刷新
~/.bash_profile
只针对当前用户有效
echo ''> ~/.bash_history放在当前文件夹中
当前用户开机后首次登录系统时会执行一次这个命令
~/ . bashrc
只针对当前用户有效
echo ' ' > ~/ .bash_ history
当前用户每次登录或者切换shell环境时都会执行一次命令
[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 `##添加这一行后登录时自动清空命令历史`
[root@localhost ~]# vim /etc/profile
[root@localhost ~]# source /etc/proflie `##刷新配置文件`
格式 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
root→任意用户,不验证密码
[root@localhost ~]# su wangwu
[wangwu@localhost root]$
普通用户→其他用户,验证目标用户的密码
[wangwu@localhost ~]$ su - root
密码:
上一次登录:二 8月 9 14:11:59 CST 2022tty2 上
[root@localhost ~]# whoami
root
将允许使用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
su命令的安全隐患
PAM(Pluggable Authentication Modules)可插拔式认证模块
一般遵循的顺序
Service (服务) → PAM (配置文件) → +pam_ *.so
首先要确定哪-项服务,然后加载相应的PAM的配置文件(位于/etc/pam.d下),最后调用认证文件(位于 /lib64/security下)进行安全认证
用户访问服务器时,服务器的某-个服务程序把用户的请求发送到PAM模块进行认证
不同的应用程序所对应的PAM模块是不同的
示例:查看su是否支持PAM模块认证
[root@localhost ~]# ls /etc/pam.d | grep su
su
sudo
sudo-i
su-l
[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目录下,如果不在此默认路径下。要填写绝对路径。
同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。`
用途: 以其他用户身份(如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]$
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"
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的威胁。可以为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负责引导linux系统,其作为系统中的第一道屏障的安全性非常重要,对GRUB 2进行加密可以实现安全性。
在默认情况下,GRUB 2对所有可以在物理上进入控制台的人都是可访问的。任何人都可以选择并编辑任意菜单项,并且可以直接访问GRUB命令行。要启用认真支持,必须将环境变量超级用户设置为一组用户名(可以使用空格、逗号、分号作为分隔符)这样就只允许超级用户使用GRUB命令行、编辑菜单项以及执行任意菜单项。
GRUB 2密码支持以下两种格式:
为GRUB菜单设置密码的两种方式:
方法一:
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 <
示例:
将终端tty5、tty6注释掉,禁止root用户从这两个终端登录。
[root@localhost ~]# vi /etc/securetty //编辑配置文件,将终端tty5、tty6注释掉
----------------------
#tty5
#tty6
[root@localhost ~]# touch /etc/nologin //禁止普通用户登录
[root@localhost ~]# rm -rf /etc/nologin //取消普通用户登录限制
控制位 | 描述 |
---|---|
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 |
[root@localhost ~]# rpm -qa|grep nmap //查看nmap
[root@localhost ~]# yum install -y 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通而放弃扫描。 |
用于主机发现的一些用法
Nmap用于端口扫描的一些用法
示例:
# 分别查看本机开放的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
-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