目录
1. 系统账户清理
2. 密码安全性控制
2.1 密码复杂性
2.2 密码时限
3 命令历史查看限制
4. 终端自动注销
5. su权限以及sudo提权
5.1 su权限
5.2 sudo提权
6. 限制更改GRUB引导
7. 网络端口扫描
那天不知道为什么,心血来潮看了一下passwd配置文件,发现里面有巨多的用户名,也不知道是什么时候创建的,看了一下很多都已经不用了,甚至很多用户里面都是空的。刚好之前发现有人在问关于用户安全的一些问题,我想起来我好像写过关于用户管理的博客,貌似还没有将关于用户账号安全或者权限这方面的博客。所以今天索性来讲一讲系统安全方面的东西。
1. 系统账户清理
首先讲一下开头提到的,系统中有太多太多没人用,甚至创建了之后都没用登录过的账户,那么该如何将这些账户删除呢?
很简单粗暴的方法就是直接删除
userdel -r 用户名 直接将用户删除,这里加-r是要递归删除用户名下的目录
那假如,万一存在这种可能性,虽然一个账户很久没登了,但不确定这是谁的,万一是老板的怎么办,话有说回来,那万一是图谋不轨的人留下的怎么办,这时候我们需要用到
grep "/sbin/nologin$" /etc/passwd 检索出nologin 账户
usermod -s /sbin/nologin 用户名 将某些用户的shell设置为/sbin/nologin 可以防止他们登录到系统。
同样的,我们可以用
usermod -L 来锁定用户
关于usermod 的用法,在我之前的一篇博客中有写,这里就不再细说了
Linux命令基础(三(用户和组))-CSDN博客
我突然想起来,假如系统里没什么重要的东西,那也没必要禁止或者删除那些用户,又占不了多大空间,或者说怕误删误封,那我们可以把系统中为数不多的重要文件上锁就可以了
chattr +i /etc/passwd /etc/shadow --锁定文件
lsattr /etc/passwd /etc/shadow --查看为锁定的状态
锁定后我们切换用户对文件进行修改
可以看到最下方提示无法修改
注意:只是不能修改,不代表不能查看。如果想要只有创建者能看那就要用到 chmod 600
2. 密码安全性控制
2.1 密码复杂性
然后我们开始讲系统安全,首先从最基础也是最直白的用户密码说起,我们设置一个密码的时候,会涉及到密码的复杂性(就是由数字,大小写字母,符号,如果仅由数字构成那么复杂度就是1),长度。那么,如何强制用户设置密码的时候,必须要有大小写或者字符,如何必须要由多少位组成呢?
我们用vim编辑器,编辑文件 /etc/pam.d/system-auth
然后在 password requisite 那一行的 type=后面添加如下内容
minlen=8 ucredit=-2 lcredit=-4 dcredit=-1 ocredit=-1
minlen=8 用户密码长度不得低于8位
ucredit=-1 用户密码中至少有1个大写字母 (数字为负数,表示至少有多少个大写字母;数字为正数,表示至多有多少个大写字母)
lcredit=-1 用户密码中最少有1个小写字母
dcredit=-1 用户密码中最少有1个数字
ocredit=-1 用户密码中最少有1个特殊字符
还有一个参数是remember,我没有加在上面,意思是防止旧密码
如 remember=5 修改用户密码时最近5次用过的旧密码就不能重用了
设置完成后我们保存退出,然后验证一下。
我输的是123456,可以看到,提示密码包含少于1的小写字母。
2.2 密码时限
密码本身自带的属性讲完后,还有密码的时限,这里的时限包括密码有效期;还有我们经常在一些app上遇到的,刚修改完密码需要隔多久才能再次修改密码;除此之外还能设置强制要求用户下次登录时修改密码等。
我们同样用文件编辑器 vim /etc/login.efs
PASS_MAX_DAYS 表示密码有效期多少天 默认99999天
PASS_MIN_DAYS 表示自上次修改密码以来,最少隔多少天后用户才能再次修改密码,默认值是 0
PASS_MIN_LEN 密码最小长度,对于root账户无效。现在这个设置不能生效了,因为已经被我们上面讲到的pam模块覆盖了。
PASS_WARN_AGE 表示 密码到期前多少天,系统开始通知用户“密码即将到期”,默认为7
这里做的修改只能适用于我们即将新建的用户,不适用于已经存在于系统中的用户,其实想一想也确实,生活中不乏那种需要重启才能启用功能的案例。
那么如何修改已经在系统中的用户的密码属性呢?
我们可以时chage命令
比如修改zhangsan 用户的密码时限
chage -M 10 zhangsan 修改zhangsan用户的密码最大有效期为10天,相应的-m 就是修改最小有效期(最小有效期内用户不能更改密码,和上面的PASS_MIN_DAYS意思一样)
chage命令其他操作我也不多讲了,在我的另外一篇博客中有写
Linux命令基础(三(用户和组))-CSDN博客
3 命令历史查看限制
我们都知道Linux有一个命令叫 history 它可以查看你前面输过的1000条命令,1000条这个数字还是蛮大的,假如刚好你配置什么隐秘性的文件,把它放在哪里,那么 history 全都能看见。所以,我们需要对这条命令做一些限制。
我们可以用
export HISTSIZE=15
限制历史命令只显示15条(只针对当前用户,重启后失效)
或者可以history -c 全部清除 ,但同样也是重启后失效。
那么,该如何才能使设置永久生效呢?
我们先查看~目录下,有个隐藏文件叫 .bashrc ,用命令ls -a可以看到,进入文件编辑,在最后一行加上 export HISTSIZE=15
然后保存退出,重启。可以看到,再次输入history 只显示15条了。同理,如果想要不显示的话,=0就可以了。
特别的,如果需要每个用户登出时都清除输入的命令历史记录,可以在/etc/skel/.bash_logout文件中添加
rm -f $HOME/.bash_history
这样,当用户每次注销时, .bash_history文件都会被删除
4. 终端自动注销
Windows系统中有静止时间长了之后电脑自带休眠或者注销,至于多久注销,注不注销,都可以根据自己的需求设置。Linux自然也有这种也可以进行相应的设置。
比如我需要闲置10秒后自动注销
export TMOUT=10
可以看到,十秒后自动登出了。
这个命令适用于当前用户,切换用户后就不适用了。
unset TMOUT 取消自动注销
5. su权限以及sudo提权
5.1 su权限
我们知道,su命令可以在用户之间进行切换,当一个用户设置了密码,我们再使用su进行切换时就需要输入密码,同样的,别的用户切换至root账户,也需要输入密码,那么这就涉及到一个问题,我普通用户是不是就可以一直su root 然后试密码,我甚至直接可以写一个脚本然后将密码字典导入进去,总会试出来的。所以我们要对系统或者用户进行一些限制。上面讲到密码复杂性中,图片里的那行代码 “type= ”前面有一个retry=3,不知道你们有没有注意看,它的意思就是输错密码后可以重试三次,如果再输错的话需要在文件里进行额外的配置。
我把上面那张图再拿来,方便大家观察。
例如,重输五此后锁定900秒,我们需要在上面的auth那一块 插入以下两行即可。
auth required pam_faillock.so preauth audit silent deny=5 unlock_time=900
auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=900
还有一种方法就是,我们对用户使用su命令进行限制,比如除了root用户外,其他用户都不准使用su命令,或者除了这几个用户外,其他用户都不允许使用su命令。
我们可以通过在/etc/pam.d/su文件里设置禁止用户使用su命令
主要观察框出来的这两行代码
为了方便解释,我们把第一个框直接称作1,第二个框2
1不注释:root用户使用 su 不需要输入密码
1注释:即使是root用户使用 su 命令也需要输入密码
2不注释:只有wheel组内的成员可以使用 su 命令
2注释:任何用户包括wheel 组内的成员使用 su 命令需要输入密码
这里简单做一下演示吧,我在配置文件里注释了 1 ,那么这也就应该意味着root用户使用 su 命令也需要输入密码,我们来切换看看,可以看到,需要输入密码了。其他我就不一一验证了。
5.2 sudo提权
其实通过很多地方都可以看出来了,root用户总是拥有特权,所以,在生产环境中的Linux服务器,它的root账户的密码就十分重要,我们上面进行的一些列操作,都是在保护root账户的安全性。但是有些时候,因为特殊原因,不得不让一些普通用户来登录root用户完成一些权限较高的任务,要知道,root账户的密码,多传播一次就多n份风险,那么我们该如何既不要告知对方root密码,又能让对方账户拥有相应的权限呢?
这里就涉及到了对用户提权,一般使用visudo来对文件进行编辑,完成相应的提权操作。
visudo编辑界面↑
这里提权的格式为
[用户名] [主机]=[需要提权的命令]
可能不太好理解,我们通过一个例子来解释,比如,我要让rose 用户能够执行用户的增删改
我们先切换到rose,试着新增一个用户,可以看到,直截了当地告诉你权限不够。
好,我们回到root账户,进入visudo编辑页面,在最底下加上
rose ALL=(ALL)/usr/sbin/useradd, /usr/sbin/userdel
rose是用户名不用多说了吧
ALL 表示可以在任何主机上执行这些命令
(ALL) 表示可以以任何用户的身份执行这些命令
后面是命令地绝对路径
配置完成了之后我们可以用切换到该用户 ,然后用 sudo -l 列出用户在主机上可用的和被禁止的命令。
可以看到,rose用户皇权特批
接下来useradd不用我多说了吧,指定能成功的,我就不进行演示了。但是强调一点,我们切换到提权后的用户,直接使用命令依然会提示权限不够,我们需要在前面加上sudo前缀
sudo useradd zhangsan 就可以了
不仅针对用户新增还是删除的提权,其他命令同样也能提权,照猫画虎就可以了。
6. 限制更改GRUB引导
我前面的博客也讲到过,假如系统开机后显示>grub,然后黑屏无法开机,可以通过修改GRUB菜单来进行修复。但是,细想那波操作,貌似人人都可以进入到那个操作进行修改,如果系统里存在比较重要的数据的话,那是相当不安全的。所以,我们可以为GRUB菜单设置一个密码
grub2-mkpasswd-pbkdf2 根据提示设置GRUB菜单的密码
我这里是123123,复制这一长段
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
在四十多行的位置输入
grub2-mkconfig 生成新的 grub.cfg 配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg 生成新的 grub.cfg 文件
然后我们重启机器,按e键进入grub菜单,可以看到,需要输入账户和密码才行了。
也可以更简单的,直接
grub2-setpassword
来设置密码
7. 网络端口扫描
络端口扫描是一种常见的网络安全测试方法,用于确定计算机或网络设备上哪些端口是开放的和可访问的。端口扫描可以帮助管理员发现潜在的安全漏洞或配置错误,从而及时采取措施加以修复。
我们常用的命令 nmap
首先用 rpm -qa |grep nmap 检测一下有没有下载nmap命令
如果没有下载的话用 yum install -y nmap 进行下载
接下来我们就可以使用nmap命令来进行扫描了
nmap命令常用的选项有
-p:分别用来指定扫描的端口
-sS:TCP SYN 扫描(半开扫描):只向目标发出 SYN 数据包,如果收到 SYN/ACK响应包就认为目标端口正在监听,并立即断开连接;否则认为目标端口并未开放。 tcp确定三次握手 -sT,TCP 连接扫描:这是完整的 TCP 扫描方式,用来建立一个 TCP 连接,如果 成功则认为目标端口正在监听服务,否则认为目标端口并未开放。
-sF:TCP FIN 扫描:开放的端口会忽略这种数据包,关闭的端口会回应RST数据包。许多防火墙只对 SYN 数据包进行简单过滤,而忽略了其他形式的 TCP 攻 击包。这种类型的扫描可间接检测防火墙的健壮性。
-sU:UDP 扫描:探测目标主机提供哪些 UDP 服务,UDP扫描的速度会比较慢。
-sP:ICMP 扫描:类似于 ping 检测,快速判断目标主机是否存活,不做其他扫描。
-P0:跳过 ping 检测:这种方式认为所有的目标主机是存活的,当对方不响应 ICMP 请求时,使用这种方式可以避免因无法 ping 通而放弃扫描。
以上就是我能想到的比较基础的系统安全相关的操作,如有补偿或者讲错的地方恳请留言指正,谢谢