在 Ubuntu 22.04 系统上为 SSH 开启基于时间的 TOTP 认证
前言
一次性密码(英语:one-time password,简称OTP),又称动态密码或单次有效密码,是指电脑系统或其他数字设备上只能使用一次的密码,有效期为只有一次登录会话或一段短时间内。基于时间的一次性密码算法(英语:Time-based One-Time Password,简称:TOTP)是一种根据预共享的密钥与当前时间计算一次性密码的算法。国内互联网服务的各种短信验证码的原理也与此相关。本次实践聚焦 SSH 远程连接场景下的 TOTP 认证,为已有的密钥认证机制再加强一下。
1. 安装 Google 的 PAM
PAM 意为可插入身份验证模块,是 Linux 系统上用于对用户进行身份验证的身份验证基础结构。因为 Google 制作了 OATH-TOTP 应用程序 Google Authenticator,所以他们还制作了一个可生成 TOTP 的 PAM,并且与任何 OATH-TOTP 应用程序完全兼容,例如 Google Authenticator 或 Microsoft Authenticator。
使用 apt 进行安装:
sudo apt install libpam-google-authenticator
安装 PAM 后,使用 PAM 附带的帮助程序应用程序为需要 OTP 认证的 SSH 用户生成 TOTP 密钥。该密钥是按用户生成的,因此多个用户需要操作多次。
运行帮助程序:
google-authenticator
运行命令后,应用程序会询问一些问题。第一个询问身份验证令牌是否应该基于时间:
Do you want authentication tokens to be time-based (y/n) y
此 PAM 允许基于时间或基于顺序的令牌。使用基于时间的令牌意味着代码会在特定时间范围后发生更改。选择基于时间的算法是因为这是 Google Authenticator 等应用程序所期望的,所以回答 y 。
运行完此命令后将输出一个验证码图像。使用任何 OATH-TOTP 应用程序进行扫描后将能够保存此验证码序列。
程序将要求输入在OATH-TOTP 应用程序中保存的验证码序列,也可以输入-1跳过:
Enter code from app (-1 to skip):
验证通过后程序将提示保存恢复码,以免丢失 OATH-TOTP 应用程序后无法登录:
Code confirmed
Your emergency scratch codes are:
01234567
01234567
01234567
01234567
01234567
之后程序会提示选择密钥保存文件:
Do you want me to update your "/root/.google_authenticator" file? (y/n) 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) y
By default, a new token is generated every 30 seconds by the mobile app.
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. This allows for a
time skew of up to 30 seconds between authentication server and client. If you
experience problems with poor time synchronization, you can increase the window
from its default size of 3 permitted codes (one previous code, the current
code, the next code) to 17 permitted codes (the 8 previous codes, the current
code, and the 8 next codes). This will permit for a time skew of up to 4 minutes
between client and server.
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
第一个问题是询问是否禁止多次使用同一身份码进行验证,选择是 y;
第二个问题是允许在移动的四分钟窗口内最多输入 17 个有效代码。如果回答“否”,则只允许 1:30 分钟的滚动窗口中限制输入 3 个有效代码,为了更好的安全性,选择否 n;
第三个问题是是否启用速率限制,这将限制攻击者每 30 秒尝试登录的次数不得超过 3 次,选择是 y。
至此安装完毕。
2. 配置 SSH 以使用 PAM 中的 OTP 模块
备份一下 PAM 配置文件:
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.bak
修改配置:
sudo vim /etc/pam.d/sshd
将以下行添加到文件底部:
. . .
# Standard Un*x password updating.
@include common-password
# enable OTP auth
auth required pam_google_authenticator.so nullok
auth required pam_permit.so
第一行的 nullok 表示身份验证方法是可选的。这允许没有 OATH-TOTP 令牌的用户仍然仅使用 SSH 密钥登录。
如果用户不使用令牌登录,则需要使用第二行的 pam_permit.so 来允许其他方法的身份验证。
配置 SSH 以支持这种身份验证。先备份文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
修改配置:
sudo vim /etc/ssh/sshd_config
修改 ChallengeResponseAuthentication 或 KbdInteractiveAuthentication 选项的值将其设为 yes:
. . .
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication yes
. . .
重启 SSH 服务验证是否修改正确:
sudo systemctl restart sshd.service
3. 让 SSH 启用 OTP 验证
通常情况下,使用密钥进行身份验证会完全跳过基于 PAM 的身份验证,这就会使得使用密钥登录的用户在登录时会跳过 OTP 验证模块。
因此需要使用 AuthenticationMethods 指令,以允许启用多种身份验证方法:
sudo vim /etc/pam.d/sshd
. . .
AuthenticationMethods publickey,keyboard-interactive
保存文件并退出。
之后再次打开 PAM 配置文件
sudo vim /etc/pam.d/sshd
找到 @include common-auth 行并通过添加 # 字符作为该行的第一个字符将其注释掉。
这将使得通过 PAM 验证时不提示输入密码,只提示 OTP 验证码:
. . .
# Standard Un*x authentication.
#@include common-auth
. . .
保存并关闭文件,然后重新启动 SSH:
sudo systemctl restart sshd.service
4. 验证 OTP 验证机制
使用 Xshell 登录原有设备,通过公钥认证后将提示一个验证码弹窗:

输入从验证器应用中得到的验证码,即可正常登录。
附录
如果开启 OTP 验证的账户为 root 账户,则需要在 SSH 的配置文件 /etc/ssh/sshd_config 中允许 root 登录:
PermitRootLogin yes
在 Ubuntu 22.04 系统上为 SSH 开启基于时间的 TOTP 认证的更多相关文章
- Ubuntu 18.04系统中不能ssh外网远程
前言 今天我不小心动了电插板,导致服务器断电,用远程命令开机,居然很长时间没反应,索性就亲自按电源键重启.服务器正常开机启动,ssh可以内网访问,远程命令内网有效果,就是外网不行.经过分析排查,是不是 ...
- 在Ubuntu 18.04系统上安装Systemback的方法(抄)
在Ubuntu 18.04系统上安装Systemback的方法 2018-12-26 21:39:05作者:林莉稿源:云网牛站 本文介绍如何在Ubuntu 18.04或者Ubuntu 18.10系统上 ...
- Ubuntu 16.04系统上NFS的安装与使用
摘要:本文介绍了NFS服务器的安装过程.配置文件和常用命令行工具,以及NFS客户端上如何安装常用工具,介绍如何挂载共享目录,并通过实验进行验证. 一.服务器端: 1.1安装NFS服务: #执行以下命令 ...
- 在Ubuntu 18.04系统上安装Pydio Cells详细图文教程
前言 基于云的协作工具Pydio cell提供了一系列灵活的特性,包括应用内消息传递.文件共享和版本控制.下面逐步介绍安装过程. Pydio cell最初是一个简单的基于云的文件共享系统,但经过升 ...
- Ubuntu 16.04系统上修改Docker镜像的存储路径 (转)
转自:https://blog.csdn.net/qihongchao/article/details/80651492 dba专门挂了一个硬盘让我放项目(测试环境)因为系统空间比较小,希望把dock ...
- Spire.Cloud 私有化部署教程(二)- Ubuntu 18.04 系统
本教程主要介绍如何在Ubuntu 18.04系统上实现Spire.Cloud私有化部署.CentOS 7系统部署请参考 这篇教程. 详细步骤如下: 一.环境配置 1.关闭防火墙 1)首先查看防火墙状态 ...
- Qemu/Limbo/KVM镜像 Ubuntu 22.04 精简版,可运行Windows软件,内存占用不到200M
镜像特征: Ubuntu 22.04系统 内置Wine 7.8,可运行大量Windows 软件 高度精简,内存占用仅200M不到. 自制UI,Windows3.1风格. 完全开源 镜像说明: 用户名为 ...
- 入门系列之使用Sysdig监视您的Ubuntu 16.04系统
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由乌鸦 发表于云+社区专栏 介绍 Sysdig是一个全面的开源系统活动监控,捕获和分析应用程序.它具有强大的过滤语言和可自定义的输出,以 ...
- 如何在 Ubuntu 15.04 系统中安装 Logwatch
大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日 ...
- 在 Ubuntu 14.04 服务器上部署 Hexo 博客
版权声明:本文由宋秉金 原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241080001487926962 来源:腾云阁 ...
随机推荐
- 本地连接阿里云上的mysql centos
首先写下原因: 未让3306端口通过防火墙 1. 检查端口是否被防火墙挡住 telnet ip地址 3306 在windows中打开telnet应用, 参考:https://www.cnblogs. ...
- 修复mbr分区
修复mbr分区 实验条件 1.备份mbr引导扇区到其他磁盘 2.模拟破坏mbr引导扇区 3.引导镜像急救模式进行mbr扇区恢复 实验 1,添加一块新的磁盘 2,分区,查看分区情况 3,格式化,并挂载 ...
- Linux 内核音频子系统调试
debugfs 文件系统 debugfs 可以为 Linux 内核各个模块的分析调试,提供许多信息,如音频子系统的 ASoC,以及 tracing 等.debugfs 文件系统可以通过命令行工具挂载, ...
- 论文解读(PERL)《PERL: Pivot-based Domain Adaptation for Pre-trained Deep Contextualized Embedding Models》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:PERL: Pivot-based Domain Adaptation for Pre-trained D ...
- 《SQL与数据库基础》04. SQL-DQL
目录 DQL 基础查询 条件查询 分组聚合 聚合函数 分组查询 结果排序 分页限制 总结 本文以 MySQL 为例 DQL 语法结构: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 ...
- 海量前端后台Java源码模板下载
给大家收集了海量的模板和源码素材,可下载研究和学习使用. 一:前端响应式静态Html5+Css3网页模板(无后台) 1:PC模板:9900套响应式html5+css3网页 ...
- linux tcpdump 使用小结(二)
转载请注明出处: TCPDump是一个功能强大的网络抓包工具,它能够在命令行界面捕获.分析和解析网络数据包.下面是TCPDump命令的使用总结,包括使用语法.常用参数说明等: 使用语法:tcpdump ...
- codeblock安装及汉化教程
1.双击图标 2.弹出如下对话框: 3.单击按钮Next,弹出如下对话框: 4.单击按钮I Agree,弹出如下对话框: 5.单击按钮Next,弹出如下对话框: 6.单击Browse按钮,可以重新设置 ...
- 安装软件提示 "无法完成操作, 因为文件包含病毒或潜在的垃圾软件" 如何处理
在Windows端安装一些小众电脑软件的时候,经常会遇到无法安装的问题,比较常见的情况是会提示 "无法完成操作, 因为文件包含病毒或潜在的垃圾软件", 或者提示"不能执行 ...
- Vue源码学习(七):合并生命周期(混入Vue.Mixin)
好家伙, 1.使用场景 现在来,来想一下,作为一个使用Vue的开发者,假设现在我们要使用created(),我们会如何使用 1.1. .vue文件中使用 <template> < ...