如何为公钥ssh授权而不是密码授权解锁帐户?


32

ssh不允许我登录,因为帐户已锁定。我想解锁服务器上的用户以通过ssh进行公钥授权,但不启用密码登录。

我试过了:

# passwd -u username
passwd: unlocking the password would result in a passwordless account.
You should set a password with usermod -p to unlock the password of this account.

验证日志条目:

Mar 28 00:00:00 vm11111 sshd[11111]: User username not allowed because account is locked
Mar 28 00:00:00 vm11111 sshd[11111]: input_userauth_request: invalid user username [preauth]

应该(IMHO)为所有用户执行此操作...为整个sshd 执行此操作时应使用一个简单的配置
Skaperen

passwd -u是个坏主意。参见Giles bellow的回答。
彼得·詹金斯

Answers:


15

解锁该帐户,并按照@Skaperen的建议为用户提供一个复杂的密码。

编辑/etc/ssh/sshd_config并确保您具有:

PasswordAuthentication no

检查该行是否未注释(#在开始处)并保存文件。最后,重新启动sshd服务。

在执行此操作之前,请确保首先进行公钥身份验证。

如果您只需要为一个(或少数)用户执行此操作,请保持PasswordAuthentication启用状态,而使用Match User

Match User miro, alice, bob
    PasswordAuthentication no

将其放置在文件底部,直到下一个Match命令或EOF 为止。

您也可以使用Match Group <group name>或取反Match User !bloggs

正如您在评论中提到的,您也可以将其撤消,以便在配置的主要部分中禁用密码身份验证,并使用Match语句为一些用户启用它:

PasswordAuthentication no
.
.
.
Match <lame user>
    PasswordAuthentication yes

我得到的印象米罗想禁用密码只是一个使用。但请参阅我之前的评论
Skaperen

@Skaperen-您完全正确。我已经稍微改变了答案。
garethTheRed

Match语法看起来不错,但我将尝试将其反转。为(很少la脚的)用户启用密码登录。
克拉韦米尔2015年

@Miro-这是一个好主意,我已将其添加到我的答案中以供将来参考。
garethTheRed

37

无论您做什么,都不要将帐户保留为,状态为passwd -u,密码字段为空白:允许登录而无需输入密码(通过SSH除外,因为SSH拒绝该密码)。

将帐户更改为没有密码,但将其解锁。如果密码数据库中的密码哈希不是任何字符串的哈希,则帐户没有密码。传统上,使用一个字符字符串,例如*!

锁定帐户还会在密码字段中使用特殊标记,使该字符串不是任何字符串的哈希。标记取决于系统。在Linux上,该passwd命令通过!在开头添加来标记已锁定的密码,如果该字段以开头,则OpenSSH会将帐户视为已锁定!。其他Unix变体倾向于使用类似但不完全相同的机制,因此请注意,如果您的密码数据库是在异构网络之间共享的。

在Linux上,您可以禁用对帐户的基于密码的访问,同时允许通过以下方式进行SSH访问(使用其他身份验证方法,通常是密钥对)

usermod -p '*' username

用户将无法将帐户更改回具有密码,因为这要求他们输入有效的密码。

如果需要,可以将SSH配置为拒绝密码身份验证,而不管帐户是否有密码。您仍然需要安排SSH不考虑该帐户已被锁定,因此例如在Linux上,您需要!从密码字段中删除(但不要将该字段留空- *如上所述,将其设置为)。要禁用SSH的密码验证,请PasswordAuthentication/etc/sshd_config/etc/ssh/sshd_config(系统上的任意一个)中添加指令。使用Match块使该指令仅适用于特定用户。Match块必须出现

…
Match User username
    PasswordAuthentication no

6
谢谢- usermod -p '*' username很有魅力!
Homme Zwaagstra 2015年

1
!如果UsePAM yes在中设置,OpenSSHd确实允许锁定的用户(即带有前缀的密码哈希)使用其他身份验证方法登录sshd_config。这可能是大多数发行版(例如Fedora)的默认设置。
maxschlepzig

1
我有一个没有PAM的嵌入式系统,因此'*'vs. '!'区别非常有用。
jpkotta

8

如果您已经在使用强键,则不需要启用或设置密码,实际上也不需要。只需从现有会话中重新锁定您的帐户(sudo passwd -l用户名)并修复您的SSH配置即可。

发生这种情况的原因可能是因为您已经编辑了默认的SSH守护程序设置之一(在/ etc / ssh / sshd_config中)。

在/ etc / ssh / sshd_config中进行更改,然后重新启动SSH:

UsePAM yes

通常,除非您确实有充分的理由要禁用PAM,否则建议您保持启用状态;在SSH中启用PAM,即使密码已删除,您仍可以登录。无论您做什么,都不要设置空密码或类似的密码...锁定密码字段并不一定意味着将整个帐户都锁定了。

使用SSH时的快速提示:更改SSH配置时,请保持另一个会话处于打开状态(在另一个窗口中),然后测试您仍然可以登录;如果您无意间中断了访问权限,请使用当前会话进行修复。

(免责声明:我在Userify工作,该公司提供SSH密钥管理软件。)


0

我在CentOS 7上遇到了这个问题。我是基于Debian的常规Linux用户,所以我不知所措。我注意到在某些服务器中它可以工作,而在其中一台中却没有。audit.log表示没有任何用处,secure.log也不提供任何内容。我发现,唯一真正的区别是文件和目录的有效上下文和不起作用的安全上下文有所不同。通过获取安全性

sudo ls -laZ <user-home>/.ssh

目录(我假设sshd_config上有很多默认值)。

你应该会看到一些ssh_home_tuser_home_t属性。如果不这样做,请使用chcon命令添加缺少的属性。

例如

home="$(getent passwd <user> | cut -d: -f6)"
sudo chcon -R unconfined_u:object_r:ssh_home_t:s0 "$home".ssh
sudo chcon unconfined_u:object_r:user_home_t:s0 "$home"

就我而言,我怀疑用户是以非标准方式创建的。他的家在/var/lib

更多信息请参见:https : //www.linuxquestions.org/questions/linux-security-4/selinux-preventing-ssh-login-with-~-ssh-authorized_keys-4175469538/


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.