系统安全与优化

系统安全与优化

0.前言

  在运维过程中,Linux系统的安全与优化就变得尤为重要,这里主要从本机配置、ssh安全、mysql安全配置、shell安全、防火墙和Linux系统资源调配等方面进行讲述

1.本机系统的配置

  • 删除多余账号

  首先是删除系统特殊的用户账号和组账号,在centos系统中,我们可以使用命令查看用户账号和组账号的相关信息

1
cat /etc/passwd   #查看用户账号信息
1
cat /etc/group      #查看组账号信息

  除此以外,我们也可以使用getent命令进行用户账号和组账号的查看

1
2
getent passwd
getent group

  效果与前两命令一致

  • 服务运行定期检查

  除此之外,我们还需要定期查看服务运行情况,执行最小化安装的原则,定期给本机系统打补丁,我们可以执行

1
systemctl list-units --type=service

  这个命令将列出所有正在运行的服务及其状态。每个服务都有一个单位,它可以是一个服务文件或者一个系统初始脚本。

  • 防止单用户破解

  对于防止单用户模式下的破解,我们可以通过配置GRUB口令实现,其实现的主要步骤如下:

  首先打开终端,使用root权限登录系统

1
su root

  接下来编辑GRUB配置文件,大多数的centos系统中,GRUB的配置文件路径都为 /etc/default/grub

1
vi /etc/default/grub

  在打开的文件中找到GRUB_CMDLINE_LINUX行,并在引号内添加single参数。这将禁用单用户模式,比如修改前:

1
GRUB_CMDLINE_LINUX="rhgb quiet"

  修改后

1
GRUB_CMDLINE_LINUX="rhgb quiet single"
  • iptable加固

  我们可以通过iptable加固系统安全比如:执行最严苛开放策略,我们可以通过添加规则的方式进行,比如允许所有传入的HTTP流量(TCP端口80),可以使用以下命令

1
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

  也能够设置重要敏感端口不开放,比如要拒绝所有传入的SSH流量(TCP端口22)

1
iptables -A INPUT -p tcp --dport 22 -j DROP

  我们还能够IP白名单限制方式访问,比如允许来自IP地址为192.168.0.100的主机访问SSH(TCP端口22)

1
iptables -A INPUT -p tcp --dport 22 -s 192.168.0.100 -j ACCEPT

  确保规则已正确添加并生效。您可以使用iptables命令查看当前的规则列表,以确认是否存在针对白名单IP地址的允许规则和默认的拒绝规则

1
iptables -L
  • Rootkit Hunter扫描器

  Rootkit Hunter是一种用于检测和识别系统中的rootkit、后门和潜在恶意软件的工具。它可以扫描系统文件、进程和隐藏的文件,以查找可能存在的安全问题,首先是安装

1
yum install rkhunter

  更新Rootkit Hunter数据库:在运行扫描之前,您应该更新Rootkit Hunter的数据库,以确保它包含最新的检测规则。您可以使用以下命令更新数据库

1
sudo rkhunter –update

  运行Rootkit Hunter进行系统扫描:

1
sudo rkhunter --check

  这里需要注意的是Rootkit Hunter作为一种安全工具,不能保证100%的安全性。它可以帮助您发现一些常见的安全问题,但并不是绝对可靠的。建议将Rootkit Hunter与其他安全工具和最佳实践结合使用,以确保系统的安全性

  • 警惕rm命令

  使用rm命令删除文件时,确实需要谨慎操作。rm命令是用于删除文件和目录的强大工具,但它没有回收站或垃圾箱的概念,因此删除的文件将无法恢复,我们可以在仔细检查要删除的文件:在运行rm命令之前,确保要删除的是正确的文件或目录,这里可以使用ls命令预览要删除的内容。

  其次是使用-i选项:在运行rm命令时,可以添加-i选项,以便在删除每个文件之前进行确认提示。这样可以避免误删文件。

1
rm -i filename

  这里也提醒了我们,要养成将重要数据进行备份的习惯,这样子即使发生意外,也可以从备份中恢复文件

2.Openssh安全配置

  • 禁止root用户登录

  可以通过在ssh配置文件中设置只允许普通用户登录,开发人员费必要不的使用root登录即可

1
PermitRootLogin no  
  • 限制SSH验证重试次数

  通过限制验证次数,能够在一定程度上防止爆破问题的产生,比如设置超过3次socket连接会断开

1
MaxAuthTries 3
  • 禁用相关的登录方式

  有些ssh登录验证并不完全安全,也会有一定的风险,比如账号密码登录能够被破解,所以我们可以有选择性的去设置我们自己符合场景的验证方式

1
2
PasswordAuthentication no
PubkeyAuthentication yes
  • 自定义默认ssh端口

  恶意用户通常会使用自动化工具扫描常见的默认SSH端口(如22),以寻找易受攻击的系统。通过将SSH端口更改为非默认端口,可以减少这些扫描攻击的数量,因为攻击者无法轻易确定我们的实际SSH端口

  在配置文件中查找名为”Port”的行,默认情况下,该行通常被注释掉(以”#”开头)。取消注释并将端口号更改为想要使用的自定义端口号即可。这里要确保选择一个未被其他服务使用的端口号。

1
Port 2222

  当然,除此之外我们还需要配置防火墙允许指定自定义端口号进行连接

1
2
3
4
5
#添加新的SSH端口到防火墙规则
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

#确认新的SSH端口是否已添加到防火墙规则
iptables -L -n

  此外可以安装一个DenyHosts,这是一个用于防止SSH暴力破解攻击的工具。它可以监视系统上的SSH登录尝试,并根据配置的规则来自动阻止恶意IP地址。与此工具类似的还有sshguard和fail2ban等工具,DenyHosts是一个python编写的脚本

1
2
3
4
wget https://github.com/denyhosts/denyhosts/archive/v2.10.tar.gz
tar xf v2.10.tar.gz
cd denyhosts-2.10
python setup.py install

  其相关配置主要是在denyhosts.conf

  • 禁止ssh端口映射

  禁止使用SSH映射Socks5访问外国网站等等

1
AllowTcpForwarding no

  在某些情况下,我们可能希望禁止TCP转发以增强安全性。例如,担心用户滥用TCP转发功能,或者希望限制用户对特定网络资源的访问,禁用TCP转发可能是一个好的选择。

  • ip地址限制

  在ssh远程连接时,我们可以通过黑白名单的办法修改hosts.allow和hosts.deny的相关操作

1
2
3
4
5
6
7
8
#白名单文件
vim /etc/hosts.allow
#只允许通过两个ip主机的ssh访问
sshd:192.168.2.1,192.168.2.2
# 黑名单文件
vim /etc/hosts.deny
#禁止所有人访问本机
sshd:ALL
  • Bash审计

  要记录SSH终端中的Bash操作,可以使用Bash会话审计功能。这将允许我们记录用户在SSH终端中执行的命令和操作,我们可以编辑/etc/bash.bashrc或者是/etc/bashrc文件,并添加相应的配置

1
2
# 设置审计日志文件路径
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//") [$RETRN_VAL]"'

  接下来,可以使用grep命令结合关键字来搜索审计日志文件,例如/var/log/secure或/var/log/auth.log,具体取决于我们的系统

1
grep "KEY" /var/log/secure

  或者查询用户名作为过滤条件

1
grep "USERNAME" /var/log/secure

  通过这些操作,我们能够在Bash会话审计日志中定位到key或者是某个用户的操作

3. MYSQL安全配置

  • 设置相关权限和属主

  对于mysql安装目录,确保权限和属主设置正确非常重要。这可以提高系统的安全性和稳定性,通常情况下,mysql的安装目录位于/var/lib/mysql或/usr/local/mysql,当然使用编译安装我们可以指定一个安装目录位置,接下来我们操作指令查看相关信息

1
2
3
4
5
6
#检查当前MySQL安装目录的权限和属主
ls -ld /var/lib/mysql
#属主不正确,可以使用chown命令更改属主
chown -R mysql:mysql /var/lib/mysql
#设置正确的权限,推荐的权限设置是700
chmod 700 /var/lib/mysql

  这将确保只有MySQL用户(属主)可以访问该目录,能够有效的提高系统的安全性

  • 限制远程访问MYSQL

  一般不允许用户远程直接访问数据库,如果有访问需要,建议使用navicat通过SSH隧道访问,或者按规范配置phpmyadmin

  这里的限制ip地址访问可以仿照ssh的相关配置,也是在hosts.allow中去添加:

1
mysqld127.0.0.1

  这将限制只有本地IP地址可以访问MySQL,也可以通过SSH隧道连接到MySQL数据库。在Navicat中,创建一个新的数据库连接,并使用本地端口作为主机地址。

  • 设置加密通道

  对于MySQL的异地备份和异地从库连接,设置加密通道是一个很好的安全实践。通过使用加密通道,可以确保数据在传输过程中得到保护,防止被未经授权的人员截获或篡改,一般有以下这几种设置加密通道的方法:

  使用SSL/TLS:MySQL支持使用SSL/TLS来加密客户端与服务器之间的通信。生成自签名证书或购买可信任的证书,并将其配置到MySQL服务器和客户端上。这样可以确保数据在传输过程中得到加密保护。

  配置SSH隧道:使用SSH隧道来加密MySQL的连接。通过在本地机器和远程机器之间建立SSH连接,并将MySQL的连接通过该SSH连接进行转发,可以实现加密通信。

  使用VPN:如果您有一个虚拟私有网络(VPN),可以通过在VPN上建立连接来加密MySQL的通信。这样可以确保数据在通过公共网络传输时得到保护。

  这里以ssh隧道作为举例,使用SSH隧道来加密MySQL连接是一种常见的方法,首先我们在本地机器上打开终端或命令提示符,并使用以下命令建立SSH连接

1
ssh -L <本地端口>:<MySQL服务器IP>:<MySQL端口> <SSH用户名>@<SSH服务器IP>

  输入SSH服务器的密码并登录,ssh连接成功后,我们就可以通过本地机器上的相应端口访问mysql服务器了,例如五年本地端口设定为了3307,则可以使用命令连接mysql服务器:

1
mysql -h localhost -P 3307 -u <MySQL用户名> -p
  • 设置连接上限

  设置MySQL合理的连接上限能够保证数据库的稳定性,这是通过修改MySQL服务器的配置文件来实现

  在配置文件中找到名为[mysqld]的部分,添加相关命令

1
max_connections=<连接上限>

  这样子我们mysql的连接上线就是10了(a是打多了的),需要注意增加连接上限可能会对服务器的性能产生影响。确保评估了服务器的硬件资源和负载情况,并根据需要进行适当的调整,设置合理的连接上限

  • 开启mysql binlog

  二进制日志(binlog)在MySQL中起着重要的作用。它是一种记录数据库中所有数据更改操作的日志文件。其开启也是在配置文件中设置相关指令:

1
log_bin=<日志文件名>

  如果我们需要设置二进制日志的位置,就可以输入;

1
log_bin_index=<索引文件名>
  • LINUX IO调度

  在Linux中,IO调度器是负责管理磁盘IO请求的组件之一。Deadline IO调度器是其中一种常见的调度算法。它的目标是通过优化IO请求的排序和处理方式来提高系统的性能和响应能力。

  对于文件系统的选择,XFS和ext4都是常见的Linux文件系统。它们各自有不同的特点和适用场景。而关闭atime是一种优化技术,它可以减少文件系统的IO操作。atime记录了文件的最后访问时间,但这个信息并不总是必要的。关闭atime可以减少对文件系统的写入操作,从而提高性能。我们可以通过指令确认系统是否已经安装了deadline IO调度器

1
2
lsblk
cat /sys/block/<device>/queue/scheduler

  如果输出中包含”deadline”字样,则表示系统已经使用了deadline IO调度器,我们这里明显输出认证了我们使用了这种调度器,如果没有使用的话,则可以执行以下命令进行切换:

1
echo deadline > /sys/block/<device>/queue/scheduler

  另外,要关闭atime的话,我们需要再挂载的文件系统下使用相应的选项,对于ext4文件系统,可以在/etc/fstab文件中找到相应的挂载选项,并将noatime添加到选项列表中。对于XFS文件系统,则可以使用-o noatime选项来挂载

  • 第三方库的定期审查

  在我们使用mysql的过程中,我们往往会利用到第三方库的相关扩展和利用,因此我们需要时时关注链接第三方库是否存在漏洞

1
2
3
4
#显示MySQL服务器上已加载的所有插件和扩展
SHOW PLUGINS;
#查看特定插件的详细信息
SHOW PLUGIN <plugin_name>;

  因此为了确保应用程序的安全性,建议定期检查并更新所有使用的第三方库,并遵循最佳实践来保护应用程序免受已知的安全威胁

  • 数据库对应用户

  对不同应用的数据库设置不同的用户使用,保证正确、合理的授权

  • 配置备份策略

  备份数据的最终目的是为了在出现一些意外情况的时,能够通过备份将数据还原,所以在备份数据库时,除了备份数据本身以外,也要注意到备份相关的数据库性感环境,如配置文件,定时任务,sudo权限等相关信息

  前面有讲述mysql备份的相关文章,这里就不进行更多的阐述了,需要知道的是一般的备份策略为:主从备份+定时备份+异地备份

4.Shell安全配置

  Shell的安全配置是指对操作系统中的shell进行设置和调整,以提高系统的安全性。Shell是用户与操作系统之间进行交互的界面,因此其安全配置非常重要

  • .history文件

  通过~/.bash_history文件记录系统管理员的操作记录,定制.bash_history格式

1
vim ~/.bash_history
1
history | head
  • 日志记录功能

  CentOS通常使用rsyslog作为默认的日志记录服务。您可以查看/etc/rsyslog.conf文件以了解当前的配置

  在rsyslog.conf文件中,找到与shell活动和登录尝试相关的规则,并确保它们被正确配置。这些规则通常涉及auth、authpriv或security等设施。我们可以指定将这些日志记录到特定的文件中,如/var/log/secure,然后重新启动rsyslog服务以使更改生效

1
2
systemctl restart rsyslog
systemctl status rsyslog

  一旦日志记录功能启用,就可以定期审查和监控生成的日志文件/var/log/secure

5.防火墙安全配置

  • 禁止跳板机

  所谓跳板机就是用户首先登录任意一台服务器后,由该服务器再登录另外一台服务器,我们可以通过封锁22等端口,避免相互跳转

1
2
3
iptables -A OUTPUT -p tcp -m multiport --dports 22,21,873 -j REJECT
/etc/init.d/iptables save
iptables -L -n

  web 服务器禁止使用ssh,作为跳板机,而用户也将不能使用ssh命令登陆到其他电脑,这里需要注意的是在某些系统中,/etc/init.d/iptables文件可能不存在。如果您想保存iptables规则,请尝试使用以下命令:

1
iptables-save > /etc/iptables/rules.v4
  • 封锁特定字符串

  防火墙封锁特定字符串的目的是为了增强网络安全和保护系统免受潜在的威胁。通过检测和阻止包含特定字符串的请求或数据包,防火墙可以帮助防止恶意行为、攻击和滥用。封锁特定字符串的常见应用场景之一是防止爬虫或机器人对网站进行未经授权的访问

1
2
3
4
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Spider" -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Baidu" -j DROP
iptables -A INPUT -p tcp --dport 80 -m string --algo bm --string "Robat" -j DROP
iptables -L -n

  这些iptables规则用于在端口80上阻止包含特定字符串的HTTP请求。具体来说,它们使用-m string模块和Boyer-Moore算法来匹配字符串,并使用-j DROP将匹配的请求丢弃。第一条规则将包含”Spider”字符串的HTTP请求丢弃。第二条规则将包含”Baidu”字符串的HTTP请求丢弃。第三条规则将包含”Robat”字符串的HTTP请求丢弃

6.浅谈DDoS攻击

  DDoS 即是分布式拒绝服务攻击这种网络攻击形式尝试用恶意流量淹没网站或网络资源,从而导致网站或网络资源无法正常运行,攻击者利用大量遭遇入侵的机器和接入互联网的设备向目标发送大量流量。这些设备有物联网 (IoT) 设备、智能手机、个人电脑和网络服务器等等

  • DDoS的攻击方式

  一般而言,DDoS攻击针对的是网络中的TCP/IP基础设施,分为了许多不同的类型,,攻击者经常混合使用多种攻击来给目标造成严重破坏。三种关键类型是容积攻击、协议攻击和应用层攻击。所有攻击的目的都是为了严重拖慢合法流量的速度,或者阻止合法流量到达其预定目的地。

  • DDoS的攻击类型

  可以根据攻击的方式和目标进行更详细的了解

  带宽消耗型攻击:

1
2
3
4
5
UDP Flood:攻击者发送大量的UDP数据包到目标服务器,占用其带宽资源。

ICMP Flood:攻击者发送大量的ICMP Echo请求(ping)到目标服务器,使其无法正常响应合法请求。

HTTP Flood:攻击者发送大量的HTTP请求到目标服务器,耗尽其带宽和处理能力。

  资源消耗型攻击:

1
2
3
4
5
6
SYN/ACK Flood:攻击者伪造大量的源IP地址,向目标服务器发送大量的SYN请求,但不发送ACK确认,导致服务器资源耗尽。

Ping of Death:攻击者发送异常大的ICMP Echo请求(ping),超过目标系统的处理能力,导致系统崩溃或变得不可用。

Slowloris:攻击者利用HTTP协议的特性,通过发送大量的部分请求并保持连接打开,耗尽目标服务器的资源。

  应用层攻击:

1
2
3
4
5
6
7
8
9
10
HTTP POST请求攻击:攻击者发送大量的POST请求到目标服务器上的特定URL,使其无法处理其他合法请求。

DNS Amplification:攻击者利用DNS服务器的放大效应,向目标发送小型DNS查询请求,但响应会被放大成更大的数据包,占用目标带宽。

SSL/TLS握手攻击:攻击者发起大量的SSL/TLS握手请求,消耗目标服务器的计算资源。
分布式反射放大攻击:

DNS Amplification:攻击者伪造源IP地址,向开放的DNS服务器发送小型DNS查询请求,但响应会被放大成更大的数据包,占用目标带宽。

NTP Amplification:攻击者伪造源IP地址,向开放的NTP服务器发送小型NTP查询请求,但响应会被放大成更大的数据包,占用目标带宽。
  • 如何应对DDoS攻击

  高防服务器:

  高防服务器一般主要是指能够独立防御50Gbps以上的强大服务器,能够帮助网站进行抵抗拒绝服务攻击,并能够定期扫描网络主节点,要收费

  DDoS清洗:

  也就是对用户请求数据进行实时监控,及时发现DOS攻击等异常流量,在不影响正常业务开展的情况下清洗掉这些异常流量

  CDN 加速:

  利用CDN 服务将网站访问流量分配到了各个节点中,即能隐藏网站的真实 IP,也能在遭遇 DDoS 攻击时,将流量分散到各个节点中,防止源站崩溃


系统安全与优化
https://one-null-pointer.github.io/2023/07/05/Linux运维——系统安全与优化/
Author
liaoyue
Posted on
July 5, 2023
传送口