文章目录
一、账号安全基本措施
1.系统账号清理
禁止用户登录系统
将禁止登陆的用户的Shell设置为/sbin/nologin
。
基本命令格式
usermod -s /sbin/nologin 用户名
基本使用方式
//设置zhagnsan用户禁止登录系统
[root@host ~]# usermod -s /sbin/nologin zhangsan
//查看文件中是否设置成功
[root@host ~]# grep "/sbin/nologin" /etc/passwd
zhangsan:x:1001:1001::/home/zhangsan:/sbin/nologin
锁定账户
基本命令格式
//锁定账号
usermod -L 用户名
passwd -l 用户名
//查看状态
passwd -S 用户名
基本使用方式
//锁定zhangsan用户
[root@host ~]# usermod -L zhangsan
[root@host ~]# passwd -l zhangsan
锁定用户 zhangsan 的密码 。
passwd: 操作成功
//查看zhangsan用户的状态
[root@host ~]# passwd -S zhangsan
zhangsan LK 2023-04-12 0 99999 7 -1 (密码已被锁定。)
//解锁zhangsan账号
[root@host ~]# passwd -u zhangsan
解锁用户 zhangsan 的密码。
passwd: 操作成功
删除账户
基本命令格式
userdel [-r] 用户名
-r
选项是连着用户的家目录一起删除
基本使用方式
[root@host ~]# useradd zhangsan
[root@host ~]# userdel -r zhangsan
锁定账户文件
基本命令格式
//锁定文件
chattr +i /etc/passwd /etc/shadow
//查看状态
lsattr /etc/passwd /etc/shadow
//解锁文件
chattr -i /etc/passwd /etc/shadow
注意:一个文件无法被写入或修改的可能原因:用户权限不够,不具有对文件修改的权限;该文件被锁定,无法修改编辑lsattr [文件名]
,查看该文件是否被锁定。
基本使用方式
[root@host ~]# chattr +i /etc/passwd /etc/shadow
[root@host ~]# lsattr /etc/passwd /etc/shadow
//如果有i的话说明文件被锁住了
----i----------- /etc/passwd
----i----------- /etc/shadow
[root@host ~]# echo 111 >> /etc/passwd
-bash: /etc/passwd: 权限不够
[root@host ~]# echo 123123 | passwd --stdin test
更改用户 test 的密码 。
passwd: 鉴定令牌操作错误
[root@host ~]# chattr -i /etc/passwd /etc/shadow
[root@host ~]# lsattr /etc/passwd /etc/shadow
如果没有i的话说明文件被解锁了
---------------- /etc/passwd
---------------- /etc/shadow
[root@host ~]# useradd lisi
[root@host ~]# userdel -r lisi
如何判断文件是否被操作过——md5sum
基本命令格式
md5sum 文件
基本使用方式
[root@host ~]# md5sum /etc/passwd
6f578abf5dbb65d47ac06236dd896a48 /etc/passwd
[root@host ~]# userdel zhangsan
[root@host ~]# md5sum /etc/passwd
bb3832257e994b8256267c412da4cf00 /etc/passwd
2.密码安全控制
密码安全控制主要就是设置账号的密码有效期,等到密码临近有效期,要求用户下次登陆时修改密码。
基本命令格式
//修改密码配置文件,适用于新建用户
vi /etc/login.defs
...
Pass_MAX_DAYS 天数
//设置用户密码有效期,适用于已有用户
chage -M 天数 用户
//强制用户下次登陆时更改密码
chage -d 0 用户
基本使用方式
修改/etc/login.defs文件中的密码有效期
[root@host ~]# vim /etc/login.defs
PASS_MAX_DAYS 30
[root@host ~]# useradd zhangsan
[root@host ~]# grep "zhangsan" /etc/shadow
zhangsan:!!:19459:0:30:7:::
修改lisi已存在用户的密码有效期
[root@host ~]# grep "lisi" /etc/shadow
lisi:!!:19459:0:99999:7:::
[root@host ~]# chage -M 30 lisi
[root@host ~]# grep "lisi" /etc/shadow
lisi:!!:19459:0:30:7:::
设置test用户下次登录改密码
//设置用户下次登陆时更改密码,密码要求大小写字母+数字
[root@host ~]# grep "test" /etc/shadow
test:$6$azaqdfxdkwB98/wd$Mc4vp.ESYFoVOj3NM08sXM8dH3tnFLNmOUlKKZ7cYxIsFFC62J2QaVOcEdpkRmU.SS43OWnvSh1yYqD2tFmv01:19459:0:99999:7:::
[root@host ~]# chage -d 0 test
[root@host ~]# grep "test" /etc/shadow
//shaow文件中第三个字段为0
test:$6$azaqdfxdkwB98/wd$Mc4vp.ESYFoVOj3NM08sXM8dH3tnFLNmOUlKKZ7cYxIsFFC62J2QaVOcEdpkRmU.SS43OWnvSh1yYqD2tFmv01:0:0:99999:7:::
如果想要设置密码永不过期,可以将天数设置为99999
。
3.命令历史限制
基本命令格式
//设置记录历史命令的条数
vim /etc/profile
exprot HISTSIZE=[条数]
//在当前shell环境中加载文件,用.也是一样的效果
source /etc/profile
//设置登陆时自动清空历史命令
vim 全局变量配置文件
echo"" > ~/.bash_history
//临时清空历史命令
history -c
基本使用方式
修改显示历史命令条数
[root@host ~]#vim /etc/profile
HISTSIZE=1000
//修改HISTSIZE的值,export会将命令输出成全局变量
HISTSIZE=5
//或者直接添加条数
export HISTSIZE=5
//刷新文件然后查看记录条数
[root@host ~]# source /etc/profile
[root@host ~]# history
27 history
28 vim /etc/profile
29 history
30 source /etc/profile
31 history
临时清空历史命令记录
[root@host ~]# history -c
[root@host ~]# history
28 history
登录时自动清空历史命令记录,可以通过修改
/etc/profile
、/etc/bashrc
、~/.bash_profile
和~/.bashrc
配置文件
[root@host ~]# history
5 reboot
6 vim /etc/profile
7 vim /etc/profile\
8 vim /etc/profile
9 history
[root@host ~]# vim /etc/profile
echo '' > ~/.bash_history
[root@host ~]# source /etc/profile
[root@host ~]# reboot
[root@host ~]# vim .bash_history
[root@host ~]# history
1 history
文件的读取顺序:
用户登录——>加载~/.bash_profile
——>bash_profile
中的配置首先使~/.bashrc
生效
用户登出——>.bash_logout运行logout配置文件
4.终端自动注销
基本命令格式
//设置自动注销的时间数值
vim /etc/profile
echo TMOUT=时间数值
基本使用方式
[root@host ~]# vim /etc/profile
echo TMOUT=30
二、使用su命令切换用户
1.su命令用法
命令作用
su命令的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
基本命令格式
su - 目标用户
带-选项表示将使用目标用户的登录shell环境
基本使用方式
切换test用户
[root@host ~]# su - test
mount: 只有 root 能执行该操作
[test@host ~]$ exit
登出
用zhangsan用户切换lisi用户
//创建用户
[root@host ~]# useradd zhangsan
[root@host ~]# useradd lisi
//创建密码
[root@host ~]# echo 123456 | passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@host ~]# echo 123456 | passwd --stdin lisi
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
//root用户切换zhangsan用户
[root@host ~]# su zhangsan
//zhangsan用户切换root用户
[zhangsan@host root]$ su root
密码:
[root@host ~]# exit
exit
//zhangsan用户切lisi用户
[zhangsan@host root]$ su lisi
密码:
[lisi@host root]$ exit
exit
[zhangsan@host root]$ exit
exit
由此可知:root——>任意用户,不需要密码;普通用户——>其他用户,需要密码。
查看登录用户
[zhangsan@host root]$ whoami
zhangsan
2.限制使用su命令的用户
默认情况下,如何用户都允许使用su命令,从而与机会反复尝试其他用户的登录密码,这样带来了安全风险。为了加强su命令的使用控制,可以借助于pam_wheel
认证模块只允许极个别用户使用 su 命令进行切换。
实现过程如下:将授权使用 su 命令 的用户添加到 wheel ,通过修改/etc/pam.d/su
文件的配置以启用 pam_wheel
认证。
设置lisi可以使用su命令
//查看当前系统中的用户信息
[root@host ~]# tail /etc/passwd
...
test:x:1000:1000:test:/home/test:/bin/bash
zhangsan:x:1001:1001::/home/zhangsan:/bin/bash
lisi:x:1002:1002::/home/lisi:/bin/bash
//将lisi添加到wheel组中
[root@host ~]# gpasswd -a lisi wheel
正在将用户“lisi”加入到“wheel”组中
//查看lisi所属组
[root@host ~]# id lisi
uid=1002(lisi) gid=1002(lisi) 组=1002(lisi),10(wheel)
//修改配置文件中的以下两项,前面取消#
[root@host ~]# vim /etc/pam.d/su
#%PAM-1.0
//root用户免密登录
auth sufficient pam_rootok.so
...
//wheel组中的用户才允许认证通过
auth required pam_wheel.so use_uid
//测试zhangsan用户是否能是否su命令
[root@host ~]# su zhangsan
[zhangsan@host root]$ su root
密码:
su: 拒绝权限
//测试lisi用户是否能是否su命令
[root@host ~]# su lisi
[lisi@host root]$ su root
密码:
[root@host ~]#
删除lisi使用su命令权限,添加zhangsan使用su命令权限
[root@host ~]# gpasswd -a zhangsan wheel
正在将用户“zhangsan”加入到“wheel”组中
[root@host ~]# gpasswd -d lisi wheel
正在将用户“lisi”从“wheel”组中删除
[root@host ~]# su zhangsan
[zhangsan@host root]$ su root
密码:
[root@host ~]# su lisi
[lisi@host root]$ su root
密码:
su: 拒绝权限
[lisi@host root]$ exit
exit
[root@host ~]#
如果将/etc/pam.d/su
文件中的两行都注释掉,那么root用户与普通用户一样,切换用户都需要输入密码。
三、PAM安全认证
1.PAM模块
Linux-PAM,是linux可插拔认证模块,是当前Linux服务器普遍使用的认证方式,这种方式高效而且厉害便利。
2.PAM认证原理
PAM 认证一般遵循的顺序:Service (服务)–>PAM(配置文件)–> pam *.so;
(1) PAM认证首先要确定哪一项应用服务,然后加载相应的PAM的配置文件(位于/etc/pam.d
下),最后调用认证模块(位于/lib64/security
下)进行安全认证。
(2) 用户访问服务器的时候,服务器的某一个服务程序把用户的请求发送到PAM模块进行认证。不同的应用程序所对应的PAM模块也是不同的。
3.PAM认证的构成
如果想查看某个程序是否支持PAM认证,可以用ls
命令进行查看/etc/pam.d/。
[root@host ~]# ls /etc/pam.d
atd gdm-pin postlogin-ac su
chfn gdm-smartcard ppp sudo
chsh ksu remote sudo-i
config-util liveinst runuser su-l
crond login runuser-l system-auth
cups other setup system-auth-ac
fingerprint-auth passwd smartcard-auth systemd-user
fingerprint-auth-ac password-auth smartcard-auth-ac vlock
gdm-autologin password-auth-ac smtp vmtoolsd
gdm-fingerprint pluto smtp.postfix xserver
gdm-launch-environment polkit-1 sshd
gdm-password postlogin sssd-shadowutils
例如想要查看su是否支持PAM模块认证可以用
ls
查看
[root@host ~]# ls /etc/pam.d | grep su
ksu
su
sudo
sudo-i
su-l
查看su的PAM配置文件
[root@host ~]# 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
PAM配置文件
PAM的配置文件中的每一行都是一个独立的认证过程,它们按从上往下的顺序依次由PAM模块调用
第一列代表PAM认证模块类型:
auth
:对用户身份进行识别。如提示输入密码,判断是否为root。account
:对账号各项属性进行检查。如是否允许登录系统,帐号是否已经过期,是否达到最大用户数等。password
:使用用户信息来更新数据。如修改用户密码。session
:定义登录前以及退出后所要进行的会话操作管理。如登录连接信息,用户数据的打开和关闭,挂载文件系统。
第二列代表PAM控制标记:
required
:表示需要返回一个成功值。如果返回失败,不会立刻将失败结果返回,而是继续进行同类型的下一验证,所有此类型的模块都执行完成后,再返回失败。requisite
:与required类似,但如果此模块返回失败,则立刻返回失败并表示此类型失败。sufficient
:如果此模块返回成功,则直接向程序返回成功,表示此类成功,如果失败,也不影响这类型的返回值。optional
:不进行成功与否的返回,一般不用于验证,只是显示信息(通常用于session类型)。include
:表示在验证过程中调用其他的PAM配置文件。比如很多****应用通过完整调用/etc/pam .d/system-auth
(主要负责用户登录系统的认证工作)来实现认证而不需要重新逐一去写配置项。
第三列代表PAW模块:
- 默认是在
/lib64/security/
目录下,如果不在此默认路径下,要填写绝对路径。 - 同一个模块,可以出现在不同的模块类型中,它在不同的类型中所执行的操作都不相同,这是由于每个模块针对不同的模块类型编制了不同的执行函数。
第四列代表PAM模块的参数:
- 根据所使用的模块来添加。
- 传递给模块的参数。参数可以有多个,之间用空格分隔开。
4.PAM安全认证流程
控制类型也称做Control Flags,用于PAM验证类型的返回结果
required
验证失败时仍然继续,但返回Fail;requisite
验证失败则立即结束整个验证过程,返回Fail;sufficient
验证成功则立即返回,不再继续,否则忽略结果并继续;optional
不用于验证,只显示信息(通常用于session类型)。
PAM实例:
用户1 | 用户2 | 用户3 | 用户4 | |||
---|---|---|---|---|---|---|
auth | required | 模块1 | pass | fail | pass | pass |
auth | sufficient | 模块2 | pass | pass | fail | pass |
auth | required | 模块3 | pass | pass | pass | fail |
结果 | pass | fail | pass | pass |
四、使用sudo机制提升权限
1.su命令的缺点
虽然限制了很多用户使用su命令,但是用户只要可以使用su命令并且知道root用户密码,就可以通过su root
获取root用户权限,因为root用户拥有系统的最高权限,很容易误操作造成系统挂掉。
2.sudo命令的使用方法
命令作用
通过sudo命令授权用户以其他用户(root用户)的身份去执行命令。
基本命令格式
sudo 授权命令
配置sudo授权
visudo 或者 vim /etc/sudoers
两种方式实际上打开的是同一个文件,但是vim /etc/sudoers
保存需要强制保存
配置别名
//配置用户别名
User_Alias 大写别名=用户1,用户2...
//配置主机别名
Host_Alias 大写别名=主机名1,主机名2...
//配置程序别名
Cmnd_Alias 大写别名=程序1,程序2...
用户/组授权
//用户或主机授权
用户名/用户别名
主机名/主机别名/ALL=程序列表/程序别名/ALL
//组授权
%组名 主机名/主机别名/ALL=[(用户)NOPASSWD: ]程序列表/程序别名/ALL
组名 主机名=命令程序列表
命令程序列表需要用绝对路径表示,每个命令用逗号相间隔
设置NOPASSWD:
提权时无需密码验证。如果没有设置,首次使用sudo
时需要验证当前用户的密码,默认超时时长为5分钟,在此期间不再重复验证密码
基本使用方式
设置zhangsan用户ip地址进行提权
//切换zhangsan用户
[root@host ~]# su - zhangsan
上一次登录:三 4月 12 16:47:55 CST 2023pts/0 上
mount: 只有 root 能执行该操作
//查询网关
[zhangsan@host ~]$ ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.223.100 netmask 255.255.255.0 broadcast 192.168.223.255
inet6 fe80::e60f:ae87:40b7:a144 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:20:88:32 txqueuelen 1000 (Ethernet)
RX packets 4115 bytes 315907 (308.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1893 bytes 190060 (185.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...
//用zhangsan用户添加ip地址
[zhangsan@host ~]$ sudo ifconfig ens32:0 192.168.223.10/24
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] zhangsan 的密码:
zhangsan 不在 sudoers 文件中。此事将被报告。
[zhangsan@host ~]$ exit
登出
//配置sudo权限进行提权
[root@host ~]# vim /etc/sudoers
....
//设置zhangsan的所有主机以root用户执行ficonfig命令
zhangsan ALL=(root) /usr/sbin/ifconfig
[root@host ~]# su - zhangsan
[zhangsan@host ~]$ sudo ifconfig ens32:0 192.168.223.10/24
[zhangsan@host ~]$ ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.223.100 netmask 255.255.255.0 broadcast 192.168.223.255
inet6 fe80::e60f:ae87:40b7:a144 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:20:88:32 txqueuelen 1000 (Ethernet)
RX packets 520149 bytes 730450434 (696.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 244280 bytes 14824403 (14.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.223.10 netmask 255.255.255.0 broadcast 192.168.223.255
ether 00:0c:29:20:88:32 txqueuelen 1000 (Ethernet)
...
设置lisi无法执行rm命令
//切换lisi用户
[root@host ~]# su - lisi
mount: 只有 root 能执行该操作
[lisi@host ~]$ touch 123
[lisi@host ~]$ ls
123
//删除文件
[lisi@host ~]$ rm -f 123
//配置sudo权限进行提权
[root@host ~]# vim /etc/sudoers
...
//通过取反符号!进行设置lisi无法执行rm命令
lisi ALL=!/usr/bin/rm
//退出lisi用户
[lisi@host ~]$ exit
登出
//在opt目录下新建abc文件
[root@host ~]# cd /opt
[root@host opt]# touch abc
[root@host opt]# ls
abc rh
//登录lisi用户,进入opt目录进行rm删除abc文件
[root@host ~]# su - lisi
上一次登录:三 4月 12 21:40:24 CST 2023pts/4 上
mount: 只有 root 能执行该操作
[lisi@host ~]$ cd /opt/
[lisi@host opt]$ rm -f abc
rm: 无法删除"abc": 权限不够
设置zhangsan、lisi用户可以使用/usr/sbin下所有命令,除了关机重启命令
//查询sbin目录下的关机重启命令
[root@host ~]# which reboot
/usr/sbin/reboot
[root@host ~]# which poweroff
/usr/sbin/poweroff
[root@host ~]# which init
/usr/sbin/init
[root@host ~]# which shutdown
/usr/sbin/shutdown
[root@host ~]# vim /etc/sudoers
...
//设置用户别名
User_Alias USERS = zhangsan,lisi
//设置命令别名
Cmnd_Alias ADMIN = /sbin/*, !/usr/sbin/reboot, !/usr/sbin/poweroff, !/usr/sbin/init, !/usr/sbin/shutdown
//zhangsan和lisi用户在所有主机上使用sudo命令时无需密码验证
USERS ALL=NOPASSWD: ADMIN
//测试一下route命令是否成功,是否需要输入密码
[zhangsan@host ~]$ which route
/usr/sbin/route
[zhangsan@host ~]$ sudo route add -net 10.0.0.0/24 gw 192.168.223.1 dev ens32
[zhangsan@host ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.223.2 0.0.0.0 UG 100 0 0 ens32
10.0.0.0 192.168.223.1 255.255.255.0 UG 0 0 0 ens32
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.223.0 0.0.0.0 255.255.255.0 U 100 0 0 ens32
//测试reboot命令是否成功
[zhangsan@host ~]$ sudo reboot
对不起,用户 zhangsan 无权以 root 的身份在 host 上执行 /sbin/reboot
查看用户所拥有的权限
[zhangsan@host ~]$ sudo -l
...
用户 zhangsan 可以在 host 上运行以下命令:
用户 zhangsan 可以在 host 上运行以下命令:
(root) NOPASSWD: /sbin/*, !/usr/sbin/reboot, !/usr/sbin/poweroff, !/usr/sbin/init, !/usr/sbin/shutdown
启用sudo操作日志
//添加sudo操作日志
[root@host ~]# vim /etc/sudoers
....
Defaults logfile = "/var/log/sudo"
//执行命令
[zhangsan@host ~]$ sudo route add -net 10.0.0.0/24 gw 192.168.223.2 dev ens32
[zhangsan@host ~]$ sudo reboot
对不起,用户 zhangsan 无权以 root 的身份在 host 上执行 /sbin/reboot。
//查看日志文件中命令操作日志
[root@host ~]# cat /var/log/sudo
Apr 12 22:15:37 : zhangsan : TTY=pts/4 ; PWD=/home/zhangsan ; USER=root ;
COMMAND=/sbin/route add -net 10.0.0.0/24 gw 192.168.223.2 dev ens32
Apr 12 22:16:00 : zhangsan : command not allowed ; TTY=pts/4 ;
PWD=/home/zhangsan ; USER=root ; COMMAND=/sbin/reboot
五、Linux系统初始化步骤
1. 不用root,添加普通用户,通过sudo授权管理
2. 更改默认的远程连接SSH服务端口及禁止root用户远程连接
3. 定时自动更新服务器时间
4. 配置国内yum源
5. 关闭selinux及iptables (iptables工作场景如果有外网IP一定要打开,高并发除外)
6. 调整文件描述符的数量
7. 精简开机启动服务 (crond rsyslog network sshd)
8. 内核参数优化(/etc/sysctl.conf)
9. 更改字符集,支持中文,但建议还是用英文字符集,防止乱码
10. 锁定关键系统文件
11. 清空/etc/issue,去除系统及内核版本登录前的屏幕显示
六、开关机安全控制
1.调整BIOS引导设置
- 将第一引导设备设为当前系统所在硬盘
- 禁止从其他设备(光盘、U盘、网络)引导系统
- 将安全级别设为setup,并设置管理员密码
2.GRUB限制
- 使用
grub2-mkpasswd-pbkdf2
生成密钥 - 修改
/etclgrub.d/00_header
文件中,添加密码记录 - 生成新的grub.cfg配置文件
通常情况下在系统开机进入GRUB菜单时,按e键可以查看并修改GRUB引导参数,这对服务器是一个极大的
威胁。
//可以为GRUB菜单设置一个密码,只有提供正确的密码才被允许修改引导参数。
[root@host ~]# grub2-mkpasswd-pbkdf2 ###根据提示设置GRUB菜单的密码
输入口令:
Reenter password:
PBKDF2 hash of your password is grub.pbkdf2.sha512.10000.0B63BA25BC67056508F4F54BA4F89154A9580326A0553EBC9308A4E46BA0C162E43AC13B5753AF9833FBA513CAB2A88BE2BC63F3658444D8C5F46F54A278D206.B454D43DD2F50B47255FCF53377C48FA12F9591C669FA90858CBC042912F1B219E6B20D101032AF2EE879F778E4489DAFE76B801F20468C809BC0E0FDD398549
//将密钥保存文件中,防止丢失
[root@host ~]# vi pass.txt
//设置备份文件
[root@host ~]# cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.bak
[root@host ~]# cp /etc/grub.d/00_header /etc/grub.d/00_header.bak
//添加密码记录
[root@host grub.d]# vim /etc/grub.d/00_header
cat << EOF
set superusers="root" ###设置用户名为root
password_pbkdf2 root grub.pbkdf2.sha512.10000.0B63BA25BC67056508F4F54BA4F89154A9580326A0553EBC9308A4E46BA0C162E43AC13B5753AF9833FBA513CAB2A88BE2BC63F3658444D8C5F46F54A278D206.B454D43DD2F50B47255FCF53377C48FA12F9591C669FA90858CBC042912F1B219E6B20D101032AF2EE879F778E4489DAFE76B801F20468C809BC0E0FDD398549
EOF
//生成新的grub.cfg文件
[root@host grub.d]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1160.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1160.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-62002d65633644949ab3b96743d6820c
Found initrd image: /boot/initramfs-0-rescue-62002d65633644949ab3b96743d6820c.img
done
//重启系统进入GRUB菜单时,按e键将需要输入账号密码才能修改引导参数。
七、终端以及登录控制
1.限制root只在安全终端登录
安全终端配置文件在 /etc/securetty
[root@host ~]# vim /etc/securetty
...
tty4
#tty5
#tty6
...
2.禁止普通用户登录
- 建立
/etc/nologin
文件 - 删除
nologin
文件或重启后即恢复正常
[root@host ~]# touch /etc/nologin
[root@host ~]#rm -f /etc/nologin
八、弱口令检测
1.JOHN the Ripper,简称为JR
- John the Ripper是一款开源的 密码破解工具,可使用密码字典(包含各种密码组合的列表文件)来进行暴力破解
- 通过对shadow文件的口令分析,可以检测密码强度
- 官方网站:http://www.openwall.com/john/
2.安装JR工具并尝试破解
安装软件编译工具
[root@host ~]yum -y install gcc gcc-c++ make
将下载的安装包解压
[root@host ~]# cd /opt/
[root@host opt]# rz -E
rz waiting to receive.
[root@host opt]# ls
john-1.8.0.tar.gz rh
[root@host opt]# tar xf john-1.8.0.tar.gz
进入解压缩的目录中的src目录下,进行编译安装
[root@host opt]# ls
john-1.8.0 john-1.8.0.tar.gz rh
[root@host opt]# cd john-1.8.0/
[root@host john-1.8.0]# ls
doc README run src
[root@host john-1.8.0]# cd src/
[root@host src]# make clean linux-x86-64
准备待破解的密码文件
[root@host src]# cd ..
[root@host john-1.8.0]# ls
doc README run src
[root@host john-1.8.0]# cd run/
[root@host run]# cp /etc/shadow ./shadow.txt
[root@host run]# ls
ascii.chr john lm_ascii.chr makechr relbench unafs unshadow
digits.chr john.conf mailer password.lst shadow.txt unique
执行暴力破解
[root@host run]# ./john shadow.txt
Loaded 4 password hashes with 4 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
123456 (zhangsan)
123 (root)
123 (test)
123123 (lisi)
4g 0:00:00:34 100% 2/3 0.1176g/s 358.2p/s 366.7c/s 366.7C/s leslie..boston
Use the "--show" option to display all of the cracked passwords reliably
Session completed
查看已破解密码的用户信息
[root@host run]# ./john --show shadow.txt
root:123::0:99999:7:::
test:123::0:99999:7:::
zhangsan:123456:19460:0:99999:7:::
lisi:123123:19460:0:99999:7:::
4 password hashes cracked, 0 left
破解后的数据保存在john.txt
[root@host run]# ls
ascii.chr john.conf lm_ascii.chr password.lst unafs
digits.chr john.log mailer relbench unique
john john.pot makechr shadow.txt unshadow
[root@host run]# cat john.pot
$6$kYbw69yD$gegsMQyqhthFv79/I/kb1KNzaUaO3hb86.7ayvcunpQooQOx3v6.Cs0xjFHstUrk3fmupsid6tp2iargFlnNB1:123456
$6$RWPpARo.wYlm0uvS$in37N24V4AMDDxOSeZBmYT8JiI9ZG.5zYpScyUn1PEb9drDlfdfGPlKUaibFvMNHentiCfq9riWlLRQx35sob1:123
$6$azaqdfxdkwB98/wd$Mc4vp.ESYFoVOj3NM08sXM8dH3tnFLNmOUlKKZ7cYxIsFFC62J2QaVOcEdpkRmU.SS43OWnvSh1yYqD2tFmv01:123
$6$HRNOkSdc$RznVTNSrxVJAig30nqtAqZQupEjLMgwa1Jn/hjM.Q8CkrsDLkhiqET3q9R4Z2HHU3QblyqyXHnLd0WunNJ.OW.:123123
由此可知JR工具的工作原理其实就是查询解压包目录下的/john-1.8.0/run/passwd.lst
密码词典文件,根据密码词典文件中的密码来逐一破解。默认的密码词典文件为passwdord.lst
。
也可以通过以下命令指定密码字典文件:
[root@host run]# ./john --wordlist=./password.lst shadow.txt
清空已破解出的账户列表,以便重新分析
[root@host run]# > john.pot
九、网络端口扫描
1.NMAP——端口扫描
- —款强大的网络扫描、安全检测工具,支持ping扫描,多端口检测等多种技术。
- 官方网站: http://nmap.org/
- CentOS 7.3光盘中安装包,nmap-6.40-7.el7.x86_64.rpm
NMAP安装
rpm -qa | grep nmap ###检查nmap是否安装
yum -y install nmap ###yum安装nmap
NMAP命令格式
nmap [扫描类型] [选项] <扫描目标...>
常用的选项和扫描类型
选项 | 含义 |
---|---|
-p | 指定扫描的端口。 |
-n | 禁用反向DNS 解析 (以加快扫描速度)。 |
扫描类型 | 含义 |
---|---|
-sS | TCP的SYN扫描(半开扫描),只向目标发出SYN数据包,如果收到SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。 |
-sT | TCP连接扫描,这是完整的TCP扫描方式(默认扫描类型),用来建立一个TCP连接,如果成功则认为目标端口正在监听服务,否则认为目标端口并未开放。 |
-sF | TCP的FIN扫描,开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对SYN数据包进行简单过滤,而忽略了其他形式的TCP attack 包。这种类型的扫描可间接检测防火墙的健壮性。 |
-sU | UDP扫描,探测目标主机提供哪些UDP服务,UDP扫描的速度会比较慢。 |
-sP | ICMP扫描,类似于ping检测,快速判断目标主机是否存活,不做其他扫描。 |
-P0 | 跳过ping检测,这种方式认为所有的目标主机是存活的,当对方不响应ICMP请求时,使用这种方式可以避免因无法 ping通而放弃扫描。 |
基本使用方式
查询本机开放的TCP端口
[root@host ~]# nmap -sT 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2023-04-13 23:14 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0010s 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.07 seconds
查询本机开放的UDP端口
[root@host ~]# nmap -sU 127.0.0.1
Starting Nmap 6.40 ( http://nmap.org ) at 2023-04-13 23:14 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0000060s 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 2.72 seconds
2.nestat——网络统计
基本命令格式
nestat [选项]
选项可以多个组合使用
常用命令形式
//查看正在运行的使用TCP协议的网络状态信息
netstat -natp
//查看正在运行的使用UDP协议的网络状态信息
netstat -naup
常用选项及含义
选项 | 含义 |
---|---|
-a | 显示主机中所有活动的网络连接信息 (包括监听、非监听状态的服务端口) |
-n | 以数字的形式显示相关的主机地址、端口等信息 |
-t | 查看 TCP相关的信息 |
-u | 显示 UDP协议相关的信息 |
-p | 显示与网络连接相关联的进程号、进程名称信息 (该选项需要 root 权限) |
-r | 显示路由表信息 |
-l | 显示处于监听状态的网络连接及端口信息 |
基本使用方式
查询监听状态下的端口信息并以数字形式显示
[root@host ~]# netstat -nltp
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 577/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1367/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1006/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1003/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1296/master
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 3249/sshd: root@pts
tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 60564/sshd: root@pt
tcp6 0 0 :::111 :::* LISTEN 577/rpcbind
tcp6 0 0 :::22 :::* LISTEN 1006/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1003/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1296/master
tcp6 0 0 ::1:6011 :::* LISTEN 3249/sshd: root@pts
tcp6 0 0 ::1:6012 :::* LISTEN 60564/sshd: root@pt
根据进程名确认监听状态的进程是否启用
[root@host ~]# netstat -nltp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1006/sshd
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 3249/sshd: root@pts
tcp 0 0 127.0.0.1:6012 0.0.0.0:* LISTEN 60564/sshd: root@pt
tcp6 0 0 :::22 :::* LISTEN 1006/sshd
tcp6 0 0 ::1:6011 :::* LISTEN 3249/sshd: root@pts
tcp6 0 0 ::1:6012 :::* LISTEN 60564/sshd: root@pt
根据协议号确认监听状态的进程是否启用
[root@host ~]# netstat -nltp | grep :22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1006/sshd
tcp6 0 0 :::22 :::* LISTEN 1006/sshd
3.ss——网络统计
ss是Socket Statistics的缩写。ss命令用来显示处于活动状态的套接字信息。它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
基本命令格式
ss [选项]
选项可以多个组合使用
常用选项及含义
选项 | 含义 |
---|---|
-a | 显示主机中所有活动的网络连接信息 (包括监听、非监听状态的服务端口) |
-n | 以数字的形式显示相关的主机地址、端口等信息 |
-t | 查看 TCP相关的信息 |
-u | 显示 UDP协议相关的信息 |
-p | 显示与网络连接相关联的进程号、进程名称信息 (该选项需要 root 权限) |
-r | 显示路由表信息 |
-l | 显示处于监听状态的网络连接及端口信息 |
-s | 列出当前socket详细信息 |
基本使用方式
查询当前主机网络使用情况
[root@host ~]# ss -s
Total: 1688 (kernel 2459)
TCP: 16 (estab 2, closed 1, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 2459 - -
RAW 1 0 1
UDP 10 7 3
TCP 15 9 6
INET 26 16 10
FRAG 0 0 0