服务器的概念一定要有深入的了解!
(1)为什么要远程连接服务器?
原因一:机房有辐射,为身体着想
原因二:当有软件漏洞或者需要紧急重新配置主机时,而你又在异地,远程连接就像坐在机房一样!
本文主要介绍文字接口远程连接服务器--->SSH--->原理以及相应的配置
SSH(安全壳协议)-->特点:采用数据包加密技术来将待传输的数据加密后传输到网络中,是一种网络安全协议,主要用于登录远程计算机的加密过程!
SSH协议本身提供两个服务器功能:类似于Telent的远程使用shell的服务器和类似于FTP服务的Sftp服务器!
rpm -qa openssl openssh
加密的理解:手语(定制的语言)和三次握手和四次挥手-->研究生面试引申的题!
本文讨论的加密技术是:非对称密钥系统(RSA算法)!
首先对下列相关概念有一个初步的了解!
密钥:类型分为对称和非对称的,包括公钥和私匙
公钥:理解为一把锁,对数据进行加密的,任何人都可以获取公钥来将数据加密!
私钥:理解为锁对应的钥匙,对公钥加密的数据进行解密的,因此私钥不能外流,只能保护在自己的主机上!
重点理解下面一句话:两把钥匙的作用是提供数据加解密的,在同一个方向上的连接中,这两把钥匙是需要成对的!
核心:SSH建立连接的步骤
前提:ssh连接是CS模型(客户端-服务器),客户端发出连接申请,服务器对客户端进行验证,再考虑是否接受连接申请。
说明:有两种建立连接的方式-->基于用户密码的登录方式(需要输入密码)和基于密钥的登录方式!
1、基于用户密码的登录方式:
(1)准备工作:第一次启动sshd服务时,该服务会主动去找/etc/ssh/host_ssh*文件,若系统刚刚安装完成,由于没有这些公钥文件,因此服务器会主动去计算这些需要的公钥文件,同时计算服务器自己需要的私钥文件!
注意:服务器端公钥和私钥的生成位置!
说明:sshd服务的重启(前提是先删除)会自动创建下面阴影的四个文件-->rsa和dsa的密钥!
留意:/etc/ssh/(系统的ssh配置文件!)目录下内容的变化!--->理论上会会生成5中类型的密钥!
(2)客户端发起一个TCP连接,默认端口号为22;-->补充telent服务是23端口
(3)当服务器知道用户请求登录时,服务器会把自己的公钥(关键字ECDSA key fingerprint-->指纹码)发给用户(响应),ssh会将服务器的公钥存放在客户端的~/.ssh/known_hosts文件下, 同时提醒用户输入服务器(远程主机)的密码,用户会根据服务器给它发的公钥对此密码进行加密,加密好好之后返回给服务器,服务器用自己的私钥解密,如果密码正确(验证),则用户会成功登录到服务器上。
说明:这种方式,如果服务器改变了自己的公钥(哪些场景?),客户端想要登录时必须删除自己~/.ssh/known_hosts文件下的旧内容,重新获取服务器新的公钥。只要你知道服务器上的用户和密码,就可以成功登录到远程服务器上。
命令格式: # ssh user@ip
在你第一次登录时,界面上会出现如下图的情形:Are you sure you want to continue connecting (yes/no)?
它会给你提示:你确定你要继续连接吗?这时,你输入yes就好。接下来会让你输入密码,只要正确输入就可成功登录。
完整流程图:稍后补充
2、基于密钥的登录方式:
加密原理:
准备工作-->事先创建一对密钥:
ssh-keygen 命令,生成密钥对(私钥和公钥)。按照默认配置,私钥会被保存在~/.ssh/id_rsa中,公钥则在~/.ssh/id_rsa.pub中;运行上面的命令以后,系统会出现一系列提示,可以一路回车。其中有一个问题是,要不要对私钥设置口令(passphrase),如果担心私钥的安全,这里可以设置一个。
说明:密钥对保存的位置--->"~/.ssh/"中
命令完成后:在~/.ssh/目录下会生成两个新文件:id_rsa.pub和id_rsa。前者存放你自己的公钥,后者存放你自己的私钥。
然后将自己的公钥上传到服务器上(类似白名单,便于识别),该命令格式为:$ ssh-copy-id user@ip
成功登录后,重启服务器ssh服务: $ systemctl restart ssh.service
接下来就可以远程操控服务器了。
说明:一般不要修改这里的文件(可能会影响客户端对服务器的访问),删除后每次生成的公钥和私钥是随机的,每次都不一样!
2.客户端通过安全的方式将公钥发送给服务器。在服务器端,将客户端发的公钥写入到~/.ssh/authorized_keys文件末尾。
说明1:在服务器的配置文件/etc/ssh/sshd_config
中记录着认证列表的目录(58行)!
说明2:known_hosts是密码登录连接时,记录服务器的公钥和ip记录;要区分authorized_keys文件(密钥登录)
什么时候需要添加authorized_keys文件:
(3)服务端收到连接请求后,将自己的一些关键信息发给客户端
信息包括:服务端的公钥;客户端在收到这个公钥后,会在自己的“known_hosts”文件进行搜索。如果找到了相同的公钥,则说明此前连接过该服务器,就会开始计算客户端自己的公私钥数据!如果没有找到(可能是第一次连接此服务器),则会在终端上显示一段警告信息,由用户来决定是否继续连接,若用户要继续建立连接客户端会将服务器的公钥数据记录到客户端的用户主目录内的'~/.ssh/known_hosts'中!如果有此服务器的公钥,但是和之前的的记录有差异(可能是服务器重装系统,导致前后两次该公钥不一致!),则会出现警告信息并退出(进行测试!)。如果匹配成功,服务器会用客户端(用户的)公用密匙加密一段随机字符串并把它发送给客户端。客户端收到加密后的随机字符串之后就可以用客户端的的私钥加密再把它发送给服务器,如果服务器上你事先存放的公钥解密成功则证明用户是可信的,直接允许登录,不再要求密码。
明白:公私钥的位置!
分三种情况考虑:找到了相同,找到了但不同,没有找到!
注意:由于服务器的ssh公钥可能会改变,导致客户端known_hosts文件中记录的内容不一致,如果无法登录时建议删除此ip对应的公钥!
(4)返回客户端的公钥数据到服务器端
达到的效果是:客户端具有自己的私钥和服务器端的公钥-->服务器端具有自己的私钥和客户端的公钥!->非对称加密系统的由来
(5)服务器接受私钥开始双向解密-->真正进行数据的传输!
1)服务器到客户端-->服务器传送数据时,会将用户的公钥加密后进行发送,客户端接受后,用自己的私钥解密
2)客户端到服务器端-->客户端发送数据时,会将服务器的公钥加密后进行发送,服务器接受后,用服务器的私钥进行解密!