许多用户在 github 上都有自己的公共 ssh 密钥。有没有简单的方法让它知道别人的用户名?我知道这是可能的——ubuntu 安装程序以某种方式获得了密钥——但我找不到办法。为只要求 github 帐户而不是 ssh 密钥的人创建帐户会很有用。
所以我将一个 SSH 私钥从我的 Linux 机器复制到了我的 M1 Mac。(我试图通过将密文上传到秘密管理器以及直接传输文件来做到这一点)但是当尝试从每个机器通过 SSH 连接到同一台机器时,我只能从 Linux 机器上成功。
Linux机器:
$ ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.4, OpenSSL 1.1.1f 31 Mar 2020
$ md5sum id_rsa
7ed8b0c73e168ef48acc715d4c6bcf73 id_rsa
$ sha256sum id_rsa
969d0a35b36c50035881bdd2d8367b90dbff548131d5c72989d29e83b7a3aa19 id_rsa
$ ssh-keygen -l -f id_rsa
4096 SHA256:d19Ee+tlzVHitLzKuuZbdgYcnhla96ypXNtpBwrqfqE [email protected] (RSA)
$ ssh -i id_rsa [email protected]
[redacted MOTD; WORKS]
M1 麦克:
$ ssh -V
openSSH_8.6p1, LibreSSL 2.8.3
$ md5 id_rsa
MD5 (id_rsa) = 7ed8b0c73e168ef48acc715d4c6bcf73
$ shasum -a 256 id_rsa
969d0a35b36c50035881bdd2d8367b90dbff548131d5c72989d29e83b7a3aa19 id_rsa
$ ssh-keygen -l -f id_rsa
4096 SHA256:rWsP9jN2otlchh8icr/jlnZxDjEfEkngDJOoPh4RYZI [email protected] (RSA)
$ ssh -i id_rsa [email protected]
[email protected]: Permission denied (publickey).
AFAICT 这些私钥是相同的。但是由于某种原因 ssh-keygen 不会对它们进行相同的指纹识别。即使它们具有相同的校验和。这可能是 M1 SoC 的问题吗?还是这里发生了更明显的事情?
我正在尝试诊断 OpenDKIM 验证错误(请参阅此问题)。在野兽的肚子里,我正试图确保生成的密钥实际上是正确的。
我正在生成我的密钥opendkim-genkey -r -d example.com
。这会生成两个文件。一个是 RSA 私钥(文件default.private
):
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFx
scSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6vi
GPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMwIDAQAB
AoGAVSjAvnwlHqEEJVAPNSLwj4Gic9BXeXwakB2fXRSi1YadcEwMNRfJE9fHs2n3
5v4VK60IJbP+05U0wwV5c6t5AgZqpP0GBW8CKUr3BwaF2cJbd+uOXlAm4cx6/S1E
Ocoku0c/vrr3mkO41IuBkB+FRm0y7WXFi7e7M32Tictt0CkCQQDzE08wRLNXxkaM
LyUDMvCtlNzACcmkU73NAHDHhwtrJMMLp7q/s4VIDbmhysoNBblNHJQvA/7zVd13
1CGxbh8/AkEA1IajRLNJ6XTuv9RmK1622BDWix4ogEvbev/zR8ti2JifO6A5gv+L
na5hVAATo563pWjtNZW3sAVKqN7juN5HDQJAP1xKKP/Pa9LQMtxbHoFZwTVrcVdb
y0zUzaoOu8PU0yHrAY/AGxY1aLnDKIxOrKRQT+xiJ/s3qsA4EXMnMTPOSwJBAK5N
dl6EBRyZsK5YDyuG1MNEnBEhPOpsTKgGf4rkfj9SfVYzxLdxyxoZyO1R2smZBNl+
wv3tuud8j40MsQwQEYkCQBCzH+1IaxoMsSggutvEvqz2SqkFbD5rq/+uL6P6xyYg
PHCYIWomK8zOlmnO+bfbRIzQb7I81vOFq2sr0yQLK+0=
-----END RSA PRIVATE KEY-----
一个生成 DKIM DNS 条目,我假设它包含公钥:
default._domainkey IN TXT ( "v=DKIM1; k=rsa; s=email; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFxscSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6viGPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMwIDAQAB" ) ; ----- DKIM key default for example.com
我假设“p=”条目是公钥,但如果是,我不知道如何验证它们是否匹配。我想我可以用 来做到这一点ssh-keygen -y -f default.private
,但是,它的输出与 DNS 条目的“p =”部分中的输出明显不同(它甚至不是相同的长度):
# ssh-keygen -y -f default.private
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDJy9S18vHtrIQNep9PogJfrKNLKKf2VSOvUwOzItlWkY3cRCFxscSNjfC4QHREcMeUuNO78wvQ+oOk+exLdyl2BggcA659Wi6v8X/+awLXpa9sB6viGPi8Zx560GbZu6jGLlEzcOaGDCYqdUxZIdAaOICDORFa3XAywHi87eQPMw==
那么,这里发生了什么?ssh-keygen 不是正确的方法吗(也许我应该用 OpenSSL 做点什么?)?“p=”不是公钥吗?或者,事实上,我的私钥和公钥不匹配?
谢谢!
PS,作为一个可能无关的旁白,我假设由 opendkim 生成的公钥对于前 34 个字符总是相同的MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQ
——并且总是以IDAQAB
.
希望有人能帮我解决这个噩梦。我做了一个关于 vagrant 配置 4 台 ubuntu 机器、1 台控制器和 3 台服务器的项目。在控制器和 ssh-copy-id 命令上创建 SSH 密钥到 3 个服务器节点。我可以在 3 台服务器上的 authorized_keyes 中看到公钥。
根据我在互联网上可以找到的内容,etc/ssh/sshd_config 转储似乎没问题。
# $OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
#PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
UsePAM yes
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
PrintMotd no
#PrintLastLog yes
#TCPKeepAlive yes
#UseLogin no
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
# override default of no subsystems
Subsystem sftp /usr/lib/openssh/sftp-server
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
UseDNS no
GSSAPIAuthentication no
当我尝试从我的控制器机器连接到其中一台服务器时调试输出。
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to server1 [172.16.1.51] port 22.
debug1: Connection established.
debug1: identity file /home/vagrant/.ssh/id_rsa type 0
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/vagrant/.ssh/id_ed25519-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: Remote protocol version 2.0, remote software version OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
debug1: match: OpenSSH_7.6p1 Ubuntu-4ubuntu0.3 pat OpenSSH* compat 0x04000000
debug1: Authenticating to server1:22 as 'vagrant'
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: algorithm: curve25519-sha256
debug1: kex: host key algorithm: ecdsa-sha2-nistp256
debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none
debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ecdsa-sha2-nistp256 SHA256:Qe4c4KKdHXNjhZ3PMFqTKrVFASCX3O8kvtCRKTifkfs
debug1: Host 'server1' is known and matches the ECDSA host key.
debug1: Found key in /home/vagrant/.ssh/known_hosts:1
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: rekey after 134217728 blocks
debug1: SSH2_MSG_EXT_INFO received
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519,ssh-rsa,rsa-sha2-256,rsa-sha2-512,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521>
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:gmW3Caq3TNEnCYHCa+BMgMm7lINsBlo7Y73bE596LZo /home/vagrant/.ssh/id_rsa
debug1: Server accepts key: pkalg rsa-sha2-512 blen 279
Enter passphrase for key '/home/vagrant/.ssh/id_rsa':
我已经尝试了大部分我能找到的关于这个主题的东西。我仍然无法无密码访问我的服务器机器。欢迎任何建议。
谢谢你。
TDLR:我有一个 Catch 22,根据用户主目录的权限,我可以让 SSH 身份验证正常工作,或者用户目录限制,但不能同时进行。
顺便说一句,我真的很想推出自己的 SFTP 服务器。请不要推荐我尝试 AWS Transfer 服务或其他替代方案。谢谢。
以下是 /etc/ssh/sshd_config 中的相关(从默认更改)内容:
Subsystem sftp internal-sftp
Port 22
Port 2299
Match Group sftpusers LocalPort 2299
ChrootDirectory /sftp-data/%u
ForceCommand internal-sftp
Match Group sftpusers LocalPort 22
DenyGroups sftpusers
Match LocalPort 2299 Group *,!sftpusers
DenyUsers *
我希望端口 22 像 ssh 通常那样运行,但仅适用于非 sftp 用户。对于 sftp 用户,在“sftpusers”组中,我希望端口 2299 仅用作 sftp,而不是 ssh。对于非 sftpusers,我希望拒绝访问端口 2299。
好的,所以,我用主目录 /sftp-data/user1 和 shell /sbin/nologin 创建了一个用户“user1”。我创建了 /sftp-data/user1/.ssh/authorized_keys 并用公共 ssh 密钥填充了它。/sftp-data 由具有 700 权限的 root 拥有。/sftp-data/user1/.ssh 及以下为 user1 所有,/sftp-data/user1/.ssh/authorized_keys 的权限为 600。 /sftp-data/user1 的所有权/权限在这里受到质疑。更多内容如下。
我创建了用户组 sftpusers 并将 user1 添加到该组。但是,您通过 AWS 获得的内置 ec2-user 不是该组的成员。使用 ec2-user 进行测试效果很好:通过 ssh 访问,端口 22 正常工作,但无法访问端口 2299。
因此,使用 user1 进行测试是有趣的地方。User1 无法访问端口 22 - 太好了!在 user1 拥有 /sftp-data/user1 的情况下,ssh 公钥认证在端口 2299 上成功,但用户立即注销,此消息保存在 /var/log/secure 中:
Sep 2 19:21:38 ip-192-168-0-25 sshd[10369]: Accepted publickey for user1 from <ip-address redacted> port 61110 ssh2: ECDSA SHA256:<sha redacted>
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session opened for user user1 by (uid=0)
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: fatal: bad ownership or modes for chroot directory "/sftp-data/user1" [postauth]
Sep 2 19:13:23 ip-192-168-0-25 sshd[9803]: pam_unix(sshd:session): session closed for user user1
当然,这是有道理的。Chroot 要求 /sftp-data/user1 由 root 拥有,权限为 700。所以,这样做,现在 sftp(ssh 密钥)身份验证失败。
Sep 2 19:41:00 ip-192-168-0-25 sshd[11693]: error: AuthorizedKeysCommand /opt/aws/bin/eic_run_authorized_keys user1 SHA256:<sha redacted> failed, status 22
顺便说一句,eic_run_authorized_keys 是 AWS 围绕标准 ssh 身份验证启用 AWS Instance Connect 的包装器。
对于额外的信用......如果上述问题不够具有挑战性,你能想出一个方案,我可以让特定的 sftp 用户访问特定的项目目录,而且只有那些,而不为每个项目创建一个组?从每个用户的主目录链接到项目目录会很棒。
@anx 要求的其他信息:
# getent passwd user1
user1:x:1001:1001::/sftp-data/user1:/sbin/nologin
# namei -l /sftp-data/user1/.ssh/authorized_keys
f: /sftp-data/user1/.ssh/authorized_keys
dr-xr-xr-x root root /
drwxr-xr-x root root sftp-data
drwx------ root root user1
drwx------ user1 sftpusers .ssh
-rw------- user1 sftpusers authorized_keys
我为 sshd 打开了调试日志记录。使用 ChrootDirectory 指令,/sftp-data/user1 由 root 拥有,并且 SSH 身份验证失败,我在 /var/log/secure 中看到了这一点:
debug1:无法打开授权密钥“/sftp-data/user1/.ssh/authorized_keys”:权限被拒绝
ps 清楚地告诉我 root 正在运行 sshd 进程。
使用仅在笔记本电脑 (alice) 上可用的私钥,有没有办法使用该密钥从服务器 (bob) 与 gitlab 进行身份验证。(我认为轻微的并发症是 alice 和 bob 之间的跳跃主机。)
爱丽丝 --> 跳跃 --> 鲍勃 --> gitlab
alice 上的 ~/.ssh/config 目前是:
Host *
PKCS11Provider /usr/lib/ssh-keychain.dylib
Host jump
HostName jump01.example.org
Host bob
HostName bob.example.org
ProxyJump jump
我从 gitlab 上的 alice 令牌中获得了公钥,我想将它与git
来自 bob 的命令一起使用。如...
alice:~ $ ssh bob
Last login: Fri Aug 27 20:33:56 2021
bob:~ $ git clone [email protected]:my/repo.git
我在鲍勃上没有密钥对。
为了安全起见,我最近从密码更改为 ssh-key。
但是,当私钥文件以某种方式被盗时,ssh-key 也可能会受到损害。
所以我在私钥上设置了一个密码。
但似乎我可以尽可能多地尝试。
那么有什么办法可以限制有多少人可以尝试密码?
这可能是一个愚蠢的问题,但无论如何我还是要问:
我已经为我的客户端机器 A 设置了一个 ssh 公钥。我将公钥复制到远程服务器,一切正常,我可以从机器 A 登录。
现在我还想从另一台机器访问该服务器并遵循最佳实践,我想为客户端机器 B 生成另一个密钥,而不是再次使用来自机器 A 的密钥。当然,我可以生成密钥对,但我无法将新的公钥复制到服务器,因为客户端机器 B 无法访问服务器,只有 A 可以。
我目前看到的唯一解决方案似乎是将 USB 记忆棒上的新公钥带到客户端机器 A 并从那里复制到服务器,但是当找到 n 台机器时,这似乎有点乏味且不太实用彼此相距甚远。
这样做的正确方法是什么?
客户端和服务器都运行 Linux。
在这里https://security.stackexchange.com/a/52564您可以阅读到较新的 OpenSSH 版本使用 bcrypt 来保护密钥文件。bcrypt 的安全性取决于成本因素,请参阅https://security.stackexchange.com/questions/139721/estimate-the-time-to-crack-passwords-using-bcrypt/201965#201965
根据https://crypto.stackexchange.com/questions/58536/how-does-openssh-use-bcrypt-to-set-ivs/58543#58543,默认的 bcrypt 轮数为 16。这将是一个很好的安全性. 但是如何获得回合数/成本因素?
到目前为止我所做的:密钥看起来像(为了让它更短,这里只有一个弱的 1024 位密钥)
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBLF8sO2Q
hcLXI43z96e1hiAAAAEAAAAAEAAACXAAAAB3NzaC1yc2EAAAADAQABAAAAgQC0gBWeZpej
9ILT/59bEb0/lSvXx0WfZqP2lXRDbuY+gluuWyT+REQcVTR2BxSx9F/P20mLTnupzY+XE3
xEu+SIJlwKIAH3fed62+QBzDrPsl9kyfoIGIvi/28ZftqVN/kg0GSOaAqu4Px+vNVX1VKn
PNV5VVCZWL4ZPlGQZ48UJwAAAhCwDkueKT9oq8E0qtD92/4DSAD2eTI7bd6jBGUxugEw85
6xWbRYnFQZdwO2ZCNV0aTHViD1FRKlC9cBHDoSORKcM/9dY9Msy6lZj7Tp5s8r7x2pOrJi
TVRbv5/cI732I+l/vYvssJEhZpeSw4JKh9tyPpifVmzBxqtqwkBrTuLCMqkwLmrcxReFUq
aA/RIZy3L616CJsAvx2ezEc49D6SbJ9i9OlKuv73a1baS4RpMvFzWGLE2NBvvtQpEnJFoL
Kyjz+two4doT6SZ7UtiVGyCtO5WQEoeAgjhkbZzOPtM2AvoV+hNLRIX2/52jOB5A1bNQ0v
qW64aj2YNe8vWfj5xtA/8BlyEG7gwhu+0HgbgMDxw7o/0qVkHM/Hv3YgBTRygsH+8h4wsR
kxA292NOKKaD18tv1j3atR80q0XQVcQH20uX8tSqXtKfDtkUc/EPbFCNp3xQJG/F81USKh
YAmjxEeDkZZ/LkEOEJKvFRCL3gFlH4rqF5/pRk6HmB99xceD4irbazm+BWfPAf5Q0zdB5L
/yei3sqA4G48yRXIkaELtYNEeTYHMp3PGz1b3CP3l+ZGZp6XNaM+sMfdICbI3Zae5bnxKg
VXEE2UMdi7DEXbqEzSlfcIf5QzXHMQJm0ZL+iLoaEmakamAxCKk6jJ+QzHzGADZEIRXrj3
5Nhhd0jsToEMsXmmawt2qxy0cIHET1M=
-----END OPENSSH PRIVATE KEY-----
密码是test
然后让我们解码base64。因此必须删除以'-----'开头的第一行和最后一行
cat key | tail -n +2 | head -n -1 | base64 -d > text.txt
但现在我不知道如何从那里读取roundcount。你能帮忙吗?