Ubuntu 20.04 开启并使用二步验证教程 (Two-Factor Authentication)
二次验证是目前比较常用的安全手段,通过设置二次验证,我们可以有效的避免账户密码可能的泄露导致的账户信息泄露,因为每次登陆前我们都需要获取一个一次性验证码,没有验证码就无法成功登陆。二次验证也叫两步验证、两步验证等。本文中老唐将说明如何在 Ubuntu 20.04 上使用 Google Authenticator PAM 模块进行 SSH 和 sudo 身份验证。
一、准备工作
- Ubuntu 20.04 VPS 服务器
- 二次验证 App,比如谷歌的
- SSH 权限
二、安装 PAM 模块
通过 SSH 登陆 Ubuntu 20.04 系统的 VPS,使用下面命令安装 Google Authenticator PAM 模块:
sudo apt install libpam-google-authenticator
三、生成二次验证代码
使用下面命令运行 Google Authenticator 设置程序:
google-authenticator -t -f -d -w 3 -e 10 -r 3 -R 30
选项说明:
- -t : 使用 TOTP 验证
- -f : 将配置保存到
~/.google_authenticator
- -d : 不允许重复使用以前使用的令牌
- -w 3 : 允许的令牌的窗口大小。 默认情况下,令牌每 30 秒过期一次。 窗口大小 3 允许在当前令牌之前和之后使用令牌进行身份验证以进行时钟偏移。
- -e 10 : 生成 10 个紧急备用代码
- -r 3 -R 30 : 限速,每 30 秒允许 3 次登录
更多帮助信息可以使用 --help
选项查看。
程序运行后,将会更新配置文件,并且显示下面信息:
- 二维码,您可以使用大多数身份验证器应用程序扫描此代码。
- 一个秘密的钥匙,如果您无法扫描二维码,请在您的应用中输入此密钥。
- 初始验证码,该验证码将在30秒后失效。
- 10 个一次性使用紧急代码的列表。
四、配置 SSH
下面这些步骤将禁用密码身份验证,SSH 密钥将被来登陆,并且将启用 2FA。
1、修改 SSH PAM 配置文件:
sudo vim /etc/pam.d/sshd
2、添加下面内容到配置文件:
auth required pam_google_authenticator.so nullok
3、禁用密码验证(添加 # 将其注释):
# @include common-auth
4、保存并关闭文件(:wq)
5、修改 SSH 配置文件:
sudo vim /etc/ssh/sshd_config
6、将 ChallengeResponseAuthentication
设为 yes:
ChallengeResponseAuthentication yes
7、检查下面几个设置项是否正确设置:
PasswordAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
8、保存并关闭文件。
9、重启 SSH 服务:
sudo systemctl restart ssh
10、重新登录 VPS,需使用 SSH 密钥,并且需要二次验证。
五、配置 sudo 二次验证
1、编辑 /etc/pam.d/common-auth
:
sudo vim /etc/pam.d/common-auth
2、添加下面内容:
auth required pam_google_authenticator.so nullok
3、保存并退出。
六、从二次验证锁定中恢复
1、紧急备份
如果您无法访问身份验证器应用程序,请使用您的紧急备用代码之一。 该代码仅供一次性使用。
2、禁用特定用户的二步验证
修改 /etc/ssh/sshd_config
文件,找到下面的选项:
AuthenticationMethods publickey,keyboard-interactive
移除 keyboard-interactive
:
AuthenticationMethods publickey
之后保存文件,并且重启 SSH:
sudo systemctl restart ssh
参考链接:
- https://www.vultr.com/docs/how-to-use-twofactor-authentication-with-ubuntu-20-04
- https://oldtang.com/3851.html
- 关于JVM CPU资源占用过高的问题排查
- ActiveMQ简单介绍以及安装
- Java Process destroy方法kill进程,返回码测试
- 百度人脸识别API Java调用
- Java Socket Timeout总结
- 求一个数组中子数组的最大和算法(Java实现)
- JDBC批量提交SQL的几点问题解答
- 工具推荐: 汽车CAN总线分析框架CANToolz
- Windows下jps, jconsole无法查看本地java进程问题解决
- DateFormat 线程不安全
- zip文件操作导致JVM crash
- 如何搭建你自己的“深度学习”机器?
- MySQL INSERT INTO...ON DUPLICATE KEY UPDATE的使用
- 通过Java代码来模拟乘法器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux如何查看进程栈信息示例
- linux查看硬盘大小与挂载硬盘的实现
- centos6.5 安装hadoop1.2.1的教程详解【亲测版】
- Linux中没有rc.local文件的完美解决方法
- 详解linux lcd驱动编写
- Linux下安装telnet的方法
- Linux 安装二进制MySQL 及 破解MySQL密码的方法
- Linux创建进程达到65535的方法
- SSH 上传文件及文件夹到linux服务器的方法
- apache tika检测文件是否损坏的方法
- Linux下二进制编译安装MySql centos7的教程
- Linux 6 修改ssh默认远程端口号的操作步骤
- 基于python的Linux系统指定进程性能监控思路详解
- ubuntu下的虚拟环境中安装Django的操作方法
- 详解linux下umask的使用