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

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

有人说,安全不是一个产品,而是一个过程(LCTT 注:安全公司 McAfee 认为,安全风险管理是一个方法论,而不是安全产品的堆叠)。虽然 SSH 协议被设计成使用加密技术来确保安全,但如果使用不当,别人还是能够破坏你的系统:比如弱密码、密钥泄露、使用过时的 SSH 客户端等,都能引发安全问题。

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

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

OTPW 是什么

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

步骤1:OTPW 的安装和配置

在 Debian, Ubuntu 或 Linux Mint 发行版上

使用 apt-get 安装:


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

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


  1. #@include common-auth

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


  1. auth required pam_otpw.so
  2. session optional pam_otpw.so

在 Fedora 或 CentOS/RHEL 发行版上

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

首先,安装编译环境:


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

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

64 位系统:


  1. PAMLIB=/usr/lib64/security

32 位系统:


  1. PAMLIB=/usr/lib/security

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


  1. $ make
  2. $ sudo make install

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


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

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


  1. #auth substack password-auth

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


  1. auth required pam_otpw.so
  2. session optional pam_otpw.so

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

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


  1. UsePrivilegeSeparation yes
  2. ChallengeResponseAuthentication yes
  3. UsePAM yes

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


  1. PubkeyAuthentication yes
  2. PasswordAuthentication no

重启 SSH 服务器。

Debian, Ubuntu 或 Linux Mint 发行版:


  1. $ sudo service ssh restart

Fedora 或 CentOS/RHEL 7 发行版:


  1. $ sudo systemctl restart sshd

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

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

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


  1. $ cd ~
  2. $ otpw-gen > temporary_password.txt

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

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

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


  1. $ more ~/.otpw


  1. OTPW1
  2. 280 3 12 8
  3. 191ai+:ENwmMqwn
  4. 218tYRZc%PIY27a
  5. 241ve8ns%NsHFmf
  6. 055W4/YCauQJkr:
  7. 102ZnJ4VWLFrk5N
  8. 2273Xww55hteJ8Y
  9. 1509d4b5=A64jBT
  10. 168FWBXY%ztm9j%
  11. 000rWUSdBYr%8UE
  12. 037NvyryzcI+YRX
  13. 122rEwA3GXvOk=z

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

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


  1. $ ssh user@remote_host

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


  1. Password 191:

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


  1. 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 号密码失效了。


  1. OTPW1
  2. 280 3 12 8
  3. ---------------
  4. 218tYRZc%PIY27a
  5. 241ve8ns%NsHFmf
  6. 055W4/YCauQJkr:
  7. 102ZnJ4VWLFrk5N
  8. 2273Xww55hteJ8Y
  9. 1509d4b5=A64jBT
  10. 168FWBXY%ztm9j%
  11. 000rWUSdBYr%8UE
  12. 037NvyryzcI+YRX
  13. 122rEwA3GXvOk=z

总结

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

原文发布时间:2015-05-22

本文来自云栖合作伙伴“linux中国”

时间: 2024-10-23 15:56:34

使用一次性密码本通过 SSH 安全登录 Linux的相关文章

Ubuntu下通过sftp/SSH远程登录linux系统

SSH远程登录linux系统 步骤如下: 1.在需要远程访问的计算机的"新立得"里面安装openssh-server.这台计算机是远程计算机,你当前使用的计算机是本地计算机.如果使用Ubuntu或者其他Linux版本,已经安装了连接到远程计算机的软件. 2.远程计算机软件安装完毕.在本地计算机的终端里面输入: ssh username@address 其中username是远程计算机的账户名称,address是远程计算机的IP地址或者域名. 平日你希望以keir登录192.168.1.

python下paramiko模块实现ssh连接登录Linux服务器

  本文实例讲述了python下paramiko模块实现ssh连接登录Linux服务器的方法.分享给大家供大家参考.具体分析如下: python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python import paramiko hostname='17

The authenticity of host 'IP' can't be established:ssh客户端登录Linux系统出错解决记录

问题 在用ssh客户端第一次登录远程Linux的时候通常会报如下的错误 The authenticity of host 'IP' can't be established. ECDSA key fingerprint is SHA256:+9UZGqPe/Rdaiz9jTg0P5ZtGMl6gVP0i+iPTh8sHwt4. Are you sure you want to continue connecting (yes/no)? Host key verification failed.

linux ssh 别名登录小技巧_Linux

为了方便登录服务器,我们一般使用putty.SecureCRT等等工具.在终端如何通过服务器别名来进行登录呢? 可以创建~/.ssh/config 文件并为每台服务器指定登录信息和验证方法,如下所示: $ vim ~/.ssh/config Host www HostName www.ttlsa.com Port 22 User root IdentityFile ~/.ssh/id_rsa.pub IdentitiesOnly yes Host bbs HostName 115.28.45.1

CentOS下SSH无密码登录的配置文件_Linux

1.确认本机sshd的配置文件(需要root权限) $ gedit /etc/ssh/sshd_config 找到以下内容,并去掉注释符"#" RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys 2.如果修改了配置文件需要重启sshd服务 (需要root权限) $ /sbin/service sshd restart 配置SSH无密码登录需要3步: 1.生成公钥和私

Linux配置远程SSH无密码登录_Linux

本文实例为大家分享了jaLinux配置远程SSH无密码登录的方法,供大家参考,具体内容如下 系统:CentOS 6.8 主机1:192.168.0.177 主机2:192.168.0.178工具介绍:ssh-keygen:创建公钥和密钥 ssh-copy-id:把生成的公钥复制到192.168.0.178主机上的authorized_keys文件上, ssh-copy-id也会给远程主机的用户主目录(/home)和/root/.ssh和/root/.ssh/authorized_key设置合适的

Linode VPS限制SSH权限登录以及ROOT密码、端口丢失解决方法

第一步.登录Linode面板账户设定Lish Settings 上图是在My Profile - Lish Settings中找到,我们需要创建SSH登录密钥,然后填写到LISH KEYS. 第二步.创建SSH密钥登录 ,创建SSH登录密钥,然后黏贴到上面的List Setting - Lish Keys文本中. 第三.找到Lish via SSH信息 我们需要在Dashboard - Remote Access中找到Linode当下机房的登录超级信息. 我们要找到上面的1,2两处的信息,然后登

如何不输入密码ssh直接登录阿里云Linux主机

服务器环境:阿里云云服务器,Linux版本 - CentOS 客户端环境:Mac OSX Terminal 在Terminal中用ssh命令登录服务器每次都要输入密码,虽然可以复制/粘贴密码,但登录后一段时间不操作,服务器会自动断开连接,连接时又要复制/粘贴密码,还是有些不方便. 有没有办法实现登录时不用输入密码呢?有办法,这篇博文分享的就是解决方法. 不输入密码,服务器如何验证客户端呢?通过证书,证书就像你进办公室门时的门卡.客户端登录时,拿门卡(证书)在服务器上刷一下(证书验证),服务器会检

ssh由于登录失败而无法启动服务的问题

ssh 由于登录失败而无法启动服务 [分析与解决] $ net start sshd 发生系统错误 1069. 由于登录失败而无法启动服务. 分析:这是由于用户密码输入错误导致的,以后更改用户后sshd也可能发生这个问题,在 services.msc 里的登录标签里更改用户设置即可! 如果修改密码后,还是无法启动sshd服务,建议卸载该服务,删出cyg_server,sshd用户,并重新安装,同时执行/bin/sh.sh脚本,所需要的命令如下: cygwin下sshd服务 开启    net