1. 前言
很多服务器时不时地被黑掉。因此,我决定编写一个简短的教程,向您展示如何轻松地保护您的Linux服务器。
这并不是一个全面的安全指南,但是它可以帮助你阻止几乎 90% 的流行后端攻击,如暴力破解登录尝试和 DDoS。
下面来介绍具体如何操作。
2. 准备工作
- 需要一台 Linux 服务器
- 需要对命令行有一定的了解
做完上面的准备工作,我们进行下一步
3. 配置 SSH 密钥
要访问远程服务器,您必须使用密码或 SSH 密钥登录。
密码登录是很容易被暴力破解(下面会介绍如何防止这种情况出现)。此外,需要在每次登录服务器时输入密码。
为了避免上面说的缺点,需要设置 SSH 密钥进行验证,它比密码更加安全,因为黑客无法强行使用它们。由于不需要输入密码,连接到服务器也更容易、更快。
下面介绍一下如何为你的服务器设置 SSH 身份验证。
▐ 3.1 生成 SSH 密钥
在你的本地计算机上,输入以下命令生成 SSH 密钥对
代码语言:javascript复制ssh-keygen
上面的命令会执行一些步骤来生成 SSH 密钥,需要注意密钥文件存储的位置。
▐ 3.2 添加到服务器
使用以下命令将上面生成的公钥添加到服务器
代码语言:javascript复制ssh-copy-id username@remote_host
将 username 和 remote_host 替换成你自己服务器的真实用户名和服务器的IP地址,接着系统会提示输入密码。
▐ 3.3 登录服务器
使用下面命令登录服务器
代码语言:javascript复制ssh username@remote_host
将 username 和 remote_host 替换成你自己服务器的真实用户名和服务器的IP地址,这一次不会提示输入密码。
4. 保持系统为最新时间
许多安全协议是利用服务器的系统时间来运行 cron 工作、日期日志和执行其他关键任务。
如果服务器的系统时间不正确,可能会对你的服务器产生负面影响。为了防止这种情况发生,可以安装 NTP 客户端。这个客户端会使你的服务器系统时间与全球 NTP 服务器同步。
使用如下命令安装 NTP 客户端:
代码语言:javascript复制sudo apt install ntp
这样就不用担心系统不是最新时间而产生的负面问题。
5. 检查激活的端口
服务器上的应用程序公开某些端口,提供给网络中其他的应用程序来访问。
黑客可以在你的服务器上安装一个后门,并暴露一个端口,通过该端口他们可以控制你的服务器。
因此,我们不希望在不知道的情况下,别人监听我们的服务器,可以使用如下命令查看激活的端口:
代码语言:javascript复制sudo ss -lntup
查看一下输入结果,如果有不熟悉的任何端口或进程,可以尝试发现和追踪对服务器潜在的服务和流程。
6. 设置防火墙
防火墙可以设置服务器上特定端口的流量,我通常会使用 UFW 来设置。
UFW 常用配置有如下几点:
- 允许或者拒绝访问
- 传入或者传出流量
- to 或者 from
- 特定或者所有端口
下面会介绍如何阻止非允许访问的所有网络流量。注意在安装其他应用程序时,需要启用运行应用程序所需要的端口。UFW 相关配置如下:
▐ 6.1 安装 UFW
代码语言:javascript复制sudo apt-get install ufw
▐ 6.2 拒绝所有出站流量
代码语言:javascript复制sudo ufw default deny outgoing comment 'deny all outgoing traffic'
▐ 6.3 允许所有出站流量
代码语言:javascript复制sudo ufw default allow outgoing comment 'allow all outgoing traffic'
▐ 6.4 拒绝所有进站流量
代码语言:javascript复制sudo ufw default deny incoming comment 'deny all incoming traffic'
▐ 6.5 允许 SSH 连接
代码语言:javascript复制sudo ufw limit in ssh comment 'allow SSH connections in'
如果你将 UFW 配置为拒绝所有出站流量,不要忘记根据你的需求打开特定的流量。下面是一些例子:
代码语言:javascript复制# 允许流量从端口 53—DNS 流出
sudo ufw allow out 53 comment 'allow DNS calls out'
# 允许流量从端口 123 - NTP 流出
sudo ufw allow out 123 comment 'allow NTP out'
# 允许 HTTP、HTTPS 或 FTP 的流量流出
sudo ufw allow out http comment 'allow HTTP traffic out'
sudo ufw allow out https comment 'allow HTTPS traffic out'
sudo ufw allow out ftp comment 'allow FTP traffic out'
# 允许域名查询服务
sudo ufw allow out whois comment 'allow whois'
# 允许流量在端口 68——DHCP 客户端流出
# 只有在使用 DHCP 时才需要这个
sudo ufw allow out 68 comment 'allow the DHCP client to update'
▐ 6.6 拒绝端口 99 的流量
代码语言:javascript复制sudo ufw deny 99
▐ 6.7 启动 UFW
代码语言:javascript复制sudo ufw enable
▐ 6.8 查看 UFW 状态
代码语言:javascript复制sudo ufw status
7. 防止自动攻击
有两个非常实用的工具,可以有效的防止大多数自动攻击:
- PSAD
- Fail2Ban
▐ PSAD 和 Fail2Ban 的区别
我们知道,服务器上的端口是开放给网络中应用程序访问使用的。
黑客可能会通过扫描你的服务器,找到开放的端口,然后他们会通过这些端口访问你的服务器。
PSAD 会监控网络活动,检测并且选择阻止非法扫描和其他类型的可疑流量,比如 DDoS 或操作系统指纹尝试。
Fail2Ban 会扫描各种应用程序 (如 FTP ) 的日志文件,并自动禁止显示恶意信号 ( 如自动登录尝试 ) 的 IP。
8. 安装 logwatch
服务器上的应用程序通常会将日志消息保存到日志文件中。我们可以安装 logwatch,帮助扫描系统日志文件并汇总它们。
安装成功后可以通过命令行启动运行,也可以设置一个循环的时间来运行。另外如果服务器支持发送邮件,可以配置 logwatch 每日定时邮件发送日志摘要。
通过使用服务文件来了解如何读取和汇总日志文件。你可以在 /usr/share/logwatch/scripts/services 中找到所有服务文件。
在 /usr/share/logwatch/default.conf/logwatch.conf 路径下可以找到 logwatch 的配置文件,可以通过名利行来修改。
在 Ubuntu 或 Debian 上安装 logwatch,执行如下命令:
代码语言:javascript复制apt-get install logwatch
对于其他 Linux 发行版的用户,可以尝试直接运行 logwatch,然后查看它收集的样本,命令如下:
代码语言:javascript复制sudo /usr/sbin/logwatch --output stdout --format text --range yesterday --service all
最后,我们需要配置 logwatch 向我们通过邮件发送每日的日志摘要。更改命令如下:
代码语言:javascript复制/usr/sbin/logwatch --output mail --format html --mailto root --range yesterday --service all
9. 执行安全审计
保护 Linux 服务器安全之后,我们需要执行安全审计,发现服务器中可能忽略的任何安全漏洞。
我们可以使用 Lynis 开源软件,支持功能如下:
- 安全审计
- 符合性测试(如PCI, HIPAA, SOx)
- 渗透测试
- 漏洞检测
- 系统硬化
▐ 如何使用 Lynis
首先,通过 Github 存储库来安装 Lynis。这样可以安装最新版本的 Lynis。
代码语言:javascript复制git clone https://github.com/CISOfy/lynis
切换到我们将 Lynis 存放的根目录:
代码语言:javascript复制cd lynis
最后,可以使用以下命令来执行第一次审计:
代码语言:javascript复制lynis audit system