在考虑 SSH 认证方案时,大家普遍认为公钥认证比密码认证更安全。然而,公钥认证技术并不是为公共环境设置的,如果你在一台公用电脑上使用公钥认证登录 SSH 服务器,你的服务器已经毫无安全可言了,公用的电脑可能会记录你的公钥,或从你的内存中读取公钥。如果你不信任本地电脑,那你最好还是使用其他方式登录服务器。现在就是“一次性密码(OTP)”派上用场的时候了,就像名字所示,一次性密码只能被使用一次。这种一次性密码非常合适在不安全的环境下发挥作用,就算它被窃取,也无法再次使用。

有个生成一次性密码的方法是通过谷歌认证器,但在本文中,我要介绍的是另一种 SSH 登录方案:OTPW,它是个一次性密码登录的软件包。不像谷歌认证,OTPW 不需要依赖任何第三方库。

OTPW 是什么

OTPW 由一次性密码生成器和 PAM 认证规则组成。在 OTPW 中一次性密码由生成器事先生成,然后由用户以某种安全的方式获得(比如打印到纸上)。另一方面,这些密码会通过 Hash 加密保存在 SSH 服务器端。当用户使用一次性密码登录系统时,OTPW 的 PAM 模块认证这些密码,并且保证它们不能再次使用。

步骤1:OTPW 的安装和配置

在 Debian, Ubuntu 或 Linux Mint 发行版上

使用 apt-get 安装:

$ sudo apt-get install libpam-otpw otpw-bin

打开针对 SSH 服务的 PAM 配置文件(/etc/pam.d/sshd),注释掉下面这行(目的是禁用 PAM 的密码认证功能):

#@include common-auth

添加下面两行(用于打开一次性密码认证功能):

auth       required     pam_otpw.sosession    optional     pam_otpw.so

在 Fedora 或 CentOS/RHEL 发行版上

在基于 RedHat 的发行版中没有编译好的 OTPW,所以我们需要使用源代码来安装它。

首先,安装编译环境:

$ sudo yum git gcc pam-devel$ git clone https://www.cl.cam.ac.uk/~mgk25/git/otpw$ cd otpw

打开 Makefile 文件,编辑以“PAMLIB=”开头的那行配置:

64 位系统:

PAMLIB=/usr/lib64/security

32 位系统:

PAMLIB=/usr/lib/security

编译安装。需要注意的是安装过程会自动重启 SSH 服务一下,所以如果你是使用 SSH 连接到服务器,做好被断开连接的准备吧(LCTT 译注:也许不会被断开连接,即便被断开连接,请使用原来的方式重新连接即可,现在还没有换成一次性口令方式。)。

$ make$ sudo make install

现在你需要更新 SELinux 策略,因为 /usr/sbin/sshd 会往你的 home 目录写数据,而 SELinux 默认是不允许这么做的。如果没有使用 SELinux 服务(LCTT 注:使用 getenforce 命令查看结果,如果是 enforcing,就是打开了 SELinux 服务),请跳过这一步。

$ sudo grep sshd /var/log/audit/audit.log | audit2allow -M mypol$ sudo semodule -i mypol.pp

接下来打开 PAM 配置文件(/etc/pam.d/sshd),注释下面这行(为了禁用密码认证):

#auth       substack     password-auth

添加下面两行(用于打开一次性密码认证功能):

auth       required     pam_otpw.sosession    optional     pam_otpw.so

步骤2:配置 SSH 服务器,使用一次性密码

打开 /etc/ssh/sshd_config 文件,设置下面三个参数。你要确保下面的参数不会重复存在,否则 SSH 服务器可能会出现异常。

UsePrivilegeSeparation yesChallengeResponseAuthentication yesUsePAM yes

你还需要禁用默认的密码认证功能。另外可以选择开启公钥认证功能,那样的话你就可以在没有一次性密码的时候使用公钥进行认证。

PubkeyAuthentication yesPasswordAuthentication no

重启 SSH 服务器。

Debian, Ubuntu 或 Linux Mint 发行版:

$ sudo service ssh restart

Fedora 或 CentOS/RHEL 7 发行版:

$ sudo systemctl restart sshd

(LCTT 译注:虽然这里重启了 sshd 服务,但是你当前的 ssh 连接应该不受影响,只是在你完成下述步骤之前,无法按照原有方式建立新的连接了。因此,保险起见,要么多开一个 ssh 连接,避免误退出当前连接;要么将重启 sshd 服务器步骤放到步骤3完成之后。)

步骤3:使用 OTPW 产生一次性密码

之前提到过,你需要事先创建一次性密码,并保存起来。使用 otpw-gen 命令创建密码:

$ cd ~$ otpw-gen > temporary_password.txt

这个命令会让你输入密码前缀,当你以后登录的时候,你需要同时输入这个前缀以及一次性密码。密码前缀是另外一层保护,就算你的一次性密码表被泄漏,别人也无法通过暴力破解你的 SSH 密码。

设置好密码前缀后,这个命令会产生 280 个一次性密码(LCTT 译注:保存到 ~/.otpw 下),并将它们导出到一个文本文件中(如 temporary_password.txt)。每个密码(默认是 8 个字符)由一个 3 位十进制数索引。你需要将这个密码表打印出来,并随身携带。

查看 ./.otpw 文件,它存放了一次性密码的 HASH 值。头 3 位十进制数与你随身携带的密码表的索引一一对应,在你登录 SSH 服务器的时候会被用到。

$ more ~/.otpw

OTPW1280 3 12 8191ai+:ENwmMqwn218tYRZc%PIY27a241ve8ns%NsHFmf055W4/YCauQJkr:102ZnJ4VWLFrk5N2273Xww55hteJ8Y1509d4b5=A64jBT168FWBXY%ztm9j%000rWUSdBYr%8UE037NvyryzcI+YRX122rEwA3GXvOk=z

测试一次性密码登录 SSH 服务器

使用普通的方式登录 SSH 服务器:

$ ssh user@remote_host

如果 OTPW 成功运行,你会看到一点与平时登录不同的地方:

Password 191:

现在打开你的密码表,找到索引号为 191 的密码。

023 kBvp tq/G  079 jKEw /HRM  135 oW/c /UeB  191 fOO+ PeiD  247 vAnZ EgUt

从上表可知,191 号密码是“fOO+PeiD”。你需要加上密码前缀,比如你设置的前缀是“000”,则你实际需要输入的密码是“000fOO+PeiD”。

成功登录后,你这次输入的密码自动失效。查看 ~/.otpw 文件,你会发现第一行变成“---------------”,这表示 191 号密码失效了。

OTPW1280 3 12 8---------------218tYRZc%PIY27a241ve8ns%NsHFmf055W4/YCauQJkr:102ZnJ4VWLFrk5N2273Xww55hteJ8Y1509d4b5=A64jBT168FWBXY%ztm9j%000rWUSdBYr%8UE037NvyryzcI+YRX122rEwA3GXvOk=z

总结

在这个教程中,我介绍了如何使用 OTPW 工具来设置一次性登录密码。你也许意识到了在这种双因子的认证方式中,打印一张密码表让人感觉好 low,但是这种方式是最简单的,并且不用依赖任何第三方软件。无论你用哪种方式创建一次性密码,在你需要在一个不可信任的环境登录 SSH 服务器的时候,它们都很有用。你可以就这个主题来分享你的经验和观点。

本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1654876,如需转载请自行联系原作者

使用一次性密码本通过 SSH 安全登录 Linux相关推荐

  1. linux服务器无密码登录不了,设置ssh无密码登录linux服务器的方法

    每次登录测试服务器,ssh登录总是需要输入密码.登录的少还行,登录的多了,多一行命令都是多余的. rsa认证登录方式 制作密钥对 在客户端(本地机器)终端下输入以下命令 ssh-keygen -t [ ...

  2. SecureCRT密钥key远连接程ssh证书登录Linux

    国内大部分人用的系统是windows,而windows下有很多ssh客户端图形工作,最流行,功能最强大的就是SecureCRT了,所以我会单独针对SecureCRT简单讲下实现ssh证书登录Linux ...

  3. 通过ssh远程登录linux的原理过程和配置免密登录

    1.总结通过ssh远程登录linux的原理过程 基于口令的认证 客户端和服务端建立TCP连接 协商阶段 双方进行ssh版本协商 密钥协商阶段 在服务器端生成一对密钥,将公钥传递给客户端,客户端将密钥C ...

  4. xshell使用SSH密钥登录Linux实例

    在本地Windows系统中打开xshell. 工具栏上打开 工具 > 新建用户密钥生成向导 在新建会话属性的 连接 配置中输入会话名称和您的云服务器IP地址 点击 连接 中的用户身份验证,方法选 ...

  5. ssh配置公钥_如何使用公钥认证免密码ssh远程登录Linux服务器

    1. Windows免密码登录Linux服务器 请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习 新建用户密钥生成向 ...

  6. linux ssh密钥对,Mac使用ssh密钥登录Linux

    ssh登录Linux通常有两种方法:用户名密码登录.用户名密钥登录:使用用户名密码登录每次都要输入密码,相当麻烦,而使用用户名密钥登录则可以避免这个问题. 创建密钥对文件 打开本地终端,执行 ssh- ...

  7. Mac使用ssh密钥登录Linux

    ssh登录Linux通常有两种方法:用户名密码登录.用户名密钥登录:使用用户名密码登录每次都要输入密码,相当麻烦,而使用用户名密钥登录则可以避免这个问题. 创建密钥对文件 打开本地终端,执行 ssh- ...

  8. mac ssh远程登录linux,MAC使用SSH远程登录

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Sun 20 December 2015 tags: 备忘录 MAC使用SSH远程登录打开ssh Mac Termina ...

  9. Linux修改密码后不能SSH远程登录了

    1.把以下文件的属性改成755,然后再修改密码: /etc/passwd ,/etc/group , /etc/shadow , /etc/gshadow 2.如果文件的属性无法更改,请用lsattr ...

最新文章

  1. 型人格 disc测试_什么是压抑型人格,如何测试筛查压抑型人格?
  2. boost bind使用指南
  3. Java面试集合(二)
  4. java创建日程到期提醒_Mac用户必备日程时间管理器,有计划有效率的人生才算完美!...
  5. 性能测试工具系列(一):性能测试工具对比分析
  6. [HNOI2010 Planar平面图判定]
  7. 二层交换机、三层交换机和路由器的基本工作原理和三者之间的主要区别
  8. Python模块及其导入
  9. C++socket编程(七):7.2 XHttp项目创建接收浏览器请求
  10. 老板最讨厌的10种烂个性
  11. python画散点图-python中画散点图
  12. ABB机器人切割铣削钻孔自动化加工应用
  13. Unity实战篇:实现虚拟摇杆控制人物(Easy Touch 5.X插件)
  14. 【鸿蒙】《校园通》--校园生活模块
  15. 批量本地英语文档翻译软件
  16. 正路走得慢,但是走得远
  17. java游戏熊猫修牧场的_教你玩转牧场积分,角色练满25修不是梦想
  18. 海康威视录像机如何添加大华摄像头
  19. 哀思著名力学家钱伟长先生
  20. JavaScript之ES6语法

热门文章

  1. [Flex] ButtonBar系列——垂直布局
  2. Little Kings - SGU 223(状态压缩)
  3. 《编程珠玑,字字珠玑》910读书笔记——代码优化
  4. v-for列表渲染之数组变动检测
  5. 【读书笔记】A Swift Tour
  6. 128.3. Example 配置实例
  7. 转:CentOS系统yum源配置修改、yum安装软件包源码包出错解决办法!
  8. 51nod1574排列转换
  9. Mongodb sharding转换一个副本集为分片集群
  10. MyEclipse用(JDBC)连接SQL出现的问题~