SSH(Secure Shell)是一种协议,使您能够创建经过验证的私有连接,使用加密密钥保护通道,以便在另一台机器上启动远程Shell。使用此连接,您可以执行远程命令、启动安全文件传输、转发套接字、显示和服务等等。
在 SSH 出现之前,大多数远程管理都是通过 telnet 完成的,公平地说,一旦您可以建立远程会话,您几乎可以做任何您需要的事情。该协议的问题在于流量以纯明文形式未经加密传输。使用流量嗅探器 查看会话中的所有数据包(包括包含用户名和密码的数据包)并不费力 。
使用 SSH,由于使用了非对称密钥,参与通信的设备之间的会话被加密。如今,这比以往任何时候都更加重要,所有的云服务器都受到来自世界各地的管理。
SSH 配置的 3 个技巧
SSH 协议最常见的实现是 OpenSSH,它由 OpenBSD 项目开发,可用于大多数 Linux 和类 Unix 操作系统。安装此软件包后,您将拥有一个名为的文件,该文件sshd_config控制服务的大部分行为。默认设置通常非常保守,但我倾向于进行一些调整以优化我的 SSH 体验并保护我的服务器免受未经授权的访问。
1.更改默认端口
并不是所有管理员都记得这个。即使你改变位置,任何使用端口扫描程序的任何人都可以发现一个 SSH 端口,因此您几乎不会将自己从危险中解脱出来,但是您可以方便地避免针对服务器启动数百个简单的脚本。你可以帮自己从日志中删掉大量的干扰。
在本文中,我在一个云提供商上使用 SSH 服务器默认端口 TCP 22,每分钟的平均攻击次数为 24。在将端口更改为更高的数字 TCP 45678 后,连接和猜测任何用户名或密码是每天两个。
要更改 SSH 的默认端口,/etc/ssh/sshd_config请在您喜欢的文本编辑器中打开并将值 Port 从 22 更改为大于 1024 的某个数字。该行可能会被注释,因为 22 是默认值(因此不需要显式声明在配置中),所以在保存之前取消注释该行。
Port 2112
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
更改端口并保存文件后,重新启动 SSH 服务器:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
⚡ sudo systemctl restart sshd
2.没有了密码
随着双因素身份验证等方法越来越流行,人们普遍开始停止使用密码作为身份验证手段。OpenSSH 可以使用非对称密钥进行身份验证,因此无需记住复杂的密码,更不用说每隔几个月更换密码,或者担心有人在您建立远程会话时“偷偷观看”。SSH 密钥的使用允许您快速、安全地登录到远程设备。这通常意味着处理服务器本身的错误用户名和密码的时间更少。登录非常简单。没有钥匙,就没有入口——甚至没有提示符。
要使用此功能,您必须同时配置客户端(就是您面前的计算机)和服务器(远程计算机)。
在客户端计算机上,您必须生成一个 SSH 密钥对。这由一个公钥和一个私钥组成。正如他们的名字所暗示的那样,一个密钥供您分发到您要登录的服务器,另一个是私有的,必须与任何人共享。使用命令创建一个新密钥ssh-keygen,并使用该 -t 选项指定一个好的、最近的加密库,如ed25519:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
⚡ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/linuxmi/.ssh/id_ed25519):
在创建密钥期间,系统会提示您命名文件。您可以按 回车 接受默认值。如果您将来创建更多键,您可以为每个键指定一个自定义名称,但拥有多个键意味着您要指定每次交互使用哪个键,所以现在,只需接受默认值即可。
您还可以为您的密钥提供密码。这样可以确保即使其他人设法获得了您的私钥(这本身不应该发生),他们也无法在没有您的密码的情况下使用它。对于某些密钥,它是一种有用的保护措施,而对于其他密钥(尤其是在脚本中使用的那些)则不适用。按 回车 使您的密钥不带密码或创建密码(如果您选择)。
要将您的密钥复制到服务器上,请使用该 ssh-copy-id 命令。例如,如果我拥有一个名为 的服务器example.com,那么我可以使用以下命令将我的公钥复制到它:
ssh-copy-id linuxmi@linuxmi.com
这将使用您的公钥 创建或修改服务器目录中.ssh的 authorized_keys文件。
一旦ssh-copy-id命令确认了它所做的事情,尝试从您的计算机登录以验证您可以在没有密码的情况下登录(或者如果您选择使用密码,则可以使用您的密钥密码)。
在不使用服务器帐户密码的情况下进入服务器后,编辑服务器sshd_config并设置PasswordAuthentication为 no.
PasswordAuthentication no
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
⚡ sudo systemctl restart sshd
重新启动ssh服务以加载新配置:
linuxmi@linuxmi /home/linuxmi/www.linuxmi.com
⚡ sudo systemctl restart sshd
相关阅读:如何使用无密码 SSH 密钥登录远程 Ubuntu 20.04 服务器 https://www.linuxmi.com/no-password-ssh-ubuntu-20-04.html
3. 决定谁可以登录
大多数发行版不允许 root 用户通过 SSH 登录,这确保只有非特权帐户处于活动状态,使用sudo命令根据需要提升权限。这可以防止一个值得注意且非常明显的目标(root)免受简单但非常常见的脚本攻击。
同样,OpenSSH 的一个简单而强大的特性是能够决定哪些用户可以登录到机器。要设置授予哪些用户 SSH 访问权限,请sshd_config在您喜欢的文本编辑器中打开该文件,然后添加如下一行:
AllowUsers linuxmi kotlin xxvi
重新启动 SSH 服务以加载新的配置选项。
这仅允许三个用户(linuxmi、kotlin 和 xxvi)登录或在远程计算机上执行任何操作。
最后的想法
您可以使用 OpenSSH 来实现强大而健壮的 SSH 服务器。这些只是加强安装的三个有用选项。不过,您可以在文件中打开或关闭大量功能和选项,sshd_config还有许多很棒的应用程序,例如 Fail2ban ,您可以使用它们来进一步保护您的 SSH 服务。