目录
一、SSH简介
SSH(Secure Shell)是一种通信加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。
SSH
通过在网络中创建安全隧道来实现SSH
客户端与服务器之间的连接。任何网络服务都可以通过SSH
实现安全传输,SSH
最常见的用途是远程登录系统,人们通常利用SSH
来传输命令行界面和远程执行命令。
加密算法包括:RSA、DSA等。
RSA:非对称加密算法,其安全性基于极其困难的大整数的分解(两个素数的乘积);
DSA:也是非对称加密算法,其安全性基于整数有限域离散对数难题;
scp
传输文件
scp(secure copy)
是linux
系统下基于ssh
登录进行安全的远程文件拷贝的命令。
# 传递文件到远程
scp local_file remote_username@remote_ip:remote_file
# 传递文件夹到远程
scp -r local_folder remote_username@remote_ip:remote_folder
# 复制远程文件到本地,只是调换下文件参数位置即可
scp remote_username@remote_ip:remote_file local_file
远程拷贝的命令还有rsync
,scp
消耗资源少,不会提高多少系统负荷,在这一点上,rsync
就远远不及它了。rsync
比scp
会快一点,但当小文件多的情况下,rsync
会导致硬盘I/O
非常高,而scp
基本不影响系统正常使用。
与scp
相似的命令是cp
,但是cp
只能本机拷贝而不能跨服务器,因此需要与ssh
合作构成scp
命令。
我们直接使用scp
来跨机器拷贝文件,会提示输入密码:
# 提示输入server端服务器的work用户密码
[[email protected] ~]$ scp test.php [email protected]:/home/work
[email protected]'s password:
原因就在于,scp
是先使用ssh
连接服务端机器后,再使用网络来执行远程拷贝(cp)
。
可以参考ssh
的过程:
# 同样的提示输入server端服务器的work用户密码
[[email protected] ~]$ ssh [email protected]
[email protected]'s password:
为避免每次scp都输入用户名、密码,可通过ssh免密登录解决。
二、SSH免密登陆原理
三、SSH免密登陆
服务器环境:
机器 | 用户名 | 密码 |
---|---|---|
192.168.26.134 master | root | 123456 |
192.168.26.131 slave1 | test2 | 123456 |
192.168.26.133 slave2 | test4 | 123456 |
1、生成密钥
分别在192.168.26.131、192.168.26.133、192.168.26.134机器的用户家目录(/home/用户名/)下,执行下列命令,通过RSA算法进行加密,提示输入的话可直接回车不输入任何内容:
ssh-keygen -t rsa
将会在家目录下的隐藏目录/.ssh
下生成文件:
id_rsa.pub //公钥
id_rsa //密钥
生成公钥、私钥可直接执行以下命令:
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
参数说明:
-t 加密算法类型,这里是使用rsa算法
-P 指定私钥的密码,不需要可以不指定
-f 指定生成秘钥对保持的位置
2、将客户端公钥 配置到服务器端
方法一:
将客户端slave1公钥发送个服务端 master,使用ssh-copy-id
ssh-copy-id [email protected] 该命令需要输入test2的密码,来完成公钥拷贝。
注:经过ssh-copy-id后接收公钥的服务端会把公钥追加到服务端对应用户的$HOME/.ssh/authorized_keys文件中 .
方法二:
1、追加公钥
在192.168.26.134机器上,将id_rsa.pub
的内容写入authorized_keys
文件中
cat id_rsa.pub >> authorized_keys
2、发送其他服务器公钥
在slave1机器上,将id_rsa.pub
复制到master机器的/.ssh
目录下,并重新命名位id_rsa.pub.slave1
:
scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave1
在slave2机器上,将id_rsa.pub
复制到master机器的/.ssh
目录下,并重新命名位id_rsa.pub.slave2
:
scp id_rsa.pub hadoop@master:/home/hadoop/.ssh/id_rsa.pub.slave2
3、追加其他服务器公钥
在master机器上,在/.ssh
目录下将看到从slave1、slave2发送过来的文件:
id_rsa.pub.slave1
id_rsa.pub.slave2
将这两个公钥内容追加写入到master机器/.ssh
目录下的authorized_keys
中:
cat id_rsa.pub.slave1 >> authorized_keys
cat id_rsa.pub.slave2 >> authorized_keys
4、确认公钥内容
在master机器上,查看authorized_keys
文件内容,确认包含slave1、slave2机器的两个公钥内容:
cat authorized_keys
5、修改authorized_keys文件权限
分别在master、slave1、slave2机器上执行,对auhorized_keys
进行权限修改,否则将无法实现免密码登录:
chmod 600 authorized_keys
6、SSH登陆测试
在master机器上,从master机器通过ssh登录到slave1,第一次需要密码,退出后以后登录就不需要密码了,其他机器类似操作:
//登陆slave1
ssh slave1
//登陆后退出
exit
//重新登陆
ssh slave1
3、known_hosts
ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告, 避免你受到DNS Hijack之类的攻击。
避免警告的方法:
1. 手动删除修改known_hsots里面的内容;
2. 修改配置文件“~/.ssh/config”,加上这两行,重启服务器。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
优缺点:
1. 需要每次手动删除文件内容,一些自动化脚本的无法运行(在SSH登陆时失败),但是安全性高;
2. SSH登陆时会忽略known_hsots的访问,但是安全性低;