Linux 管理员的一个重要任务是保护服务器免受非法攻击或访问。 默认情况下,Linux 系统带有配置良好的防火墙,比如iptables、Uncomplicated Firewall(UFW),ConfigServer Security Firewall(CSF)等,可以防止多种攻击。

任何连接到互联网的机器都是恶意攻击的潜在目标。 有一个名为 Fail2Ban 的工具可用来缓解服务器上的非法访问。

1.认识问题严重性

先在你机器(包括你平时用的linux的机器)上跑几个命令看看吧。

1.1查看尝试暴力破解机器密码的人

sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more

害怕吗?

1.2查看暴力猜用户名的人

sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more

在我实验室的机器上,看到的结果如下:

次数ip207202.201.34.104108114.80.253.818222.186.58.2448222.186.56.1203198.55.103.1442一堆ip1一堆ip

感受到寒意了吗?

2应对策略

2.1 SSH相关

2.1.1 不使用默认的22端口

ssh登陆默认的端口是22,而搬瓦工一般都默认是一个比较大的随机端口,不要为了方便,改回22
修改/etc/ssh/sshd_config文件,将其中的Port 22改为随意的端口比如Port 47832,port的取值范围是 0 – 65535(即2的16次方),0到1024是众所周知的端口(知名端口,常用于系统服务等,例如http服务的端口号是80)。

2.1.2 不要使用简单密码

默认生成的root密码是随机的,但是不要改成你自己的密码,你可以将密码记在手机上,但是一定不要改成你自己的有规律的密码。

2.1.3 禁止使用密码登陆,使用RSA私钥登陆

这条是最重要最有效的。
跟之前写的debian ssh 连接android 通过termux里登陆部分是一样的。rsa的原理也不再赘述,wiki上的条目描述的很清楚。
先通过ssh-keygen -t rsa生成你的客户端的密钥,包括一个私钥和公钥,用scp id_rsa.pub root@XX.XX.XX.XX:~/把公钥拷贝到服务器上,注意,生成私钥的时候,文件名是可以自定义的,且可以再加一层密码,所以建议文件名取自己能识别出哪台机器的名字。然后在服务器上,你的用户目录下,新建.ssh文件夹,并将该文件夹的权限设为700chmod 700 .ssh,并新建一个authorized_keys,这是默认允许的key存储的文件。如果已经存在,则只需要将上传的id_rsa.pub文件内容追加进去即可:cat id_rsa.pub >> authorized_keys,如果不存在则新建并改权限为400即可。
然后编辑ssh的配置文件:

# vi /etc/ssh/sshd_config
RSAAuthentication yes #RSA认证
PubkeyAuthentication yes #开启公钥验证
AuthorizedKeysFile .ssh/authorized_keys #验证文件路径
PasswordAuthentication no #禁止密码认证
PermitEmptyPasswords no #禁止空密码
# 最后保存,重启sshd服务
sudo service sshd restart

2.1.4 禁止root用户登录

你可以新建一个用户来管理,而非直接使用root用户,防止密码被破解。
还是修改/etc/ssh/sshd_config

PermitRootLogin no

什么是 Fail2Ban?

Fail2Ban 是一款入侵防御软件,可以保护服务器免受暴力攻击。 它是用 Python 编程语言编写的。 Fail2Ban 基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,如 /var/log/auth.log/var/log/apache/access.log 等,并禁止带有恶意标志的IP,比如密码失败太多,寻找漏洞等等标志。

通常,Fail2Ban 用于更新防火墙规则,用于在指定的时间内拒绝 IP 地址。 它也会发送邮件通知。 Fail2Ban 为各种服务提供了许多过滤器,如 ssh、apache、nginx、squid、named、mysql、nagios 等。

Fail2Ban 能够降低错误认证尝试的速度,但是它不能消除弱认证带来的风险。 这只是服务器防止暴力攻击的安全手段之一。

如何在 Linux 中安装 Fail2Ban

Fail2Ban 已经与大部分 Linux 发行版打包在一起了,所以只需使用你的发行包版的包管理器来安装它。

对于 Debian / Ubuntu,使用 APT-GET 命令APT 命令安装。

$ sudo apt install fail2ban

对于 Fedora,使用 DNF 命令安装。

$ sudo dnf install fail2ban

对于 CentOS/RHEL,启用 EPEL 库RPMForge 库,使用 YUM 命令安装。

$ sudo yum install fail2ban

对于 Arch Linux,使用 Pacman 命令安装。

$ sudo pacman -S fail2ban

对于 openSUSE , 使用 Zypper命令安装。

$ sudo zypper in fail2ban

如何配置 Fail2Ban

默认情况下,Fail2Ban 将所有配置文件保存在 /etc/fail2ban/ 目录中。 主配置文件是 jail.conf,它包含一组预定义的过滤器。 所以,不要编辑该文件,这是不可取的,因为只要有新的更新,配置就会重置为默认值。

只需在同一目录下创建一个名为 jail.local 的新配置文件,并根据您的意愿进行修改。

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

默认情况下,大多数选项都已经配置的很完美了,如果要启用对任何特定 IP 的访问,则可以将 IP 地址添加到 ignoreip 区域,对于多个 IP 的情况,用空格隔开 IP 地址。

配置文件中的 DEFAULT 部分包含 Fail2Ban 遵循的基本规则集,您可以根据自己的意愿调整任何参数。

# nano /etc/fail2ban/jail.local[DEFAULT]ignoreip = 127.0.0.1/8 192.168.1.100/24bantime = 600findtime = 600maxretry = 3destemail = 2daygeek@gmail.com
  • ignoreip:本部分允许我们列出 IP 地址列表,Fail2Ban 不会禁止与列表中的地址匹配的主机
  • bantime:主机被禁止的秒数
  • findtime:如果在最近 findtime 秒期间已经发生了 maxretry 次重试,则主机会被禁止
  • maxretry:是主机被禁止之前的失败次数

如何配置服务

Fail2Ban 带有一组预定义的过滤器,用于各种服务,如 ssh、apache、nginx、squid、named、mysql、nagios 等。 我们不希望对配置文件进行任何更改,只需在服务区域中添加 enabled = true 这一行就可以启用任何服务。 禁用服务时将 true 改为 false 即可。

# SSH servers[sshd]enabled = trueport = sshlogpath = %(sshd_log)sbackend = %(sshd_backend)s
  • enabled: 确定服务是打开还是关闭。
  • port:指明特定的服务。 如果使用默认端口,则服务名称可以放在这里。 如果使用非传统端口,则应该是端口号。
  • logpath:提供服务日志的位置
  • backend:指定用于获取文件修改的后端。

重启 Fail2Ban

进行更改后,重新启动 Fail2Ban 才能生效。

[For SysVinit Systems]# service fail2ban restart[For systemd Systems]# systemctl restart fail2ban.service

验证 Fail2Ban iptables 规则

你可以使用下面的命令来确认是否在防火墙中成功添加了Fail2Ban iptables 规则。

# iptables -LChain INPUT (policy ACCEPT)target prot opt source destinationf2b-apache-auth tcp -- anywhere anywhere multiport dports http,httpsf2b-sshd tcp -- anywhere anywhere multiport dports 1234ACCEPT tcp -- anywhere anywhere tcp dpt:1234Chain FORWARD (policy ACCEPT)target prot opt source destinationChain OUTPUT (policy ACCEPT)target prot opt source destinationChain f2b-apache-auth (1 references)target prot opt source destinationRETURN all -- anywhere anywhereChain f2b-sshd (1 references)target prot opt source destinationRETURN all -- anywhere anywhere

如何测试 Fail2Ban

我做了一些失败的尝试来测试这个。 为了证实这一点,我要验证 /var/log/fail2ban.log 文件。

2017-11-05 14:43:22,901 fail2ban.server [7141]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.62017-11-05 14:43:22,987 fail2ban.database [7141]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'2017-11-05 14:43:22,996 fail2ban.database [7141]: WARNING New database created. Version '2'2017-11-05 14:43:22,998 fail2ban.jail [7141]: INFO Creating new jail 'sshd'2017-11-05 14:43:23,002 fail2ban.jail [7141]: INFO Jail 'sshd' uses poller {}2017-11-05 14:43:23,019 fail2ban.jail [7141]: INFO Initiated 'polling' backend2017-11-05 14:43:23,019 fail2ban.filter [7141]: INFO Set maxRetry = 52017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Set jail log file encoding to UTF-82017-11-05 14:43:23,020 fail2ban.filter [7141]: INFO Added logfile = /var/log/auth.log2017-11-05 14:43:23,021 fail2ban.actions [7141]: INFO Set banTime = 6002017-11-05 14:43:23,021 fail2ban.filter [7141]: INFO Set findtime = 6002017-11-05 14:43:23,022 fail2ban.filter [7141]: INFO Set maxlines = 102017-11-05 14:43:23,070 fail2ban.server [7141]: INFO Jail sshd is not a JournalFilter instance2017-11-05 14:43:23,081 fail2ban.jail [7141]: INFO Jail 'sshd' started2017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.1672017-11-05 14:43:23,763 fail2ban.filter [7141]: INFO [sshd] Found 103.5.134.1672017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.1702017-11-05 14:43:23,764 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.1702017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.1702017-11-05 14:43:23,765 fail2ban.filter [7141]: INFO [sshd] Found 181.129.54.1702017-11-05 15:19:06,192 fail2ban.server [7141]: INFO Stopping all jails2017-11-05 15:19:06,874 fail2ban.jail [7141]: INFO Jail 'sshd' stopped2017-11-05 15:19:06,879 fail2ban.server [7141]: INFO Exiting Fail2ban2017-11-05 15:19:07,123 fail2ban.server [8528]: INFO Changed logging target to /var/log/fail2ban.log for Fail2ban v0.9.62017-11-05 15:19:07,123 fail2ban.database [8528]: INFO Connected to fail2ban persistent database '/var/lib/fail2ban/fail2ban.sqlite3'2017-11-05 15:19:07,126 fail2ban.jail [8528]: INFO Creating new jail 'sshd'2017-11-05 15:19:07,129 fail2ban.jail [8528]: INFO Jail 'sshd' uses poller {}2017-11-05 15:19:07,141 fail2ban.jail [8528]: INFO Initiated 'polling' backend2017-11-05 15:19:07,142 fail2ban.actions [8528]: INFO Set banTime = 602017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set findtime = 602017-11-05 15:19:07,142 fail2ban.filter [8528]: INFO Set jail log file encoding to UTF-82017-11-05 15:19:07,143 fail2ban.filter [8528]: INFO Set maxRetry = 32017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Added logfile = /var/log/auth.log2017-11-05 15:19:07,144 fail2ban.filter [8528]: INFO Set maxlines = 102017-11-05 15:19:07,189 fail2ban.server [8528]: INFO Jail sshd is not a JournalFilter instance2017-11-05 15:19:07,195 fail2ban.jail [8528]: INFO Jail 'sshd' started2017-11-05 15:20:03,263 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.1672017-11-05 15:20:05,267 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.1672017-11-05 15:20:12,276 fail2ban.filter [8528]: INFO [sshd] Found 103.5.134.1672017-11-05 15:20:12,380 fail2ban.actions [8528]: NOTICE [sshd] Ban 103.5.134.1672017-11-05 15:21:12,659 fail2ban.actions [8528]: NOTICE [sshd] Unban 103.5.134.167

要查看启用的监狱列表,请运行以下命令。

# fail2ban-client statusStatus|- Number of jail:  2`- Jail list:   apache-auth, sshd

通过运行以下命令来获取禁止的 IP 地址。

# fail2ban-client status sshStatus for the jail: ssh|- filter| |- File list: /var/log/auth.log| |- Currently failed: 1| `- Total failed: 3`- action |- Currently banned: 1 | `- IP list: 192.168.1.115 `- Total banned: 1

要从 Fail2Ban 中删除禁止的 IP 地址,请运行以下命令。

# fail2ban-client set ssh unbanip 192.168.1.115