标签 OTP 下的文章

每天似乎都有一个安全漏洞的新闻报道,说我们的数据会因此而存在风险。尽管 SSH 是一种远程连接系统的安全方式,但你仍然可以使它更安全。本文将向你展示如何做到这一点。

此时 双因子验证 two-factor authentication (2FA)就有用武之地了。即使你禁用密码并只允许使用公钥和私钥进行 SSH 连接,但如果未经授权的用户偷窃了你的密钥,他仍然可以借此访问系统。

使用双因子验证,你不能仅仅使用 SSH 密钥连接到服务器,你还需要提供手机上的验证器应用程序随机生成的数字。

本文展示的方法是 基于时间的一次性密码 Time-based One-time Password (TOTP)算法。Google Authenticator 用作服务器应用程序。默认情况下,Google Authenticator 在 Fedora 中是可用的。

至于手机,你可以使用与 TOTP 兼容的任何可以双路验证的应用程序。Andorid 或 iOS 有许多可以与 TOTP 和 Google Authenticator 配合使用的免费应用程序。本文与 FreeOTP 为例。

安装并设置 Google Authenticator

首先,在你的服务器上安装 Google Authenticator。 $ sudo dnf install -y google-authenticator

运行应用程序:

$ google-authenticator

该应用程序提供了一系列问题。下面的片段展示了如何进行合理的安全设置:

Do you want authentication tokens to be time-based (y/n) y
Do you want me to update your "/home/user/.google_authenticator" file (y/n)? y

这个应用程序为你提供一个密钥、验证码和恢复码。把它们放在安全的地方。如果你丢失了手机,恢复码是访问服务器的唯一方式。

设置手机验证

在你的手机上安装验证器应用程序(FreeOTP)。如果你有一台安卓手机,那么你可以在 Google Play 中找到它,也可以在苹果 iPhone 的 iTunes 商店中找到它。

Google Authenticator 会在屏幕上显示一个二维码。打开手机上的 FreeOTP 应用程序,选择添加新账户,在应用程序顶部选择二维码形状工具,然后扫描二维码即可。设置完成后,在每次远程连接服务器时,你必须提供验证器应用程序生成的随机数。

完成配置

应用程序会向你询问更多的问题。下面示例展示了如何设置合理的安全配置。

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) 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) n
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) y

现在,你必须设置 SSH 来利用新的双路验证。

配置 SSH

在完成此步骤之前,确保你已使用公钥建立了一个可用的 SSH 连接,因为我们将禁用密码连接。如果出现问题或错误,一个已经建立的连接将允许你修复问题。

在你的服务器上,使用 sudo 编辑 /etc/pam.d/sshd 文件。

$ sudo vi /etc/pam.d/ssh

注释掉 auth substack password-auth 这一行:

#auth       substack     password-auth

将以下行添加到文件底部:

auth sufficient pam_google_authenticator.so

保存并关闭文件。然后编辑 /etc/ssh/sshd_config 文件:

$ sudo vi /etc/ssh/sshd_config

找到 ChallengeResponseAuthentication 这一行并将其更改为 yes

ChallengeResponseAuthentication yes

找到 PasswordAuthentication 这一行并将其更改为 no

PasswordAuthentication no

将以下行添加到文件底部:

AuthenticationMethods publickey,password publickey,keyboard-interactive

保存并关闭文件,然后重新启动 SSH:

$ sudo systemctl restart sshd

测试双因子验证

当你尝试连接到服务器时,系统会提示你输入验证码:

[user@client ~]$ ssh [email protected]
Verification code:

验证码由你手机上的验证器应用程序随机生成。由于这个数字每隔几秒就会发生变化,因此你需要在它变化之前输入它。

如果你不输入验证码,你将无法访问系统,你会收到一个权限被拒绝的错误:

[user@client ~]$ ssh [email protected]
Verification code:
Verification code:
Verification code:
Permission denied (keyboard-interactive).
[user@client ~]$

结论

通过添加这种简单的双路验证,现在未经授权的用户访问你的服务器将变得更加困难。


via: https://fedoramagazine.org/two-factor-authentication-ssh-fedora/

作者:Curt Warfield 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

介绍

今天,Fedora 提供了多种方式来提高我们账户的身份认证的安全性。当然,它有我们熟悉的用户名密码登录方式,它也同样提供了其他的身份认证选项,比如生物识别、指纹、智能卡、一次性密码,甚至是 询问-响应 challenge-response 身份认证。

每种认证方式都有明确的优缺点。这点本身就可以成为一篇相当冗长的文章的主题。Fedora 杂志之前就已经介绍过了这其中的一些选项:

在现在的 Fedora 版本中,最安全的方法之一就是离线硬件询问-响应。它也同样是最容易部署的方法之一。下面是具体方法。

询问-响应认证

从技术上来讲,当你输入密码的时候,你就正在响应用户名询问。离线的询问、响应包含了这些部分:首先是需要你的用户名,接下来,Fedora 会要你提供一个加密的物理硬件的令牌。令牌会把另一个其存储的加密密钥通过 可插入式身份认证 Pluggable Authentication Module 模块(PAM)框架来响应询问。最后,Fedora 才会提示你输入密码。这可以防止其他人仅仅使用了找到的硬件令牌,或是只使用了账户名密码而没有正确的加密密钥。

这意味着除了你的账户名密码之外,你必须事先在你的操作系统中注册了一个或多个加密硬件令牌。你必须保证你的物理硬件令牌能够匹配你的用户名。

一些询问-响应的方法,比如一次性密码(OTP),在硬件令牌上获取加密的代码密钥,然后将这个密钥通过网络传输到远程身份认证服务器。然后这个服务器会告诉 Fedora 的 PAM 框架,这是否是该用户的一个有效令牌。如果身份认证服务器在本地网络上,这个方法非常好。但它的缺点是如果网络连接断开或是你在没有网的远程端工作。你会被锁在系统之外,直到你能通过网络连接到身份认证服务器。

有时候,生产环境会采用通过 Yubikey 使用一次性密码(OTP)的设置,然而,在家庭或个人的系统上,你可能更喜欢询问-响应设置。一切都是本地的,这种方法不需要通过远程网络调用。下面这些过程适用于 Fedora 27、28 和 29.

准备

硬件令牌密钥

首先,你需要一个安全的硬件令牌密钥。具体来说,这个过程需要一个 Yubikey 4、Yubikey NEO,或者是最近发布的、同样支持 FIDO2 的 Yubikey 5 系列设备。你应该购买它们中的两个,一个做备份,以避免其中一个丢失或遭到损坏。你可以在不同的工作地点使用这些密钥。较为简单的 FIDO 和 FIDO U2F 版本不适用于这个过程,但是非常适合使用 FIDO 的在线服务。

备份、备份,以及备份

接下来,为你所有的重要数据制作备份,你可能想在克隆在 VM 里的 Fedora 27/28/29 里测试配置,来确保你在设置你自己的个人工作环境之前理解这个过程。

升级,然后安装

现在,确定你的 Fedora 是最新的,然后通过 dnf 命令安装所需要的 Fedora Yubikey 包。

$ sudo dnf upgrade
$ sudo dnf install ykclient* ykpers* pam_yubico*

如果你使用的是 VM 环境,例如 Virtual Box,确保 Yubikey 设备已经插进了 USB 口,然后允许 VM 控制的 USB 访问 Yubikey。

配置 Yubikey

确认你的账户访问到了 USB Yubikey:

$ ykinfo -v
version: 3.5.0

如果 Yubikey 没有被检测到,会出现下面这些错误信息:

Yubikey core error: no yubikey present

接下来,通过下面这些 ykpersonalize 命令初始化你每个新的 Yubikey。这将设置 Yubikey 配置插槽 2 使用 HMAC-SHA1 算法(即使少于 64 个字符)进行询问响应。如果你已经为询问响应设置好了你的 Yubikey。你就不需要再次运行 ykpersonalize 了。

ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible

一些用户在使用的时候将 YubiKey 留在了他们的工作站上,甚至用于对虚拟机进行询问-响应。然而,为了更好的安全性,你可能会更愿意使用手动触发 YubiKey 来响应询问。

要添加手动询问按钮触发器,请添加 -ochal-btn-trig 选项,这个选项可以使得 Yubikey 在请求中闪烁其 LED。等待你在 15 秒内按下硬件密钥区域上的按钮来生成响应密钥。

$ ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -ochal-btn-trig -oserial-api-visible

为你的每个新的硬件密钥执行此操作。每个密钥执行一次。完成编程之后,使用下面的命令将 Yubikey 配置存储到 ~/.yubico

$ ykpamcfg -2 -v
debug: util.c:222 (check_firmware_version): YubiKey Firmware version: 4.3.4

Sending 63 bytes HMAC challenge to slot 2
Sending 63 bytes HMAC challenge to slot 2
Stored initial challenge and expected response in '/home/chuckfinley/.yubico/challenge-9992567'.

如果你要设置多个密钥用于备份,请将所有的密钥设置为相同,然后使用 ykpamcfg 工具存储每个密钥的询问-响应。如果你在一个已经存在的注册密钥上运行 ykpersonalize 命令,你就必须再次存储配置信息。

配置 /etc/pam.d/sudo

现在要去验证配置是否有效,在同一个终端窗口中,你需要设置 sudo 来要求使用 Yubikey 的询问-响应。将下面这几行插入到 /etc/pam.d/sudo 文件中。

auth required pam_yubico.so mode=challenge-response

将上面的 auth 行插入到文件中的 auth include system-auth 行的上面,然后保存并退出编辑器。在默认的 Fedora 29 设置中,/etc/pam.d/sudo 应该像下面这样:

#%PAM-1.0
auth required pam_yubico.so mode=challenge-response
auth include system-auth
account include system-auth
password include system-auth
session optional pam_keyinit.so revoke
session required pam_limits.so
session include system-auth

保持这个初始的终端窗口打开,然后打开一个新的终端窗口进行测试,在新的终端窗口中输入:

$ sudo echo testing

你应该注意到了 Yubikey 上的 LED 在闪烁。点击 Yubikey 按钮,你应该会看见一个输入 sudo 密码的提示。在你输入你的密码之后,你应该会在终端屏幕上看见 “testing” 的字样。

现在去测试确保失败也正常,启动另一个终端窗口,并从 USB 插口中拔掉 Yubikey。使用下面这条命令验证,在没有 Yubikey 的情况下,sudo 是否会不再正常工作。

$ sudo echo testing fail

你应该立刻被提示输入 sudo 密码,但即使你输入了正确密码,登录也应该失败。

设置 Gnome 桌面管理器(GDM)

一旦你的测试完成后,你就可以为图形登录添加询问-响应支持了。将你的 Yubikey 再次插入进 USB 插口中。然后将下面这几行添加到 /etc/pam.d/gdm-password 文件中:

auth required pam_yubico.so mode=challenge-response

打开一个终端窗口,然后运行下面这些命令。如果需要,你可以使用其他的编辑器:

$ sudo vi /etc/pam.d/gdm-password

你应该看到 Yubikey 上的 LED 在闪烁,按下 Yubikey 按钮,然后在提示符处输入密码。

修改 /etc/pam.d/gdm-password 文件,在已有的 auth substack password-auth 行上添加新的行。这个文件的顶部应该像下面这样:

auth [success=done ignore=ignore default=bad] pam_selinux_permit.so
auth required pam_yubico.so mode=challenge-response
auth substack password-auth
auth optional pam_gnome_keyring.so
auth include postlogin

account required pam_nologin.so

保存更改并退出编辑器,如果你使用的是 vi,输入键是按 Esc 键,然后在提示符处输入 wq! 来保存并退出。

结论

现在注销 GNOME。将 Yubikey 插入到 USB 口,在图形登录界面上点击你的用户名。Yubikey LED 会开始闪烁。触摸那个按钮,你会被提示输入你的密码。

如果你丢失了 Yubikey,除了重置密码之外,你还可以使用备份的 Yubikey。你还可以给你的账户增加额外的 Yubikey 配置。

如果有其他人获得了你的密码,他们在没有你的物理硬件 Yubikey 的情况下,仍然不能登录。恭喜!你已经显著提高了你的工作环境登录的安全性了。


via: https://fedoramagazine.org/login-challenge-response-authentication/

作者:nabooengineer 选题:lujun9972 译者:hopefully2333 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

继前一段时间 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 开源的程序;

感谢微信提供的环境。

本文讲述了如何通过 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.sogoogle-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 的隐藏文件,如下图所示:

配置运维密码

打开微信小程序

打开微信,依次点击“发现”,“小程序”,输入“运维密码”并搜索。或长按识别下列二维码:

点击“运维密码”进入应用,然后点击列表下方的“添加场景”:

 title=

这会调起“扫一扫”功能,请扫描配置 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 [email protected]

首先输入服务器的密码,接着会让输入“运维密码”生成的 6 位数字密钥。

 title=

如下图:

我们可以看到,在登录的时候,需要配合“运维密码”才能登录服务器。

公钥登录测试

如果使用公钥登录呢?以上配置是不是也是需要配合“运维密码”才能登录的,我们进行验证一下:

首先,我们将本机的公钥复制到远程机器的 authorized_keys 文件中。

ssh-copy-id [email protected]

登录测试:

我们可以看到,不需要输入任何密码和一次性密钥,直接登录到了系统。

结合运维密码配置增强型SSH安全选项

针对上面公钥登录的测试,如果认为还不是很安全,我们可以设定如下登录场景:公钥 + 密码 + 运维密码,我们需要如何做呢?

配置 SSH 公钥双因子

修改 /etc/ssh/sshd_config 配置文件:

echo "AuthenticationMethods publickey,keyboard-interactive:pam" >>/etc/ssh/sshd_config

重启 SSH 服务:

systemctl restart sshd.service

登录测试(同样,请新开窗口):

ssh [email protected]

可以看到,登录的时候是需要验证公钥、密码,及输入“运维密码”生成的密钥才能登录到系统。

没有密钥的情况下尝试登录测试,如下图:

总结

至此,本文结束,更多的使用细节可以参照小程序内的帮助,或此文

如有错误及不足欢迎指正。也欢迎大家加入到这个小程序的开发当中,将这个小程序应用到你的应用场景中。

运维密码是什么?

这是我们 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 的全部功能。

产品无感知迭代

我们会对“运维密码”不断的更新,当然,你可以无需担心更新带来的数据问题。我们的小程序会自动帮你做好升级的事情。

开始使用

你可以直接在微信小程序中的搜索框内搜索:

微信小程序搜索框

或者,在微信公众号“运维伙伴”的详情页中也有“运维密码”的入口:

运维伙伴

或者,扫描下方二维码,添加运维密码小程序:

我还制作了一个简单的视频:

如何加入自己的场景?

打开“运维密码”,点击右下角的“扫描二维码”的按钮:

扫码

扫描服务商给你的“种子二维码”(这里包含了场景相关的信息),会自动识别,并且跳转到添加信息的界面:

确认信息

确认信息无误后,点击添加。添加成功后,即可跳转到到运维密码的详情页:

添加成功

视频操作如下:

如何获取密码?

在“运维密码”的首页,你可以看到你所添加的场景的列表,从中可以直接看到当前的一次性密码。也可以用下述的场景二维码来获取。

生成场景二维码

点击某个场景,可以查看该场景的详情,在此可以生成该场景的场景二维码(不同于之前的服务商所提供的“种子二维码”)。将此二维码打印出来,贴于所应用的场景附近,如服务器或终端旁边,这样你可以在该服务器或终端旁边直接用微信扫描即可马上显示该场景当前的一次性密码。

备份与恢复

作为最重要的差异性功能,“运维密码”提供了场景的备份和恢复功能,从此再也不怕丢失了手机后无法登入。

备份

首先进入“设置”,点击“本地场景备份”,会显示你的所有场景:

确认本地备份

确认后,会显示一个二维码图片,这个图片就是你的场景备份信息,千万保存好,也不要随意给别人。

视你所保存的场景多寡,这个二维码图片也尺寸和信息密度也有所不同。生成该备份信息会稍微有一些慢。

场景备份

对此备份,可以截屏保存到本地,妥善保管即可。下一步我们还会推出加密保存,需要使用密码才能解开。

恢复

如果因为某种原因,删除了场景或丢失了场景,你可以通过之前备份信息进行恢复,只需要选择你的备份二维码即可。重复的场景并不会覆盖。

恢复场景

下一步,我们也会推出基于公有云或私有云的云端备份功能。

更多功能

更多使用细节,您可以亲自试试。我们也有一大波新的功能增强正在赶来~

入群体验

对此小程序感兴趣的同学,欢迎加入专属体验群,提出您的建议和反馈:

扫描上述二维码并添加好友后,验证信息:“运维密码”,即可获得加群邀请。

寄语

我们希望运维密码能够给你带来更加舒服的体验,如果你觉得哪里有不足的,也希望你能够告诉我们,让我们一起把它做的更好。

后继我们将对此小程序开源,也欢迎大家提供反馈、补丁和功能请求。

安全就是一切。我们生活的当今世界,数据具有令人难以置信的价值,而你也一直处于数据丢失的风险之中。因此,你必须想尽办法保证你桌面系统和服务器中数据的安全。结果,管理员和用户就会创建极其复杂的密码、使用密码管理器甚至其它更复杂的东西。但是,如果我告诉你你可以只需要一步,至多两步就能登录到你的 Linux 服务器或桌面系统中呢?多亏了 Google 身份验证器,现在你可以做到了。并且,配置也极其简单。

我会给你简要介绍为登录和 sudo 设置双因子认证的步骤。我基于 Ubuntu 16.04 桌面系统进行介绍,但这些步骤也适用于其它服务器。为了实现双因子认证,我会使用 Google 身份验证器。

这里有个非常重要的警告:一旦你设置了认证,没有一个从认证器中获得的由 6 个数字组成的验证码你就不可能登录账户(或者执行 sudo 命令)。这也给你增加了一步额外的操作,因此如果你不想每次登录到 Linux 服务器(或者使用 sudo)的时候都要拿出你的智能手机,这个方案就不适合你。但你也要记住,这额外的一个步骤也给你带来一层其它方法无法给予的保护。

话不多说,开始吧。

安装必要的组件

安装 Google 身份验证器 Google Authenticator ,首先要解决两个问题。一是安装智能机应用。下面是如何从 Google 应用商店安装的方法:

  1. 在你的安卓设备中打开 Google 应用商店
  2. 搜索 google 身份验证器 Google Authenticator
  3. 找到并点击有 Google Inc. 标识的应用
  4. 点击安装
  5. 点击“接受”
  6. 等待安装完成

接下来,我们继续在你的 Linux 机器上安装这个认证器。步骤如下:

  1. 打开一个终端窗口
  2. 输入命令 sudo apt-get install google-authenticator
  3. 输入你的 sudo 密码并敲击回车
  4. 如果有弹窗提示,输入 y 并敲击回车
  5. 等待安装完成

接下来配置使用 google-authenticator 进行登录。

配置

要为登录和 sudo 添加双因子认证只需要编辑一个文件,即 /etc/pam.d/common-auth。打开并找到如下一行:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure

在这行上面添加:

auth required pam_google_authenticator.so

保存并关闭文件。

下一步就是为系统中的每个用户设置 google-authenticator(否则他们就不能登录了)。为了简单起见,我们假设你的系统中有两个用户:jack 和 olivia。首先为 jack 设置(我们假设这是我们一直使用的账户)。

打开一个终端窗口并输入命令 google-authenticator。之后会问你一系列的问题(每个问题你都应该用 y 回答)。问题包括:

  • 是否允许更新你的 "/home/jlwallen/.google\_authenticator" 文件 (y/n) y
  • 是否禁止多个用户使用同一个认证令牌?这会限制你每 30 秒内只能登录一次,但能增加你注意到甚至防止中间人攻击的可能 (y/n)
  • 默认情况下令牌时长为 30 秒即可,为了补偿客户端和服务器之间可能出现的时间偏差,我们允许使用当前时间之前或之后的其它令牌。如果你无法进行时间同步,你可以把这个时间窗口由默认的 1:30 分钟增加到 4 分钟。是否希望如此 (y/n)
  • 如果你尝试登录的计算机没有针对暴力破解进行加固,你可以为验证模块启用速率限制。默认情况下,限制攻击者每 30 秒不能尝试登陆超过 3 次。是否启用速率限制 (y/n)

一旦完成了问题回答,你就会看到你的密钥、验证码以及 5 个 紧急刮码 emergency scratch code 。把这些刮码打印出来并保存。你可以在无法使用手机的时候使用它们(每个刮码仅限使用一次)。密钥用于你在 Google 身份验证器上设置账户,验证码是你能当下就能够立即使用(如果需要)的一次性验证码。

设置应用

现在你已经配置好了用户 jack。在设置用户 olivia 之前,你需要在 Google 身份验证器应用上为 jack 添加账户(LCTT 译注:实际操作情形中,是为 jack 的手机上安装的该应用创建一个账户)。在打开应用,点击“菜单”按钮(右上角三个竖排点)。点击“添加账户”然后点击“输入提供的密钥”。在下一个窗口(图1),你需要输入你运行 google-authenticator 应用时提供的 16 个数字的密钥。给账户取个名字(以便你记住这用于哪个账户),然后点击“添加”。

图1: 在 Google Authenticator 应用上新建账户

(LCTT 译注:Google 身份验证器也可以扫描你在服务器上设置时显示的二维码,而不用手工输入密钥)

添加完账户之后,你就会看到一个 6 个数字的密码,你每次登录或者使用 sudo 的时候都会需要这个密码。

最后,在系统上设置其它账户。正如之前提到的,我们会设置一个叫 olivia 的账户。步骤如下:

  1. 打开一个终端窗口
  2. 输入命令 sudo su olivia
  3. 在智能机上打开 Google 身份验证器
  4. 在终端窗口(图2)中输入(应用提供的) 6 位数字验证码并敲击回车
  5. 输入你的 sudo 密码并敲击回车
  6. 以新用户输入命令 google-authenticator,回答问题并记录生成的密钥和验证码。

成功为 olivia 用户设置好之后,用 google-authenticator 命令,在 Google 身份验证器应用上根据用户信息(和之前为第一个用户添加账户相同)添加一个新的账户。现在你在 Google 身份验证器应用上就会有 jack 和 olivia 两个账户了。(LCTT 译注:在实际操作情形中,通常是为 jack 和 olivia 两个人的手机分别设置。)

图2: 为 sudo 输入 6位数字验证码

好了,就是这些。每次你尝试登录系统(或者使用 sudo) 的时候,在你输入用户密码之前,都会要求你输入提供的 6 位数字验证码。现在你的 Linux 机器就比添加双因子认证之前安全多了。虽然有些人会认为这非常麻烦,我仍然推荐使用,尤其是那些保存了敏感数据的机器。


via: https://www.linux.com/learn/how-set-2-factor-authentication-login-and-sudo

作者:JACK WALLEN 译者:ictlyh 校对:wxy