安全外壳协议:什么是SSH?

安全外壳协议,或SSH是一个加密协议,主要用于保护远程命令行界面的外壳访问。

近来,一两个同事无意中听到另一个同事和我谈到了SSH (Secure Shell)以及SSH正在连接到我们的新服务器上。当然,当另一个与IT相关的首字母缩写词被抛出时,总会有一些困惑。因此,几周,也许几个月后(时间很难追踪),我被要求进一步阐述这个主题并回答这个问题:SSH是什么?

因此,这就是我为那些不知道SSH的人所编写的、对安全外壳的颂歌(它不会是任何艺术散文)。许多技术世界之外的人可能没有意识到SSH和shelling在我们日常的技术生活中是多么常用和重要,事实也确实如此。总之,本文将探究SSH和shelling,并复习一些包含SSH和安全外壳的技术方面的内容。

什么是外壳?

你可能知道什么是外壳。它们可以保护海龟、蜗牛、螃蟹等不受事物对其内部口味的影响。这个欺善怕恶的带有长钉的蓝色外壳可以阻挡住外部的事物。或者,在糖果的例子中,它们可以增强内部的口味。

因此,如果在你的逻辑思维中,认为在计算机的世界里,外壳就是一个遮盖某物的遮盖物,那么你就差的不太远。就计算机和软件而言,shell为操作系统的外壳,为用户提供了使用操作系统的用户界面(尽管确切的定义还有待讨论,但我认为只是语义表达上有所不同而已)。操作系统是用来协调和控制计算机的所有不同部分的,因此它可以使我们对其所需的所有不同的功能和软件变得更加便利。

实际上,你可能每天都在和shell打交道:我们用来控制计算机、电话、平板电脑等的漂亮的图形界面就是shell的一种。这包括Windows 10、iOS 12、Android 8.0 Oreo等操作系统。在高级别上,你可以将操作系统分解成两部分:我们都熟悉的用户界面部分,以及在幕后完成大量我们认为是理所当然的重任的、底层操作系统框架内部的好的东西。这些界面被设计为对用户是非常友好的(尽管我们中的许多人每天都在与它们较劲)。相信我,你可能对Windows或苹果有疑虑,但如果我们必须使用另一种利用率很高的shell:命令行接口(CLI),它要直观得多。

有些人喜欢命令行界面(CLI)(坚持与计算机进行直接的交流,以作为对抗个人生活中无尽的孤独的堡垒),而有些适应能力强的人则对此感到害怕。许多事情只能在CLI本机中进行。大多数操作系统都提供了一个图形化的用户界面(GUI,发音为gooey,拜托,你也知道,这是为数不多的好的gooey shell之一——通常它只是意味着你踩到了一只乌龟)。所有操作系统(据我所知)都提供某种CLI。

Windows有DOS和Powershell。Linux是Unix的GUI版本的一个通用术语(通用的原因是Linux/Unix有很多“口味”——但是它多变的创造者Linus Torvalds只有一种口味:咸)。我已经习惯了Bourne Shell,或者BASH,因为这是所有Unix系统中我最喜欢的Shell——它开始有点粗糙,但在它找到了上帝之后,它真的扭转了局面。它是最常用且针对我的需求相当有效的,但还有其他可供选择的选项,包括但不限于:

  • Ksh – Korn Shell
  • Zsh – Z Shell
  • Fish – Friendly Interactive Shell
  • Tcsh – Has syntax similar to the programming language C

需要考虑的一个重要的事是,并不是所有的计算机都有GUI。事实上,我认为许多服务器都没有GUI。为什么?考虑一下服务器的功能就知道了。服务器为客户服务。每天许多人都会使用到客户端/服务器关系:在线银行、Facebook、FortNite等。在最常见的场景中,服务器从客户端机器获取数据,处理它,然后再将信息返回到客户端。服务器可能需要交互来调整设置、更新数据或一般的管理(清除缓存、删除未使用/不需要的数据),但通常,一旦服务器投入生产,用户便不会在上面花费太多的时间。

因此,通常GUI是不需要的,因为它们可能占用系统资源并导致不必要的开销。这并不是说服务器永远不需要GUI,但是大多数事情都可以通过自动化流程、shell脚本或者手动运行shell命令来完成。

因此,什么是SSH?

有时候,我们的服务器是本地的。我们可以根据需要插入键盘、鼠标以及监视和控制服务器。如今,最为常见和有效的是,许多服务器都位于colo(协同定位设备,大量的服务器托管在一个合适的环境中,具有冷却、数据吞吐量、物理安全性等)中,或者像AWS或微软Azure那样虚拟化服务器。因此,在没有对shell的物理访问权限的情况下,我们也可以使用Secure Shell。

SSH能够使用加密的网络连接来连接到服务器,并允许用户远程向服务器发送shell命令,并让它们执行,就好像他们在服务器旁边一样。它是Telnet的一个改进,而后者在本质上做的是同样的事情,但没有使用加密连接。Telnet以明文的形式出现。在这个类比中,Telnet就像是HTTP到SSH的HTTPS一样。在当今这个时代,它大多已被摒弃了。

现在,当我说到服务器时,让我澄清一点:只要有一个SSH服务器实例在那台机器上运行,任何计算机都可以被SSH连接到。大多数服务器操作系统都至少安装了一个SSH服务器实例,只需进行一些设置就可以激活它。但是,即使是你的家庭计算机从技术上来说可以运行SSH服务器并通过安全的shell客户端访问(假设其他安全进程,如防火墙或杀毒程序允许进行连接)。

我可以如何进行SSH连接?

因此,一台运行了SSH服务器实例的服务器可以让客户端机器连接到它。PuTTY是一个常用的SSH应用程序。许多人都在使用它。SSH功能可以被配置到环境变量中,并通过DOS/Powershell运行,或者SSH还可以被配置到macOS的终端中,而后者我相信将会使用bash作为默认设置,但也将支持其他的shell。在这篇文章中,我将会参考PuTTY,因为它是非常简单和有能力的。

基于密钥/证书的生成和身份验证

在我们开始设置安全的shell会话之前,让我们先看一下提供身份验证并为会话添加yuuuuuuuge安全层的用户的密钥生成。大多数人都知道密钥对包括公钥和私钥。用户将拥有属于他们自己的私钥,并且只有他们才有,他们还拥有一个其他人可以使用的附带的公钥。在使用SSH时,公钥将保存在服务器上,并位于用户配置文件的子文件夹中,同时用户将拥有附带的私钥。用户将使用私钥登录,因此便不再需要用户密码。服务器基本上是在说,“我是看门人。只有密钥主人才可以访问。你是密钥主人吗?

如果用户有密钥,他们基本上就会说:“我是Vinz, Vinz Clortho, Gozer的密钥主人。”Volguus Zildrohar, Sebouillia的主人。”

有很多方法可以创建这样的密钥对。这里我将介绍其中的两种方法:

首先,通过对服务器的访问,无论是物理访问还是通过不同的用户访问,SSH密钥对都可以在服务器上生成。下面这种生成的图像看起来的样子(带有命令):

  • 开始生成的命令是:

       ssh - keygen - t rsa

       记住,这来自于相关的用户目录,在我们的示例中是:rthomas

  • 当系统询问把密钥保存在哪个文件下时,它将默认保存到当前用户的. ssh文件夹(公钥应该在这里)下。按“回车”键选择这一设置。
  • 接下来的两行是一个密码。我建议使用密码作为额外的安全层,但这当然取决于用户。
  • 浏览到用户的.ssh目录后,我们就可以看到这两个文件。在私钥的目录中是没有扩展的。最好将其保存在本地机器上并从服务器上删除。

其次,如前所述,PuTTY是用于SSH的最流行的独立应用程序之一。通常会有一个附带的(显然我现在很喜欢这个词)软件来创建一个公钥/私钥对。它被称为PuTTYGen。以下是它的启动情况:

通过选择生成按钮,应用程序实际上会要求你在那个按钮上方的大的灰色空间中随机移动鼠标。这有点像是一种游戏。这些动作用于生成密钥对。

在这里,你可以选择添加密码短语(强烈推荐),然后可以选择保存私钥和公钥:

然后,与前面的方法一样,你将需要把公钥保存在服务器上目标用户的.ssh文件夹中。你可以使用FTP、SCP,或尝试将公共文件复制粘贴到服务器上的一个新文件中。

服务器端设置

本节可能会涉及很多方面。让我们来看一种用于SSH的服务、身份验证和安全性的通用方法。

正如前面提到的,SSH旨在访问计算机系统的CLI shell。在某种意义上,你是该系统的用户,但是来自“远程”位置。因此,了解你将成为哪种连接到SSH的用户是很重要的。拥有用户凭证是一件重要的事情,但是你还需要知道该用户的角色和权限。

SSH的默认端口是22。可以将其指定为任何类型,但在为服务器端SSH服务分配不同的端口时要小心,因为将一个众所周知的端口分配给SSH肯定会毁掉另一个服务或进程。使用默认端口,或者,如果需要,使用动态端口。尽管如此,我还是建议使用众所周知的端口22,并使用用户身份验证和防火墙规则(例如,指定有效的源IP地址)来保护系统。

服务器的IP地址/主机名也必须是已知的。服务器可能位于公共位置,因此它有一个公共的IP地址。或者,服务器可能位于防火墙之后,需要使用VPN或端口转发等来连接到系统。一个好的实践是白名单特定IP地址,你知道这些白名单IP地址将使用SSH协议,并拒绝所有其他的IP地址使用SSH。

例如,在亚马逊网络服务(Amazon Web Services)中,有一个与VPC(网络配置文件)相关联的安全组配置文件,它能够帮助定义防火墙和路由服务。安全组可以根据协议和端口指定这些规则。下面是一个示例:

可以使用两种方式在基于Linux的机器上检查状态。这取决于你是否使用的是SysVInit或SystemD。可以使用下面的命令检查状态:

sudo systemctl status ssh

sudo /etc/init.d ssh status

在基于Linux的机器上,在启动时启用ssh,这样因为它总是处于打开状态,便可以确保你能够连接,即使有中断或服务器升级事件发生。在新版的、使用了SystemD(任何新的服务器都可能会)的Linux上,为了确保SSH能够在重新启动后运行,可以输入以下命令:

sudo systemctl enable ssh

客户端设置

本节也有几种方法,但假设我们希望使用GUI来进行SSH连接吧。同样,PuTTY是一个非常受欢迎的低开销软件,在任何平台上都非常有用/兼容。客户端上的整体概念非常简单:将必要的参数配置到SSH,并且如果你希望在服务器的生命周期中执行多个会话,则保存该配置文件。下面是PuTTY的初始窗口的截图:

你可以看到有很多选项。但是,大多数默认设置都允许进行SSH会话。一些快速而必要的东西是:

  • 主机名或IP地址是必需的。
  • 需要指定端口。记住,端口22是默认端口。
  • 身份验证部分用于(私有)密钥的身份验证。上一节介绍了如何生成私钥。在这里你可以指定私钥的位置(理想情况下在本地计算机上)。
  • 在第一个PuTTY图像中,你可以对配置文件进行配置,然后保存它以备将来使用。你可以选择配置文件并加载它以再次调用这些连接设置。

关于连接需要注意的另一件事是,一旦你执行了会话,系统就会提示用户提供身份验证。通过将目标SSH服务器作为前缀加在用户前面,用户的输入提示便可以绕过,形式为user@SSHServerDomainOrIPAddress。

好的,我进来了。现在该怎么办?

首先,恭喜你。

其次:这取决于你想做什么……

从这里,你可以去任何你选择的方向。需要使用Apache之类的东西设置web服务器吗?写一个类似WordPress的博客怎么样?这取决于你的情况。如果你是新手,并且我假设你是新手,因为没有经验的人不会知道如何进行SSH连接,那么我肯定会制定一个计划。你可能需要学习一些CLI命令来导航并执行你可能感兴趣的任何功能。

这里还有一条建议:在基于Linux/Unix的系统中,权限在做任何事情时都扮演着非常重要的角色。仅仅因为一个用户/组有做某事的权限,就不要假设其他用户/组有相同的权限。许多事情都可能因为权限而失败。事实上,我所学到的是,在遇到大多数问题时,首先要考虑权限,因为它常常是罪魁祸首。

和往常一样,在使用SSH时,我将牢记安全。本文中提到的一些安全实践将确保安全连接,因此你的安全shell会话便能够产生一些有效的结果。

我们希望你能有所收获。要安全、小心一点。某些操作可能导致SSH崩溃,从而导致对机器的访问中断,特别是在虚拟化环境中,然后你就必须执行可怕的恢复操作或挂载到另一个服务器实例上。呀!

提交
还没有评论,快来抢沙发吧!
售前
支持
代理
合作
售后
支持