在 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 来源:腾云阁 ...
随机推荐
- Oracle内存管理方式介绍(转载)
"Oracle内存管理可分为两大类,自动内存管理和手动内存管理.其中手动内存管理又可分为自动共享内存管理,手动共享内存管理,自动PGA内存管理以及手动PGA内存管理.本文会简单的介绍不同的内 ...
- 使用在线Excel时,有哪些方法可以引入计算函数?
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在日常生活和工作中,我们都会或多或少的使用Excel中的 ...
- IDA的使用2
IDA的使用2 string类型的选择 Rename 要注意如果再namelist和public name里面是不能重名 操作数 这个主要和开发结合精密, change sign-改变符号 bitwi ...
- Linux 网络发包流程
哈喽大家好,我是咸鱼 之前咸鱼在<Linux 网络收包流程>一文中介绍了 Linux 是如何实现网络接收数据包的 简单回顾一下: 数据到达网卡之后,网卡通过 DMA 将数据放到内存分配好的 ...
- AI绘画StableDiffusion实操教程:可爱头像奶茶小女孩(附高清图片)
本教程收集于:AIGC从入门到精通教程汇总 今天继续分享AI绘画实操教程,如何用lora包生成超可爱头像奶茶小女孩 放大高清图已放到教程包内,需要的可以自取. 欢迎来到我们这篇特别的文章--<A ...
- ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载
一.ChatGPT生成markdown源代码 问: 我想做一份ChatGPT变现方法的PPT,请生成丰富的教学展示内容,因为生成PPT是需要MarkDown格式的,请您输出Markdown格式的内容 ...
- jQuery默认选中下拉框的某个值
$("#quaterSelect").val("0");//id为quaterSelect的下拉框默认选中value是0的option选项
- 【krpano】淘宝buy+案例
这是一个类似淘宝buy+的案例,是基于krpano全景开发工具二次开发的全景视频.WebVR.360°环物.全景视频热点添加于一身的综合性案例.现在将案例上传网站供krpano技术人员和爱好者大家共同 ...
- k8s1.25版本上实践 Ingress-nginx
背景: 领导要求的最新最新版本k8s...使用ingress-nginx 对外暴露内部服务 环境 节点 master worker 主机/ip calico-master01/192.168.195. ...
- DHCP是什么
DHCP 1. DHCP是什么 协议,一种应用层的网络协议,他可以动态地分配网络中的IP地址和其他网络配置的参数以及网络设备,通俗一点讲,每台设备的IP地址,子网掩码,网关等网络参数信息都是由他来完成 ...