SSH主机密钥标识服务器。
SSH还支持使用密钥对用户进行身份验证。
使用密钥对用户进行身份验证需要比密码提前进行更多的设置,但正确完成后,即安全又方便。我们将同时考虑服务器和用户密钥。
如果入侵者入侵了你的服务器,则服务器的私钥不再是私有的。你必须替换它。这需要生成一个新的密钥对。
虽然大多数操作系统会自动创建丢失的主机密钥,但其他操作系统不会。使用ssh-keygen手动创建服务器密钥。
如果你的服务器运行的时最新版的OpenSSH,请以root身份运行ssh-keygen -A,以自动生成所有支持但缺少的主机密钥。
你可能需要为本地主机以外的主机创建主机密钥,例如在使用某些编排系统部署新安装时。你可以使用ssh-keygen的-t和-f参数手动创建密钥文件:
xxxxxxxxxx
$ ssh-keygen -t ecdsa -f ssh_host_ecdsa_key -N ''
$ ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N ''
-t标志指定要创建的密钥类型。在以上例子中,我们创建了两种不同类型的密钥,ECDSA和ED25519。
-f标志给出私钥文件的文件名。每个密钥对的公钥都在一个同名文件中,末尾添加了.pub。
最后,-N允许你在命令行上指定密码短语。主机密钥没有密码短语。两个单引号表示一个空密码短语。
每当你生成主机密钥时,请务必按照第四章中的讨论获取密钥指纹。你的用户需要指纹来验证主机密钥。
密码短语——passphrases,类似于密码,但更长。它包括空格、单词、特殊字符、数字以及你可以键入的任何其他内容。
密码短语用于加密和解密私钥。在输入正确的密码短语之前,不能使用带有密码短语的密钥。
密码短语最常与用户身份验证密钥一起使用。具有密钥对的用户可以访问该系统,而无需提供该系统的密码。
台式机和笔记本电脑系统通常不如服务器安全,并且经常被感染、劫持或彻底被盗。
如果用户的身份验证密钥被盗,入侵者可以使用该密钥对访问服务器,就像他是合法用户一样。使用密码短语对私钥进行加密意味着,即使用户的私钥文件被盗,入侵者也无法在没有密码短语的情况下使用密钥。如果入侵者获取了你的私钥文件或密码,但没有同时获得两者,则损害已经得到控制。
足够长的密码短语无法通过暴力猜测,并且足够复杂,以阻止随意窃听。
密码短语可以是一个单词,像秘密一样?是的,但这是个坏主意。现在计算机速度很快,它们可以通过连续尝试所有可能的密码来快速发现短密码短语。使用短密码短语会大大降低私钥的安全性。
密码短语应该至少有几个单词长,你可以很容易记住,而且对其他人来说不应该很明显,即使是你认识的。
它应该包含特殊字符,如#、!、~、,来自专门的非计算机词汇表的特殊单词是有用的。用数字代替字母。
永远不要使用流行文化中的任何东西,也不要使用任何你自己的习惯用语。你对朋友或同事说的任何吸引人的话都是糟糕的选择。
如果你的想象力完全失败了,骰子(http://www.diceware.com)是一个使用普通骰子从真实单词中随机生成最令人难忘的密码短语的工具。虽然入侵者会毁了你的一周,但一个拿着你的私钥和幽默感的同事可能会更令人恼火。
主机密钥不使用密码,因为SSH服务必须在系统启动时启动。您可以将密码与服务器密钥一起使用,但只有在有人在服务器控制台输入密码后,SSH才会启动。这在大多数环境中都是不可接受的。
用户密钥对提供比密码更强的身份验证。
结合代理(agent),用户密钥消除了在远程计算机中键入任何身份验证凭据的需要。从密码学上讲,用户密钥与主机密钥相同,唯一的区别是密钥在哪里使用。
一般来说,计算机可以根据你是什么、你知道什么、你有什么(something you are, something you know, something you have)来识别你是谁。
虹膜扫描仪和指纹读取器可以验证你的身体,确认你是什么。密码验证你是否知道一个秘密。进入一所房子需要你有门的钥匙。
基于密钥的身份验证结合了以下两点:你必须拥有包含私钥的文件,并且必须知道该密钥的密码短语。诚然,私钥文件比物理钥匙更容易复制,但比8个字符的密码更难复制。这一额外的安全层提供了额外的保护,防止未经授权使用帐户。
然而,密钥比密码更复杂。你必须保护你的私钥。如果计算机丢失或被盗,则该计算机上的任何私钥都应被视为丢失。虽然可以记住密码,但大多数人不会花时间或精力记住私钥中的数千个字符。是的,你应该有备份......但如果你的笔记本被盗,那台笔记本电脑上的私钥无论如何都应该被视为被盗。
通过用户密钥设置身份验证真的值得麻烦吗?近十年来(实际上距今已经十几年了),一个被称为“Hail Mary Cloud”的受损机器网络反复扫描互联网上的SSH服务器。当云成员找到SSH服务器时,它会让网络中的其他机器知道它。然后,云会有条不紊地尝试可能的用户名和密码。网络上的一台主机尝试了几次,然后是另一台,然后是另外一台。阻止单个IP地址并不是对这些扫描程序的有效防御,因为每个地址在下一个攻击者轮到之前只会尝试几个密码。 任何一次尝试成功猜测的几率都很低。尝试是不断的。他们永远不会结束。最终,Hail Mary Cloud会幸运地闯入你的服务器。这可能是明天,也可能是明年,但它会发生。为了防止这种入侵,您可以使用数据包过滤来阻止对SSH服务器的公共访问,也可以取消密码身份验证。用户密钥允许您删除密码。
用密码短语和密钥替换密码有一个明显的缺陷:键入密码很烦人,为什么要用更麻烦的密码短语替换烦人的密码?它可能更安全,但你和你的用户真的会费心吗?
这就是SSH代理发挥作用的地方。
SSH代理是一个在后台运行的小程序。当你启动桌面会话时,你需要输入密码来解密你的私钥。解密后的私钥被加载到SSH代理中。
代理讲密钥存放在内存中,而不是存储在磁盘上。代理处理SSH客户端的所有私钥操作。当SSH客户端需要使用私钥解密某些内容时,它会要求代理处理它。
当你当天注销时,SSH代理会关闭,解密后的密钥从内存中消失。
换句话说,使用SSH代理,无论当天打开多少个SSH会话,你都可以在每个工作会话中键入一次密码短语。
在一个典型的日子里,我登录到我的工作站,激活我的SSH代理,然后键入一次密码短语。
然后我打开了无数个SSH会话,连接到我网络中的服务器和路由器,而无需再次键入密码短语或密码。当我退出一天的工作时,我的代理关闭了。代理使用的内存被擦除并返回给操作系统。我的私钥再次仅在加密文件中可用。
代理并不能保证安全。任何可以在您登录时读取计算机内存的人都可以访问解密密钥。这包括根帐户。如果您不信任桌面上的系统管理员,请不要使用SSH代理。如果您挂起笔记本电脑,解密的私钥将保留在内存中。任何可以唤醒您的笔记本电脑并登录的人都可以在访问权限允许的情况下使用密钥。一个想用你的笔记本电脑快速赚钱的小偷可能不知道或不理解他有什么,但一个专门针对你和/或你的雇主的小偷可能会检查一个实时私钥。更常见的是,如果你在吃午饭前没有锁好桌面,同事可能会利用你不安全的终端。这些问题最好通过在不积极使用系统时清空或关闭代理来解决。
代理安全也是多用户计算机上的一个问题。任何在系统上具有管理或超级用户权限的人都可以访问主机上运行的任何SSH代理。如果其他人在您的桌面上具有root或管理员权限,他们可以访问您的代理并伪装成您。使用代理是不明智的。
在类Unix系统中,使用ssh-keygen命令生成一个密钥,不要使用任何参数,程序讲引导你生成用户身份验证密钥:
xxxxxxxxxx
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mwlucas/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/mwlucas/.ssh/id_rsa.
Your public key has been saved in /home/mwlucas/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:LK+1dKbb/PtN8KjiXLDdZzOK1fivRkMZIn8YoOrmEvA mwlucas@zfs1
The key's randomart image is:
+---[RSA 2048]----+
…
系统会问你要把新密钥保存在哪里。各种OpenSSH程序都希望在默认的位置能找到密钥文件,所以应该接受它的建议。然后,系统会要求你输入两次密码短语。你的私钥将使用此密码短语进行加密。
SSH对主机和用户使用相同的密钥格式。当你生成用户密钥时,你会得到一个密钥指纹和一个randomart图像。两者对于用户身份验证密钥都不是特别有用。
你将在$HOME/.ssh/中找到你的密钥对,其中id_rsa为私钥,id_rsa.pub为公钥。请立即在离线介质(如闪存盘或CD-ROM)上备份新的密钥对。如果工作站被破坏了,你需要有恢复密钥对的能力。
与主机密钥一样,用户密钥可以使用几种不同的加密算法。如果不指定算法,OpenSSH工具将使用推荐的算法——此时是2048位RSA。您可以使用-t标志指定不同的算法。
xxxxxxxxxx
$ ssh-keygen -t ecdsa
为什么要创建多个密钥?密码学家有一个令人痛苦的习惯,那就是发现密码算法的弱点。总有一天,不可思议的事情会发生,有人会发现一个广泛使用和广泛信任的算法中的缺陷。所有使用该算法的密钥将立即变得不可信。如果你有不同算法的用户密钥,你可以在SSH服务器上禁用损坏的算法时,但仍然可以访问服务器。
我们的示例假设您使用的是RSA密钥,但它们同样适用于使用其他算法制作的密钥。
使用PuTTYgen程序为PuTTY创建用户身份验证密钥。PuTTY安装程序包括puttygen,您也可以从PuTTY网站单独下载。
在PuTTY Key Generator对话框下方的Parameters中选择机密算法,默认为RSA。DSA密钥正被淘汰,SSH-1(RSA)密钥也过时了。Number of bits in a generated key至少2048(默认的)。对于古老的服务器,可能需要选择更少的bits。
点击“Generate”按钮,然后在“Key”框中晃动鼠标以生成随机性,一旦有了足够的熵(entropy——熵、无序状态),它会生成一个密钥。
接下来的界面中,可以输入三个字段。第一个是Key comment,这里可以填写一个注释信息,以反映你生成密钥的机器和创建密钥的日期。下面两个字段是用来设置的密码短语的。
然后点击“Save public key”按钮,将文件保存到只有你有权访问的位置。我通常以创建这些文件的机器和日期命名这些文件。Puttygen默认情况下不会分配文件扩展名,因此请手动为其加上.pub扩展名。
现在保存私钥,公钥和私钥使用相同的文件名。PuTTYgen使用.ppk扩展名作为私钥,因此它们不会相互覆盖。
您现在拥有公钥。祝贺 你!但不要退出PuTTYgen。
屏幕顶部以OpenSSH友好的authorized_keys格式显示密钥。将其复制到一个文件中,所有内容都在一行中。我通常以生成密钥的机器、日期命名该文件,并添加字符串authorized_keys。
无论你使用哪个客户端,你都必须在服务器上安装公钥,然后才能使用它登录。
每当你通过SSH登录主机时,OpenSSH服务器都会检查本地文件$HOME/.ssh/authorized_keys。此文件保护公钥,每行(非常长)一个。
SSH服务器将客户端提供的公钥与文件中的密钥进行比较。如果密钥匹配,并且客户端可以成功地使用该密钥交换数据,则客户端已经证明它拥有相应的私钥。客户端会得到授权。如果没有authorized_kyes文件,服务器将退回到下一个身份验证方法,通常是密码。
如果你是请求访问只接受公钥身份验证的服务器的用户,系统管理员将要求你提供authorized_keys文件。如果这是你第一次使用公钥身份验证,这不是安全风险——记住,你的公钥文件是公开的。任何人都可以拥有它。没有相应的私钥,它完全无用。
最常见的用户密钥类型是RSA密钥。OpenSSH将客户端的RSA公钥存储在文件$HOME/.ssh/id_RSA.pub中。PuTTY的密钥生成器使你可以命名自己的密钥文件,你将有一些不同的密钥文件。你需要包含authorized_keys友好版本的文件。
你过你遵循了建议,文件名将包含authorized_keys。为了简化示例,我们使用文件名id_rsa_authorized_keys.pub。根据需要替换PuTTY文件。
要使用你的公钥,你必须将客户端的公钥文件复制到服务器上你的帐户中的authorized_keys文件中。
你可以使用图形界面的复制和粘贴功能,但这很容易出错。通过SFTP或SCP上传公钥文件,然后将其连接到authorized_keys上,这样更可靠。
记住,每个密钥必须在authorized_keys中的一行且只有一行。
让机器复制文件,它比你做得好。
在这里,我使用scp将客户端的id_rsa_authorized_keys.pub复制到服务器sloth:
xxxxxxxxxx
$ scp .ssh/id_rsa_authorized_keys.pub sloth:
服务器仍将请求密码以上传密钥文件,虽然你创建了密钥,但还没有安装。
PuTTY用户应该使用WinSCP友好地拖放文件副本。
现在,登录到服务器,并将id_rsa_authorized_keys.pub的内容附加到authorized_keys中。
如果你是第一次安装公钥,你可以直接将密钥文件复制到authorized_keys。然而,如果你让自己养成了这个习惯,总有一天你会覆盖现有的authorized_keys,并在接下来的几个小时里为自己犯的错自责。
xxxxxxxxxx
$ cat id_rsa_authorized_keys.pub >> .ssh/authorized_keys
现在,您可以尝试使用密钥进行身份验证。如果基于密钥的身份验证不适合您,请检查authorized_keys和.ssh目录的权限。除了你之外,任何用户都不应该写它们。
如果您从类UNIX主机上传,则可以在一个命令中执行上传和复制:
xxxxxxxxxx
$ cat .ssh/id_rsa_authorized_keys.pub | ssh sloth "cat >>~/.ssh/authorized_keys"
如果您曾经手动编辑authorized_keys,请确保最后一个键以换行符结尾。如果最后一个条目没有换行,则添加到此文件的下一个键将被附加到上一个键的末尾。新密钥和旧密钥都将停止工作。如果有疑问,请转到文件末尾并单击RETURN。在authorized_keys末尾添加一个换行符不会有任何影响。
只上传公钥,绝不能上传私钥。你的私钥永远不应该跨网络。
一旦你有了你想要的authorized_keys文件,你就要把它复制到所有的服务器上。有很多方法可以管理它。许多类UNIX主机都包含ssh copy id(1),这是一种将现有的authorized_keys从一个主机复制到另一个主机的方便方法。我把最新的授权密钥藏在公共Web服务器上,这样我就可以很容易地将其安装在我碰巧进入的任何机器上。或者,您可以使用第11章中讨论的技术,将您和所有用户的authorized_keys文件自动复制到您的所有计算机上。
实际上,现代系统可以自动化以上操作。
使用ssh-keygen生成密钥对,在Linux系统上,使用ssh-copy-id user@host命令将公钥自动追加到authorized_keys中;在FreeBSD系统上,使用ssh-copy-id -i ~/.ssh/id_rsa.pub user@host命令将公钥追加到authorized_keys中。
使用密钥进行身份验证会改变你的登录方式。无论你使用什么客户端,在继续之前,请验证你的密钥是否有效。在知道密钥有效之前,不要尝试用SSH代理。
如果密钥不起作用,请使用第五章讨论的SSH调试工具。在详细模式下运行ssh。使用PuTTY会话日志记录。读取输出信息。如果你有权限问题或配置错误,答案就在那里。
当你的客户端在$HOME/.ssh中找到密钥对,并且SSH服务器在你的帐户中找到authorized_keys文件时,客户端会要求你输入密码短语。此处我们连接到远程机器sloth:
xxxxxxxxxx
$ ssh sloth
Enter passphrase for key '/home/mwl/.ssh/id_rsa':
所有涉及的软件都找到了你的密钥文件。输入密码短语后,客户端可以解密私钥并使用它与服务器进行身份验证。
是的,这看起来很像常规的基于密码的登录,但在幕后却大不相同。你已在本地解密了密钥文件。
您发送到服务器的唯一身份验证信息是确认您能够在服务器上的帐户中交换用存储在authorized_keys文件中的公钥加密的数据。您永远不会发送密码或其他传统身份验证信息。
OpenSSH会自动检查所有标准密钥文件。您可能有一个专用密钥,仅用于特殊情况,如自动化作业。要将该密钥与scp、sftp或ssh一起使用,请使用-i标志和文件名。
xxxxxxxxxx
$ ssh -i $HOME/specialkey sloth
现在你知道密钥有效,每次登录此服务器都需要输入密码短语。现在是配置SSH代理的好时机。
如果您没有运行代理,则必须告诉PuTTY在哪里可以找到您的私钥文件。在PuTTY配置屏幕的左侧,选择连接->SSH->身份验证。在标记为“用于身份验证的私钥文件:”的文本框中,输入私钥文件的完整路径。记住,私钥文件以.ppk结尾。
现在尝试连接。PuTTY应提示您输入用户名,然后请求密码短语。如果您正确输入了密码短语,您将收到一个命令提示符。
一旦您知道您的密钥有效并且安装正确,请减少您必须使用Pageant SSH代理键入密码的频率。
虽然OpenSSH和PuTTY的SSH代理非常不同,但它们都执行相同的任务。它们将您的私钥存储在安全内存中,这样您就不必一直键入密码。两者都允许您查看解密的密钥、添加新密钥和删除密钥。它们之间唯一真正的区别是它们是如何编程的,以及你如何让它们表现出来的——你知道,那些不重要的东西。
将密钥加载到ssh代理中后,您的登录尝试将如下所示:
xxxxxxxxxx
$ ssh mail
Last login: Thu Nov 16 16:56:52 2017 from ceo.worldhq.mwl.io
FreeBSD 10.3-RELEASE-p20 (GENERIC) #0: Wed Jul 12 03:13:07 UTC 2017
请注意,没有任何密码或短语请求;您刚刚在没有人工身份验证的情况下登录了远程计算机。如果你在工作日连接到许多机器,SSH代理会让生活变得更容易,并将用户密钥从烦恼转变为乐趣。
任何包含OpenSSH的类Unix系统都有SSH代理ssh-agent命令。
类Unix世界中桌面环境的多样性的一个烦恼是,每个环境都有自己运行ssh-agent的首选方式。
我们将讨论其中的几个,但如果这些在你的环境中都不起作用,你需要检查你的操作系统或窗口管理器文档。
许多Unix变体都有自己稍微独特的桌面设置,它们改变了使用ssh-agent的精确方法,以适应开发人员的个人偏见和本周的热门话题。
大多数显示管理器,如xdm和kdm,都有钩子来自动检查用户主目录中的SSH密钥。当显示管理器在登录过程中找到密钥时,它会创建一个弹出窗口来请求你的密码短语。输入密码短语,显示管理器将SSH代理连接到你的桌面环境。
如果是更老式的桌面,比如startx,在运行它之前,告诉SSH代理你有一个带ssh-add的密钥:
xxxxxxxxxx
$ ssh-add
Enter passphrase for /home/mwl/.ssh/id_rsa:
输入密码短语以将密钥添加到代理。
文本控制台用户必须首先使用shell作为参数运行ss-agent,然后运行ssh-add:
xxxxxxxxxx
$ ssh-agent /bin/tcsh
$ ssh-add
从该控制台会话启动的所有SSH会话都与代理一起运行。该代理不能跨虚拟控制台终端工作,只能用于ssh-agent运行的shell的子级。另一个虚拟终端需要自己的SSH代理。
如果你有多个具有相同密码短语的密钥,ssh-add会自动解密所有密钥。如果你有多个具有不同密码短语的密钥,ssh-add会分别为每个密码短语添加提示。
使用ssh-add -l列出当前存储在代理中的所有私钥,使用ssh-add -D从正在运行的代理中删除密钥。
PuTTY SSH代理——Pageant——为SSH提供了一个友好的Windows风格界面。双击Pageant即可启动。Pageant图标,一个带黑色宽边帽的电脑,将出现在系统托盘中。
右键单击Pageant图标。您将看到几个选项,包括“查看关键点”、“添加关键点”和“退出”。还有运行已保存或新的PuTTY会话的选项。选择“添加关键点”以打开标准窗口文件浏览器。找到您的私钥并选择它。Pageant将显示一个对话框来请求您的密码。输入密码。如果您无法正确键入密码,Pageant将要求您重新输入。
一旦Pageant准备就绪,打开PuTTY会话。连接到安装了公钥的计算机。您应该得到一个命令提示符,而不需要输入密码。
如果基于密钥的身份验证在指定私钥文件时有效,但在使用Pageant时无效,请验证PuTTY是否配置为使用Pageant。选择连接->SSH->身份验证。在“身份验证方法”下,您将找到“使用Pageant尝试身份验证”复选框。确保它被检查过。
一旦你知道Pageant有效,在登录时开始它会很有帮助。查找帐户的“启动”文件夹(确切位置因Windows版本而异)。在另一个窗口中,找到您的Pageant程序。它可能位于程序或程序文件(x86)下的PuTTY目录中。在启动目录中创建指向Pageant的链接。
为了获得最佳便利,请在登录时让快捷方式加载您的私钥。您可以将密钥的完整路径作为参数提供给Pageant,也可以在目录中设置Start并仅使用短文件名。我建议在目录中设置Start,因为它使登录时加载多个密钥变得更加简单。右键单击Pageant快捷方式。在Target下,添加私钥文件的名称作为参数。目标现在应该看起来像“C:\Program Files\PuTTY\magazine.exe”moose.ppk。在同一屏幕上,您将看到“开始”字段。在那里输入密钥目录的完整路径。在我的笔记本电脑上,应该是C:\Users\mwlucas\Documents\keys。
要验证此操作是否有效,请退出正在运行的Pageant,然后双击启动文件夹中的新图标。系统应提示您输入密钥的密码。如果它不起作用,你可能把捷径上的一条路弄乱了。记住,你需要在任何有空格的路径周围加引号。
如果你丢失了私钥,你的密钥对就没用了。
PuTTY的.ppk文件包含公钥和私钥,但OpenSSH的密钥对分成了两个文件。
不要只是将私钥复制到另一台机器上——每台拥有私钥的机器都是密钥被盗的另一个地方。
将私钥备份到离线介质上,如闪存驱动器或CD。你也可以使用GnuPG等程序对其进行加密。
许多系统管理员拥有多台计算机。我经常使用两台台式机和一台笔记本电脑。通过复制密钥文件,可以在机器之间移动密钥对。你甚至可以将OpenSSH密钥导入PuTTY。
与其在所有台式机和笔记本电脑上重复使用单个私钥,不如为每台设备创建一个单独的私钥。创建一个authorized_keys文件,其中包含所有身份验证密钥的公钥。当机器退役、被盗或自焚时,请停止使用该机器的密钥。从所有服务器上的authorized_keys文件中删除相应的公钥,在替换机器上生成新密钥。
如果新的一台台式机计算机受到攻击,你必须停止使用该计算机的身份验证密钥。如果所有客户端共享一个私钥,则必须重新生成一个新的密钥对并将其分发到所有计算机。
拥有你私钥的入侵者可能会在你完成操作之前将你锁在自己的系统之外。
如果每台机器都有一个唯一的密钥对——即使所有密钥共享相同的密码短语——那么一个密钥的泄露或丢失不会泄露所有的其他机器上的密钥。
此外,首选的关键算法会随着时间的推移而变化。当我写这本书的第一版时,用户身份验证密钥默认为1024位。默认值现在是2048。如果我仍然使用几年前创建的密钥,它们对于当前的使用来说太弱了。未来,RSA的默认用户身份验证密钥算法完全有可能被完全不同的算法所取代。通过在获得新机器时创建新密钥,并使与旧硬件相关的密钥无效,您可以确保您的密钥相对较新且安全。
密码的安全性不如密钥。既然您已经使用了基于密钥的身份验证,明智的做法是禁止基于密码的身份验证。sshd_config关键字ChallengeResponseAuthentication禁用通用质询-响应身份验证系统,例如请求用户名和密码的提示。关键字PasswordAuthentication启用和禁用密码。要禁用基于密码的身份验证,请将这两个关键字都设置为no:
xxxxxxxxxx
ChallengeResponseAuthentication no
PasswordAuthentication no
虽然sshd默认情况下允许公钥身份验证,但请验证没有人更改该关键字。PubkeyAuthentication关键字必须设置为yes:
xxxxxxxxxx
PubkeyAuthentication yes
现在,使用内置的系统命令或pkill -1 sshd重新启动sshd。
更改sshd_config不会改变其他程序使用密码的方式。如果您使用sudo的密码,sudo仍会要求用户提供密码。
如果您在配置SSH时出错,导致没有人可以登录,您可以将自己锁定在服务器之外。更改sshd_config时,在验证更改有效之前,不要注销现有的SSH会话。(记住,您可以在备用端口上运行sshd进行测试,如第3章所述。)创建一个新的SSH会话。在断开第一个会话之前,请验证您是否可以登录并成为root。
前一段非常重要。忽视它会带来危险,或者为自己的躁狂抑郁症冰淇淋狂欢做好准备。
虽然密码很弱,但有时您无法完全禁用它们。您可能有一些用户或应用程序由于某种愚蠢的原因无法使用密钥。根本问题往往是政治问题,而不是技术问题,但它们仍然是问题。在您解决这些问题时,您可以使用条件配置允许来自特定主机的密码,如第3章所述。在这里,我们允许从特定子网进行密码身份验证:
xxxxxxxxxx
Match Address 192.0.2.0/24
PasswordAuthentication yes
请记住,所有Match语句都位于sshd_config的底部。
允许基于用户名的密码身份验证是可能的,但极其不明智。SSH服务器在挂断客户端之前必须获取用户名,而不是挂断请求密码的客户端。这意味着Hail Mary Cloud将不断地戳服务器。迫使您允许有限密码身份验证的原因可能会使要求强密码同样成问题——要求允许他使用密码的老板可能认为p455w0rd是一个安全的密码。允许密码的帐户将是一个弱点。在这里,唯一能救你的是将主机外的日志记录到一个非常安全的堡垒主机上,这样当机器受到攻击时,你就可以告诉老板停机是他的错。
假设我在所有计算机上禁用了基于密码的身份验证。在我的任何主机上访问命令提示符的唯一方法是使用公钥进行身份验证。
我正在处理我的服务器wrath,必须把一个文件复制到服务器gluttony上。这带来一个问题:我的私钥不在wrath之中。将私钥复制到服务器是一种糟糕的安全做法——你希望私钥在尽可能少的主机上,而不是在服务器上。但是密码又不起作用。该如何使用SCP或SFTP?
答案是将身份验证请求转发回你的工作站。代理转发就是这个意思。
当你尝试从一个服务器通过SSH连接到另一个服务器时,服务器上的SSH客户端会将私钥请求发送回你的桌面。代理可以作为套接字使用,位于环境变量$SSH_AUTH_SOCK给出的位置:
xxxxxxxxxx
$ echo $SSH_AUTH_SOCK
/tmp/ssh-zOeUnDTnkb/agent.2513
要使用代理转发,客户端和服务器都必须运行,并且SSH代理必须在启动第一个SSH连接之前运行。如果客户端和服务器都支持并请求转发,则将转发身份验证请求。
代理转发的风险在于,你必须将一些信任扩展到SSH服务器。
任何具有root访问权限的人都可以访问你的SSH代理套接字。任何可以访问SSH代理套接字的人都可以使用你的私钥,而无需提供密码。
如果你的SSH服务器受到攻击,入侵者可以借助你的身份验证套接字,使用你的凭据登录远程服务器。混杂的代理转发时许多组织被入侵的原因,即使是你认为更了解的组织。
仅启用代理转发到你控制的计算机。
要在服务器上启用代理转发,请将AllowAgentForwarding关键字设置为yes:
xxxxxxxxxx
AllowAgentForwarding yes
我通常会全局禁用代理转发,然后使用Match语句只允许某些用户或地址转发他们的代理。
在ssh_config中,使用ForwardAgent关键字激活代理转发:
xxxxxxxxxx
ForwardAgent yes
下次连接到服务器时,客户端将请求代理转发。
PuTTY默认启用代理转发。在PuTTY设置屏幕的左侧,转到连接->SSH->身份验证。在“身份验证参数”下,您将看到一个标记为“允许代理转发”的复选框。