向~/添加公钥。Ssh /authorized_keys不能自动登录

我在authorized_keys文件中添加了公共SSH密钥。ssh localhost应该让我登录,而不需要询问密码。

我这样做了,并尝试输入ssh localhost,但它仍然要求我输入密码。我是否还需要经过另一个设置才能使它生效?

我已经按照说明更改权限:

下面是执行ssh -v localhost的结果。

debug1: Reading configuration data /home/john/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/john/.ssh/identity type 1
debug1: identity file /home/john/.ssh/id_rsa type -1
debug1: identity file /home/john/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_4.7p1 Debian-8ubuntu3
debug1: match: OpenSSH_4.7p1 Debian-8ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'localhost' is known and matches the RSA host key.
debug1: Found key in /home/john/.ssh/known_hosts:12
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/john/.ssh/identity
debug1: Server accepts key: pkalg ssh-rsa blen 149
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>

然后在上面的日志之后请求一个密码阶段。为什么不用密码就能登录?

713270 次浏览

. ssh / authorized_keys中列出公钥是必要的,但不足以让sshd(服务器)接受它。如果您的私钥是受密码短语保护的,那么您每次都需要向ssh(客户端)提供密码短语。或者你也可以使用ssh-agent,或者GNOME的等价程序。

您的更新跟踪与密码短语保护的私钥一致。参见ssh-agent,或使用ssh-keygen -p

你需要验证authorized_keys文件和它所在的文件夹/父文件夹的权限。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

更多信息见这个页面

您可能还需要更改/验证主目录的权限,以删除组和其他对象的写访问权限。

chmod go-w ~

注意SELinux也会触发这个错误,即使所有的权限看起来都是OK的。禁用它对我来说很有用(插入禁用它的通常免责声明)。

SELinux也会导致authorized_keys不工作。特别是对于CentOS 6和7中的根。但是没有必要禁用它。

一旦你验证了你的权限是正确的,你可以这样修复:

chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
restorecon -R -v /root/.ssh

试试“ssh-add”,它对我很有用。

也要确保你的主目录不能被其他人写入:

chmod g-w,o-w /home/USERNAME

这个答案是从在这里偷来的。

在命令行上发出这些命令:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

在你这样做之后,确保你的目录是这样的:

drwx------ 2 lab lab 4.0K Mar 13 08:33 .
drwx------ 8 lab lab 4.0K Mar 13 08:07 ..
-rw------- 1 lab lab  436 Mar 13 08:33 authorized_keys
-rw------- 1 lab lab 1.7K Mar 13 07:35 id_rsa
-rw-r--r-- 1 lab lab  413 Mar 13 07:35 id_rsa.pub

设置ssh authorized_keys似乎很简单,但它隐藏了一些陷阱,我试图弄清楚。

——server——

/etc/ssh/sshd_config中,设置passwordAuthentication yes让服务器暂时接受密码身份验证

——客户——

考虑Cygwin作为Linux仿真,并安装&运行OpenSSH

生成私钥和公钥(客户端) # ssh-keygen < / p >

这里只按输入,你会得到默认的两个文件,"和id_rsa . pub",在~ / . ssh /中,但如果你给出一个name_for_the_key,生成的文件将保存在你的当前工作目录中。

2.your_key.pub文件传输到目标计算机ssh-copy-id user_name@host_name

如果您没有创建默认键,这是出错的第一步 ... 你应该使用:

ssh-copy-id -i path/to/key_name.pub user_name@host_name

3.日志记录ssh user_name@host_name只适用于默认的id_rsa文件,所以这里是第二个陷阱。你需要做ssh -i path/to/key_name user@host

(使用SSH -v…选项查看发生了什么。)

如果服务器仍然要求输入密码,那么你给出了一些东西。输入密码:当你创建了键(所以这是正常的)。

如果ssh不在默认端口22上监听,则必须使用ssh -p port_nr

——server -----

修改文件/etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  %h/.ssh/authorized_keys

(如有,取消评论)

这告诉ssh接受文件authorized_keys,并在用户主目录中查找写入. ssh / authorized_keys文件中的key_name sting。

5在目标机器上设置权限

chmod 755 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

同时关闭pass认证,

passwordAuthentication no

关闭所有SSH root/admin/....的gate@your_domain尝试。

6.确保所有非根主目录的所有权和组所有权是适当的。

chown -R ~ usernamehere
chgrp -R ~/.ssh/ user

===============================================

7.考虑优秀的http://www.fail2ban.org

< p > 8.额外的 SSH隧道< em > < / em >访问MySQL (bind = 127.0.0.1)服务器

绝望的人也可以确保他们没有在authorized_keys文件中有额外的换行符,因为从一个混乱的终端复制文件id_rsa . pub的文本。

最后对我有用的事情是确保所有者/组不是,而是用户:

chown -R ~/.ssh/ user
chgrp -R ~/.ssh/ user

确保目标用户已经设置了密码。运行passwd username来设置一个。即使密码SSH登录被禁用,我也需要这样做。

在这一点上,确保你的sshd配置有这一行:

PermitRootLogin without-password

如上所述设置,然后重新启动sshd (/etc/init.d/sshd restart)。

注销后再尝试登录!

我相信,默认值是:

PermitRootLogin no

我从之前的答案中发出sudo chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keyschmod go-w $HOME $HOME/.ssh,它修复了我在CentOS 7框上的问题,我在尝试获得Samba共享工作时弄乱了权限。

这似乎是一个许可问题。通常,如果某些文件/目录的权限没有正确设置,就会发生这种情况。大多数情况下,它们是~/.ssh~/.ssh/*。在我的例子中,它们是/home/xxx

你可以通过修改文件/etc/ssh/sshd_config(搜索LogLevel,并将其设置为DEBUG)来改变sshd的日志级别,然后检查文件/var/log/auth.log中的输出,看看到底发生了什么。

这解决了我的问题:

ssh-agent bash


ssh-add

在下面,用户是你的用户名。

mkdir -p /home/user/.ssh
ssh-keygen -t rsa
touch /home/user/.ssh/authorized_keys
touch /home/user/.ssh/known_hosts
chown -R user:user /home/user/.ssh
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/id*
chmod 644 /home/user/.ssh/id*.pub
chmod 644 /home/user/.ssh/authorized_keys
chmod 644 /home/user/.ssh/known_hosts

在我的情况下,这是因为用户的组没有在配置文件/etc/ssh/sshd_config的AllowGroups中设置。添加后,一切工作正常。

我的问题是修改的AuthorizedKeysFile,当填充/etc/ssh/authorized_keys的自动化还没有运行时。

$sudo grep AuthorizedKeysFile /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysFile  /etc/ssh/authorized_keys/%u

另一个要记住的提示:自v7.0 OpenSSH默认禁用DSS/DSA SSH密钥以来,由于它们的继承弱点。所以如果你有OpenSSH v7.0+,确保你的密钥不是ssh-dss

如果您被DSA密钥卡住了,您可以通过在本地重新启用支持 用这样的行更新你的sshd_config~/.ssh/config文件

我的主目录在一个非标准的位置,在sshd日志中,我有以下一行,即使所有权限都很好(见其他答案):

无法打开授权密钥/data/home/user1/。ssh/authorized_keys':拒绝权限

我在这里找到了一个解决方案: ssh公钥认证到RHEL 6.5的问题

在我的特殊情况下:

  • /etc/selinux/targeted/contexts/files/file_contexts.homedirs中添加了新行:

  • 这是常规主目录的原始行:

    /home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

  • 这是我的新行:

    /data/home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

  • 后面跟着restorecon -r /data/sshd重新启动。

你必须注意的另一个问题是:如果你生成的文件名不是默认的id_rsaid_rsa.pub

你必须创建. ssh / config文件,并手动定义将与连接一起使用的id文件。

这里有一个例子:

Host remote_host_name
HostName 172.xx.xx.xx
User my_user
IdentityFile /home/my_user/.ssh/my_user_custom

在我的例子中,我需要把我的authorized_keys文件放在.openssh中。

这个位置在/etc/ssh/sshd_config选项AuthorizedKeysFile %h/.ssh/authorized_keys下指定。

确保你已经将整个公钥复制到authorized_keys;ssh rsa前缀是键工作所必需的。

只要在服务器上的/var/log/auth.log文件中查找即可。在客户端使用vv设置额外的详细信息不会有帮助,因为服务器不太可能向潜在的攻击者提供太多信息。

您需要验证文件的属性。

要分配所需的属性,使用:

$ chmod 600 ~/.ssh/sshKey
$ chmod 644 ~/.ssh/sshKey.pub

我有这个问题,没有一个其他的答案解决它,虽然当然其他答案是正确的。

在我的例子中,结果是/root目录本身(而不是例如/root/.ssh)具有错误的权限。我需要:

chown root.root /root
chmod 700 /root

当然,这些权限应该是类似的(可能是chmod 770)。然而,它特别阻止了sshd工作,即使/root/.ssh/root/.ssh/authorized_keys都有正确的权限和所有者。

在服务器上的/var/log/auth.log文件中查找sshd身份验证错误。

如果所有这些都失败了,那么在调试模式下运行sshd服务器:

sudo /usr/sbin/sshd -ddd -p 2200

然后从客户端连接:

ssh user@host -p 2200

在我的例子中,我在末尾找到了错误部分:

    debug1: userauth_pubkey: test whether pkalg/pkblob are acceptable for RSA SHA256:6bL+waAtghY5BOaY9i+pIX9wHJHvY4r/mOh2YaL9RvQ [preauth]
==> debug2: userauth_pubkey: disabled because of invalid user [preauth]
debug2: userauth_pubkey: authenticated 0 pkalg ssh-rsa [preauth]
debug3: userauth_finish: failure partial=0 next methods="publickey,password" [preauth]
debug3: send packet: type 51 [preauth]
debug3: receive packet: type 50 [preauth]

有了这些信息,我意识到我的sshd_config文件限制登录到ssh组的成员。下面的命令修复了这个权限错误:

sudo usermod -a -G ssh NEW_USER

当我将登录用户的组添加到另一个用户时,遇到了这个问题。

假设有一个ssh登录用户userera和一个非ssh登录用户userB。userA也有userA组。我修改了userB,使其具有组userera。导致所描述的行为,使userA不能登录没有提示。

当我从userB中删除组userA后,没有提示的登录再次正常工作。

我这样使用它。

cat ~/.ssh/id_rsa.pub| ssh user@remote-system 'umask 077; cat >>~/.ssh/authorized_keys'

我以前也遇到过同样的问题,但是今天我不得不设置一个新的服务器。在这段时间我能学到什么…

实现无密码认证的基本流程如下:

  1. 在服务器上,验证你的主文件夹是否有.ssh文件夹。如果它不存在,你可以用mkdir命令手动创建它,然后用chmod分配正确的权限,或者你可以使用相同的实用程序ssh-keygen来创建私钥/公钥,但在服务器上为你的用户。这个过程将创建所需的.ssh文件夹。

  2. 你还需要使用ssh-keygen实用程序创建私钥/公钥。

  3. 你需要将你的公钥文件.ssh/authorized_keys移动到服务器。要实现这一点,你可以使用ssh-copy-id实用程序,或者你可以手动使用catscp命令。

  4. 在最好的情况下,这将允许连接到您的服务器没有密码。

好了,现在是我今天发现的问题:首先有几个密钥生成算法:rsadsaecdsaed25519,还有许多版本的OpenSSH(你可以在你的本地机器上有一个版本,在你的服务器上有一个旧版本):

当你连接到服务器时,使用ssh -v有助于查看额外的信息。

OpenSSH_8.2p1 Ubuntu-4, OpenSSL 1.1.1f 31 Mar 2020

debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3

我今天的错误是,我试图使用一个带有“更新”的键。服务器上安装的OpenSSH版本不支持的生成算法。当我检查支持的算法时,我发现另一个错误是服务器拒绝我的算法:

debug1: Skipping ssh-dss key /home/user/.ssh/id_dsa - not in PubkeyAcceptedKeyTypes

在那之后,我必须改变我的密钥算法,然后我才能成功地连接到服务器。

OpenSSH发布注释:链接

在本例中,我们将根键移动到example_user,这也是

.禁止root用户访问SSH密钥
  1. SSH到实例为根。

  2. 为example_user创建.ssh目录。

    # mkdir /home/example_user/.ssh

  3. 将根键移动到example_user的SSH目录。

    # mv /root/.ssh/authorized_keys /home/example_user/.ssh/

  4. .ssh目录的所有权从root改为example_user,以便OpenSSH可以读取它。

    # chown -R example_user:example_user /home/example_user/.ssh

来源- https://www.vultr.com/docs/using-your-ssh-key-to-login-to-non-root-users#Option_2__Move_the_root_SSH_Key_to_the_Non_root_User