开源啦！「运维密码」小程序携全新 UI 开源啦！
继前一段时间 Linux 中国推出了“运维密码”微信小程序之后，经过开发团队的努力，重构了代码和使用了全新的现代 UI 后，同时在 GitHub 上开源了！“运维密码”小程序是一款工作在微信环境中的小程序，主要的功能是提供一款方便、可靠、美观的 TOTP 密钥管理工具。TOTP 是基于时间的一次性密钥方案，可以为用户认证提供双因子认证（2FA）的支持，即在通常的密码之外，还额外通过另外一种方式来交叉认证以提升安全。TOTP 认证，或者说双因子认证，在得到 Google 的大力推进之后，得到了广泛的互联网业界的支持，包括 Google、GitHub 等重视互联网安全的大型网站，也包括各类比特币网站，均支持 TOTP RFC 草案所规定的 TOTP 算法，并且 Google 还开源了其服务器端实现和客户端代码。除此之外，TOTP 还广泛应用于 Apple 、QQ、微博等各种需要双因子认证的场景中。除了网站之外，对于我们运维人员来说，TOTP 还可以应用与服务器的远程管理上，为 SSH、SFTP、FTP 等提供安全、简单、可靠的保障！新版本介绍好了，言归正传，我们来介绍一下本次新版本发布的情况。本次版本迭代，我们毫不谦虚的将版本定位到 1.0.x，我们认为“运维密码”的第一阶段功能目标已经达成，目前主要有：添加 TOTP 场景查看 TOTP 密钥修改和删除 TOTP 场景生成场景二维码分享（克隆） TOTP 场景给朋友本地备份 TOTP 场景信息本地恢复 TOTP 场景信息新的版本，采用了现代化的 UI 设计，看起来会更专业一点。场景列表场景列表会列出你已经添加的所有场景，最上方是时间进度条会显示场景密钥要更新的时间。在列表最下方，可以点击“添加场景”，调出摄像头来扫描密钥二维码来添加场景。点击场景列表中的场景密钥，会复制该密钥，以备手机上使用。场景详情点击场景列表中的场景（非密钥区域），可以查看场景具体详情，在此可以“分享”、“生成二维码”、“编辑”乃至于“删除”场景。分享：请点击页面右上角的菜单，可以将该场景分享给你的朋友，这样你的朋友就会得到一份该场景的完全复制品。切记！分享该场景会导致别人一直拥有该场景信息，并随时生成密钥（和你的场景生成相同的密钥）。如果这不是你希望的结果，切勿分享。生成二维码：可以生成一份该场景特定的二维码，将其打印出来贴于服务器等物理环境处，使用时直接用微信扫描即可调出“运维密码”小程序添加该场景。（注：该场景二维码不同于用于添加场景的种子二维码）编辑和删除：也可以对此场景进行编辑，尤其是你在添加场景时输入的信息不够明确时。也可以在此修改该场景的地点（我们后继的版本会推出地点感知功能）。生成的场景二维码场景备份与恢复场景备份信息，请截屏安全保存最重要的，“运维密码”小程序提供了备份和恢复功能，这是 Google 所开源的 Google 身份验证器所缺乏的最重要功能。有了备份功能，你就不用担心手机丢失或更换手机的麻烦了。目前我们提供了本地备份功能。限于微信小程序的限制，我们不能保存文件，只能将备份信息以二维码的方式备份出来。您可以将该二维码截屏，保存到安全可靠的地方，以备以后需要时恢复。现阶段没有提供远程云端备份功能的主要原因是用户可能忧虑云端备份的隐私保障，因此，我们在没有办法提供一个可靠备份，连服务提供方也不能破解的方法之前，不会提供云端备份功能。开源啦！作为一家倡导开源的社区，我们一定要亲自践行开源才算得上名至实归。因此，我们在代码重构稳定之后，第一时间就将“运维密码”开源了出来。开源地址在：https://github.com/LCTT/WeApp-Password本项目采用 AGPL 3.0 协议开源。欢迎大家复刻和提交拉取请求，有什么错误和功能建议，也非常欢迎大家给我们提出 issue。欢迎体验我们还开设了“运维密码”小程序体验群，欢迎大家到群内发表意见，以及寻求帮助。加入本群也可以及时体验我们发布前的体验版本，第一时刻尝鲜。运维密码体验群扫描识别添加上面的好友，验证信息：“运维密码”，可获得入群邀请。使用参考要在 OpenSSH 上使用 TOTP，请参考 netb2c 写的《SSH 安全加固篇：通过“运维密码”小程序实现 SSH 双因子认证》。我们还会陆续推出更多使用 “运维密码”的文章，也欢迎大家给我们投稿。哦，好像我没有说到如何找到“运维密码”——我想这一定难不倒你，不过假如你不知道的话，你可以如此这般：在微信中“发现”->“小程序”中搜索“运维密码”即可。什么，你的“发现”中没有“小程序”，那你可以扫描下面这个二维码，来尝鲜你的第一个小程序：运维密码致谢感谢开发团队的 @Bestony、betty、wxy；感谢撰写使用“运维密码”的文章的同学：netb2c；感谢“运维密码”体验群的诸位同学；感谢 Google 开源的程序；感谢微信提供的环境。
SSH 安全加固篇：通过“运维密码”小程序实现 SSH 双因子认证
本文讲述了如何通过 Linux中国 所开发的微信小程序“运维密码”实现在 Linux 系统上 OpenSSH 双因子认证，从而对 SSH 进行安全加固。背景近来很多知名企业都出现了密码泄露，通过单一的密码对敏感和重要信息进行保护已经面临越来越多的挑战，因此业内对多重认证的呼声也越来越高，而其中的双因子认证得到了业界的普遍认可。什么是双因子认证 双因子认证 （ Two-factor authentication ） （即 2FA），是一种通过组合两种不同的验证方式进行用户身份验证的机制。在这种多重认证的系统中，用户需要通过两种不同的认证程序：提供他们知道的信息（如用户名/密码）再借助其他工具提供用户所不知道的信息（如用手机生成的一次性密码）SSH 双因子认证实现思路在 SSH 服务器端安装 Google 身份验证器服务器端组件，这样，在使用密码或密钥登录 SSH 服务器时，同时通过与 Google 身份验证器相匹配的客户端所提供的验证信息来确认登录者的身份和权限。这里的客户端可以使用 Google 身份验证器 （ Google Authenticator ） 应用，也可以使用我们开发的、采用同一个 RFC 规范的“运维密码”微信小程序。Google 身份验证器所采用的算法规范基于 TOTP RFC 草案。（题外话，RSA 硬件令牌，也是采用了类似的机制，只不过客户端是硬件的；而最近 Apple 公司的一些服务所需要的双因子认证也是一样的，但是其用于呈现验证信息的是手机或平板上的 iOS 内部组件，非独立应用。）关于Google 身份验证器为了鼓励广泛采用双因子认证的方式，Google 公司发布了 Google 身份验证器 （ Google Authenticator ） ，这是一款开源的、可基于开放规则（如 HMAP/ 基于时间）生成一次性密码的软件。它是一款跨平台软件，可运行在 Linux、Android、iOS 上。Google 公司同时也支持 插件式鉴别模块 （ pluggable authentication module ） PAM ，使其能和其它适用于 PAM 进行验证的工具（如 OpenSSH）协同工作。Google 身份验证器分为两个部分，分别是服务器端组件和客户端应用，都称之为“Google 身份验证器”，这里，我们为了澄清起见，会在说明时指明。关于运维密码Google 公司所开发的身份验证器以简洁著称，但也因此缺乏一些必要的特性，比如备份功能——这使得使用该身份验证器的人时时处于手机丢失的恐慌之中。（虽然 Google 提供的服务器端和自身的服务也提供了紧急验证码，以用于这种情况下的自救，但是很多采用 Google 身份验证器的服务并不支持和提供紧急验证码）作为一家紧密关注于运维安全、积极倡导信息安全的技术社区，Linux 中国 久已有开发一个新的替代品的想法。恰逢微信推出小程序平台，我们感觉到这正是一个良机，可以充分利用到微信和小程序的便利之处，又适合小程序的使用情境。因此，由 Linux 中国旗下的 LCTT 技术组的白宦成同学独立开发了一款旨在移动互联网场景中提供更好的多因子认证体验的小程序：运维密码。顺便说一句，在产品初步成熟之后，我们已经将该小程序开源给社区，代码托管于 GitHub：https://github.com/LCTT/WeApp-Password ，希望更多的人能够受益和共同完善它，有什么功能需求、错误反馈请到 GitHub 上提出 issue，也欢迎发送拉取请求给我们。此外，大家在使用过程中，发现什么问题或需要帮助，也可以加入微信体验群：扫描识别添加上面的好友，验证信息：“运维密码”，可获得入群邀请。言归正传，我们来看看如何使用“运维密码”来为你的 SSH 服务提供双因子认证支持。如何开始首先我们需要一些准备工作：一台运行着 OpenSSH 服务（版本大于 6.2）的 Linux 主机一台能运行微信的智能手机一台支持 SSH 登录的终端在 Linux 系统中安装 Google 身份验证器服务器端组件第一步需要在运行着 OpenSSH 服务的 Linux 主机上安装 Google 身份验证器服务器端组件。按照如下步骤安装 Google 身份验证器及其 PAM 模块。用安装包安装 Google 身份验证器服务器端组件如果你不想自己构建 Google 身份验证器服务器端组件，在几个主流 Linux 发行版上有已经编译好的安装包。安装包里面包含 Google 身份验证器服务器端组件的二进制程序和 PAM 模块。在 Ubuntu 上安装 Google 身份验证器服务器端组件：sudo apt-get install libpam-google-authenticator 在 Fedora 上安装 Google 身份验证器服务器端组件：sudo dnf install google-authenticator 在 CentOS 上安装 Google 身份验证器服务器端组件，需要首先启用 EPEL 软件库，然后运行如下命令：sudo yum install google-authenticator 编译安装 Google 身份验证器服务器端组件提示：编译安装建议对 Linux、pam 等熟悉的同学采用。首先，安装构建 Google 身份验证器所需的软件包。在 Debian、 Ubuntu 或 Linux Mint 上：sudo apt-get install wget make gcc libpam0g-dev 在 CentOS、 Fedora 或 RHEL 上：sudo yum install wget make gcc pam-devel 然后下载 Google 身份验证器服务器端组件的源代码：git clone https://github.com/google/google-authenticator-libpam.git编译安装 Google 身份验证器服务器端组件：cd google-authenticator-libpam ./bootstrap.sh ./configure make 如果构建成功，你会在目录中看到 pam_google_authenticator.so 和 google-authenticator 两个二进制文件。最后，将 Google 身份验证器的服务器端组件安装到合适位置。其默认会安装到 /usr/local/lib/security 下，根据你的系统不同，你可能需要将其符号链接到 pam 库的位置（比如 CentOS 7 会在 /usr/lib64/security）。如下图所示：sudo make install 至此，Google 身份验证器服务器端组件安装完成。配置 Google 身份验证器服务器端组件及“运维密码”小程序完成 Google 身份验证器服务器端组件的安装我们仅仅完成了第一步，接着需要对 Google 身份验证器服务器端组件、“运维密码”、OpenSSH 进行配置才能达到我们预期的效果。配置 google-authenticator 及生成验证密钥使用以下命令生成验证密钥：./google-authenticator 生成验证密钥的时候，会再次确认信息。Do you want authentication tokens to be time-based (y/n) 意思是：你想要生成基于时间生成验证码吗？这里需要需要输入 y。输入 y之后你将看到一个代表着该“场景”密钥的二维码和密钥字符串，它使用如下二维码图形格式表示我们数字形态的密钥（这里也提供了一个用于在浏览器中再次显示该二维码的 URL，但是需要翻墙）。接着我们要用到它在“运维密码”上完成配置。（安装 google-authenticator 过程中若出现二维码无法显示的问题，请检查系统中是否安装了二维码生成器：rpm - q qrencode，若未安装，请运行命令 yum install qrencode -y 安装后重试。）在二维码和密钥字符串后面，接着显示了一个当前的校验码和几个紧急密钥。紧急密钥你可以另行保存的一个安全的地方，以防你在无法使用 Google 身份验证器应用或“运维密码”时使用（紧急密钥是 8 位的，不同于普通的 6 位密钥，也是一次性使用的）。保存 Google 服务器端组件的配置文件，Google 身份验证器虽然运行了，但是相关设置还没有保存，接下来会提示保存：Do you want me to update your "/root/.google_authenticator" file? (y/n) 意思是：你想将配置文件更新到 /root/.google_authenticator 保存吗？输入 y 回车。禁止同一令牌多次登录Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) 意思是：你是否要禁用同一密钥多次登录，这将限制你每 30 秒只能使用该密钥登录一次，但这能够让你可以更多地被提醒受到了中间人攻击，甚至能够防止这种攻击。输入 y 回车。时间容错设置By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) 意思是：默认情况下，密钥在 30 秒内有效，为了防止由于客户端与服务器时间偏移（时间相差太大）导致认证失败，google 身份验证器设计了时间容错措施。可以让你使用与当前时间偏移 1 到 4 分钟的密钥。这个可根据实际情况进行配置，一般一分钟就足够了。输入 y回车。暴力破解防护If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) 意思是：为了避免暴力破解，可以启用速率限制，默认情况下，每 30 秒只能尝试 3 次。输入 y回车。配置完成配置完成后会在home目录下生成一个权限为 400 的隐藏文件，如下图所示：配置运维密码打开微信小程序打开微信，依次点击“发现”，“小程序”，输入“运维密码”并搜索。或长按识别下列二维码：点击“运维密码”进入应用，然后点击列表下方的“添加场景”：这会调起“扫一扫”功能，请扫描配置 google-authenticator 时所生成的二维码，然后会识别出该场景信息，你可以根据需要修改场景信息，点击确定添加场景。这样 Google 身份验证器就和“运维密码”匹配上了。下面我们要使 SSH 服务可以支持该验证。配置 SSH 服务添加认证模块使用如下命令在 /etc/pam.d/sshd 文件添加认证模块：echo "auth required pam_google_authenticator.so" >>/etc/pam.d/sshd 在 Centos 6.6 或更低的版本中如果遇到无法进行 google-authenticator 验证的情况，请将 auth required pam_google_authenticator.so放在 /etc/pam.d/sshd 文件的最顶端进行测试一下。配置挑战式密码认证：sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config 重启 sshd 服务：systemctl restart sshd.service 切记，如果你是远程登录到服务器上配置，切勿退出当前的 SSH 会话，而应该另外开一个会话去测试 SSH 登录。重启不会中断当前的 SSH 会话。测试登录以上配置完成基本上就搞定了，下面我们进行测试。密码登录测试另外开一个终端窗口进行连接，不要关闭当前的 SSH 连接。输入命令登录主机：ssh root@10.112.2.3 首先输入服务器的密码，接着会让输入“运维密码”生成的 6 位数字密钥。如下图：我们可以看到，在登录的时候，需要配合“运维密码”才能登录服务器。公钥登录测试如果使用公钥登录呢？以上配置是不是也是需要配合“运维密码”才能登录的，我们进行验证一下：首先，我们将本机的公钥复制到远程机器的 authorized_keys 文件中。ssh-copy-id root@10.112.2.3 登录测试：我们可以看到，不需要输入任何密码和一次性密钥，直接登录到了系统。结合运维密码配置增强型SSH安全选项针对上面公钥登录的测试，如果认为还不是很安全，我们可以设定如下登录场景：公钥 + 密码 + 运维密码，我们需要如何做呢？配置 SSH 公钥双因子修改 /etc/ssh/sshd_config 配置文件：echo "AuthenticationMethods publickey,keyboard-interactive:pam" >>/etc/ssh/sshd_config 重启 SSH 服务：systemctl restart sshd.service 登录测试（同样，请新开窗口）：ssh root@10.112.2.3 可以看到，登录的时候是需要验证公钥、密码，及输入“运维密码”生成的密钥才能登录到系统。没有密钥的情况下尝试登录测试，如下图：总结至此，本文结束，更多的使用细节可以参照小程序内的帮助，或此文。如有错误及不足欢迎指正。也欢迎大家加入到这个小程序的开发当中，将这个小程序应用到你的应用场景中。
Linux 中国发布的第一款小程序：「运维密码」，你的好帮手
运维密码是什么？这是我们 Linux 中国旗下的 LCTT 技术组开发的第一款小程序，基于微信平台提供 OTP 口令管理功能。想必绝大部分系统管理员都知道 OTP ，OTP 即 一次性口令 （ One-Time Password ） ，最常见的一次性口令是 基于时间的一次性口令 （ Time-based One-time Password ） （TOTP），即每隔一段时间（如 60 秒）就生成一个一次性的六位数字的密码。这种一次性口令可以用于各种登录验证系统，比如 SSH、网站登录等等，只要验证系统和验证者持有相同的 OTP 种子，并采用一致的算法即可。最常见的方式是采用 Google 身份验证器 （ Google Authenticator ） 来提供基于时间的一次性口令（TOTP），也有采用 RSA 等公司提供的硬件 OTP 令牌进行一次性口令管理的。而我们这次推出的“运维密码”，即是一款采用和 Google 身份验证器 Google Authenticator 相同的算法的微信小程序。为什么要开发这样的一款小程序呢，请听我道来~缘起为什么要做这样一款小程序？ 大概是因为 Google 身份验证器 Google Authenticator 无法满足我的需要，没有办法备份场景。这让我很是担心，假如我丢失了手机，我可能再也无法登录到我的服务器上去了。 而且本身这个工具不是一个高频的应用，所以我们在考虑，能不能有这样的一种可能，让我们可以很方便地使用，同时也不会像App 一样过于侵扰我们的生活。 微信小程序出现后，其随用随走的理念深得我们的喜爱。其强大的线上线下融合能力，也非常适合我们的需求。所以在微信小程序出现后，我们就一直在关注，看我们的想法能不能在微信小程序上得以实现。为什么选择微信小程序微信小程序在某些方面的理念和我们对于这款工具的理念是一致的。随用随走：我们希望我们的产品不会给用户产生过多的困扰，而是很方便就可以使用它。作为一款安全工具，我们不希望它对用户的生活产生太多的麻烦。线上线下融合：微信小程序的形式让我们的用户只需要打开微信，扫一扫线下的二维码，就可以快捷、方便的拿到自己需要的动态密码。“运维密码”的优势备份功能由于我们对于云服务的安全和隐私的担忧，所以我们将备份的功能做在了本地。当然，后续我们也会根据用户的不同偏好而推出基于云端的备份。资源占用小“运维密码”小程序不超过 200K，你只需要花费很少的流量，就可以实现和 Google 身份验证器 Google Authenticator 的全部功能。产品无感知迭代我们会对“运维密码”不断的更新，当然，你可以无需担心更新带来的数据问题。我们的小程序会自动帮你做好升级的事情。开始使用你可以直接在微信小程序中的搜索框内搜索：或者，在微信公众号“运维伙伴”的详情页中也有“运维密码”的入口：或者，扫描下方二维码，添加运维密码小程序：我还制作了一个简单的视频：如何加入自己的场景？打开“运维密码”，点击右下角的“扫描二维码”的按钮：扫描服务商给你的“种子二维码”（这里包含了场景相关的信息），会自动识别，并且跳转到添加信息的界面： 确认信息无误后，点击添加。添加成功后，即可跳转到到运维密码的详情页： 视频操作如下：如何获取密码？在“运维密码”的首页，你可以看到你所添加的场景的列表，从中可以直接看到当前的一次性密码。也可以用下述的场景二维码来获取。生成场景二维码点击某个场景，可以查看该场景的详情，在此可以生成该场景的场景二维码（不同于之前的服务商所提供的“种子二维码”）。将此二维码打印出来，贴于所应用的场景附近，如服务器或终端旁边，这样你可以在该服务器或终端旁边直接用微信扫描即可马上显示该场景当前的一次性密码。备份与恢复作为最重要的差异性功能，“运维密码”提供了场景的备份和恢复功能，从此再也不怕丢失了手机后无法登入。备份首先进入“设置”，点击“本地场景备份”，会显示你的所有场景：确认后，会显示一个二维码图片，这个图片就是你的场景备份信息，千万保存好，也不要随意给别人。视你所保存的场景多寡，这个二维码图片也尺寸和信息密度也有所不同。生成该备份信息会稍微有一些慢。对此备份，可以截屏保存到本地，妥善保管即可。下一步我们还会推出加密保存，需要使用密码才能解开。恢复如果因为某种原因，删除了场景或丢失了场景，你可以通过之前备份信息进行恢复，只需要选择你的备份二维码即可。重复的场景并不会覆盖。下一步，我们也会推出基于公有云或私有云的云端备份功能。更多功能更多使用细节，您可以亲自试试。我们也有一大波新的功能增强正在赶来~入群体验对此小程序感兴趣的同学，欢迎加入专属体验群，提出您的建议和反馈：扫描上述二维码并添加好友后，验证信息：“运维密码”，即可获得加群邀请。寄语我们希望运维密码能够给你带来更加舒服的体验，如果你觉得哪里有不足的，也希望你能够告诉我们，让我们一起把它做的更好。后继我们将对此小程序开源，也欢迎大家提供反馈、补丁和功能请求。