为了内网安全,将暴露在公网上的服务器禁用SSH密码登录。但这样一来,临时从没有密钥的机器上登录机器变成了一个难题。今天突然想到:能否针对不同的端口使用不同的认证方式?

基本想法是:暴露在公网的登录端口,例如2222,仅允许密钥登录;而内网SSH端口,默认是22,则可以使用密码登录。通过两种认证方式组合,既保障了服务器的安全,也方便随时从内网登录和管理。

要达到这个目的,一个自然想法是创建两个SSHD服务,监听不同的端口,并使用不同的认证方式。这种做法的弊端是升级时需要手动更新另一个实例的配置文件。

另一个更简便的做法是使用Match指令:在SSHD的配置文件(默认是/etc/ssh/sshd_config)文件末尾增加如下两行:

Match LocalPort 22
    PasswordAuthentication yes

然后重启SSH服务:systemctl restart sshd。接下来22端口便可以使用密码登录了。

使用Match指令需注意两点:

  1. Match指令必须放置在文件最末尾,后续指令都受Match影响,除非遇到文件结尾,或者新的Match指令(也就是说可以有多个Match指令);
  2.  Match指令后的指令无需缩进,但缩进写法更容易阅读和理解,推荐使用。

参考

  1.  Is it possible to have sshd accept passwords only on certain ports?
  2.  Creating port-specific SSH authentication for the same user
  3.  CentOS系统运行多个redis实例
  4.  ssh公钥认证失效