我正在设置一个 ubuntu 服务器,像 99% 的人一样,我做的第一件事就是禁用密码身份验证,转而使用密钥。
在其他发行版和其他时间,这只需编辑/etc/ssh/sshd_conf
并确保......
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePam no
正如您可能已经知道的那样,仅仅这样做不再有效,因为在开始附近,该sshd_conf
文件包含另一个conf文件......
Include /etc/ssh/sshd_config.d/*.conf
包含的文件是一个名为的文件,50-cloud-init.conf
其安装时的唯一内容恰好是...
PasswordAuthentication yes
包含的 Conf 文件会sshd_conf.d
覆盖原始文件sshd_conf
,因此如果只是更改sshd_conf
,50-cloud-init.conf
则会翻转回密码身份验证设置。将其更改为“否”将最终禁用密码登录。
我已经这样做了两次,但每次都忘记了。我现在会记得,但这让我烦恼,因为我无法理解这些东西的基本原理是什么。
到目前为止,通过四处搜寻,我们在“为什么”方面取得了很多成果。大多数人都很乐意克服这个小障碍并继续前进。我很高兴它可以解决,但我有疑问:
这个额外的conf文件的名称表明它与基于云的安装有关。但什么云呢?我把它安装在物理机上。大概是
cloud-init
为我创造了这个,但为什么呢?我没有在云环境中运行。另外,“50”是什么? 50什么?此外,它唯一具有启用密码身份验证的行。在云安装中,不是每个人都总是使用密钥吗?我发现可以只删除非云安装的 cloud-init。这样做有什么注意事项吗?即使在非云安装上,默认情况下也会安装并运行它,这似乎很奇怪。一定有原因吧?
如果您超越“ cloud-init ”中的“云”,它可能会帮助您更快地理解事情:它是一个用于声明性配置系统的工具,通常用于各种类型的首次设置(例如,作为桌面安装程序的一部分,或云环境中的虚拟实例,或其他没有安装程序的地方,例如 Raspberry Pi 映像)。是的,它最初是为云环境创建的,但后来它的范围和功能有了很大的发展。特别是,Ubuntu 桌面安装程序使用它来进行各种初始配置活动,正如您在此处看到的那样。从代码重用的角度来看,这很有意义:当存在专用的、维护良好的、广泛使用的工具时,桌面安装程序没有特别的理由去重新发明轮子来完成这些事情。
至于您看到的额外文件,其原因主要与我在回答sysctl 被分成这么多配置文件的原因中描述的相同。 :
通常,支持此类插入式配置文件的软件按字典顺序从一个目录或一组目录中读取文件。为了使字典顺序更容易理解,长期以来存在使用零填充两位数前缀(
00-foo.conf
、50-whatever.sh
等)的约定,因为这些前缀在数字和字典顺序上排序相同。如果您有一个NN-whatever
包含某些要覆盖的设置的文件,您有两个选择:只需用您想要的任何内容覆盖该文件即可。如果相关文件具有或可能具有您不希望覆盖且不希望跟踪的其他设置,则您可能希望避免使用此选项。
创建一个文件
MM-whatever
,其中MM
:NN
软件优先考虑设置的第一次出现的情况(例如00
极端情况),或者,NN
如果它优先考虑设置的最后出现(例如,99
在极端情况下)。对于两位数前缀,极端是
00
,99
,50
就在中间。因此管理员很容易覆盖它。在您的特定情况下,只需创建一个包含以下内容的文件/etc/ssh/sshd_config.d/00-only-pubkey-auth.conf
:而且您不必担心主配置文件或其他嵌入式文件。
这个特殊的变化甚至不是 Ubuntu 或 cloud-init 所特有的。当 sshd 首次开始支持嵌入式配置文件时,Arch Linux 也立即转而使用嵌入式文件(当然,名称不同)来更改上游默认值。我也立即制作了另一个替代文件来覆盖这些设置。在此之前,我必须编辑主配置文件本身,每次更新包中的配置文件时,包管理系统都会要求我检查更改。这些天来,我已经有一段时间没有被这个特定的配置更改所困扰了,从长远来看,这让我的生活变得更轻松。