自从弄了这个个人网站,时不常的需要登录系统做些备份升级什么的。用SSH登录的话还要记一个超级复杂的密码,太累了。想换成密匙登录,这样省的记那么多密码。但又有多个地点登录多个服务器的需求,这样管理多份密匙太麻烦了。想着有没有什么安全简单的方式呢?网上查了一下,觉得OpenGPG+YubiKey的方案不错。密匙可以共用GPG产生的密匙,且私匙存储在再YubiKey里面随身携带,只要YubiKey保存好就没问题。这样的好处有以下几个:
一、不用维护多份私匙公匙。
二、YubiKey里面的密匙不能读出,这样即便再某些不太安全的电脑上也可以使用,不用担心私匙泄露。
三、GPG可以对文件进行高强度加密和签名。
因为常用电脑为Windows,所以装了gpg4win-4.0.0。Yubikey是淘宝买的Yubikey 5 NFC这里需要强调一下,GPG这个用的人还是太少,网上教程的坑太多,我会把我遇到的坑说一遍,避免更多人崴脚。
坑一、别以为装了gpg4win有了GUI界面就可以不用学习用命令行了。做梦吧,gpg4win的GUI界面就是为了给纯小白,只有加密解密的需求和用outlook发邮件的人准备的。确实用这几个功能,点几下鼠标就好了。但是,但凡你想用点其他功能,GUI界面要不没有对应选项,要不就是表述不清,反正难用的要死。所以,命令行才是正途。
安装好之后,用图形界面的工具Kleopatra生成新的密匙对。图形化操作极其简单,直接新建密匙对,录入姓名、邮件地址,勾选使用密码保护密匙。然后选择高级设置,加密方式我选的RSA 4096位(主要是为了兼容性,RSA虽然慢点但几乎所有的程序都支持,椭圆曲线加密虽然好用,但有的还是支持不太好),去掉了主密匙的签名(signing)功能,只保留默认无法修改的选项(这样做的的目的是:主密匙(私匙)只用来给子密匙授权,其他的签名、加密、认证功能全都用子密匙分开。这样的好处是,日常只用子密匙,如果不小心泄漏了,可以用主密匙撤回换新某一个,而不用更新所有的。
从这里开始开始全部使用命令行模式了,抛弃图形界面。首先新建3个子密匙,分别授予加密(E)签名(S)认证(A)功能。然后将私匙、子密匙、撤回证书等文件备份保存好。然后将3个子密匙迁移到Yubikey中。(这个过程网上教程大把的,我就没必要在写一遍了。Yubikey的GitHub页面写的详细无比,需要的自己看吧:https://github.com/drduh/YubiKey-Guide#creating-keys)
这里用到的命令大致有下面这些:
gpg --help #列出所有命令
gpg --expert --edit-key #进入密匙编辑模式(专家模式),进入后可以输入?获得更多命令说明。如:addkey增加子密匙,keytocard将密匙写入Yubikey等
gpg --list-keys #列出所有密匙
gpg --list-secret-key #列出所有私匙
gpg --card-edit #进入Yubikey卡设置模式,可以设置一些公匙地址、PIN、持有者信息等。个人感觉最有用的是公匙URL这个,设好之后。以后到任何一台电脑上,只要一个fetch命令,所有信息就会自动弄好,直接用就行了。
坑二、还是和图形界面有关。在图形界面里面根本看不出密匙到底是否从电脑上删除了。我删掉私匙之后,发现只要你的Yubikey插在电脑上,Kleopatra的私匙导出功能就一直可以用。我还以为自己有什么操作问题。结果最后开始用命令模式才发现,电脑里面的只是一个类似快捷方式的东西,将密匙指向Yubikey,即便导出了也不是真的私匙。完全没问题。就是图形界面表述不清。在命令行里面就显示的很清楚。存在本机的子密匙用ssb表述,挪到Yubikey之后就变成了ssb>。主密匙(私匙)删除前是sec,之后会用sec #表示。非常明确的告诉你电脑里面已经没有了。导出私匙功能直接就提示不可用,而不会像图形界面一样导出一个不知道什么玩意的东西。
对了,记得导出SSH认证密匙(不用担心会有很多个,只有认证功能(A)的密匙可以导出来)和认证密匙(A)的keygrip,用一下2个命令得到。记下来后面会用到。
gpg -k --with-keygrip #得到keygrip
gpg --export-ssh-key #得到SSH认证公匙
做完以上工作之后,还需要设置一下本地系统和远端的服务器系统,大致如下:
本地Windows系统:
进入并编辑(%APPDATA%/gnupg/gpg-agent.conf),没有就手动建立一个。确保其中有以下内容:
enable-putty-support #开启GPG的putty支持
enable-ssh-support #开始GPG的ssh支持,如果希望使用系统自带的OpenSSH,就加上这行,否则不用
编辑(%APPDATA%/gnupg/sshcontrol)文件,在其中加入以下内容:
# List of allowed ssh keys. Only keys present in this file are used
# in the SSH protocol. The ssh-add tool may add new entries to this
# file to enable them; you may also add them manually. Comment
# lines, like this one, as well as empty lines are ignored. Lines do
# have a certain length limit but this is not serious limitation as
# the format of the entries is fixed and checked by gpg-agent. A
# non-comment line starts with optional white spaces, followed by the
# keygrip of the key given as 40 hex digits, optionally followed by a
# caching TTL in seconds, and another optional field for arbitrary
# flags. Prepend the keygrip with an '!' mark to disable it.
# 这上面的内容都是文件自带的说明,不用管。
B51A5EC70A47318365AB5C532FA2D669882EAB87 #这个是前面导出的认证密匙(A)的keygrip,替换成你自己的。
#切记文件最后一定要留一个空行。
启动GPG的认证代理程序。用下面这个命令:
gpg-connect-agent /bye
如果报错不行,就多加一个命令,依次执行下面这2个命令:
gpg-connect-agent KILLAGENT /bye
gpg-connect-agent /bye
远端的服务器系统(以Linux为例):
进入并编辑/etc/ssh/sshd_config,确保一下内容存在。一般文件里面都有,不过被注释掉了。去掉注释就行
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
保存之后,用这个命令重启SSH服务:
/etc/init.d/ssh restart #或者用systemctl restart ssh也行
回到用户主目录,建立:.ssh/authorized_keys文件。命令如下:
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
最后,编辑.ssh/authorized_keys文件。将你的GPG认证(A)子密匙导出的SSH密匙放在这个文件里面。我随便敲了个范例在下面,大致就这样子。
注意:所有东西都是一行的。至此,服务器端设置完毕。
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDbq3KG/lgpuPtIz0ipCKxd3+iH6mGDjc8v1Mvr3zJy1V8zc44o9lQmkAJq7MHxegHwybOD17BF80YlpcaxCGwlUuWnnRtqr4GELAJ7SDPd5fPbkK/9rKea37JJMmcik6YpeqZ23plQrkTS5m1rvOcxKRwHXxNoJVqpLaRSQSAd19dV/a6Y8lFSddPhTABxUX20kLhfkEg6LRmdNg/aYDIy7Q7D7I3/t2+j0L/WPd4JZG8lWJ7LhMYMFCPWVIPGE47xg2kwh/zkfIYvs3EZqpWYXegoAkuY/D/yyVg9UWE3Mn9Uf+KIAS37Y0JhJ+zSks2kBYxyrGxbA1zR9bFzVLsrxWXp0QdLvXSBbn/Es6tXaTWXpeHQ8EvyUDbMVlXXy0gpjuSfiR80hXSeOWOIfyJwDYNSG8KQiAHpSk3uhxI2leFOG9XoKnqlVJih9DBL8iorJhpfOJBDfTaj2YJ4qNd0DxfNjAiyCYOXGNfIui/4v/Da/HsBMk5vMcyRrtiEPYUUuta7UDbsPZtSb/AH6tM0AtPVZToIBlUvishyn1+7kvB/ByRWNCOvT0FazoOMcL4TRTqARAjplgBSYOQ+rlcQrfx0plC1pVme2coxrNCpy89CVi/SPk79kQ1qUqT/XSBJ/8iRFRogO/YQWl68cASIBkrEumZcHanDYF1q1CMwqQ==openpgp:0x19BA20EF
至此,打开Putty,用SSH连接服务器,你会发现,系统先要你插入Yubikey,插上后输入PIN码,就会直接用Yubikey生成的密匙登录进去了。再也不用记繁琐的密码了。而且安全性也有保障。
最后有人会有疑问,我不小心把Yubikey丢了咋办,不是登录不了系统了。没关系。让你插入Yubikey的时候选取消,就会跳出密码登录了。
最最后,把你所有的服务器都照这样设置一遍,并且服务器密码改成一个超长超复杂的,记在纸上放进你最秘密的地方做备份(反正以后也用不着了,就是以防万一)。然后就开心的享用安全便捷的密匙登录吧。
后记:Yubikey不止文中一个应用,还可以用来登录Windows等几乎所有的系统、登录google等云服务,充分实现一张身份卡,开遍所有门的体验。大家有兴趣的话积极开发哦。