欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何在PuTTY中使用SSH公匙/密匙? 有大用

shiping1 的头像

【IT专家网独家】虽然Linux在数据中心的应用越来越普及,不过还是有很多管理员在使用公司Windows桌面办公。而在各种远程登录管理Linux服务器的工具中,PuTTY无疑是最佳选择(Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端,但是功能丝毫不逊色于商业的telnet类工具,用它来远程管理Linux十分好用)。在这篇文章中,你将了解到如何使用SSH公匙/密匙(public/private keys)使你的Linux服务器与PuTTY之间的通信更加安全。

  通常可以使用三种不同的因素来证明你的身份:你知道的事物、你拥有的事物以及关于你的资料。为了使认证过程更加可靠,你通常应该至少要使用这三个要素中的两个要素。而当你使用SSH公匙/密匙进行认证,并且密匙设定了Passphrase时(即密码短语,功能与密码一样,只是长度比密码更长),你就可以结合两种认证要素,从而使认证过程更加可靠,你的服务器更加安全。

  当使用SSH公匙/密匙进行认证时,用户需要在他的工作站生成一个公匙/密匙对。生成以后,用户必须把公匙复制到名为authorized_keys的文件中。这个文件通常位于服务器的用户主目录里,被放置在一个名为.ssh的隐藏子目录中。在下面的9个步骤中,你将学会如何在一个使用PuTTY的Windows工作站里生成公匙/密匙对:

  1.从http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html站点下载完整的PuTTY安装包,安装包中包含PuTTYgen命令,运行这项命令,它就会打开PuTTYgen Key Generator窗口(密匙生成窗口)。

  2.在窗口的下部明确你想要生成什么类型的密匙。我建议你使用一个2048比特的DSA密匙,因为如果低于该比特数值的话,所获得的安全级别就不够高。选择这个选项后,点击“生成”。为了产生密匙,你必须把鼠标指针在PuTTYgen窗口来来回回地移动,这样可以产生出PuTTYgen用来生成密匙对的随机数据。

  3.一旦密匙对生成后,你就会看到一个窗口。在此窗口中,你需要详细指明密匙的特性。以下你必须完成两项重要任务:首先,你要把你看到的位于窗口上半部分的公匙复制并将它储存在一个文件内。不要使用“保存公匙(Save public key)”选项,因为这样储存的密匙格式在Linux中将不可用。

(图1)
因此,复制这个公匙,打开Notepad,把这个密匙存入一个新建的文件中,接着把该文件存入你的电脑。

  4.下一步,仍然是同一窗口,你可以设定一个密码短语来保护私匙,防止其他人擅自使用。当然,你也可以选择不使用密码短语,但是这中间确实存在不小的安全风险,因此非常推荐使用密码短语来保护私匙。选择一个不是太容易被猜到的字符串,并将它输入“钥匙密码(Key passphrase)”和“确认密码(Confirm passphrase)”方框中。

然后,点击“保存私匙”将该密码短语存入一个文件。

  5.现在打开PuTTY窗口,把你想要使用密码短语输入至最终连接配置框。在屏幕的较低部分,打开Connection〉SSH〉Auth。这样就打开了另一个窗口。在这个窗口,点击“浏览”,浏览私匙所保存的地址,然后把私匙添加到这个地址。

  6.接下来,仍然是在PuTTY里,回到窗口左边部分的“Session”选项,然后点击“保存”,这样下次你打开PuTTY界面时,私匙同样是有效可用的。


7.这一步的主要作用 就是把 (图1) 中复制的公匙 作为一个文件存下来 存为 (/root/.ssh/authorized_keys) 文件 (这里的root是登录的有户名)
 关于下面的7.8.的内容就没必要细看了
现在你暂时需要退出PuTTY窗口,打开一个Window命令提示符。在这个命令提示符中,使用“pscp”命令(同样是PuTTY安装包的一部分)将公匙复制在你的Linux服务器的一个临时文件中。在将要使用这个公匙的用户的主目录中创建这个文件;在大多数情况下,那应该是用户根(user root)。在下面的例子中你会看到如何将PuTTY公匙复制到 “myserver.example.com” 服务器的用户根的主目录的一个命名为tempkey的临时文件中,命令如下:

  

以下是引用片段:
pscp pubkey root@myserver.example.com:/root/tempkey

  8.现在需要建立一个SSH连接到服务器,在服务器上,使用cd来启动用户根主目录,并使用下列命令将公匙添加到子目录“ssh”的authorized_keys文件中:

  

以下是引用片段:
cat tempkey >> .ssh/authorized_keys

  9.现在你已经准备就绪了。由于SSH的所有分布区都可以默认接受公匙/私匙登录,所以下次你想建立与那个服务器的连接时,PuTTY就能自动使用钥匙对帮助你登录。

  在这篇文章中,你已经了解到了如何使用公匙/私匙使Windows客户端与Linux服务器之间建立更安全可靠的连接。如果可能的话就使用这些方法吧,因为在使用一个不可信的网络(如因特网)来建立远程连接时,使用密匙要比使用密码安全得多。(编译:邹铮)

  此文章中文版权归TechTarget和天极公司所共有,任何第三方不得转载。

来自 http://cio.ctocio.com.cn/linux/290/7571790.shtml

 

注意 :代码中的 # 只表示注释作用,该内容不能输入到命令行窗口中

 

      远程管理 Ubuntu,可以通过很多方式,这里只介绍 SSH。通过 SSH 可以远程登录到服务器上,让你觉得好像就在服务器面前工作一样。我们使用的 SSH 是 OpenSSH ,它是由两个小组开发的,其中 OpenBSD 为该项目做了杰出贡献。通过 OpenSSH,我们不仅可以远程使用命令行,还可以远程运行 X Window 图像程序,安全地传输文件。我们甚至还可以用 OpenSSH 的端口映射功能为其它协议做管道,来通过防火墙或者不可信任的网络。

      OpenSSH 的安全性非常高,如果你目前仍在使用 telnet、rlogin、ftp 这些非常不安全的工具(它们传输密码时使用明文,导致密码很容易被窃取),希望你能尽快转移到 SSH 上来,已减少网络安全隐患。

 

关于公钥认证

为什么要用公钥认证

      如果你的 SSH 服务器是放在 Internet 上的,那么 Hiweed 强烈建议你不要使用密码登录。因为总有些像搞破坏的人,使用各种各样的方法,希望能够得到你的用户名和密码,然后做一些乱七八糟的事情。

      请你千万不要不以为然。你可以查看系统认证日志文件,该文件位于/var/log/auth.log 。使用 tail 查看文件的最后几行(-n 的默认值为 10,即十行)。使用 -f 开关,可以输出该文件新增的数据。具体参数配置可以使用 tail --help 命令。

Linux代码  收藏代码
  1. $ cd /var/log  
  2. $ tail -f auth.log  

其轮转(rotate)后的日志文件为 /var/log/auth.log.0 等。使用 grep 过滤出 SSH 的认证信息:

Linux代码  收藏代码
  1. $ grep failed auth.log.0  

       你很有可能会看到非常多的认证失败信息:

Sshd - failed代码  收藏代码
  1. Jul  1 21:18:44 lee sshd[2273]: error: key_read: key_from_blob AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOw fjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lm ESAM5Ns= lee's key\n failed  
  2. Jul  1 21:26:13 lee sshd[2560]: error: key_read: uudecode AAAAB3NzaC1yc2EAAAABJQAAAIEAql2+PY8ZDVK+RVLUCzteXHyz8qFoC/fNlUOwfjRVUuVoytgjpqyHWM7vSxkBO90B6f8mPL8jxhWBGqXMv2hQKsJrHDf4m9ILIrDN/pGt/HnZ/JQZkLOnxddWdXCLbDMESrU8D3a9SMSkEbmL5RgJ+NIv6DbrlTElT7lmESAM5Ns== lee's key\n failed  

     尤其是那些在时间上很连续的登录尝试,一看就知道是暴力破解。

     既然密码登录方式这么不安全,那么使用什么方式登录呢?使用公钥 

公钥认证是怎么工作的

     “公钥”是从 Public Key 翻译过来的,和“私钥”(Private Key)相对应。公钥和私钥都是一个很长的字符串(一个非常大的随机数)。公钥放在服务器上,私钥放在你的客户机上;当你从客户机连接服务器时,如果你的 私钥能够和公钥对上号,就可以通过认证。

     简单地说,公钥就好像一把锁,把服务器锁住;私钥就好像一把钥匙,只有钥匙对了,才能打开那把锁。没有钥匙,别指望打开它。

       因为大多数 SSH 程序保持私钥时都使用密码加密保护。所以,即便你的电脑丢失,私钥被人拿到,你也有足够的时间来创建新的公钥和私钥,并将服务器上的旧公钥替换掉。

SSH 的安装 

       Ubuntu 提供了一个 meta 软件包,名为 ssh。它依赖 openssh-server 和 openssh-client。使用 apt-cache 显示软件包的依赖关系,从而验证我们刚才所说的是否正确:

Linux代码  收藏代码
  1. $ apt-cache show ssh  
  2. ...  
  3. Depends: openssh-client, openssh-server  
  4. ...   

      如果你的机器上既需要 SSH Server 又需要 SSH Client,可以直接安装 ssh 软件包;否则,就可以分开来安装。

安装 SSH 服务器和客户端

      如果你的服务器上只需用 SSH Server的话,则安装 openssh-server 软件包即可。使用 dpkg -l 查看软件包 openssh-server 是否已安装。如没,则输入安装命令。

Linux代码  收藏代码
  1. # 确认 openssh-server 是否已安装  
  2. $ dpkg -l openssh-server  
  3. # 如没,则输入安装命令  
  4. $ sudo apt-get install openssh-server  

      这样,OpenSSH 服务器就安装好了。提供 SSH 服务的程序叫做 sshd,其配置文件是/etc/ssh/sshd_config 。在默认情况下,SSH 服务跑在 TCP 的22端口。为了安全起见,你可以把这个端口号改成别的,比如2323。使用 sudo nano 修改端口号:

Linux代码  收藏代码
  1. $ sudo nano /etc/ssh/sshd_config  
  2. # 将 Port 22 改为 Port 2323,然后按 Ctrl+o,最后按 Ctrl+x。这样就修改完成  
  3. # 重新启动系统才能生效  
  4. $ sudo reboot  

      如果是在客户端上,我们只需要安装 SSH Client,那么安装 openssh-client 软件包即可:

Linux代码  收藏代码
  1. $ sudo apt-get install openssh-client  

      这样,OpenSSH 客户端就安装好了。它携带了一些其他 SSH 工具,比如 ssh-keygen 可以用来生成公钥/私钥对,scp 可以用来通过 SSH 远程复制文件,sftp 可以实现安全 FTP 传输,等等。

测试 

      安装好后,马上就可以在服务器上测试一下:

Linux代码  收藏代码
  1. $ ssh localhost -p 2323  

      正常情况下,SSH 会邀请你输入密码,通过认证后,便登录成功,你就进入了基于 SSH 新的命令行了。要退出也很简单,使用 Ctrl+d 或 exit 命令即可。

 

SSH 配置

      首先,我们需要生成一对公钥/私钥。

       在 Linux 客户机上,运行 ssh-keygen 命令(请确认你安装了 openssh-client 软件包):

      上面命令行输入的 rsa 代表 rsa for protocol version 2。有关参数选项的含义,建议参考 OpenSSH 用户手册——ssk-keygen 

      这样,密钥对就生成了。公钥是~/.ssh/id_rsa.pub,私钥是~/.ssh/id_rsa。

将公钥复制到服务器

      生成公钥后,我们还需要将它复制到服务器上。

      你可以使用 scp 进行远程 copy,但是 OpenSSH 提供了一个更好的工具叫做 ssh-copy-id QuickTip: Make life easier with ssh-copy-id ), 专门用于密钥的复制 。它可以更安全地帮助我们上传公钥,并自动把公钥写入 SSH 服务器上的 ~/.ssh/authorized_keys (如果~/.ssh目录不存在的话,它会自动创建)。

Linux代码  收藏代码
  1. $ ssh-copy-id -i .ssh/id_rsa.pub lewis@192.168.1.199  

      如果想查 authorized_keys 文件的获取权限是不是 -wr------ ?可以使用 ls -l 命令查看文件的权限:

Linux代码  收藏代码
  1. $ cd .ssh  
  2. $ ls -l  
 

SSH 登录测试

      复制后,我们来测试一下,看看使用刚才创建的密钥对能不能登录。

  1. 从 Linux 登录

      从 Linux 客户机上登录 SSH 服务器很简单:

Linux代码  收藏代码
  1. $ ssh lewis@192.168.1.199  

      输入密钥密码后,应该就可以登录成功了。如果你在创建 key 时没有输入密码,则登录时也不需要使用密码,直接就能登录成功(可以用在 shell 脚本中实现自动维护任务)。

      如果你的 .ssh 目录下有多个 key,则可以使用 -i 来指定 key 文件:

Linux代码  收藏代码
  1. $ ssh -i .ssh/id_rsa lewis@192.168.1.199  

   2. 用 PuTTY 登录

      在 Windows 上用 PuTTY 登录的话,我们的私钥必须用 PuTTYgen 转换一下格式。在 PuTTYgen 的 File 菜单上,选择“Load private key” 或 直接单击“load”按钮(如图 20.1 所示)。

图 20.1  在 PuTTYgen 上加载私钥

       如果你的私钥有密码,PuTTYgen 会要求你输入密码,如图 20.2 所示。

图 20.2 输入私钥的密码

       输入正确的密码后,会显示导入成功。并提示说,“Save private key”将私钥保存为 PuTTY 自己的 key 格式,如图 20.3 所示。

图 20.3 私钥导入成功

      现在,在 PuTTYgen 的界面上,你可以修改 key 的备注(Key comment),然后单击“Save private key”按钮,将私钥保存(如图 20.4 所示)。

图 20.4 修改备注并保存

  • Run the Putty client (PuTTY.exe) to specify the saved private key and auto-login username before initiating connection to lewis. 

      现在,在 PuTTY 中的“Connection -> SSH -> Auth”配置界面中,指定 key 的路径即可,如图 20.5 所示。

图 20.5 在 PuTTY 中加载私钥

Graph 20.6 Specify the login user ID

SSH服务器配置

      在 SSH 服务器上,我们要禁止使用密码登录,仅允许使用密钥登录。

      先备份/etc/ssh/sshd_config,然后修改它:

Linux代码  收藏代码
  1. $ sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config-backup  
  2. $ sudo nano /etc/ssh/sshd_config  

     找到下面几行内容:

Linux代码  收藏代码
  1. PermitRootLogin yes  
  2. #PasswordAuthentication yes  
  3. UsePAM yes  

     将 yes 全部改为 no:

Linux代码  收藏代码
  1. # 不允许使用 root 账号登录系统  
  2. PermitRootLogin no  
  3. # 密码登录权限失效  
  4. PasswordAuthentication no  
  5. UsePAM no  

     文件保存后,重新启动 SSH 服务:

Linux代码  收藏代码
  1. $ sudo /etc/init.d/ssh restart  

     好,SSH 服务器的配置就完成了。现在开始,SSH 服务器将不再接受密码登录方式,只有使用私钥 key 才能登录。

来自  http://douglee.iteye.com/blog/707136

 

普通分类: