通过ssh,可以相对很安全的操作远程服务器。使用的软件包 openssh 是该协议的开源实现。
安装 openssh
虚拟机arch linux 执行: #sudo pacman -S openssh
ssh 认证方式
详细说下这部分。 我操作的两种认证过程: 用户名+密码认证和公钥认证。
关于公钥和密钥: 他们是成对出现的,信息经过公钥加密, 只有配对的密钥才能解密。公钥是可以任意分发的,私钥必须自己持有,确保自己能唯一解密信息。
1. 用户名+密码:
访问步骤:
用户第一次访问远程服务器的时候,服务器把自己 public key 发送到客户端
客户端用服务器的 public key 加密自己的密码,并发送到服务器
服务器用自己的 private key 解密信息。然后进行验证信息是否有错。
这个过程中,只涉及到了服务器端的公私密钥对。
优点:密码是安全的,因为只有服务器端的私钥才能解密。这点比传统的 telnet、ftp用的明文传递安全。
缺点:不能避免中间人攻击。把上述过程中的服务器替换成攻击者的服务器,流程也是没有问题的。攻击者欺骗客户端,把自己的 public key发给客户端。攻击者再用自己的私钥解密密码,轻而易举的拿到客户端的密码。然后再假装成客户端请求真正的服务器
2. 公钥认证
这种方式用到了两组密钥对。客户端和服务端都有自己的公私密钥对。
-
提前准备:
将客户端的公钥上传到服务器。(这步必须确保安全传到正确的服务器,可以用 usb、
#ssh-copy-id user@host
命令)服务器将该公钥写入到
~/.ssh/authorized_keys
文件。该文件一行存放一个 public key。
访问步骤:
客户端请求访问服务器
服务器生成一个会话用的公私密钥对,并将会话公钥用该客户端对应的 public key 加密,返回给客户端
客户端用private key 解密会话公钥。并用该会话公钥加密发给服务器的信息
服务器用会话私钥解密客户端的信息
接下来的客户端-服务器的通信,都通过对方的公钥加密信息,发给对方的消息,只有对方的私钥能解密。这个过程涉及到了两组公私密钥对。
优点:不需要使用密码,提高了安全性。即使有中间人攻击,中间人也无法拿到客户端的私钥解密信息,也不能拿到会话私钥解密服务端的消息。确保了信息安全。
具体涉及的命令:
生成密钥对。xshell中可以生成的密钥对,只是公钥格式好像有问题,不能直接使用。在虚拟机里执行
#ssh-keygen -t rsa
生成一组公私密钥对,该指令默认生成 2048位的 rsa 算法类型的密钥对。命令执行过程如下
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
/home/test/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
f2:75:41:ad:c7:4d:38:0c:d2:aa:d5:aa:9a:f5:84:86 test@hostname.com
第一步是提示输入保存密钥文件的路径,输入enter默认即可。(测试机生成过一次覆盖即可)。
第二步提示提示输入 passphrase,这个相当于给密钥加了个密码。建议在要求更加安全的情况下使用, 一般输入 enter 默认为空即可。
id_rsa 文件保存的是私钥, 公钥的文件命名是private_key_filename.pub
。
生成完毕后,将公钥copy到服务器~/.ssh/authorized_keys
。我是虚拟机,直接复制粘贴了 :),你也可以使用命令:#cat yourpubkeyfile >> ~/.ssh/authorized_keys
客户端是 xshell,通过 工具->用户私钥管理,导入该私钥。即可建立对服务端的访问。对于远程服务器初次安装 key 可以通过 ssh-copy-id -i ~/.ssh/your_key root@remote_ip
命令,执行命令后会提示输入密码,输入完毕后,便公钥导入成功。
基本配置介绍
/etc/ssh/sshd_config
是ssh服务端配置文件/etc/ssh/ssh_config
是ssh客户端的配置文件。 在我的环境中,使用xhell,使用不到这个文件。
/etc/ssh/sshd_config
中添加AllowUsers userA userB
该指令限制仅userA、userB 可以通过ssh连接。新添加用户通过空格分隔,每次修改后sudo systemctl restart sshd
重启 sshd守护进程~/.ssh/known_hosts
和~/.ssh/authorized_keys
分别是客户端和服务端管理公钥的文件。
服务端每增加一个客户端的公钥,都要写入服务端的
~/.ssh/authorized_keys
文件客户端也经常需要连接多个服务端,每个服务端的host与对应的 public key关系保存在客户端
know_hosts
他们的详细格式请查阅手册
#man sshd
;
当远程主机IP变化、重装系统等, 会导致known_hosts
缓存的信息失效,更新即可
参考
Arch Linux Wiki:SSH 配置#.E8.BF.9E.E6.8E.A5.E5.88.B0.E6.9C.8D.E5.8A.A1.E5.99.A8)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。