一、SSH基本简介
SSH 提供两种安全验证方式:
1. 基于口令:客户端使用账号和口令登录服务器,所有传输数据都会被加密。但可能存在伪造服务器冒充真正的服务器与客户端进行交互,不能避免中间人攻击。
2. 基于密钥:使用一对密钥(私钥 + 公钥),将公钥放置到服务器注册。当用户从客户端登录服务器时,服务器会接到使用密钥(即注册在服务器的公钥)进行安全验证请求,服务器首先比对从客户端发送过来的公钥与在己方注册的公钥是否一致,如果一致,服务器会使用该公钥加密数据向客户端发起 "挑战"[1],从而避免中间人攻击。
SSH 协议主要分成三个协议:
1. 传输层协议(The Transport Layer Protocol):传输层协议提供服务器认证,数据机密性,信息完整性等支持。
2. 用户认证协议(The User Authentication Protocol):用户认证协议为服务器提供客户端的身份鉴别。
3. 连接协议(The Connection Protocol):连接协议将加密的信息隧道划分成若干逻辑通道,提供给更高层应用协议使用。
OpenSSH 提供了以下几个工具:
1. ssh:实现 SSH 协议,用以建立安全连接,它替代了较早的 rlogin 和 Telnet。
2. scp, sftp:利用 SSH 协议远程传输文件,它替代了较早的 rcp。
3. sshd:SSH 服务器守护进程,运行在服务器端。
4. ssh-keygen:用以生成 RSA 或 DSA 密钥对。
5. ssh-agent, ssh-add:管理密钥的工具。
6. ssh-keyscan:扫描网络中的主机,记录找到的公钥。
二、服务器端密钥的生成和配置
1.在用户目录(例如root用户就是cd /root)下新建一个.ssh目录,并将其目录权限改为700(仅用户自身有读写操作权限):
# cd /root
# mkdir .ssh
# chmod 700 .ssh
2.进入.ssh目录,使用ssh-keygen命令生成rsa密钥对:
# ssh-keygen -t rsa
如果私钥文件不需要加密,一路直接按回车即可。如果需要加密,如下图所示地方输入相应的密码即可:
3.这时生成了两个文件:id_rsa和id_rsa.pub,其中前一个为私钥,后一个为公钥,公钥须保留在服务器上,私钥拷贝到客户端机器上。
4.在.ssh目录中新建一个文件名为:authorized_keys,将公钥内容拷贝到这个文件中,并将文件权限改为600(仅用户自身有读写权限):
# touch authorized_keys
# cat id_rsa.pub >> authorized_keys (双尖括号>>表示像向文件中追加)
# chmod 600 authorzied_keys
到此,服务器端的密钥设置完成,这里需注意要保证.ssh和authorized_keys都仅用户自身有写权限,否则验证无效,这也是系统处于安全性考虑做的设置。
三、客户端密钥的设置
首先我们需要将在服务器端生成的私钥id_rsa拷贝到要用来登录服务器的客户端电脑。接下来根据客户端电脑操作系统的不同进行分别说明:
Windows系统
在Windows系统下,一般我们采用不同的X server工具来登录,需要先将私钥导入到登录工具的密钥管理器,建立一个新的连接,用户名和主机的填写与采用用户名密码登录一样,登录不再选择”Password”而是”Public key",User Name填写自己的登录用户名,User Key选择之前导入的服务器私钥 ,保存之后,即可无密码登录。
Linux系统
Linux系统下设置同样先将服务器私钥拷贝到客户端
1.与服务器端一样,在用户目录下新建一个.ssh目录,并将其目录权限改为700(仅用户自身有读写操作权限):
# mkdir .ssh
# chmod 700 .ssh
2. 将私钥id_rsa拷贝到.ssh目录下,检查文件权限是否为600,如果不是,需要更改文件权限为600
# mv id_rsa ./.ssh
# chmod 600 id_rsa
3. 这时即设置完毕,输入ssh命令,即可直接连接到服务器,无需输入用户名密码
# ssh 服务器IP
4. 如果需要从客户端通过密钥认证的方式登录不同的服务器,私钥的名称不能都是用id_rsa,这是可以在.ssh目录下建立一个config文件来进行区分,config文件权限同样设为600
# touch config
# chmod 600 config
5. 为config文件添加内容如下:
Host xx.xx.xx.xx //设置服务器IP
HostName xx.xx.xx.xx //设置服务器名称
Port 22 //设置端口
User root //设置登录用户
IdentityFile ~/.ssh/id_rsa //设置私钥路径
这样,用户可以将私钥id_rsa改为与config文件中irs_file同名的文件名,就可以匹配登录服务器了。