SSH 安全篇

配置密钥登录

我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录。

本教程以Ubuntu为例,最终实现结果为:仅通过密钥登录,禁止密码登录,禁止root 用户通过 SSH 登录(使用普通用户登录后切换到root用户)

  1. 制作密钥对

    首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

    • rsa 类型(更推荐下面的 Ed25519 类型)

      1
      ssh-keygen

      如果输入密钥锁码,则在使用私钥时还必须输入密码,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。

      现在,在当前用户的根目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥(下载下来,连接vps需要使用这个认证),id_rsa.pub 为公钥。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      test@ubuntu:~$ ssh-keygen  <== 建立密钥对
      Generating public/private rsa key pair.
      Enter file in which to save the key (/home/test/.ssh/id_rsa): <== 直接按 Enter,这里是密钥生成目录
      Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
      Enter same passphrase again: <== 再输入一遍密钥锁码
      Your identification has been saved in /home/test/.ssh/id_rsa <== 私钥位置
      Your public key has been saved in /home/test/.ssh/id_rsa.pub <== 公钥位置
      The key fingerprint is:
      ...
    • Ed25519 类型(更推荐)

      和上面制作 rsa 类型 的密钥的步骤差不多。使用以下命令生成

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      ssh-keygen -o -a 256 -t ed25519

      或者更复杂的这个:ssh-keygen -o -a 256 -t ed25519 -C "[email protected]" -f ~/.ssh/id_ed25519

      参数说明:
      -o : 使用新的OpenSSH格式来存储私钥,当使用ed25519格式时,默认会启用此选项
      -a : 进行几轮KDF。值越大则密码验证越慢,也能更好的抗暴力破解。
      -t : 创建的key的类型,我们使用ed25519
      -f : 生成的文件名
      -C : 可选注释,通常写自己的邮箱
  2. 在服务器上安装公钥

    1
    2
    3
    4
    5
    6
    7
    # 注意 `id_ed25519` 根据实际进行更换

    cd .ssh #切换到密钥所在目录

    cat id_ed25519.pub >> authorized_keys #将公钥内容追加到authorized_keys文件中

    rm /home/test/.ssh/id_ed25519 # 先把私钥下载后,通过此命令删除vps上面的私钥文件(建议不要把 私钥文件放在服务器上!!!,可以通过 cat /home/test/.ssh/id_ed25519 ,查看其内容,注意更换你的路径)

    为了确保连接成功,务必修改文件权限:

    1
    2
    chmod 600 authorized_keys
    chmod 700 ~/.ssh
  3. 设置 SSH,打开密钥登录功能

    编辑 /etc/ssh/sshd_config 文件,使用 sudo vim /etc/ssh/sshd_config 命令,然后按 i进入编辑模式,添加或更改下方几行代码,完成后按 ESC 键,输入:wq 保存并退出

    1
    2
    3
    4
    5
    6
    7
    PermitRootLogin prohibit-password    # 禁止使用密码进行 root 登录

    KbdInteractiveAuthentication no # 禁用键盘交互认证
    ChallengeResponseAuthentication no # 禁用挑战响应认证

    RSAAuthentication yes # 启用 RSA 认证(不过这个选项在新的 OpenSSH 版本中已经被废弃)
    PubkeyAuthentication yes # 启用密钥登陆

    然后重启 SSH 服务:

    1
    sudo systemctl restart sshd
  4. 禁用密码登录

    不要关闭之前的ssh窗口,而是再新建一个ssh窗口连接vps(通过密钥连接),如果没有问题,则进行下面设置:

    我们通过命令查看50-cloud-init.conf 文件内容:

    1
    2
    3
    4
    test@ubunt:~$ cat /etc/ssh/sshd_config.d/50-cloud-init.conf

    # 如果显示下面这行
    PasswordAuthentication yes

    发现里面有个参数 PasswordAuthentication yes 这代表可以通过密码登录,我们要想禁用密码登录,所以需要编辑 /etc/ssh/sshd_config.d/50-cloud-init.conf 文件,添加或更改下方代码

    1
    PasswordAuthentication no   # 禁用密码登陆

    也可以直接删除50-cloud-init.conf文件,然后将这行代码添加到/etc/ssh/sshd_config中

    然后重启 SSH 服务:sudo systemctl restart sshd

  5. 参考

  6. 补充

    上面我是直接在VPS上面生成密钥的,所有操作都是在vps上面。可以直接在本地生成密钥后,手动上传公钥到vps上面进行操作,但是建议不要把 SSH 登陆私钥放在服务器上!

    /etc/ssh/sshd_config文件内容备份:

    1
    占位

Fail2ban

待。。。

防火墙篇

基础

腾讯云等大厂的服务器都带有安全组(注意放行),VPS就基本不用另外安装防火墙了, 其余商家默认认为没有安全组, 就需要我们自己在 VPS 上配置防火墙, Debian 系列使用 ufw。

基本命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apt update && apt upgrade -y    # 更新
apt install ufw # 安装 ufw

ufw default deny # 默认拒绝所有连接
ufw default deny incoming # 默认阻止入站
ufw default allow outgoing # 默认允许出站

# 允许访问某端口:ufw allow {PORT} # {PORT}表示实际端口号
# 阻止访问某端口:ufw deny {PORT}
ufw allow 22 # 允许通过22端口(SSH 端口, 根据实际情况填写端口)

ufw enable # 启用 ufw, 提示可能中断当前 SSH 连接, 按 y 继续即可
ufw disable # 禁用 UFW
ufw status # 防火墙的状态
ufw version # 防火墙版本

常用命令参考:

  • 启用 UFW:ufw enable
  • 禁用 UFW:ufw disable
  • 列出当前活动规则(详细的):ufw status verbose
  • 列出当前活动规则(带序号): ufw status numbered # 此处序号标识了此条规则
  • 允许某 CIDR 访问本机所有端口: ufw allow from {CIDR}
  • 阻止某 CIDR 访问本机所有端口: ufw deny from {CIDR}

Docker 干预 iptables 导致异常暴露端口的问题

https://blog.liqiye.com/posts/1306930330/

https://blog.liqiye.com/posts/919176895/

参考