“关于“CentOS被尝试登陆”问题”的版本间差异

来自Wikioe
跳到导航 跳到搜索
 
第516行: 第516行:
| 包含用于 DH-GEX 的 Diffie-Hellman groups 。文件的格式在 moduli(5) 手册页中描述。
| 包含用于 DH-GEX 的 Diffie-Hellman groups 。文件的格式在 moduli(5) 手册页中描述。
|}
|}
== 参考 ==
<references/>

2022年8月25日 (四) 19:12的最新版本


关于

【时间:2022/04/29 19:34:40】

使用 XShell 登录 CentOS 时,注意到提示在过去的一个月,服务器被尝试登录了将近十万次!!!


提示内容如下:

Xshell 7 (Build 0056)
Copyright (c) 2020 NetSarang Computer, Inc. All rights reserved.

Type `help' to learn how to use Xshell prompt.
[C:\~]$ 

Connecting to **.**.***.**:**...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last failed login: Fri Apr 29 09:58:48 UTC 2022 from 49.248.77.234 on ssh:notty
There were 98858 failed login attempts since the last successful login.
Last login: Mon Mar 14 15:09:10 2022 from ***.**.**.**
[root@newjersey ~]#
最近一次尝试登录的是“49.248.77.234”(印度—马哈拉施特拉邦—浦那)

解决方案

There were xxx failed login attempts since the last successful login.
很明显:系统正在遭受密码暴力破解的风险。

虽然设置的密码没有撞库的风险,但是,暴力破解的一次次尝试登录着实给服务器使用带来了影响。

通过查找资料,了解了几种解决方案:

  1. 使用 SSH 密钥登录,并禁止密码登录。【建议】
  2. 修改 SSH 端口
    • 虽然这比传统的安全加固方式有一定难度,但它可以再一定程度上抵御一些简单的密码暴力破解脚本。
    • 但是高级的攻击方式会扫描系统所有开放端口,并很方便地找到修改后的 SSHD 端口。
  3. 手动禁用登陆失败的 IP 地址
  4. 安装并启用 fail2ban
    • fail2ban 可对使用 SSH 多次失败登录的自动检测,以便阻止重复尝试。


使用 SSH 密钥登录[1]

相关文件:
       公钥:id_rsa.pub
       私钥:id_rsa
       授权:authorized_keys

步骤:

  1. 生成 SSH 密钥
    1. 创建 SSH 密钥:
      [root@newjersey ~]# ssh-keygen -t rsa
      Generating public/private rsa key pair.
      Enter file in which to save the key (/root/.ssh/id_rsa): 
      Created directory '/root/.ssh'.
      Enter passphrase (empty for no passphrase): 
      Enter same passphrase again: 
      Your identification has been saved in /root/.ssh/id_rsa.
      Your public key has been saved in /root/.ssh/id_rsa.pub.
      The key fingerprint is:
      SHA256:NzRAas2Pjk49X2pjD+yGKnMyBrZrXIKprikA3k41sv8 root@newjersey
      The key's randomart image is:
      +---[RSA 2048]----+
      |       .o        |
      |       + .       |
      |      o o o      |
      |.  . +   + .     |
      |oo. + . S +      |
      |+.++.  + o .     |
      |ooo=. o +.o .    |
      |o.+.*+. .+=+     |
      |*o.o *+E ++o.    |
      +----[SHA256]-----+
      [root@newjersey ~]#
      
      • 每次执行 ssh-keygen -t rsa 产生的私钥文件都会不同;
      • 如果文件“~/.ssh/id_rsa”存在,会提示是否覆盖该文件:
        “y”:重新生成“~/.ssh/id_rsa”文件;
        “n”:不覆盖该文件而使用已有的文件;
      • “passphrase”:密码短语(相当于额外的安全层),可为空;
        如果设置该内容,在使用密钥初次登录时,会要求输入该密码;
    2. (验证 SSH 密钥):
      [root@newjersey ~]# ls -l ~/.ssh/id_*.pub
      -rw-r--r-- 1 root root 396 Apr 29 16:42 /root/.ssh/id_rsa.pub
      
      • 如果提示 ls: cannot access /root/.ssh/id_*.pub: No such file or directory,说明没有 SSH 密钥。
    3. (密钥传输):
      • 如果是在客户端生成的 SSH 钥匙对,则上传公钥到服务器;
      • 如果是在服务端生成的 SSH 钥匙对,则下载私钥到客户端;
  2. 应用 SSH 密钥
    1. 公钥内容追加到“authorized_keys”(授权 Keys)文件中:
      [root@newjersey ~]# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
      
      • 如果服务器上存在“authorized_keys”文件,则将公钥内容追加到该文件末尾;(如上)
      • 如果服务器上没有“authorized_keys”文件,则复制公钥并保存为该文件名:[root@newjersey ~]# cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
    2. 修改认证文件权限:
      [root@newjersey ~]# chmod 600 ~/.ssh/authorized_keys
      
      • 只有当前用户可读可写,保证安全。
  3. 开启 SSH 密钥认证
    1. 修改 SSH 配置文件:
      [root@newjersey ~]# vim /etc/ssh/sshd_config
      ...
      PubkeyAuthentication yes
      AuthorizedKeysFile .ssh/authorized_keys
      ...
      
    2. 重新启动 SSH 服务:
      [root@newjersey ~]# systemctl restart sshd
      
      • CentOS 中该服务为“sshd”;其他系统中该服务为“ssh”;
  4. 使用 SSH 密钥登录服务器ssh root@<ip>
    Xshell 7 (Build 0056)
    Copyright (c) 2020 NetSarang Computer, Inc. All rights reserved.
    
    Type `help' to learn how to use Xshell prompt.
    [C:\~]$ ssh root@**.**.***.**
    
    
    Connecting to **.**.***.**:**...
    Connection established.
    To escape to local shell, press 'Ctrl+Alt+]'.
    
    WARNING! The remote SSH server rejected X11 forwarding request.
    Last login: Fri Apr 29 17:09:58 2022 from 125.70.176.149
    [root@newjersey ~]#
    
    • 如果没有为私钥设置密码,将立即登录。否则,将被要求输入密码。
  5. 关闭 SSH 密码认证
    • 在继续之前,须确保可以在没有密码的情况下以具有 sudo 权限的用户身份登录到服务器。
    1. 修改 SSH 配置文件:
      [root@newjersey ~]# vim /etc/ssh/sshd_config
      ...
      PasswordAuthentication no
      ...
      
    2. 重新启动 SSH 服务:
      [root@newjersey ~]# systemctl restart sshd
      
      • CentOS 中该服务为“sshd”;其他系统中该服务为“ssh”;

修改 SSH 端口

默认情况下,SSH 侦听端口 22。

更改默认 SSH 端口会通过降低自动攻击的风险为您的服务器增加额外的安全层。

步骤:

  1. 防火墙开启端口:
    1. 如果使用 firewalld
      firewall-cmd --permanent --zone=public --add-port=5522/tcp
      firewall-cmd --reload
      
      • CentOS 还需要调整 SELinux 规则:
        semanage port -a -t ssh_port_t -p tcp 5522
        
    2. 如果使用 iptables
      iptables -A INPUT -p tcp --dport 5522 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
      
    3. 如果使用 UFW(Ubuntu 的默认防火墙配置工具):
      ufw allow 5522/tcp
      
    • 在 Linux 中,1024 以下的端口号是为知名服务保留的,只能由 root 绑定:
      虽然可以为 SSH 服务使用 1-1024 范围内的端口,以避免以后出现端口分配问题,但建议选择 1024 以上的端口。(如上:5522)
  2. 配置 SSH:
    [root@newjersey ~]# cat /etc/ssh/sshd_config
    #	$OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
    
    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.
    
    # This sshd was compiled with PATH=/usr/local/bin:/usr/bin
    
    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.
    
    # If you want to change the port on a SELinux system, you have to tell
    # SELinux about this change.
    # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
    #
    #Port 22
    Port 5522
    
    ...
    
    • 修改 SSH 配置文件时要格外小心,配置错误可能导致 SSH 服务无法启动。
  3. 重启 SSH 服务:
    systemctl restart sshd
    
    • 在 CentOS 中,服务为“sshd”;在其他系统中,服务为“ssh”。
  4. 验证 SSH 守护程序是否正在侦听 5522:
    [root@newjersey ~]# ss -an | grep 5522
    tcp   LISTEN      0        128            0.0.0.0:5522           0.0.0.0:*
    tcp   ESTAB       0        0      192.168.121.108:5522     192.168.121.1:57638
    tcp   LISTEN      0        128               [::]:5522              [::]:*
    
    • 要指定端口,请调用“ssh”后跟“-p <port_number>”选项的命令:
      ssh -p 5522 username@remote_host_or_ip
      

手动禁用登陆失败的 IP 地址

步骤:

  1. 查看登陆失败的 IP 地址:
    [root@newjersey ~]# grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr
        335 64.94.87.153
        223 45.9.20.25
        198 163.239.13.33
        171 167.172.46.113
        171 159.65.27.49
        135 92.255.85.135
        118 49.81.17.200
        118 114.228.91.16
        115 92.255.85.237
        111 179.43.154.185
         76 103.150.55.85
         60 142.93.133.12
         50 43.154.89.207
         50 213.81.201.121
         49 52.163.248.162
         49 50.116.3.96
         49 43.156.248.251
    [root@newjersey ~]#
    
    太他妈多了……
  2. 将 IP 加入服务器访问限制名单:
    [root@newjersey ~]# cat /var/log/secure |  grep "Failed password for invalid user" | awk '{print $13}' | sort | uniq -c | sort -n | tail -10 |awk '{print "sshd:"$2":deny"}' >> /etc/hosts.allow
    
    [root@newjersey ~]# tail -20 /etc/hosts.allow
    #
    # hosts.allow   This file contains access rules which are used to
    #               allow or deny connections to network services that
    #               either use the tcp_wrappers library or that have been
    #               started through a tcp_wrappers-enabled xinetd.
    #
    #               See 'man 5 hosts_options' and 'man 5 hosts_access'
    #               for information on rule syntax.
    #               See 'man tcpd' for information on tcp_wrappers
    #
    sshd:43.156.248.251:deny
    sshd:50.116.3.96:deny
    sshd:52.163.248.162:deny
    sshd:213.81.201.121:deny
    sshd:43.154.89.207:deny
    sshd:142.93.133.12:deny
    sshd:103.150.55.85:deny
    sshd:179.43.154.185:deny
    sshd:92.255.85.237:deny
    sshd:114.228.91.16:deny
    sshd:49.81.17.200:deny
    sshd:92.255.85.135:deny
    sshd:159.65.27.49:deny
    sshd:167.172.46.113:deny
    sshd:163.239.13.33:deny
    sshd:45.9.20.25:deny
    sshd:64.94.87.153:deny
    

安装并启用 fail2ban

注意事项:
    fail2ban 内置在 Plesk/cPanel 中的,它会配置它使用 iptables 而不是 firewalld。
    如果使用 Plesk/cPanel,请改用本指南启用它

步骤:

  1. 在 CentOS 7/8 上使用 firewalld 安装和配置 fail2ban:
    dnf install epel-release
    dnf install fail2ban
    echo '
    [sshd] 
    enabled = true
    ' > /etc/fail2ban/jail.local
    systemctl restart fail2ban
    
    • dnf:新一代的 RPM 软件包管理器。
  2. fail2ban 使用:
    1. 查看 fail2ban 状态:(可以使用具有不同详细程度的各种选项)
      systemctl status fail2ban
      fail2ban-client status
      fail2ban-client status sshd
      
    2. 如果IP被禁止,通过下面的方式取消禁止 IP:
      fail2ban-client unban 192.168.56.1
      

附:ssh-keygen 命令

名称
    ssh-keygen - 生成、管理和转换认证密钥

语法
    ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-C comment] [-f output_keyfile]
    ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
    ssh-keygen -i [-f input_keyfile]
    ssh-keygen -e [-f input_keyfile]
    ssh-keygen -y [-f input_keyfile]
    ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
    ssh-keygen -l [-f input_keyfile]
    ssh-keygen -B [-f input_keyfile]
    ssh-keygen -D reader
    ssh-keygen -F hostname [-f known_hosts_file]
    ssh-keygen -H [-f known_hosts_file]
    ssh-keygen -R hostname [-f known_hosts_file]
    ssh-keygen -U reader [-f input_keyfile]
    ssh-keygen -r hostname [-f input_keyfile] [-g]
    ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]
    ssh-keygen -T output_file -f input_file [-v] [-a num_trials] [-W generator]

描述

  1. ssh-keygen 用于为 ssh 生成、管理和转换认证密钥,包括 RSADSA 两种密钥。
    • 密钥类型可以用 -t 选项指定。如果没有指定则默认生成用于 SSH-2 的 RSA 密钥。
  2. ssh-keygen 还可以用来产生 Diffie-Hellman group exchange (DH-GEX) 中使用的“素数模数”。
  3. 一般说来,如果用户希望使用 RSA 或 DSA 认证,那么至少应该运行一次这个程序,在 ~/.ssh/identity~/.ssh/id_dsa~/.ssh/id_rsa 文件中创建认证所需的密钥。
    • 另外,系统管理员还可以用它产生主机密钥。
  4. 通常,这个程序产生一个密钥对,并要求指定一个文件存放私钥,同时将公钥存放在附加了“.pub”后缀的同名文件中。
    • 程序同时要求输入一个密语字符串(passphrase),空表示没有密语(主机密钥的密语必须为空)。
    • “密语”和“口令”(password)非常相似,但是密语可以是一句话,里面有单词、标点符号、数字、空格或任何你想要的字符。
    • 好的密语要30个以上的字符,难以猜出,由大小写字母、数字、非字母混合组成。密语可以用 -p 选项修改。
  5. 丢失的密语不可恢复。如果丢失或忘记了密语,用户必须产生新的密钥,然后把相应的公钥分发到其他机器上去。
  6. RSA1 的密钥文件中有一个“注释”字段,可以方便用户标识这个密钥,指出密钥的用途或其他有用的信息。
    • 创建密钥的时候,注释域初始化为“user@host”,以后可以用 -c 选项修改。

命令选项

密钥产生后,下面的命令描述了怎样处置和激活密钥。

可用的选项有:

选项 描述
-a <trials> 在使用 -T 对 DH-GEX 候选素数进行安全筛选时需要执行的基本测试数量。
-B 显示指定的公钥/私钥文件的 bubblebabble 摘要。
-b <bits> 指定密钥长度。
  • 对于 RSA 密钥,最小要求768位,默认是 2048 位。
  • DSA 密钥必须恰好是 1024 位(FIPS 186-2 标准的要求)。
-C <comment> 提供一个新注释
-c 要求修改私钥和公钥文件中的注释。
程序将提示输入私钥文件名、密语(如果存在)、新注释。
  • 本选项只支持 RSA1 密钥。
-D <reader> 下载存储在智能卡 reader 里的 RSA 公钥。
-e 读取 OpenSSH 的私钥或公钥文件,并以 RFC 4716 SSH 公钥文件格式在 stdout 上显示出来。
  • 该选项能够为多种商业版本的 SSH 输出密钥。
-F <hostname> 在 known_hosts 文件中搜索指定的 hostname ,并列出所有的匹配项。
  • 这个选项主要用于查找散列过的主机名/ip地址,还可以和 -H 选项联用打印找到的公钥的散列值。
-f <filename> 指定密钥文件名。
-G <output_file> 为 DH-GEX 产生候选素数。
  • 这些素数必须在使用之前使用 -T 选项进行安全筛选。
-g 在使用 -r 打印指纹资源记录的时候使用通用的 DNS 格式。
-H 对 known_hosts 文件进行散列计算。这将把文件中的所有主机名/ip地址替换为相应的散列值。
  • 原来文件的内容将会添加一个".old"后缀后保存。
  • 这些散列值只能被 ssh 和 sshd 使用。
  • 这个选项不会修改已经经过散列的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用。
-i 读取未加密的 SSH-2 兼容的私钥/公钥文件,然后在 stdout 显示 OpenSSH 兼容的私钥/公钥。
  • 该选项主要用于从多种商业版本的 SSH 中导入密钥。
-l 显示公钥文件的指纹数据。
  • 它也支持 RSA1 的私钥。
  • 对于 RSA 和 DSA 密钥,将会寻找对应的公钥文件,然后显示其指纹数据。
-M <memory> 指定在生成 DH-GEXS 候选素数的时候最大内存用量(MB)。
-N <new_passphrase> 提供一个新的密语。
-P <passphrase> 提供(旧)密语。
-p 要求改变某私钥文件的密语而不重建私钥。
程序将提示输入私钥文件名、原来的密语、以及两次输入新密语。
-q 安静模式。
  • 用于在 /etc/rc 中创建新密钥的时候。
-R <hostname> 从 known_hosts 文件中删除所有属于 hostname 的密钥。
  • 这个选项主要用于删除经过散列的主机(参见 -H 选项)的密钥。
-r <hostname> 打印名为 hostname 的公钥文件的 SSHFP 指纹资源记录。
-S <start> 指定在生成 DH-GEX 候选模数时的起始点(16进制)。
-T <output_file> 测试 Diffie-Hellman group exchange 候选素数(由 -G 选项生成)的安全性。
-t <type> 指定要创建的密钥类型。
可以使用:“rsa1”(SSH-1)、“rsa”(SSH-2)、“dsa”(SSH-2)
-U <reader> 把现存的 RSA 私钥上传到智能卡 reader
-v 详细模式。ssh-keygen 将会输出处理过程的详细调试信息。
  • 常用于调试模数的产生过程。
  • 重复使用多个 -v 选项将会增加信息的详细程度(最大3次)。
-W <generator> 指定在为 DH-GEX 测试候选模数时想要使用的 generator
-y 读取 OpenSSH 专有格式的公钥文件,并将 OpenSSH 公钥显示在 stdout 上。

模数生成

ssh-keygen 可以生成用于 Diffie-Hellman Group Exchange(DH-GEX)协议的 groups。

生成过程分为两步:

  1. 首先,使用一个快速且消耗内存较多的方法生成一些候选素数。
  2. 然后,对这些素数进行适应性测试(消耗CPU较多)。
  • 可以使用 -G 选项生成候选素数,同时使用 -b 选项制定其位数。例如:
    # ssh-keygen -G moduli-2048.candidates -b 2048
    
  • 默认将从指定位数范围内的一个随机点开始搜索素数,不过可以使用 -S 选项来指定这个随机点(16进制)。
  • 生成一组候选数之后,接下来就需要使用 -T 选项进行适应性测试。
    此时 ssh-keygen 将会从 stdin 读取候选素数(或者通过 -f 选项读取一个文件),例如:
    # ssh-keygen -T moduli-2048 -f moduli-2048.candidates
    
  • 每个候选素数默认都要通过 100 个基本测试(可以通过 -a 选项修改)。
    DH generator 的值会自动选择,但是你也可以通过 -W 选项强制指定。有效的值可以是: 2, 3, 5
  • 经过筛选之后的 DH groups 就可以存放到 /etc/ssh/moduli 里面了。
    很重要的一点是这个文件必须包括不同长度范围的模数,而且通信双方双方共享相同的模数。

文件

文件 描述
~/.ssh/identity 该用户默认的 RSA1 身份认证私钥(SSH-1)。
  • 此文件的权限应当至少限制为"600"。
  • 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
  • ssh(1) 将在登录的时候读取这个文件。
~/.ssh/identity.pub 该用户默认的 RSA1 身份认证公钥(SSH-1)。
  • 此文件无需保密。
  • 此文件的内容应该添加到所有 RSA1 目标主机的 ~/.ssh/authorized_keys 文件中。
~/.ssh/id_dsa 该用户默认的 DSA 身份认证私钥(SSH-2)。
  • 此文件的权限应当至少限制为"600"。
  • 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
  • ssh(1) 将在登录的时候读取这个文件。
~/.ssh/id_dsa.pub 该用户默认的 DSA 身份认证公钥(SSH-2)。
  • 此文件无需保密。
  • 此文件的内容应该添加到所有 DSA 目标主机的 ~/.ssh/authorized_keys 文件中。
~/.ssh/id_rsa 该用户默认的 RSA 身份认证私钥(SSH-2)。
  • 此文件的权限应当至少限制为"600"。
  • 生成密钥的时候可以指定采用密语来加密该私钥(3DES)。
  • ssh(1) 将在登录的时候读取这个文件。
~/.ssh/id_rsa.pub 该用户默认的 RSA 身份认证公钥(SSH-2)。
  • 此文件无需保密。
  • 此文件的内容应该添加到所有 RSA 目标主机的 ~/.ssh/authorized_keys 文件中。
/etc/ssh/moduli 包含用于 DH-GEX 的 Diffie-Hellman groups 。文件的格式在 moduli(5) 手册页中描述。

参考

  1. 以下操作,在 Debian 完全一致