Advertisement

运维必备!一文吃透SSH

阅读量:

目录

一、SSH:运维的秘密武器

二、SSH 到底是什么

三、SSH 的核心机制

3.1 安全验证

3.2 协议组成

四、SSH 实用操作指南

4.1 基本用法与选项参数

4.2 配置文件详解

4.3 常见操作示例

五、SSH 问题排查与优化

5.1 常见问题及解决方法

5.2 性能优化技巧

六、SSH 安全加固策略

6.1 修改默认端口

6.2 禁用 root 登录

6.3 限制 IP 访问

6.4 启用公钥认证并禁用密码认证

6.5 限制登录尝试次数

6.6 定期更新 SSH 软件和系统

七、总结与展望


一、SSH:运维的秘密武器

在运维的江湖中,SSH(Secure Shell)堪称一把威力巨大的秘密武器,发挥着无可替代的关键作用。想象一下,当你需要管理分布在不同地理位置的服务器时,如果没有 SSH,你可能需要亲自跑到服务器所在的机房,进行繁琐的操作。但有了 SSH,一切都变得简单起来,你只需在自己的电脑前,通过 SSH 就可以安全地连接到远程服务器,执行各种命令,就像在本地操作一样便捷。

SSH 就像是一座桥梁,架设在本地计算机与远程服务器之间,让运维人员能够跨越物理距离的限制,实现高效的远程管理。它不仅为运维工作提供了便利,更重要的是,它通过加密技术,保障了数据传输的安全性,有效防止数据被窃取或篡改。在这个信息安全至关重要的时代,SSH 的这一特性显得尤为重要。无论是在日常的服务器维护、软件安装与更新,还是在处理紧急故障时,SSH 都能让运维人员迅速、安全地完成任务,大大提高了运维工作的效率和质量。

二、SSH 到底是什么

SSH,全称 Secure Shell,即安全外壳协议 ,是一种基于网络的安全协议,专为在不安全的网络环境中进行安全通信而设计。它就像是给数据传输穿上了一层坚固的铠甲,通过加密技术,将传输的数据进行加密处理,确保数据在传输过程中的安全性,有效抵御数据被窃取、篡改或监听的风险。比如,当你通过 SSH 连接到远程服务器时,你输入的用户名、密码以及执行的命令等数据,都会被加密成一串乱码进行传输,即使有不法分子企图截取这些数据,看到的也只是毫无意义的乱码,无法获取其中的真实信息。

从功能上看,SSH 主要有以下几个核心作用:

  • 远程登录 :这是 SSH 最为常用的功能之一。借助 SSH,用户能够安全地登录到远程服务器或计算机,就如同坐在远程机器前直接操作一样。比如,系统管理员可以在办公室通过 SSH 连接到位于机房的服务器,进行日常的维护和管理工作,无需亲自跑到机房。

  • 命令执行 :用户可以在本地通过 SSH 向远程服务器发送各种命令,并实时获取命令的执行结果。例如,开发人员可以使用 SSH 在远程服务器上执行代码部署、调试等操作,大大提高了开发和运维的效率。

  • 文件传输 :SSH 协议包含了一个安全文件传输协议(SFTP),允许用户在本地和远程服务器之间安全地传输文件。与传统的 FTP 协议相比,SFTP 通过 SSH 加密通道进行文件传输,有效防止了文件在传输过程中被窃取或篡改,确保了文件的完整性和保密性。例如,企业员工可以通过 SFTP 将重要的文件安全地上传到公司的服务器,或者从服务器下载所需的资料。

SSH 的应用场景极为广泛,在服务器管理、系统运维、软件开发等诸多领域都发挥着重要作用。在互联网公司中,运维人员需要管理大量的服务器,通过 SSH,他们可以方便地对这些服务器进行远程管理,包括安装软件、更新系统、查看日志等操作。在软件开发过程中,开发人员常常需要将本地编写的代码部署到远程的测试服务器或生产服务器上,SSH 为他们提供了安全、高效的传输方式。

三、SSH 的核心机制

3.1 安全验证

SSH 提供了两种主要的安全验证方式,为数据传输的安全性保驾护航。

第一种是基于口令的安全验证 。这种方式是我们日常使用较为频繁的,就好比你进入家门需要输入正确的密码一样,只要你知晓服务器的 SSH 连接账号和口令,并且清楚对应服务器的 IP 及开放的 SSH 端口(默认为 22),便可以通过 SSH 客户端登录到远程主机。在联机过程中,所有传输的数据都会被加密,如同给数据穿上了一层防护衣,有效防止数据被窃取。但是,它存在一定的局限性,无法保证你连接的服务器就是你预期的那台,可能会遭遇 “中间人” 攻击,就像有人冒充房东骗你交出家门钥匙一样。当你第一次连接远程主机时,系统会提示你当前远程主机的 “公钥指纹”,这就像是远程主机的独特 “指纹”,你可以通过它来确认远程主机的真实性。若选择继续,便可以输入密码进行登录。当远程主机接受后,该服务器的公钥就会被保存到~/.ssh/known_hosts文件中,下次连接时,系统会自动比对公钥,以确保连接的安全性。

第二种是基于密钥的安全验证 。这种方式需要你为自己创建一对密钥,就如同你拥有一把独特的锁(私钥)和一把对应的万能钥匙(公钥),并把公用密钥放在需要访问的服务器上。当你要连接到 SSH 服务器时,客户端软件会向服务器发出请求,就像你拿着万能钥匙去开锁,请求用你的密钥进行安全验证。服务器收到请求后,会先在该服务器上你的主目录下寻找你的公用密钥,然后将其与你发送过来的公用密钥进行仔细比较。如果两个密钥一致,服务器就会用公用密钥加密 “质询”,并把它发送给客户端软件。客户端软件收到 “质询” 后,就可以用你的私人密钥解密,再把它发送给服务器,这就像是用独特的锁成功解开了加密的信息。用这种方式,你必须牢记自己密钥的口令。与第一种方式相比,它的优势在于不需要在网络上传送口令,大大降低了口令被窃取的风险,同时,“中间人” 这种攻击方式也难以得逞,因为攻击者没有你的私人密钥,就无法解开加密的信息。

3.2 协议组成

SSH 主要由传输层协议、用户认证协议和连接协议这三个关键部分组成 ,它们相互协作,共同确保了 SSH 的高效。

传输层协议(SSH-TRANS)就像是 SSH 的坚实护盾,主要负责提供服务器认证、保密性及完整性保护。它如同一个严格的守卫,在数据传输前,仔细核实服务器的身份,确保数据是传输到合法的服务器上,有效防止了服务器被冒充的风险。同时,它采用强大的加密技术,对传输的数据进行加密处理,使得数据在传输过程中即使被截取,也难以被破解,保证了数据的保密性。此外,它还具备完整性保护功能,就像给数据贴上了一个防篡改标签,一旦数据在传输过程中被篡改,接收方就能立刻察觉。有时,它还会提供压缩功能,就像把行李压缩打包一样,减少数据的体积,提高传输效率,让数据能够更快地到达目的地。该协议通常在 TCP/IP 连接上,也可能用于其它可靠数据流上 ,为 SSH 的稳定奠定了基础。

用户认证协议(SSH-USERAUTH)则是 SSH 的身份验证官,专门用于向服务器提供客户端用户鉴别功能 。它在传输层协议之上,就像在坚实护盾的保护下工作。当 SSH-USERAUTH 开始工作后,它会从低层协议那里接收会话标识符,这个标识符就像是用户的临时通行证,用于唯一标识此会话。通过这个标识符,它可以标记以证明私钥的所有权,从而确认用户的身份。例如,当你使用基于密钥的安全验证方式登录时,它会验证你发送的密钥是否与服务器上保存的公钥匹配,以此来判断你是否有权限登录,确保只有合法用户才能访问服务器。

连接协议(SSH-CONNECT)像是一个智能的交通调度员,它将多个加密隧道分成逻辑通道 。在用户认证协议之上,它为用户提供了交互式登录会话,让你感觉就像是直接坐在服务器前操作一样便捷;支持远程命令执行,你可以在本地轻松地向远程服务器发送各种命令,并实时获取执行结果;还能实现转发 TCP/IP 连接和转发 X11 连接 ,就像搭建了一条条数据传输的高速公路,使得数据能够在不同的网络环境中安全、高效地传输。例如,当你需要在远程服务器上一个图形化程序时,通过连接协议,你可以将程序的图形界面转发到本地显示,方便你进行操作。

四、SSH 实用操作指南

4.1 基本用法与选项参数

SSH 命令的基本语法为:ssh [options] [user@]hostname [command] ,其中 [user@]hostname 是指要连接的远程主机的用户名和主机名,如果不指定用户名,将默认使用当前本地用户;[command] 为可选参数,表示在远程主机上执行的命令 。例如,要以用户 “admin” 的身份连接到 IP 地址为 “192.168.1.100” 的远程服务器,可使用命令:ssh admin@192.168.1.100

常用的选项参数有:

  • -l user:指定要登录的用户,例如 ssh -l root 192.168.1.100 ,效果等同于 ssh root@192.168.1.100

  • -p port:指定连接到远程主机的端口号,SSH 服务器的默认端口号为 22,若服务器的 SSH 端口被修改为其他端口,如 8888 ,则连接时需使用 -p 8888 选项,如 ssh -p 8888 admin@192.168.1.100

  • -i identity_file:指定身份验证文件(私钥文件),用于基于密钥的认证方式。例如,若私钥文件为 /home/user/.ssh/id_rsa ,则可使用 -i /home/user/.ssh/id_rsa 选项来指定该私钥进行身份验证,如 ssh -i /home/user/.ssh/id_rsa admin@192.168.1.100

  • -v:详细模式,可显示调试信息,方便排查连接过程中出现的问题。当连接出现异常时,使用 -v 选项可以输出详细的连接日志,帮助我们分析问题所在,如 ssh -v admin@192.168.1.100

  • -C:启用压缩,在数据传输过程中对数据进行压缩,可提高传输速度,尤其适用于网络带宽有限的情况 。例如 ssh -C admin@192.168.1.100 ,开启压缩功能后,数据在传输前会被压缩,到达目标主机后再解压缩,从而减少数据传输量,加快传输速度。

  • -N:不执行远程命令,只进行端口转发。常用于建立 SSH 隧道,实现安全的端口转发,如 ssh -N -L 8080:localhost:80 admin@192.168.1.100 ,表示将本地的 8080 端口转发到远程主机的localhost:80端口 。

  • -f:后台,常用于需要在后台执行 SSH 连接和端口转发的场景,如 ssh -f -N -L 8080:localhost:80 admin@192.168.1.100 ,命令执行后会在后台,不会占用当前终端。

  • -L local_port:remote_host:remote_port:本地端口转发,将本地的某个端口转发到远程主机的指定端口,如 ssh -L 8080:192.168.1.101:80 admin@192.168.1.100 ,表示将本地的 8080 端口转发到远程主机 192.168.1.100 上的 192.168.1.101:80 端口,这样访问本地的 8080 端口就相当于访问远程主机上的 192.168.1.101:80 端口 。

  • -R remote_port:local_host:local_port:远程端口转发,与本地端口转发相反,将远程主机的某个端口转发到本地主机的指定端口,如 ssh -R 8080:localhost:80 admin@192.168.1.100 ,表示将远程主机 192.168.1.100 的 8080 端口转发到本地主机的localhost:80端口 。

  • -D [bind_address:]port:动态应用程序级端口转发,常用于创建 SOCKS 代理,实现更灵活的网络访问,如 ssh -D 1080 admin@192.168.1.100 ,表示在本地创建一个 SOCKS 代理,监听 1080 端口,通过该代理可以访问远程主机及与远程主机相连的其他网络资源 。

4.2 配置文件详解

SSH 主要有两个配置文件,分别是系统范围配置文件 /etc/ssh/ssh_config 和用户特定配置文件 ~/.ssh/config 。

系统范围配置文件 /etc/ssh/ssh_config 对系统中的所有用户生效,包含了全局的默认设置 。例如,Port 22 设置了 SSH 服务监听的默认端口号为 22;Protocol 2 指定了使用的 SSH 协议版本为 2;HostKey /etc/ssh/ssh_host_rsa_key 设置了 SSH 服务器的密钥文件路径;LogLevel INFO 设置了 SSH 日志级别为 INFO ,记录一般的信息。

用户特定配置文件 ~/.ssh/config 仅对当前用户生效,其配置会覆盖系统范围配置文件中的相应设置 。如果该文件不存在,可以手动创建。例如,在 ~/.ssh/config 文件中添加以下配置:

复制代码

Host server1

HostName 192.168.1.100

User admin

Port 2222

IdentityFile ~/.ssh/id_rsa

上述配置表示,当使用 ssh server1 命令时,会连接到 IP 地址为 192.168.1.100 的远程主机,以用户 “admin” 身份登录,连接端口为 2222,并使用 ~/.ssh/id_rsa 私钥文件进行身份验证 。通过这种方式,可以为不同的远程主机设置不同的连接参数,方便管理和使用 。此外,还可以在该文件中设置其他选项,如 ForwardAgent 用于设置连接是否经过验证代理转发给远程计算机;ForwardX11 用于设置 X11 连接是否被自动重定向到安全的通道和显示集等 。

4.3 常见操作示例

  1. 连接服务器 :使用基本的 SSH 命令连接到远程服务器。如要以 “ubuntu” 用户身份连接到 IP 地址为 “10.0.0.1” 的服务器,可在本地终端输入:ssh ubuntu@10.0.0.1 ,然后输入该用户的密码,即可成功连接到远程服务器。如果服务器的 SSH 端口不是默认的 22,比如改为了 2222 ,则连接命令为:ssh -p 2222 ubuntu@10.0.0.1

  2. 执行命令 :在连接到远程服务器后,可以执行各种命令。例如,查看远程服务器的当前目录,可在 SSH 连接后输入 pwd 命令;查看服务器的系统信息,可输入 uname -a 命令 。也可以在不登录远程服务器的情况下,直接执行单个命令,如 ssh ubuntu@10.0.0.1 "ls -l /var/log" ,该命令会在远程服务器上执行 ls -l /var/log 命令,并将结果返回显示在本地终端 。

  3. 实现免密登录 :首先在本地生成密钥对,在本地终端输入 ssh-keygen -t rsa ,一路回车使用默认设置,即可在 ~/.ssh/ 目录下生成私钥文件 id_rsa 和公钥文件 id_rsa.pub 。然后将公钥文件内容添加到远程服务器的 authorized_keys 文件中,有两种常见方法。一种是使用 ssh-copy-id 命令,如 ssh-copy-id ubuntu@10.0.0.1 ,该命令会自动将本地的公钥添加到远程服务器的 authorized_keys 文件中,并完成相关权限设置;另一种方法适用于没有 ssh-copy-id 命令的情况,先使用 cat ~/.ssh/id_rsa.pub 命令查看公钥文件内容,然后通过 SSH 连接到远程服务器,将公钥内容追加到 ~/.ssh/authorized_keys 文件中,命令如下:ssh ubuntu@10.0.0.1 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ,在出现输入提示时,粘贴本地公钥文件的内容,然后按 Ctrl+D 结束输入 。完成上述操作后,再次连接远程服务器时,就无需输入密码,直接使用 ssh ubuntu@10.0.0.1 即可连接。

  4. 文件传输(SCP) :SCP(Secure Copy)是基于 SSH 协议的安全文件传输命令 。从本地复制文件到远程服务器,例如将本地的 test.txt 文件复制到远程服务器 “ubuntu@10.0.0.1” 的 ~/documents/ 目录下,命令为:scp test.txt ubuntu@10.0.0.1:~/documents/ ,输入远程服务器用户密码后,即可开始传输文件。如果要复制整个目录,需加上 -r 选项,如将本地的 project 目录复制到远程服务器的 ~/projects/ 目录下,命令为:scp -r project ubuntu@10.0.0.1:~/projects/ 。从远程服务器下载文件到本地,例如将远程服务器 “ubuntu@10.0.0.1” 的 ~/reports/report.pdf 文件下载到本地当前目录,命令为:scp ubuntu@10.0.0.1:~/reports/report.pdf. ,其中最后的 . 表示本地当前目录 。同样,如果要下载整个目录,也需使用 -r 选项 。

五、SSH 问题排查与优化

5.1 常见问题及解决方法

在使用 SSH 的过程中,我们难免会遇到各种各样的问题,这些问题可能会影响我们的工作效率。下面为大家列举一些常见问题及对应的解决方法 :

  • 连接失败 :连接失败是较为常见的问题。当出现这种情况时,首先要检查网络连接是否正常,可以通过 ping 命令来测试与远程服务器的连通性。比如,在本地终端输入 ping 192.168.1.100 (假设远程服务器 IP 为 192.168.1.100 ),如果出现 “请求超时” 等提示,则说明网络连接存在问题,需要检查网络配置、路由器设置等 。其次,检查用户名和密码是否正确,确保在连接时输入的用户名和密码与远程服务器上的设置一致。此外,还要确认服务器的 SSH 服务是否正常,可以在服务器端使用命令 systemctl status sshd (以 Linux 系统为例)来查看 SSH 服务状态,如果服务未,使用 systemctl start sshd 命令启动服务 。如果服务器的 SSH 端口不是默认的 22,还需要检查端口是否开放,可使用 telnet 192.168.1.100 2222 (假设端口为 2222 )命令测试端口连通性,若显示连接失败,可能是端口未开放,需要在服务器上开放相应端口。

  • 登录缓慢 :登录缓慢会影响工作效率。造成登录缓慢的原因之一可能是 DNS 反向解析问题,SSH 在连接时会尝试反向解析客户端的 IP 地址,如果 DNS 设置不合理或 DNS 服务响应缓慢,就会导致登录延迟。解决方法是在 SSHD 配置文件(通常在 /etc/ssh/sshd_config )中将 UseDNS 设置为 no ,禁用 DNS 反向解析 。另一个原因可能是 GSSAPI 认证,若网络中没有使用 Kerberos 认证,GSSAPI 认证可能会造成不必要的延迟,可在 SSHD 配置文件中将 GSSAPIAuthentication 设置为 no ,关闭这个功能 。此外,网络延迟过高也会导致登录缓慢,需要检查网络环境,优化网络设置,比如检查路由器配置、网络带宽是否充足等 。

  • 权限问题 :权限问题可能导致无法正常登录或执行某些操作。如果出现权限被拒绝的提示,首先检查远程主机的 SSH 配置文件(/etc/ssh/sshd_config ),查看是否允许当前用户登录,例如是否禁止了 root 用户登录(PermitRootLogin 设置为 no ),若需要 root 用户登录,可将其改为 yes (仅建议在安全环境下使用) 。同时,检查是否启用了密码认证(PasswordAuthentication ),若配置为仅允许密钥认证(PasswordAuthentication no ),即使密码正确也无法通过认证,可将其改为 yes 以启用密码认证 。另外,还要检查登录用户的家目录、.ssh 文件夹以及 authorized_keys 文件的权限和归属是否正确。家目录权限一般应为 700(rwx------ ),仅自己可以写;.ssh 文件夹权限也应为 700;authorized_keys 文件权限应为 600(rw------- ),且这些文件和文件夹的归属都应是登录用户 。例如,使用命令 chmod 700 ~/ 、chmod 700 ~/.ssh 、chmod 600 ~/.ssh/authorized_keys 来设置正确的权限,使用 chown -R user:user ~/ 、chown -R user:user ~/.ssh 、chown user:user ~/.ssh/authorized_keys (假设用户名为 user )来设置正确的归属 。

5.2 性能优化技巧

为了提高 SSH 的性能,让连接更加快速稳定,我们可以采用以下优化技巧 :

  • 禁用 DNS 反向解析 :正如前面提到的,SSH 连接时的 DNS 反向解析可能会导致登录缓慢。在服务器的 SSHD 配置文件(/etc/ssh/sshd_config )中添加或修改 UseDNS no ,然后重启 SSH 服务(systemctl restart sshd ),即可禁用 DNS 反向解析,加快登录速度 。这样,SSH 在连接时就不会花费时间去解析客户端的 IP 地址,从而提高连接效率。

  • 优化加密算法 :选择更高效的加密算法可以减少密钥交换和加密过程的时间,提高连接速度。在服务器端和客户端的 SSH 配置文件中,可以修改加密算法相关的配置。例如,在服务器端的 /etc/ssh/sshd_config 文件中,将 KexAlgorithms 设置为 curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256 ,将 Ciphers 设置为 chacha20-poly1305@libssh.org,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr ,将 MACs 设置为 hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,hmac-ripemd160 ;在客户端的 ~/.ssh/config 文件中,也可以添加类似的配置 。修改完成后,重启 SSH 服务使配置生效 。这些算法在安全性和性能之间取得了较好的平衡,能够有效提升 SSH 连接的速度。

  • 调整 TCP 参数 :优化 TCP 参数可以改善网络传输性能,进而提高 SSH 连接的稳定性和速度。比如,增大 TCP 窗口大小可以提高网络传输效率,在 /etc/sysctl.conf 文件中添加 net.ipv4.tcp_window_size = 4096 ,然后执行 sysctl -p 使设置生效;开启 TCP SACK 可以帮助网络在丢包时更有效地恢复,减少重传的数据量,添加 net.ipv4.tcp_sack = 1 并执行 sysctl -p ;调整 TCP 最大段大小(MSS)可以减少 IP 层的分片,提高传输效率,添加 net.ipv4.tcp_mss = 1460 并执行 sysctl -p ;开启 TCP BIC 拥塞控制算法可以提高网络吞吐量,添加 net.ipv4.tcp_congestion_control = bic 并执行 sysctl -p 。这些 TCP 参数的调整可以根据实际网络情况进行优化,以提升 SSH 连接的性能。

  • 关闭不必要的功能 :如果不需要图形界面转发,可以关闭 X11 转发功能。在服务器端的 /etc/ssh/sshd_config 文件中,将 X11Forwarding 设置为 no ,然后重启 SSH 服务 。关闭 X11 转发不仅可以提高安全性,还可能减少连接开销,提升 SSH 连接的性能 。因为 X11 转发功能会占用一定的系统资源和网络带宽,关闭它可以让 SSH 专注于基本的连接和命令执行功能。

六、SSH 安全加固策略

在数字化时代,网络安全犹如一座坚固的堡垒,守护着我们的数据和系统。SSH 作为运维中常用的工具,其安全性直接关系到服务器和数据的安全,因此,对 SSH 进行安全加固至关重要。接下来,我将为大家详细介绍一些实用的 SSH 安全加固策略 。

6.1 修改默认端口

SSH 服务器的默认端口是 22,这个端口就像是一个众人皆知的大门,很容易成为攻击者的目标。攻击者可以通过端口扫描工具轻松发现开放 22 端口的服务器,进而尝试进行暴力破解等攻击。为了增加服务器的安全性,我们可以将 SSH 的默认端口修改为一个不常用的端口 ,比如将端口修改为 8888 。具体操作步骤如下:

  1. 使用文本编辑器打开 SSH 配置文件,在 Linux 系统中,一般为 /etc/ssh/sshd_config ,命令为 sudo vim /etc/ssh/sshd_config 。

  2. 在配置文件中找到 Port 22 这一行,将其修改为 Port 8888 (这里的 8888 可根据实际需求改为其他未被占用的端口号) 。

  3. 修改完成后,保存并退出文件。然后重启 SSH 服务,使配置生效,在大多数 Linux 系统中,可以使用命令 sudo systemctl restart sshd 来重启 SSH 服务 。

修改端口后,攻击者在进行端口扫描时,就很难轻易发现我们的 SSH 服务,从而降低了服务器被攻击的风险 。

6.2 禁用 root 登录

root 用户在服务器中拥有至高无上的权限,就像城堡的主人,一旦 root 用户的登录信息被泄露,攻击者就可以在服务器中为所欲为,对服务器的安全造成极大的威胁。为了降低这种风险,我们应该禁用 root 用户直接通过 SSH 登录 。操作方法如下:

  1. 打开 SSH 配置文件 /etc/ssh/sshd_config ,命令为 sudo vim /etc/ssh/sshd_config 。

  2. 在文件中找到 PermitRootLogin yes 这一行,将其修改为 PermitRootLogin no ,表示禁止 root 用户通过 SSH 登录 。

  3. 保存并退出文件,然后重启 SSH 服务,命令为 sudo systemctl restart sshd 。

禁用 root 登录后,我们可以创建一个普通用户,并为其赋予适当的 sudo 权限,通过普通用户登录服务器后,再使用 sudo 命令来执行需要 root 权限的操作 。这样即使普通用户的账号信息被泄露,攻击者所能获取的权限也相对有限,从而提高了服务器的安全性 。

6.3 限制 IP 访问

我们可以通过设置访问控制策略,只允许特定 IP 地址或 IP 地址段的设备连接到 SSH 服务器,就像只给特定的人发放城堡的钥匙,其他人无法进入。这样可以有效防止来自未知来源的 IP 地址的攻击 。有以下两种常见的实现方式:

  • 使用防火墙规则 :以 iptables 防火墙为例,假设我们只允许 IP 地址为 192.168.1.100 的设备连接到 SSH 服务器(假设 SSH 端口已修改为 8888 ),可以使用以下命令:
复制代码

sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 8888 -j ACCEPT

sudo iptables -A INPUT -p tcp --dport 8888 -j DROP

第一条命令表示允许源 IP 为 192.168.1.100 且目标端口为 8888 的 TCP 连接,第二条命令表示拒绝其他所有目标端口为 8888 的 TCP 连接 。

  • 修改 SSH 配置文件 :在 /etc/ssh/sshd_config 文件中添加或修改以下配置,只允许特定用户从指定 IP 地址连接 :
复制代码

AllowUsers username@192.168.1.100

这里的 username 是允许登录的用户名,192.168.1.100 是允许的 IP 地址 。如果要允许某个网段的 IP 地址访问,可以使用类似 AllowUsers username@192.168.1.* 的配置 。修改完成后,记得重启 SSH 服务使配置生效 。

6.4 启用公钥认证并禁用密码认证

基于密码的认证方式存在一定的安全风险,密码可能会被暴力破解、窃取或猜测。而公钥认证则更加安全,它就像一把独特的钥匙,只有拥有对应的私钥才能打开服务器的大门 。启用公钥认证并禁用密码认证的步骤如下:

  1. 在本地生成密钥对,在终端中输入 ssh-keygen -t rsa ,一路回车使用默认设置,即可在 ~/.ssh/ 目录下生成私钥文件 id_rsa 和公钥文件 id_rsa.pub 。

  2. 将公钥文件内容添加到远程服务器的 authorized_keys 文件中,可以使用 ssh-copy-id 命令,如 ssh-copy-id username@server_ip ,该命令会自动将本地的公钥添加到远程服务器的 authorized_keys 文件中,并完成相关权限设置 。如果没有 ssh-copy-id 命令,也可以手动将公钥内容追加到 authorized_keys 文件中 。

  3. 打开远程服务器的 SSH 配置文件 /etc/ssh/sshd_config ,找到 PubkeyAuthentication 这一行,确保其值为 yes ,表示启用公钥认证;找到 PasswordAuthentication 这一行,将其值改为 no ,表示禁用密码认证 。

  4. 保存并退出文件,然后重启 SSH 服务 。

通过以上步骤,我们就启用了公钥认证并禁用了密码认证,大大提高了 SSH 登录的安全性 。

6.5 限制登录尝试次数

为了防止攻击者通过暴力破解密码的方式登录 SSH 服务器,我们可以限制登录尝试次数。当用户输入错误密码达到一定次数后,服务器将自动断开连接,就像银行的取款密码连续输错一定次数后,银行卡会被锁定一样 。在 SSH 配置文件 /etc/ssh/sshd_config 中,找到 MaxAuthTries 这一行,将其值设置为一个较小的数字,比如 3 ,表示允许用户最多尝试 3 次登录,超过 3 次则断开连接 。修改完成后,重启 SSH 服务使配置生效 。

6.6 定期更新 SSH 软件和系统

SSH 软件和操作系统都可能存在安全漏洞,黑客可能会利用这些漏洞进行攻击。因此,我们要定期更新 SSH 软件和操作系统,及时修复这些漏洞,就像给城堡不断加固,使其更加坚固 。在 Linux 系统中,可以使用包管理器来更新软件,例如在 Debian 或 Ubuntu 系统中,使用命令 sudo apt update && sudo apt upgrade 来更新系统和软件包;在 CentOS 系统中,使用命令 sudo yum update 来更新系统和软件包 。同时,要关注 SSH 软件的官方发布信息,及时获取最新版本并进行更新 。

通过实施以上这些 SSH 安全加固策略,我们可以显著提高 SSH 的安全性,有效保护服务器和数据的安全 。在实际应用中,我们应根据服务器的实际需求和安全状况,灵活选择和配置这些策略,为服务器构筑一道坚实的安全防线 。

七、总结与展望

SSH 作为运维工作中的得力助手,其重要性不言而喻。它不仅为我们提供了安全、高效的远程管理方式,还在文件传输、端口转发等方面发挥着关键作用。通过本文,我们深入了解了 SSH 的概念、核心机制、实用操作、问题排查、优化方法以及安全加固策略 。

然而,SSH 的世界远不止于此,它还有许多高级应用等待我们去探索。比如,在集群环境中,利用 SSH 实现自动化部署和管理;结合脚本语言,编写更复杂的 SSH 自动化任务 。希望大家在今后的运维工作中,不断学习和实践,充分发挥 SSH 的强大功能,提升工作效率,保障服务器和数据的安全 。同时,随着技术的不断发展,SSH 也在持续演进,让我们共同期待它为运维领域带来更多的惊喜和便利 。

全部评论 (0)

还没有任何评论哟~