SSH的简易安全配置:查看SSH登录日志文件,修改默认端口,UFW配置防火墙,禁止root用户登录,禁用密码登陆,使用RSA私钥登录,使用 Fail2ban 工具,使用两步验证(2FA)。
环境是Ubuntu 22.04 LTS
这台才买回来3天就被扫了500多次,东西都还都没上就被扫了这么多次emmm 还是要留意下安全问题的
查看登录日志文件
sudo vim /var/log/auth.log
不出意外会看到很多类似如下的日志
Failed password for root from 183.146.30.163 port 22537 ssh2
Failed password for invalid user admin from 183.146.30.163 port 22545 ssh2
Invalid user tester from 101.254.217.219 port 56540
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.61.8.34
然后可以统计有多少人在暴力破解root密码错误登录,展示错误次数和ip
sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
因为腾讯云还有个默认用户Ubuntu,也可以一起看看,或是查看一下自己其他用户的错误登录
sudo grep "Failed password for ubuntu" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
统计有多少暴力猜用户名的
sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more
修改SSH的默认端口
在ECS上修改的时候要多留意一下,小心没改好再把自己拒绝在外面。
修改后不要退出当前的 ssh 链接,大多数 Linux 发行版重启 ssh 服务并不会中断当前已经建立的 ssh 连接。另外开个窗口去重新连接 ssh 服务,如果遇到问题,还可以在原来的 ssh 连接下修改和恢复。
也可以让SSH同时工作在22和新设定的端口下,等测试能连接到新端口后再将22端口注释掉。
如果操作不慎丢失了ssh连接,可以尝试使用云平台提供的控制台登录
防火墙设置
Ubuntu系统上默认装有了UFW(Uncomplicated Firewall)来配置防火墙。它们之间的关系是 netfilter-->iptables-->[ ufw / firewall ]
。ufw / firewall 是用人性化的语言配置规则并转化为iptables的规则语法。iptables 是一个通过控制 Linux 内核的 Netfilter 模块来管理网络数据包的流动与转送的应用软件,其功能包括不仅仅包括防火墙的控制出入流量,还有端口转发等等。
检查UFW状态
sudo ufw status verbose
verbose
参数可不加。当防火墙处于关闭状态时只会显示inactive
UFW默认情况下允许所有的出站连接,拒绝所有的入站连接。
启用UFW防火墙日志
sudo ufw logging on
sudo ufw logging medium #sudo ufw logging low|medium|high
日志文件在/var/log/ufw.log
在防火墙开放SSH端口:
sudo ufw allow ssh
sudo ufw allow 2233/tcp
UFW通过 /etc/services 知道ssh服务使用的端口默认为22
开启UFW:
sudo ufw enable
在系统修改后记得去ECS控制台(比如这台是腾讯云)防火墙里面开放想要设置的端口和关闭默认的22端口。
(用了UFW这种类似于前端的工具后,在不是非常清楚每条命令都是在做什么以及有什么效果那就不要乱改iptables,尤其是不要iptables -F清除全部规则)(不推荐)直接使用iptables配置防火墙的方法:
iptables -A INPUT -p tcp -m tcp --dport 2233 -j ACCEPT
保存和重启iptables防火墙 service iptables save
和 service iptables restart
修改SSH的默认端口
sudo vim /etc/ssh/sshd_config
把 # Port 22
修改为 Port 2233
最好使用1024到65535之间的一个别人猜不到的端口号
重启ssh服务:
sudo /etc/init.d/ssh restart #或 sudo service ssh restart
查看SSH侦听(监听)端口:
sudo netstat -tunlp | grep ssh
UFW删除规则:
sudo ufw status numbered #查看所有规则的规则号
sudo ufw delete 2 #直接删除规则号对应的规则即可
UFW有两种方式删除防火墙规则,既可以通过规则号删除,也可以通过实际规则删除,通过规则号删除更容易。因为UFW默认会管理IPV6所以会既有ipv6又有ipv4,需要删除2个。
禁止SSH的root用户登录
修改 /etc/ssh/sshd_config
文件
首先创建一下文件的备份
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
禁止以root用户身份通过 SSH 登录
PermitRootLogin no
设置SSH单次登录限制
LogLevel INFO #将LogLevel设置为INFO,记录登录和注销活动
MaxAuthTries 3 #限制单次登录会话的最大身份验证尝试次数
LoginGraceTime 20 #缩短单次的登录宽限期,即ssh登录必须完成身份验证的时间 单位是秒
重启ssh服务 sudo service ssh restart
禁用密码登陆,使用RSA私钥登录
ssh-keygen #在客户端生成密钥
ssh-copy-id myserver1 #将公钥添加至服务端
还需要配置服务端
sudo vim /etc/ssh/sshd_config
PasswordAuthentication no #禁止密码认证
PermitEmptyPasswords no #禁止空密码用户登录
重启ssh服务 sudo service ssh restart
使用 Fail2ban
Ubuntu 16.04 系统源里带有 denyhosts
,到了Ubuntu 20.04默认不再包含。DenyHosts
现在几乎不再更新了,所以使用Fail2ban
工具来缓解暴力密码攻击
检查是否安装了特定软件包
apt-cache search denyhosts
apt-cache search fail2ban
安装fail2ban
sudo apt-get update
sudo apt-get install fail2ban
配置fail2ban
配置文件在 /etc/fail2ban/jail.conf
。 在配置文件的[DEFAULT]
区,可以在此定义所有受监控的服务的默认参数
[DEFAULT]
# 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
# 用于指定哪些地址可以忽略 fail2ban 防御
ignoreip = 127.0.0.1/8 ::1
# 客户端主机被禁止的时长
bantime = 60m
# 查找失败次数的时长
findtime = 3m
# 客户端主机被禁止前允许失败的次数
maxretry = 3
根据上述配置,fail2ban会自动禁止在最近3分钟内有超过3次访问尝试失败的任意IP地址。一旦被禁,这个IP地址将会在1小时内一直被禁止访问 SSH 服务
保存配置后重启服务
sudo service fail2ban restart
查看fail2ban运行状态
验证fail2ban成功运行:
$ sudo fail2ban-client ping
Server replied: pong
查看日志文件
sudo vim /var/log/fail2ban.log
检验fail2ban状态
$ sudo fail2ban-client status
Status
|- Number of jail: 1
`- Jail list: sshd
检验一个特定监狱的状态
sudo fail2ban-client status sshd
上面的命令会显示出当前被禁止IP地址列表
解锁特定的IP地址
sudo fail2ban-client set sshd unbanip 103.61.8.34
看不懂但是大受震撼
用的腾讯云,修改ssh端口后,要在控制台安全组里添加相应端口
保存和重启iptables防火墙 service iptables save 和 service iptables restart
在这一步出现 iptables: unrecognized service, 这个问题是怎么回事。不太懂,最后还是把防火墙关闭了