如果您管理一组服务器机器,无疑会遇到以下问题打开SSH问题:
无法建立主机“host.example.org(1.2.3.4)”的真实性。RSA密钥指纹是1b:9b:b8:5e:74:b1:31:19:35:48:ba:7d:d0:01:f5。是否确实要继续连接(是/否)?
如果服务器是一台单用户机器,那么您是唯一需要登录的人,只需回答“是”一次,然后使用~/.ssh/known_hosts记录密钥指纹的文件将(排序)起作用,并保护您免受未来的人在其中的攻击。我说sort-of,因为如果您想从多台机器访问服务器,则需要同步已知主机以某种方式归档。一旦您的组织规模扩大,并且您不是唯一需要登录的人,那么在所有机器上的第一次连接时,每个人都只回答“是”的策略是不好的。每当有人对这些提示键入“是”时,有人成功地进行MITM攻击的风险就会增加。
设置一个(或多个)SSH证书颁发机构(CA)来创建SSH主机证书,并让您的用户信任此CA,这将允许您和您的用户通过SSH主机CA的间接方式自动信任主机的指纹。我很惊讶(但可能不应该如此)发现部署它很简单。即使是用存储在YubiKey近地天体上的硬件支持的钥匙来设置它也很容易。下面,我将解释如何为一个假设的组织设置此设置,其中两个人(系统管理员)负责安装和配置机器。
我将假设您已经有几个主机在运行,并且它们运行OpenSSH守护进程,所以它们有一个/etc/ssh/ssh_host_rsa_key*公共/私有密钥对,并且您有一个YubiKey近地天体PIV小程序,NEO处于CCID模式。我认为这无关紧要,但我正在运行以下组合Debian公司和Ubuntu公司机器。这个Yubico PIV工具用于配置YubiKey NEO,我将使用OpenSC(开放式供应链)的PKCS#11库将OpenSSH与YubiKey NEO连接。让我们安装一些工具:
apt-get安装yubikey-个性化yubico-piv-tool opensc-pkcs11 pcscd
您组织中负责签署SSH主机证书的每个人都需要YubiKey NEO。例如,只有两个人,但人数可能会更多。他们每个人都必须经历以下过程。
第一步是准备近地天体。第一种模式使用切换到CCID一些设备配置工具,比如尤比基人格化.
yk个性化-m1
然后在YubiKey NEO中准备PIV小程序。这包括在YubiKey NEO PIV简介但我会复制下面的命令。在断开连接的机器上执行此操作,保存在一个或多个安全介质上生成的所有文件,并将其存储在保险箱中。
user=西蒙key=`dd if=/dev/random bs=1 count=24 2>/dev/null|hexdump-v-e'/1“%02X”'`echo$key>ssh-$user-key.txtpin=`dd-if=/dev/random-bs=1 count=6 2>/dev/null|hexdump-v-e'/1“%u”'|cut-c1-6`echo$pin>ssh-$user-pin.txtpuk=`dd if=/dev/random bs=1 count=6 2>/dev/null|hexdump-v-e'/1“%u”'|cut-c1-8`echo$puk>ssh-$user-puk.txtyubico-piv-tool-一个set-mgm-key-n$keyyubico-piv-tool-k$key-a change-pin-P 123456-N$pinyubico-piv-tool-k$key-a change-puk-P 12345678-N$puk
然后为SSH主机CA生成RSA私钥,并为该密钥生成虚拟X.509证书。X.509证书的唯一用途是让PIV/PKCS#11满意——他们希望能够从智能卡中提取公钥,并通过X.509凭证实现。
openssl genrsa-out ssh-$user-ca-key.pem 2048openssl req-new-x509-batch-key ssh-$user-ca-key.pem-out ssh-$user-ca-crt.pem
您可以按如下方式将密钥和证书导入PIV小程序:
yubico piv工具-k$key-一个导入密钥-s 9c<ssh-$user-ca-key.pemyubico-piv-tool-k$key-导入证书-s 9c<ssh-$user-ca-crt.pem
您现在有一个SSH主机CA可以使用了!您要做的第一件事是提取CA的公钥,并为此使用OpenSSH的ssh-keygen,指定OpenSC的PKCS#11模块。
ssh-keygen-D/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so-e>ssh-$user-ca-key.pub
如果你碰巧使用使用gpg-agent/scdaemon的带有OpenPGP的YubiKey NEO,您可能会收到以下错误消息:
无插槽无法从pkcs11读取公钥
原因是scdaemon程序
以独占方式锁定智能卡,因此其他应用程序无法访问它。您需要终止scdaemon,具体操作如下:
gpg-connect-agent SCD KILLSCD SCD再见
ssh-keygen的输出可能如下所示:
ssh-rsa软件AAAAB3NzaC1yc2EAAAADAQABAAABAQCp+gbwBHova/OnWMj99A6HbeMAGE7eP3S9lKm4/fk86Qd9bzzNNz2TKM7V1IMEj0GxeiagDC9FMVIcbg5OaSDkuT0wGzLAJWgY2Fn3AksgA6cjA3fYQCw0Kq4/ySFX+Zb+A8zhJgCkMWT0ZB0ZEWi4zFbG4D/q6IvCAZBtdRKkj8nJtT5l3DGPWa2A2pp tGVDgs+0FYbHX0ynD0KfB4PmtR4fVQyGJjJ0MbF7fXFzQVcWiBtui8WR/Np9tvYLUJHkAXY/FjLOZf9ye0jLgP1yE10+ihe7BCxkM79GU9BsyRgRt3oArawUU6tLgkaMN8kZPKAdq0wxNauFtH公司
现在,组织中的所有用户都需要在其~/.ssh/known_hosts如下:
@证书授权*.example.com ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQCp+gbwBHova/OnWMj99A6HbeMAGE7eP3S9lKm4/fk86Qd9bzzNNz2TKM7V1IMEj0GxeiagDC9FMVIcbg5OaSDkuT0wGzLAJWgY2Fn3AksgA6cjA3fYQCw0Kq4/ySFX+Zb+A8zhJgCkMWT0ZB0ZEWi4zFbG4D/q6IvCAZBtdRKkj8nJtT5l3DGPWa2A2pp tGVDgs+0FYbHX0ynD0KfB4PmtR4fVQyGJjJ0MbF7fXFzQVcWiBtui8WR/Np9tvYLUJHkAXY/FjLOZf9ye0jLgP1yE10+ihe7BCxkM79GU9BsyRgRt3oArawUU6tLgkaMN8kZPKAdq0wxNauFtH公司
每个系统管理员都需要完成此过程,每个用户需要为每个系统管理员添加一行。虽然您可以在多个YubiKey近地物体上放置相同的密钥/证书,但为了允许用户只需将一行放入他们的文件中,如果这样做,那么处理撤销就变得有点复杂。如果同时使用多个CA密钥,则可以滚动到新的CA密钥,而不会影响生产。用户可能对不同的机器使用不同的策略,因此并非所有系统管理员都有权为组织中的所有机器创建主机密钥。
CA设置现在已经完成,但它自己没有做任何事情。我们需要使用CA签署一些主机密钥,并配置主机的sshd以使用它们。对于要为其创建密钥的每个主机host.example.com,您可以这样做:
h=主机.example.comscp根@$h:/etc/ssh/ssh_host_rsa_key.pub。gpg-connect-agent“SCD KILLSCD”“SCD BYE”/再见ssh-keygen-D/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so-s ssh-$user-ca-key.pub-I$h-h-n$h-V+52w ssh_host_rsa_key.pubscp ssh_host_rsa_key-cert.pub根@$h:/etc/ssh/
ssh-keygen命令将使用OpenSC的PKCS#11库与NEO上的PIV小程序对话,并提示您输入PIN。输入您在上面设置的PIN。命令的输出如下:
输入“PIV_II(PIV持卡人PIN)”的PIN:签名的主机密钥ssh_host_rsa_key-cert.pub:id“host.example.com”serial 0 for host.exmple.com有效期为2015-06-16T13:39:00至2016-06-14T13:40:58
主机现在安装了SSH主机证书。要使用它,您必须确保/etc/ssh/sshd_config具有以下行:
主机证书/etc/ssh/ssh_host_rsa_key-cert.pub
您需要重新启动sshd以应用配置更改。如果您现在尝试连接到主机,您可能仍将使用known_hosts指纹方法。因此,请从您的机器中删除指纹:
ssh-keygen-R$h
现在,如果您尝试将ssh连接到主机,并将-v参数用于ssh,您将看到以下内容:
调试1:服务器主机密钥:RSA-CERT 1b:9b:b8:5e:74:b1:31:19:35:48:ba:7d:d0:01:f5debug1:主机“Host.example.com”已知并与RSA-CERT主机证书匹配。
成功!
可能需要进一步讨论的一个方面是主机密钥。在这里,我只为主机的RSA密钥创建了主机证书。您还可以为DSA、ECDSA和Ed25519密钥创建主机证书。我没有这样做的原因是,在这个组织中,我们都使用GnuPG的gpg-agent/scdaemon和YubiKey NEO的OpenPGP Card Applet以及RSA密钥进行用户身份验证。因此,只有主机RSA密钥才相关。
YubiKey NEO密钥的撤销是通过要求用户删除其中一个系统管理员的对应行,并为系统管理员为其创建主机证书的主机重新生成主机证书来实现的。这是用户应该为您的组织至少拥有两个CA的原因之一,他们信任这两个CA来签署主机证书,这样他们就可以在不中断操作的情况下从一个CA迁移到另一个CA。