由于我的服务器集群需要将日志回收到中心统一处理,所以需要建立ssh互信关系实现免密码登录。您可能熟悉ssh的使用。今天主要讲一下ssh连接和免密码登录的原理。scptransferfilesscp(securecopy)是linux系统下基于ssh登录的安全远程文件拷贝命令。#传输文件到远程scplocal_fileremote_username@remote_ip:remote_file#传输文件夹到远程scp-rlocal_folderremote_username@remote_ip:remote_folder#复制远程文件到本地,只需将文件参数位置更改为scpremote_username@remote_ip:remote_filelocal_fileremote复制命令还包括rsync。scp消耗资源少,不会增加系统负载。在这方面,rsync远不如它。rsync比scp快,但是当小文件很多的时候,rsync会造成非常高的硬盘I/O,而scp基本不影响系统的正常使用。类似于scp的命令是cp,但是cp只能在本地复制,不能跨服务器,所以需要配合ssh组成scp命令。我们直接使用scp跨机器拷贝文件,会提示输入密码:#提示输入服务器server的工作用户密码[work@client.com~]$scptest.phpwork@server.com:/home/workwork@server.com的密码:原因是scp先用ssh连接服务器机器,然后用网络进行远程复制(cp)。ssh流程可以参考:#同样提示输入服务器server的工作用户密码[work@client.com~]$sshwork@server.comwork@server.com的密码:ssh加密信息SecureShell(SecureShellProtocol,简称SSH)是一种加密的网络传输协议,可以在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道实现SSH客户端与服务器的连接。虽然任何网络服务都可以通过SSH安全传输,但是SSH最常见的用途是远程登录系统。人们通常使用SSH传输命令行界面并远程执行命令。SSH是非安全shell(如Telnet/rlogin)的替代品。这些协议采用明文传输,会引入很多安全问题:如图所示,telnet使用23端口,包括用户名和密码在内的所有信息均采用明文传输;而ssh使用22端口,所有信息都会加密传输,安全性大大提高。ssh的使用非常简单。选择哪个用户连接哪台机器,然后输入密码:$sshuser@hostnameuser@hostname的密码:对称加密和非对称加密ssh的主要优点是安全,这取决于加密方式。加密方式主要有两种:对称加密和非对称加密。对称加密对称加密使用相同的密钥进行加密和解密,在传输过程中是安全可靠的,但是如何安全地保存密钥呢?在集群中,客户端的数量是巨大的。一旦任何一个客户端的密钥被盗窃,那么整个系统的安全性也就不复存在了。非对称加密由于对称加密的这一缺点,产生了非对称加密。非对称加密有两个密钥:公钥和私钥。公钥由私钥生成,但不能推导出私钥;公钥加密的密文只能用对应的私钥解密。非对称加密登录流程:初始状态:topgun终端需要登录Server服务器,发起连接请求sshwork@server.com服务器运行ssh服务,持续监听22端口,所以一对公钥和可以生成私钥;此时,公钥返回给客户端。客户端使用公钥加密登录密码(例如服务器工作用户密码为xxx),生成公钥加密字符串。客户端将公钥加密后的字符串发送给服务器。服务端用私钥解密公钥的加密字符串,得到原始密码,检查密码是否合法(这是本地工作密码),返回登录结果给客户端:登录成功或密码错误.在非对称加密中,只有公钥会被传输,而私钥是保存在服务器本地的,所以即使监听到公钥也无法获取到原始密码登录服务器。中间人攻击在非对称加密中可以有效保护登录密码不被泄露,但这是在与真实服务器建立连接时。想象一下,如果提供者不监听密码或者公钥,而是直接伪装成一个服务器:在这个例子图中,有一个Hacker服务器劫持了你的ssh连接建立请求(比如通过DNS劫持等),导致你到黑客机器的连接是正常的,所以它可以拿到你的明文密码,通过明文密码攻击真实的服务器。那么SSH是如何使用非对称加密来解决这个问题的呢?[work@client.com:~]$sshwork@server.com无法确定主机'server.com(10.10.10.24)'的真实性。RSA密钥指纹为ad:2e:92:41:6f:31:b1:c1:35:43:eb:df:f1:18:a1:c1。您确定要继续连接吗(是/否)?yesWarning:Permanentlyadded'server.com,10.10.10.24'(RSA)tothelistofknownhosts.密码:(输入密码)在这个认证信息中,可以看到提示:无法确认主机服务器的真实性。com(10.10.10.24),但是知道它的公钥指纹,是否继续连接?输入yes继续连接后,会确认服务器是可信服务器,然后添加到known_hosts文件中。下次不用再确认,直接跳转到输入密码的验证阶段。这种简单粗暴的方法,相当于让我们用肉眼进行对比,判断目标服务器是否是真实服务器。我认为这不是最理想的方式,希望以后有更完善的认证方式。之所以用指纹(公钥指纹)代替密钥,是因为密钥太长(RSA算法生成的公钥有1024位),难以直接比较。因此,将公钥哈希生成一个128位的指纹,方便比对。SSH免密码登录我们已经掌握了如何使用ssh登录远程服务器,但是每次登录都要输入密码很麻烦,ssh提供了一种免密码登录方式:公钥登录。在客户端使用ssh-keygen生成一对密钥:公钥+私钥。将客户端公钥附加到服务器上的authorized_key文件。客户端完成公钥认证操作后,向服务器端发起登录请求,并将公钥传递给服务器端。服务器检索authorized_key文件并确认公钥是否存在。如果公钥存在,则生成一个随机数R,用公钥加密生成公钥加密字符串pubKey(R),并将公钥转换为加密后的字符串传递给客户端。客户端使用私钥解密带有公钥的加密字符串。R服务器在与客户端通信时,会生成一个会话ID(sessionKey)。使用MD5加密R和SessionKey生成摘要(即MD5加密字符串)客户端将生成的MD5加密字符串发送给服务器。服务器还生成一个MD5(R,SessionKey)加密字符串。如果客户端发送的加密字符串与服务端自己生成的加密字符串相等,如果认证成功,此时不需要输入密码,即建立连接,可以开始远程执行shell命令,实现免密码登录。ssh-genkey是一个生成密钥的工具。默认情况下,它保存在~/.ssh/路径中。常用的参数有:-t:指定生成密钥的类型(rsa、dsa)。默认为rsa-f:指定存放私钥的文件,公钥文件名是私钥文件名加上后缀.pub。默认为id_rsa-P:指定passphrase(私钥的密码),保证私钥的安全。默认为空-C:注释。默认是user@hostname,我们直接执行生成key。所有参数都可以为空,即回车确认:$ssh-keygenGeneratingpublic/privatersakeypair.Enterfilewhichtosavethekey(/home/work/.ssh/id_rsa):Enterpassphrase(emptyfor无密码):再次输入相同的密码:您的身份已保存在id_rsa中。您的公钥已保存在id_rsa.pub中。密钥指纹为:74:17:74:38:b2:c7:70:fd:1d:33:eb:e2:71:71:cc:11work@client.com此时生成的文件在在~/.ssh/目录下,我们会看到这些文件:id_rsa//私钥文件id_rsa.pub//公钥文件authorized_keys//存储客户端公钥的文件known_hosts//已确认的可信服务器列表的文件配置公钥指纹//指定不同的域名使用哪个密钥配置文件因为一台机器既可以是客户端又可以是服务器,所以既有authorized_keys(机器为服务器时使用)也有Known_hosts(机器为服务器时使用)客户)。我们的服务器会有很多用户。如果所有用户都使用同一个密钥,可能无法划分权限或区分用户。比如多个用户提交git,需要根据用户名生成key来区分用户。.同时,你可能还想为不同的服务器使用不同的密钥对,所以你需要config配置文件来为不同的服务器配置配置:$vim~/.ssh/configHosta.baidu.comUserworkIdentityFile~/.ssh/id_rsaHostb.baidu.comUserzhaoshuiqiangIdentityFile~/.ssh/zhaoshuiqiang这样在连接不同的服务器时,会使用不同的密钥文件进行登录。客户端生成密钥对后,只需将公钥附加到服务器的authorized_keys文件即可。...15ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAn30bjwtkLW82vTlLMQnI/a42J2g7o+HBCpSzBgNG+xfZuSNQOAU8+FNKQvriT4AL7ToiTtrZDLOEGqyQzaxQejuNnWG6aQ9ETh96qXhVLecWidaBieFGuv+FuXz6x551xtFXx64AzG+706dhnv1nOACYlrnfvXhi5kZzWzprET+CxMIeYhJQwwc19pF5zCWeU9QUvd1mOu0n8JVycevmuXRdVx9WpXq2+aaaaaaaa3uYGMBxvSLtT40O1AiEZ+k9EeYCnTEVtnGoVWCyxpwv6rR/GDOtJL/d+/Wb6I0HEKxxe087yZz8GWpQN5TEIAjq3oEjI/aiGw==work@a.baidu.com16ssh-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAzRmK+CAVLnryXqQwweu8Yji8bGAvqzf8PSDzYn1nmE6ZeDkBbrWvFlVZ2yOip3IX8RjvuPc28mTCr0LsIOOmpvET0SzOkt0hzLBPiyCN/QvbKU/RbUv8v5y2hEAlbUkMEzv7qOHQEruGEvA5y99gf/nYjK5OFKVpmg838OScUV3i88Xbqk8rtcuRZHWuZLnuB5spBsEE5r1UrnH/Ik7frZr8Vb4X6aZWbAp1yc0SqZ8JXVbmOiakqq0WqkLm+zqhEwr+Ooh2guH23x9zjMqYUy+aaaaaBEBC+LepCvskArBt/SRwJDJkcItz8T7kBC3CP0Y0X4hB+6k6/yM/pup5w==work@b.baidu.com此时,即可免密登录服务器。Thesecurityof私钥假设你已经实现了服务器集群的免密码登录,如果你的某个客户端被攻击成功,那么整个集群的安全性就会消失。因此,我们有时需要保证密钥的安全,即设置私钥密码://使用rsa方式加密,生成测试密钥对,私钥密码为123456ssh-keygen-trsa-ftest-P123456这里,每台机器还是免密登录,但是需要输入私钥密码:$sshwork@a.baidu.comEnterpassphraseforkey'/home/work/.ssh/test':参考RUNOOB-Linuxscp命令:http://www.runoob.com/linux/l...linux-docscp跨机远程复制:https://linuxtools-rst.readth...维基百科SecureShell:https://zh.wikipedia。org/wiki...说明SSH原理的简书图:https://www.jianshu.com/p/334...CSDNscp在linux中实现两台主机互传文件-无需输入密码互信:https://blog.csdn.net/posonri...