Linux系统以其开放性和强大的功能成为众多企业和开发者的首选。然而,开放性也带来了安全风险。本文将探讨Linux系统调优中的安全防护策略,分享并提供一系列实用的优化措施,确保系统在高效运行的同时,也能抵御潜在的网络威胁,减少日常使用的安全隐患。
大家好,我是技术界的小萌新,今天要和大家分享一些干货。在阅读之前请先点赞,给我一点鼓励吧!这对我来说很重要 (*^▽^*)
系统 命令审计
是日常运维工作中的一个增加 Linux 安全性的一个环节,它不仅关乎系统操作的合规性,更是防范 未授权访问
和潜在威胁的重要手段。随着系统复杂性的增加,对命令的细致审计变得尤为必要,它能够帮助我们识别和阻止恶意行为,保护系统免受损害。
其中开始 历史命令时间戳
并增加历史命令记录量是一个简单的方式,用于记录日常运维工作中的命令使用记录,方便遇到问题时进行 排错
解决,并记录其他用户使用的命令,方法如下:
[root@ECS-PROXY ~] vim /etc/profile.d/history.sh
# 在全局环境变量配置目录中写脚本,方便开机自启
export HISTSIZE=10000
export HISTTIMEFORMAT="%F %T `whoami` "
# 设置历史命令记录为 1w 个
# 开启历史命令时间戳,%F %T 分别显示 年份 月份,'whoami' 执行该命令,显示当前命令执行用户
"/etc/profile.d/history.sh" 2L, 62C
修改完毕,我们执行 history
命令可以查看如下效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0pdl8WA1-1721030775069)(https://i-blog.csdnimg.cn/direct/75acb5e3019349e19034130e68b380e7.png#pic_center =80%x)]
这里有聪明的小伙伴就要想了,可不可以用 $USER
环境变量显示用户,不执行命令?
其实 whoami
的输出稳定性是更好的,这是因为 USER 是一个 环境变
量,反映当前用户身份,可被脚本或程序 更改
,用户身份会随 su 或 sudo 切换用户
而改变。
而 whoami 是一个命令行实用程序,显示当前 有效
的用户名称,与 USER 变量不同,whoami 会根据当前有效的用户 ID (EUID)来确定并显示用户名,这意味着即时通过 su 或 sudo 切换了用户,whoami 也会反映出当前实际的用户身份。
最后如果是对系统命令审计 精细度
有更高的要求,还可以使用更 高效
的方式,rsyslog + elasticsearch 建立日常命令的日志,并实时交给 ELK 日志平台
统计处理,详细可见如下博客。
参考:《用 Shell 搞定 Linux 命令审计》
Linux 公网防护
是确保服务器安全的重要环节,众所周知,一旦你的服务器暴露在公网的环境下,总有无聊的一些破解 SSH 密码的行为出现,这个时候就可以使用一个简单的脚本来进行预防可能 的 SSH 撞库攻击
,将一些试错 SSH 密码超过一定次数的 IP 放入防火墙,拒绝接下来的所有行为,提高服务器一定的安全性,脚本如下:
#!/bin/bash
# 使用awk统计ssh连接失败IP的次数,超过十次,放入防火墙iptables中,禁止 IP 访问。
awk '/Failed password/{
# 匹配 secure 日志中显示错误 ssh 密码连接的行,包含来访者 IP
if (match($11,/((25[0-5]|2[0-4]\d|1?\d?\d).?){4}/))
# 利用 awk 中内置正则匹配函数 match 匹配第 11 列 IP ,或者 13 列也会出现 IP,
# $11,13 是位置函数,代表默认以空格区分的 awk 匹配行的该列内容。
{ip[$11]++}
# 使用 ip 数组,数组下标为 IP ,匹配到该 IP 则次数+1,
else
{ip[$13]++}
};
END{
for (i in ip){
if (ip[i] `** = 10){
print i
# 循环打印 IP 数组中记录的 SSH 密码错误连接超过 10 次的 IP
}
}
}' /var/log/secure `** ~/tmp.txt
# secure 日志文件记录了系统的安全日志,最后打印的 IP 写入临时文件中
for i in $(cat ~/tmp.txt)
# 循环此 IP 列表
do
if ! iptables -nL | grep $i;then
iptables -I INPUT -s $i -j REJECT
# 判断此 IP 是否被加入防火墙,没有则加入到防火墙,拒绝并警告 INPUT 链数据包为此源 IP 的访问
fi
done
rm -rf ~/tmp.txt
# 删除临时文件
最后将此脚本放入 cron 计划任务
,可每分钟执行一次,且为了以防万一,在每晚的 0 点清除防火墙规则,给自己留下后门。
[root@ECS-PROXY ~] crontab -e -u root
*/1 * * * * /root/shell/prevent_ssh.sh
0 0 * * * iptables -F
# iptables 的 -F 选项用于清除防火墙所有规则
完成上述操作后,等待脚本运行后,使用 iptables -nL
查看防火墙,可看到要求已满足。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8juqYLF-1721030775072)(https://i-blog.csdnimg.cn/direct/2ba27204202b401081f661e1c88f5f6f.png#pic_center =80%x)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCeC9L6S-1721030775073)(https://i-blog.csdnimg.cn/direct/a806ca08355040b981d79b262ca435c4.png#pic_center =80%x)]
为了加强服务器的安全策略,可以取消 SSH 的 明文密码登录
,只使用秘钥登录。可以进行以下操作完成这一目的:
1)客户端生成秘钥
运用 ssh-keygen
命令生成公钥和私钥,存放于 ~/.ssh/
下的 is_rsa (私钥),id_rsa.pub (公钥)
[root@ECS-PROXY ~] ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Kgul1K94kpHFTA2g6kTa3kYEB96DgpsHWqxGoLkVO5Y root@ECS-PROXY
The key's randomart image is:
+---[RSA 3072]----+
|. =ooo |
|+= O. . |
|BoE++ |
|*% ++. |
|Oo+o+ S |
|++o= . . |
| .+o+ o |
| o+.+ |
| .oo |
+----[SHA256]-----+
[root@ECS-PROXY ~]#
2)公钥传给服务器
传输公钥给服务器用 ssh-copy-id 服务器IP
来完成。
[root@ECS-PROXY ~] ssh-copy-id 192.168.1.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.1.31'"
and check to make sure that only the key(s) you wanted were added.
3)配置服务端 SSH 禁止密码登录
在服务端的 sshd_config 文件中添加 PasswordAuthentication no
来 禁用
密码登录,添加 PubkeyAuthentication yes
来启动秘钥登录,最后重启 sshd 服务。
[root@docker-01 ~] vim /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
"/etc/ssh/sshd_config" 147L, 4301C
[root@docker-01 ~] systemctl restart sshd
测试连接远程服务器,发现无法输入密码,工作完成。
最后注意 保护
好客户端的公钥、私钥,做上 备份
。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-joc85RWo-1721030775074)(https://i-blog.csdnimg.cn/direct/bc6aec6a543848e7a87c38db25474cc6.png#pic_center =80%x)]
账户保护
对于个人和企业用户都至关重要。随着网络攻击的日益增多,包括 钓鱼
、密码破解和 社会工程学
等手段,账户安全面临着严峻挑战。账户一旦被 入侵
,可能导致敏感数据 泄露
、财务损失甚至企业声誉受损。
Linux 通常提供了不少 默认账户
或账户组,这些账户的密码可能已经远近闻名了,当我们第一次装上 Linux 系统就应该意识到这一点,从而减少不使用的不必要的默认账户,通过 userdel
及 groupdel
命令即可。
chattr命令可以给下面的文件加上 不可更改
属性,从而防止非授权用户获得权限。我们可以进行以下操作:
[root@docker-01 ~] chattr +i /etc/passwd
[root@docker-01 ~] chattr +i /etc/shadow
[root@docker-01 ~] chattr +i /etc/group
[root@docker-01 ~] chattr +i /etc/gshadow
这个命令会给指定的文件名(filename)添加 i(immutable)属性。 Immutable
意味着“不可变的”,一旦设置了这个属性,文件不能被 修改
、删除,也不能被重命名或链接。
我们可以关闭无关端口,禁止不必要的服务,这样不仅可以提高系统运行速度,而且可以防止出现软件方面的 漏洞
,进而防范了黑客攻击,最后 限制
用户权限最小授权,加强密码策略,也是进行安全方面 系统调优
的重要步骤。
本文详细介绍了 Linux 系统安全防护的多个方面,包括系统命令审计、公网防护、服务器使用秘钥登录、默认账户及口令文件的防护,以及其他安全配置措施。通过这些方法,可以有效提高 Linux 系统的安全性,抵御 潜在的
网络威胁和攻击。
文章到这里就结束了,希望我的分享能为你的技术之旅增添一抹亮色。如果你喜欢这篇文章,请点赞收藏支持我,给予我前行的动力!