1

升级openssh版本

如果服务端openssh版本过低,应该更新openssh,尤其是某些版本已经曝出过重大漏洞的情况。

使用高强度加密算法

检查服务端sshd使用的加密算法,应该去掉已经被证实的弱加密算法,例如arcfourdes系列算法。

新版本openssh一般会不采用已经曝光的弱加密算法。

可以用nmap扫描目标ssh服务器,获取其sshd使用的加密算法(encryption_algorithms)

nmap --scrip "ssh2*" <server>

可以在sshd_config中配置Ciphers指定使用高强度加密算法,例如:

Ciphers aes256-ctr chacha20-poly1305@openssh.com aes256-gcm@openssh.com

修改后需要重启sshd服务。

登录记录查看

现在的linux发行版多将历史记录存到二进制文件中,因此在/var/log中不一定能找到储存有历史记录的文本文件。

  • 登录历史

    • 用户最近登录情况:lastlog
    • 登录成功的记录:last
    • 登录失败的记录:lastb
      lastb是需要重点关注的,输出内容是按时间排序的,最后输出的内容是最早的记录,条目过多时可使用tac将其倒序排列:lastb|tac
      从该文件中可以看到脚本小子喜欢用哪些用户名来尝试登录你的服务器。使用lastb|wc -l统计失败记录(注意:该记录过多会按设置清理掉旧记录),我的某云服务器在某周的lastb记录高达20多万条……
  • 当前登录用户

    • 当前已登录用户列表(以及登录的用户正在执行什么操作):w
    • 当前已登录的用户信息:who

防御工具

  • fail2ban
    具体使用参看文档,配好firewalld或iptables使用。我在文末附上一个自己边用边写的fail2ban脚本,轻松就配置好fail2ban(当然fail2ban配置也挺简单的)。
  • sshguard 有点老了 没用过了。

root用户登录限制

禁止root用户登录或仅允许其使用密钥登录。建议没啥必要就关掉root登录。(看着我lastb中有几千个root登录记录,不慌,我关掉了root登录)。

修改服务器的/etc/ssh/sshd_config文件中的PermitRootLogin 的值,值可以为:

  • noyes 禁止或允许root用户登录
  • prohibit-password或者without-password 不允许使用密码登录(可以使用其他认证方式,例如ssh密钥)
  • forced-commands-only 只能使用密钥登录 且 仅允许使用授权的命令

禁止某些用户使用shell

禁止其使用shell当然就禁止了其登录。
某些用户可能只用于自动启动某个守护进程,无需登录,可以修改其shell为nologin。
扫描工具一般会扫描知名软件的默认用户,例如postgresql的postgres用户,zabbix的zabbix用户,当然,默认情况下,不为用户设置密码,该用户是不能ssh登录的,在下曾经安装postgresql后随手其设置了密码postgresql,最后被肉鸡了,安装了挖矿程序。

修改方法:

  • chsh -s /sbin/nologin username username为用户的名字
  • 编辑/etc/passwd文件,找到该用户所在行,将/bin/bash字样改为/sbin/nologin

更换sshd监听端口

没有什么技术含量但十分有效的手段,可以和修改默认弱密码并驾齐驱的两大简单又有效的防御手段,可以减少被工具批量扫描的几率,不要高看多数骇客的手段,毕竟弱密码和默认端口的机器那么多,扫扫简单的机器不好吗,可能因此就跳过你的服务器了。当然,这是在非针对性的攻击时有一定效果,属于侥幸型方法,要是对方专门针对,那当然没用了。

修改服务器的/etc/ssh/sshd_config文件中的Port 值为其他可用端口。

如果要监听多端口,则添加多行Port,如果要指定监听的地址,添加ListenAddress行:

Port 1234
Port 4567
ListenAddress 0.0.0.0

使用密钥而非密码登录

安全但不方便。

ssh-keygen  #或者ssh-keygen -t rsa 4096 客户机生成密钥
ssh-copy-id -p 23579 user@host  #上传公钥到服务器

注意,dsa密钥已经证实为不安全,rsa密钥位数过低也较为不安全,推荐至少4096位。

IP白名单和黑名单

  • 黑名单/etc/hosts.deny中添加禁止列表。
  • 白名单/etc/hosts.allow中添加允许列表。

用户白名单和黑名单

  • sshd控制,在/etc/sshd_config中添加配置行

    • 白名单

      • 用户:AllowUsers username1 username2
      • 用户组:AllowGroups groupname1 groupname2
    • 黑名单

      • 用户:DenyUsers username1 username2
      • 用户组:DenyGroups groupname1 groupname2
  • PAM控制

    1. /etc/pam.d/sshd文件中添加:

      auth  required  pam_listfile.so  item=user  sense=deny  file=/etc/ssh/deny onerr=succeed

      sense取值:黑名单值为deny,白名单值为allow

    2. /etc/ssh/denyhosts中添加黑名单/白名单用户,一行一个用户名。

fail2ban 配置脚本

安装fail2ban后执行该脚本按照提示配置上sshd的规则即可,该配置规则:某ip连续登录失败5次将其拉入黑名单,拉黑时间8640000秒(100天)。
执行后将生成以下可用命令:

  • banip :拉黑指定ip ban_ip 1.2.3.4 3.4.5.6
  • unbanip : 取消屏蔽 用法同上
  • ignoreip :忽略ip(不被拉黑) 用法同上
  • delignoreip:删除忽略的ip 用法同上
  • unbanip all: 清空黑名单
  • blacklist : 查看黑名单
#!/bin/sh
if [[ $USER != root ]]; then
  echo "need root or sudo."
  exit
fi

if [[ ! $(which fail2ban-server) ]]; then
  echo "please install fail2ban"
  exit
fi

#-----
jail_file=/etc/fail2ban/jail.d/jail.local
bandtime=8640000 #封禁时间 默认秒s m h d w
findtime=6000    #从过去n秒的记录内筛选
maxretry=5       #最大错误尝试次数

#-----

[[ -f $jail_file ]] && mv $jail_file $jail_file.bak

echo "[DEFAULT]
bantime = $bandtime
findtime = $findtime
maxretry = $maxretry

[sshd]
enabled = true
" >$jail_file

function gen_scripts() {
  #banip
  echo '#!/bin/sh
sudo fail2ban-client set sshd banip "$@"
' >/usr/local/bin/banip

  #unbanip
  echo '#!/bin/sh
case "$@" in
  all)
    sudo fail2ban-client unban --all
    ;;
  *)
    sudo fail2ban-client set sshd unbanip "$@"
  ;;
esac
' >/usr/local/bin/unbanip

  #ignore ip
  echo '#!/bin/sh
sudo fail2ban-client set sshd addignoreip "$@"
' >/usr/local/bin/ignoreip

  ##delete ignore ip
  echo '#!/bin/sh
sudo fail2ban-client set sshd delignoreip "$@"
' >/usr/local/bin/delignoreip

  ##sshd blacklist
  echo '#!/bin/sh
sudo fail2ban-client status sshd
echo ===========
banip [ip1 ip2]         : ban 1 IP or more IPs, eg, banip 8.8.8.8 9.9.9.9
unbanip [ip1 ip2]       : unban 1 IP or more IPs
unbanip all             : unban all IPs
ignoreip [ip1 ip2]     : ignore 1 IP or more IPs
delignoreip [ip1 ip2]  : delete a ignored IP"
' >/usr/local/bin/blacklist

  chmod +x /usr/local/bin/{banip,unbanip,delignoreip,ignoreip,blacklist}
}

#=====

gen_scripts
systemctl enable --now fail2ban
systemctl restart fail2ban
blacklist

notusednow
515 声望4 粉丝