文章

服务器被暴力破解,改用仅限密钥登录

服务器被暴力破解,改用仅限密钥登录

开局先放一张图:

1ac3b1caf6b293a1c5d0d8fec636893

之前没怎么注意到登录之后显示有很多次失败的登录:

d7264f032f0a4eba96a26e5d77e423b

后来才注意到是有人在暴力破解我的ssh,因为做了内网穿透,所以被别人当靶子打了吧。

解决方案:改用仅限密钥登录

各种文件用途:

私钥文件(通常是id_rsa

  • 用途:存储用户的私钥,用于客户端身份验证。私钥必须保密,不能泄露给其他人。
  • 位置:通常位于用户主目录下的.ssh文件夹中,例如~/.ssh/id_rsa

公钥文件(通常是id_rsa.pub

  • 用途:存储用户的公钥,用于在服务器端验证客户端的私钥。公钥可以公开,通常会被添加到服务器的authorized_keys文件中。
  • 位置:通常位于用户主目录下的.ssh文件夹中,例如~/.ssh/id_rsa.pub

authorized_keys文件

  • 用途:存储允许登录到服务器的公钥列表。当客户端尝试使用密钥登录时,服务器会检查该文件中的公钥是否与客户端提供的私钥匹配。
  • 位置:通常位于服务器上用户主目录下的.ssh文件夹中,例如~/.ssh/authorized_keys

known_hosts文件

  • 用途:存储已知的服务器公钥。当客户端首次连接到服务器时,会保存服务器的公钥,以便后续连接时验证服务器的身份,防止中间人攻击。
  • 位置:通常位于客户端用户主目录下的.ssh文件夹中,例如~/.ssh/known_hosts

ssh_config文件

  • 用途:客户端的SSH配置文件,用于设置SSH客户端的各种选项,如默认端口、使用的私钥文件等。
  • 位置:通常位于客户端用户主目录下的.ssh文件夹中,例如~/.ssh/config,或者系统的全局配置文件/etc/ssh/ssh_config

sshd_config文件

  • 用途:服务器的SSH配置文件,用于设置SSH服务器的各种选项,如是否允许密码登录、允许的密钥类型等。
  • 位置:通常位于服务器上的/etc/ssh/目录中,例如/etc/ssh/sshd_config

方法一:在服务器端生成密钥然后把私钥复制到本地

  1. 生成密钥对并配置服务器

    1
    
    ssh-keygen -t rsa -b 4096
    
  2. 将公钥添加到authorized_keys

    1
    2
    3
    
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh
    
  3. 从本地下载私钥

    1
    
    cat ~/.ssh/id_rsa
    

    将显示的私钥内容复制到剪贴板。注意不要泄露私钥内容。

方法二:从本地生成密钥并上传公钥到服务器

  1. 生成SSH密钥对

    在客户端计算机上,为用户生成SSH密钥对(如果还没有的话):

    1
    
    ssh-keygen -t rsa -b 4096
    

    当提示输入文件位置和密码时,你可以按回车键接受默认值(无密码)。这将生成两个文件:一个私钥(通常是~/.ssh/id_rsa)和一个公钥(通常是~/.ssh/id_rsa.pub)。

  2. 上传公钥到服务器

    将生成的公钥上传到服务器的~/.ssh/authorized_keys文件中:

    1
    
    ssh-copy-id 用户名@服务器地址
    

    或者手动上传:

    1
    
    cat ~/.ssh/id_rsa.pub | ssh 用户名@服务器地址 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys'
    

    输入密码以完成操作。

  3. 修改服务器上的SSH配置

    登录到服务器,编辑SSH守护进程配置文件/etc/ssh/sshd_config

    1
    
    sudo vim /etc/ssh/sshd_config
    

    进行以下更改:

    • 确保PubkeyAuthentication设置为yes

      1
      
      PubkeyAuthentication yes
      
    • 确保或添加PasswordAuthentication设置为no

      1
      
      PasswordAuthentication no
      
    • 确保或添加ChallengeResponseAuthentication设置为no

      1
      
      ChallengeResponseAuthentication no
      
    • 如果希望进一步提高安全性,可以禁用根登录:

      1
      
      PermitRootLogin no
      
    • 保存并关闭文件。

  4. 重启SSH服务

    重启SSH服务以应用更改:

    1
    
    sudo systemctl restart sshd
    

    或者,如果您使用的是旧版本的系统:

    1
    
    sudo service ssh restart
    

注意事项

  • 在完成这些更改之前,请确保你有至少一种方式(如第二个SSH会话)能够访问服务器,以防配置错误导致无法登录。
  • 确保所有的用户都上传了他们的SSH公钥,特别是如果你禁用了密码认证和根登录。
  • 如果服务器有多个用户,每个用户都需要将自己的公钥添加到~/.ssh/authorized_keys文件中。

完成这些步骤后,SSH服务器应该只接受基于密钥的认证,不再接受密码认证,从而提高了安全性。

本文由作者按照 CC BY 4.0 进行授权