SSH是访问远程Linux主机的主要手段, 特别是当用户需要操作Linux和Windows主机的时候, 在Windows上能非常方便的通过SSH访问Linux主机. 本文介绍了如何在Linux主机下生成SSH密钥对并在Windows中配置SSH客户端来使用公钥登录远程Linux主机.
Background
这几天需要在实验室空闲电脑上配置一个samba服务器用于共享文件, 而那台电脑所在座位上刚好来了一个人临时要在这边待几个星期, 因此无法直接在服务器前进行配置, 于是乎想到了利用SSH来远程登陆服务器进行操作. 其实说是远程, 也就隔了不到5米, 但是通过自己的电脑操控另一台电脑的感觉真的还是很美妙的. 想象一下此刻你正处于地球上不知道哪个地方, 然后通过庞大的互联网, 连接到了与你距离十万八千里的某台主机上进行操作, 想想还有点小激动呢.
系统环境
服务器: CentOS 6.4 x86_64 OpenSSH
SSH客户机: Windows 7 64bit PuTTY
安装启动SSH服务
在CentOS上查看是否安装了ssh相关的包.
1 | [fancyseeker@localhost ~]$ rpm -qa | grep ssh |
如果没有安装, 那么需要手动安装下
1 | # yum install openssh* |
- 设置开机启动SSH服务
1 | # chkconfig sshd on |
- 开启SSH服务
1 | # /etc/init.d/sshd start |
- 查看SSH服务运行状态
1 | # /etc/init.d/sshd status |
配置SSH服务
SSH服务配置 SSH服务的配置文件主要有2个, 分别为 /etc/ssh/ssh_config
以及 /etc/ssh/sshd_config
ssh_config配置文件
这里我们先对ssh_config
配置文件进行修改, 添加或修改如下几项
1 | # 使用RSA算法进行安全验证 |
由于接下来我们会选用RSA算法来产生密钥对, 因此将RSAAuthentication
设置成yes
, PasswordAuthentication
设置成no
使得客户端无法通过不安全的账户密码方式登录, 增强安全性. Protocol 2
设定强制使用SSH的第二版. 当然, 如果希望仅在某一个网段内进行SSH连接, 那么可以设置 Host *
选项, 将*
换成允许的网段, 例如192.168.1.
代表IP地址为192.168.1.x
的电脑可以进行SSH连接, 而其他IP地址的电脑则无法连接. 关于ssh_config
文件的具体选项的解释如下所示[1
1 | Host * |
sshd_config配置文件
在sshd_config文件中添加或修改如下选项
1 | PermitRootLogin no |
出于安全性的考虑, 我们不允许客户端直接用root账户进行登录, 故将PermitRootLogin
设置成no
(当然, 可以在登陆了其他用户后切换至root用户), 同时不允许空密码. sshd_config
文件的其它具体选项的解释如下所示[1
1 | Port 22 |
密钥对配置
在上面的设置中, 我们已经禁止了用户通过提供账号密码这种不太安全的方式进行登录, 因此, 用户只能通过公钥认证这种方式登录. 公钥认证登录方式相对而言安全, 而且方便, 不要输入密码. 关于公钥认证的原理请看上一篇文章<SSH连接认证原理概述>. 接下来, 需要生成密钥对, 即一组配对的公钥Public Key
和私钥Private Key
. 登录一个普通用户, 利用$ ssh-keygen -t rsa
命令为其生成密钥对, -t rsa
开关代表利用RSA算法产生密钥对.
1 | [fancyseeker@localhost ~]$ who |
注: 运行ssh-keygen
命令并不需要切换至特定的用户 (比如你想要通过sample_user这个用户来进行ssh登陆, 但是并不一定要求说需要切换至sample_user来执行ssh-keygen
这个命令), 同样的也不需要指定在服务器还是客户端执行, 执行ssh-keygen
的目的仅仅是为了得到一个密钥对, 与谁来执行, 在哪执行没有特别的关系. 当然, 生成的密钥对会默认存放在当前用户的~/.ssh
文件夹下, 因此如果用特定用户来执行ssh-keygen
会省事很多. 在得到密钥对之后, 将公钥和私钥设置好权限之后放置在合适的目录下即可. 具体的权限和位置请看接下来的部分.
这时候, 可以查看下~/.ssh
目录下生成的公钥和私钥文件.
1 | [fancyseeker@localhost .ssh]$ ll ~/.ssh |
这里可以看到ssh-keygen
命令生成了公钥 id_rsa.pub
和私钥 **id_rsa
**文件.
接下来, 需要做的就是把公钥文件留在服务器特定用户的 ~/.ssh
文件夹下, 而将私钥文件放置于客户端.
公钥处理
首先, 将公钥 id_rsa.pub
文件重命名为 **authorized_keys
**放置于服务器端指定登陆用户的 ~/.ssh
文件夹下.
1 | [fancyseeker@localhost .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys |
这里有几点要说明下, 关于为什么要将公钥名称更改为authorized_keys
, 这是因为ssh服务会在客户端发起连接请求的时候在对应用户家目录的.ssh
文件夹下寻找 authorized_keys
文件, 并打开访问文件中包含的公钥. 除此之外, authorized_keys
文件中可以包含多个公钥, 因此上述的命令中用了>>
指令将之前生成的公钥追加至authorized_keys
文件的尾部.
为了使登陆更加安全, 我们需要将公钥的权限设置为只有所有者可读, 同时删除之前的 id_rsa.pub
文件, 即
1 | [fancyseeker@localhost .ssh]$ chmod 400 ~/.ssh/authorized_keys |
至此, 服务器端的配置结束. 接下来介绍Windows客户端PuTTY的配置和使用.
Windows下使用PuTTY登陆
PuTTY是Windows环境下一个简单易用的SSH客户端软件.
首先, 我们需要利用一种安全的方式(可以用U盘, 移动硬盘之类的存储介质, 也可以使用scp(secure copy)协议进行安全传输), 将服务器端产生的私钥文件 id_rsa
移动到客户端上来.
转换私钥格式
由于服务器端产生的私钥文件id_rsa
的格式PuTTY无法识别, 因此需要先利用PuTTYgen
工具转换成PuTTY识别的格式.(PuTTYgen工具需要此处下载)
运行PuTTYgen工具, 点击 Load, 选择要转换的私钥文件.
找到之前存放私钥文件的地方.
这里需要将文件名后面的文件类型更改为All File(.)才能看到服务器端产生的私钥文件.
此时, PuTTYgen会要求你输入passphrase口令, 该口令是之前在服务器端利用ssh-keygen
生成密钥对时,由用户输入的一个口令, 如果为空, 直接回车即可.
输入口令, 点击ok, PuTTYgen会提示私钥格式转换成功
点击 Save private key 将转换成功后的 ppk 文件保存至自己想要的指定位置. 此时, 私钥的转换工作结束, 接下来配置PuTTY.
导入私钥
双击打开PuTTY, 在左侧的列表中找到Connection-SSH-Auth
, 在右边的窗口中, 选择需要导入的私钥.
然后找到刚才利用PuTTYgen转换得到的ppk私钥文件
配置会话Session
之后点击左侧列表中的Session, 来配置SSH会话, 即连接的具体参数
此处需要配置服务器的IP地址, 以及要保存的连接名称(任意取), 设定完后点击右侧的 Save
按钮将连接保存, 这样下次就不需要设置而能快速访问了.
至此, SSH的服务器端和客户端的配置全部结束, 接下来是测试过程.
测试登录
双击打开PuTTY, 选中之前我们保存的名为 Whatever you like 的连接, 点击Open
, 发起SSH连接
我们会看到一个黑色的连接对话框, 在输入要登陆的用户名以及在生成密钥对时要求的passphrase后, 成功地登陆了远程服务器.
有几点需要在本文的最后稍微做下说明.
- SSH配置的关键在于首先需要先生成一个密钥对, 该密钥对是由哪个用户生成以及是在服务器端生成还是在客户端生成的都不重要, 重要的是最后这个密钥对中的公钥必须要在服务器端的特定用户家目录下的.ssh文件夹中,并命名为authorized_keys,而私钥则必须经由客户端转换后导入客户端软件,这样才能满足SSH连接的需求.
- 服务器端的公钥权限不对,无法被读取有可能导致在进行SSH登陆的时候被服务器端拒绝.
- 一个萝卜一个坑, 不同用户不可共同使用同一组密钥对, 否则可能导致登陆失败.
- 服务器之所以接受该用户利用SSH登陆是因为在服务器端的改用户家目录的.ssh文件夹下有公钥文件, 并且和发起请求客户端的私钥文件是配对的. 显然的, 如果发起请求的用户在服务器端的家目录.ssh文件夹下没有公钥文件, 那么便无法成功登陆.
至此, 本文结束.