1

通过ssh,可以相对很安全的操作远程服务器。使用的软件包 openssh 是该协议的开源实现。

安装 openssh

虚拟机arch linux 执行: #sudo pacman -S openssh

ssh 认证方式

详细说下这部分。 我操作的两种认证过程: 用户名+密码认证和公钥认证

关于公钥和密钥: 他们是成对出现的,信息经过公钥加密, 只有配对的密钥才能解密。公钥是可以任意分发的,私钥必须自己持有,确保自己能唯一解密信息。

1. 用户名+密码:

  • 访问步骤:

  1. 用户第一次访问远程服务器的时候,服务器把自己 public key 发送到客户端

  2. 客户端用服务器的 public key 加密自己的密码,并发送到服务器

  3. 服务器用自己的 private key 解密信息。然后进行验证信息是否有错。
    这个过程中,只涉及到了服务器端的公私密钥对。

优点:密码是安全的,因为只有服务器端的私钥才能解密。这点比传统的 telnet、ftp用的明文传递安全。

缺点:不能避免中间人攻击。把上述过程中的服务器替换成攻击者的服务器,流程也是没有问题的。攻击者欺骗客户端,把自己的 public key发给客户端。攻击者再用自己的私钥解密密码,轻而易举的拿到客户端的密码。然后再假装成客户端请求真正的服务器

2. 公钥认证

这种方式用到了两组密钥对。客户端和服务端都有自己的公私密钥对。

  • 提前准备:

    1. 将客户端的公钥上传到服务器。(这步必须确保安全传到正确的服务器,可以用 usb、#ssh-copy-id user@host命令)

    2. 服务器将该公钥写入到 ~/.ssh/authorized_keys 文件。该文件一行存放一个 public key。

  • 访问步骤:

  1. 客户端请求访问服务器

  2. 服务器生成一个会话用的公私密钥对,并将会话公钥用该客户端对应的 public key 加密,返回给客户端

  3. 客户端用private key 解密会话公钥。并用该会话公钥加密发给服务器的信息

  4. 服务器用会话私钥解密客户端的信息

接下来的客户端-服务器的通信,都通过对方的公钥加密信息,发给对方的消息,只有对方的私钥能解密。这个过程涉及到了两组公私密钥对。

优点:不需要使用密码,提高了安全性。即使有中间人攻击,中间人也无法拿到客户端的私钥解密信息,也不能拿到会话私钥解密服务端的消息。确保了信息安全。

  • 具体涉及的命令:

  1. 生成密钥对。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,使用不到这个文件。

  1. /etc/ssh/sshd_config中添加 AllowUsers userA userB 该指令限制仅userA、userB 可以通过ssh连接。新添加用户通过空格分隔,每次修改后 sudo systemctl restart sshd 重启 sshd守护进程

  2. ~/.ssh/known_hosts~/.ssh/authorized_keys 分别是客户端和服务端管理公钥的文件。

  • 服务端每增加一个客户端的公钥,都要写入服务端~/.ssh/authorized_keys文件

  • 客户端也经常需要连接多个服务端,每个服务端的host与对应的 public key关系保存在客户端 know_hosts

他们的详细格式请查阅手册 #man sshd;
当远程主机IP变化、重装系统等, 会导致known_hosts 缓存的信息失效,更新即可

参考

  1. IBM ssh安全性和配置入门

  2. Arch Linux Wiki:SSH 配置#.E8.BF.9E.E6.8E.A5.E5.88.B0.E6.9C.8D.E5.8A.A1.E5.99.A8)


gaara
3.3k 声望39 粉丝

这个人很懒,什么也没留下