SSH
批量管理
SSH介绍
SSH是Secure Shell Protocol
的简写,由IETF网络工作小组(Network working Group
)指定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全
SSH是专为远程登录会话
和其他网络服务提供的安全性协议
。利用SSH协议可以有效的放置远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet
(23端口,非加密)
在默认状态下,SSH服务主要提供了两个服务功能,一个是提供类似Telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP服务的sftp-server
,借助SSH协议来传输数据的,提供更安全的SFTP服务(vsftp,proftp
)
SSH客户端(SSH命令)还包含一个远程安全拷贝命令scp,也是通过ssh协议工作
ssh小结
1、SSH是安全的加密协议
,用于远程
连接linux服务器
2、SSH默认端口是22
,安全协议版本SSH2,除了2之外还有SSH1
(漏洞)
3、SSH服务端主要包含两个服务协议SSH远程连接,SFTP
服务
4、Linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp
命令
SSH结构
SSH服务由服务端软件OpenSSH (openssl)和客户端(常见的有SSH(linux),SecureCRT,Putty,Xshell)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本分别是1.x和2.x
检查安装SSH
[root@web01 ~]# rpm -qa openssh
openssh-5.3p1-111.el6.x86_64 远程连接安装包
[root@web01 ~]# rpm -qa openssl
openssl-1.0.1e-42.el6.x86_64 加密安装包
OpenSSH同时支持SSH 1.x
和2.x
用SSH 2.x的客户端程序不能链接到SSH1.x的服务程序上
SSH服务是一个守护进程
(daemon),他在后台运行并响应来自客户端的连接请求,SSH服务端的进程名为sshd
,负责实时监听远程
SSH客户端的连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。
SSH客户端包含ssh
以及像scp
(远程拷贝)slogin
(远程登录)sftp
(安全FTP文件传输)等应用程序
SSH
的工作机制大致是本地的ssh客户端发送一个连接请求到远程的ssh服务器,服务器检查连接的客户端发送的数据包和ip地址,如果确认合法
,就会发送密钥给SSH的客户端,此时,客户端本地再将密钥发回给服务端,自己建立连接。SSH1.x和SSH2.x在连接协议上有一些安全方面
的差异
SSH加密技术
SSH加密技术是将人类可以看得懂的数据,通过一定的特殊的程序算法,把这些数据变成杂乱的无意义的信息,然后,通过网络进行传输,二挡到了目的地后,在通过对应的解密算法,把传过来的加密的数据信息解密成加密前的可读取的正常数据。因此,当数据在互联网上传输时即使被有心的黑客监听窃取了,也很难获取到真正需要的数据
网络上的数据包加密技术一般是通过所谓的一对公钥
和私钥
(Public key and Pivate key)组合撑的密钥对进行加密
与解密
操作。
SSH 1.x
每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit
的RSA Key 这个RSA的加密方式就是用来产生公钥和私钥的算法之一。
当服务启
动时,就会产生一个768 bit的临时公钥存放在Server
中
[root@m01 ~]# grep ServerKey /etc/ssh/sshd_config
#ServerKeyBits 1024
SSH 2.x
在SSH 1.x
的联机过程中,当Server接收Clinet端
的Private Key
后,就不再针对该次联机的Key pair进行检验。若此时有而已黑客对该联机key pair
插入而已的程序代码时,由于服务端你不会在检验联机的正确性,因此可能会接收该程序代码,从而导致系统被黑
为了改正这个缺点,SSH version2多加了一个确认联机正确
性的Diffie-Hellman机制
在每次数据传输中,Server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入而已程序代码的问题
另外,SSH2同时支持RSA
和DSA
密钥,但是SSH1仅支持RSA密钥
由于SSH1协议本身存在较大问题,建议使用SSH2的联机模式
当Client端SSH联机请求传送过来时,Server就会将这个768-bit的公钥传给Client端
此时Client会将此公钥与先前存储的公钥进行对比,看是否一致,判断标准是Client端联机用户目录下~/.ssh/known_hosts
文件的内容(linux-客户端
)
不加用户默认是root
不加-p
指定端口 默认是22
[root@m01 ~]# ssh -p52113 oldboy@10.0.0.41
The authenticity of host '[10.0.0.41]:52113 ([10.0.0.41]:52113)' can't be established.
RSA key fingerprint is 96:66:71:6c:ab:2f:8d:58:ce:2c:19:78:a7:ad:13:58.
Are you sure you want to continue connecting (yes/no)?
不加账户默认是root
连接密码文件存放路径
[root@backup /]# cat ~/.ssh/known_hosts
10.0.0.7 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3KsbWJYe6fa2by0asfaZluclFBDtJH61HYG/jxxNEXhVqkGfdp2vN6tHroTFSMPdOHNbqOZICP8YQRpS9UMddfeZxWpf/+HwJLe+40J5eCVY/YgVaDIUVJrxVgkUfB4/XBoUawhSoqLQELnQHVeayHLvQSiZmlFYTaQ0Vb7g+qO7cUHdxi5/1zCplJhq9TMbz78yfWrwvP3iX6x/QdBX72OKUSS02b7KSwhfGj76OX56BmnQx8fVMMotrxTtWuRqYAw+BBtAjr197SZ4J0aJagWHod6HDxA4yfYebB/RuBtmd2va4+TqQtq6N2zvZ7Z5ud2drpZZmruIdGg91mlMLQ==
如何防止SSH登录入侵:
1、用密钥
登录,不用密码登录
2、牤牛阵法
:解决SSH安全问题
3、防火墙
封闭SSH,指定源限制(局域网,信任公网)
4、开启SSH只监听本地内网IP(ListenAddress 10.0.0.8
)
5、尽量不给服务器外网IP
远程连接SSH服务
ssh基本使用语法
ssh -p52113 oldboy@172.16.1.1
1. 连接远程主机命令
的基本语法
2. -p
小写接端口,默认22
端口时可以省略-p22
3. -@
前面为用户名
,如果当前用户连接,可以不指定用户
4. @
后面为要连接的服务器的IP
密钥存储路径
[oldboy@m01 ~]$ cat ~/.ssh/known_hosts
如果端口已修改为特殊端口
,那么用上面命令连接就会发生问题
[oldboy@m01 ~]$ ssh -p22 oldboy@10.0.0.31
ssh: connect to host 10.0.0.31 port 22: Connection refused #提示拒绝连接
保存的结果可能为:
1、no route to hosts
可能为防火墙
2、Connection refused
可能是防火墙,可能是连接端口错误
远程执行命令(最好全路径) ssh -p 22 root@10.0.0.1 /sbin/ifconfig
SSH小结:
1、切换到别的机器上 ssh -p52113 user@ip
2、到其他机器执行命令(不会切到机器上) ssh -p 52113 user@ip
命令
3、当第一次SSH连接的时候,本地会产生一个密钥文件~/.ssh/known_hosts
SSH客户端附带的远程拷贝scp命令
scp的基本语法使用:scp -sercure copy
(remote file copy program
)
推 PUSH
scp -P22 -rp /tmp/oldboy oldboy@10.0.0.1:/tmp
拉 PULL
scp -P22 -rp root@10.0.0.1:/tmp/oldboy/ /tmp/
参数:
#→ -P(大写)接接口,默认22 可以省略
#→-r 递归,表示拷贝目录
#→-p 表示在拷贝前后保持文件或目录属性
# -l 限制速度
scp 知识小结:
1、scp是加密
的远程拷贝,而cp仅为本地拷贝
2、可以把数据从一台机器推送到另一台机器,也可以从其他服务器把数据拉回到本地执行命令的服务器
3、每次都是全量完成拷贝,因此效率不高,适合第一次拷贝用,如果需要增量拷贝,用rsync
ssh服务附带的sftp功能服务
windows客户端和linux服务器之间传输数据工具:
1) rz、sz(lrzsz)
2) winscp WinSCP-v4.0.5 基于SSH,sftp
3) SFX(xshell) 4) SFTP 基于SSH加密传输
5) samba,http,ftp,nfs
FTP工具:vsftp、proftpd、SFTP
linux sftp客户端连接sftp服务方法
登录FTP的方法就是sftp oldboy@10.0.0.1
如果ssh
端口为52113
,则命令如下
[oldboy@m01 ~]$ sftp -oPort=52113 oldboy@10.0.0.31
Connecting to 10.0.0.31...
sftp> cd /home/oldboy
#还可以像命令行那些切换目录
sftp> put /etc/hosts #把/etc/hosts
从客户端本地传到nfs服务器当做连接目录
Uploading /etc/hosts to /home/oldboy/hosts
/etc/hosts 100% 349 0.3KB/s 00:00
sftp>ls -l /home/oldboy #可以查看目录
SSH服务认证类型介绍
基于口令的安全验证:
基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH端口号
和口令
,应服务器的IP
及开放的端口
,默认都为22
,就可以通过ssh客户端登录到主机,此时联机过程中所有传输都是加密
的
基于密钥的安全验证:
基于密钥的安全验证方式是指,需要依靠密钥
,也就是必须事先建立一对密钥
,然后把公用密钥(Publickey
)放在需要访问的目标服务器上,另外,个还需要把私有密钥
(Private key)放到SSH客户端或对应的客户端服务器上
此时,如果要想连接到这个带有公用密钥
的SSH服务器,客户端SSH软件或者客户端端服务就会想SSH服务端发出请求,请求用联机用户密钥进行安全连接。SSH服务会在收到请求之后,会现在改SSH服务器上连接的用户的加密路下 放上去的对应用户密钥,然后把它和连接的SSH客户端发来进行密钥,如果两个密钥一直SSH服务就会用公用密钥加密“质询
”(challenge)并把它发送给SSH客户端
更改ssh默认登录配置
修改SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config
实现的
一般来说SSH服务使用默认的配置已经够很好的工作,如果对安全要求不高,仅仅提供SSH服务的情况不需要修改任何配置
sshd_config
配置文件说明:
优化SSH配置文件选项
[root@m01 etc]# cp /etc/ssh/sshd_config{,.ori} 修改配置文件前进行备份
[root@m01 etc]# vim /etc/ssh/sshd_config
Port 52113 //ssh连接端口默认为22,修改端口号可以提高级别
PermitRootLogin no //禁止root远程登录
PermitEmptyPasswords no //禁止空密码的用户登录
UseDNS no //不使用DNS进行解析
GSSAPIAuthentication no //会导致SSH连接慢
SSH远程连接服务慢的解决方案
在这里我们可以使用`sed`进行一键替换
[root@m01 etc]# sed -r '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
准备工作
优化SSH
sed -i ’13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords
no\nUseDNS no\nGSSAPIAuthentication no’ /etc/ssh/sshd_config
sed -i '13 iPort 52113\nPermitRootLogin no \n 禁止root登录
PermitEmptyPasswords no \n 禁止使用密码
UseDNS no\n 禁用DNS
GSSAPIAuthentication no' 禁用GSSAPI
sshd_config
检查houst解析
cat >>/etc/hosts/ <<EOF
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01 db01.etiantian.org
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
EOF结束
实验步骤
[root@m01 /]# useradd oldboy
[root@m01 /]# echo "123456"|passwd --stdin oldboy
[root@m01 /]# id oldboy
[root@m01 /]#su – oldboy
[oldboy@web01 ~]$ ssh-keygen -t dsa //非交互式创建密钥
#ssh-keygen
是生产密钥的工具 -t参数是指定密钥的类型,这里是建立dsa
类型密钥
#也可以使用ssh-keygen -t
rsa
来建立rsa类型密钥
#RSA与DSA加密算法的区别
#RSA:
是一种加密算法(PS:RSA也可以进行数字签名的)它的简写的来由是RonRivest、Adi Shamir和LeonAdleman 这三个姓氏加在一起就是RSA
#DSA就是数字签名
算法的英文全称的简写,即Digital Sigenature Algorithm=DSA
RSA
既可以进行加密
,也可以进行数字签
名实现认证,而DSA
只能用于数字签名
脚本分发密钥
yum install -y sshpass
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa &>/dev/null
sshpass -p 123456 ssh -o StrictHostKeyChecking=no 用户名@主机名
一键产生密钥对:
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
echo -e "\n"|ssh-keygen -t dsa -N ""
[oldboy@web01 ~]$ ll -la
total 28
drwx------. 3 oldboy oldboy 4096 May 6 00:59 .
drwxr-xr-x. 3 root root 4096 May 1 04:39 ..
-rw-------. 1 oldboy oldboy 25 May 5 18:58 .bash_history
-rw-r--r--. 1 oldboy oldboy 18 Jul 24 2015 .bash_logout
-rw-r--r--. 1 oldboy oldboy 176 Jul 24 2015 .bash_profile
-rw-r--r--. 1 oldboy oldboy 124 Jul 24 2015 .bashrc
drwx------ 2 oldboy oldboy 4096 May 6 00:59 .ssh 注意权限
[oldboy@web01 .ssh]$ ll
total 8
-rw------- 1 oldboy oldboy 668 May 6 00:59 id_dsa 私钥=钥匙
-rw-r--r-- 1 oldboy oldboy 602 May 6 00:59 id_dsa.pub 公钥=锁
[oldboy@web01 .ssh]$ssh-copy-id -i id_dsa.pub oldboy@10.0.0.41
ssh-copy-id
只能发公钥
,不能发私钥
-i
代表发送的文件 代表默认发送(端口22
情况)
[oldboy@web01 .ssh]$ ssh-copy-id -i id_dsa.pub “-p 52113 oldboy@10.0.0.41”
代表改变端口-p 后面加上修改后的端口即可
[oldboy@web01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.31
[oldboy@web01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub "-p52113 oldboy@172.16.1.41"
SSH免密码登录小结:
1)免密码登录是单向的,方向从私钥(钥匙)==》公钥(锁)
2)SSH免密码登录基于用户的,最好不要跨不同的用户
3)ssh连接慢的问题解决
例子:将本地hosts发送给指定的ip
第一种 sudo
提权实现没有权限用户拷贝
[root@web01~]#echo“oldboyALL= NOPASSWD:/usr/bin/rsync ”>>/etc/sudoers
[root@web01~]#visudo -c
[oldboy@web01 ~]$scp -P52113 hosts oldboy@172.16.1.31:~ //最好发送到家目录下,直接发送到/下是没有权限
[oldboy@web01 ~]$ssh -p52113 -t oldboy@172.16.1.31 sudo rsync ~/hosts /etc/hosts
需要授权sudo权限
第二种 利用suid
实现没有权限用户拷贝(了解即可,不建议
使用)
[root@web01~]#chmod u+s `which rsync`
[oldboy@web01 ~]$scp -P52113 hosts oldboy@172.16.1.31:~
[oldboy@web01 ~]$ssh -p52113 oldboy@172.16.1.31 rsync ~/hosts /etc/hosts
第三种 使用root
进行操作
rsync
使用
rsync -avz hosts -e ‘ssh -p 52113’oldboy@172.16.1.31:~
1、可以增量备份
2、使用ssh隧道加密传输
常用连接介绍:
发送文件脚本
[cyh888@m01 ~]$ sh fenfa.sh hosts
hosts 10.0.0.41 is ok [ OK ]
hosts 10.0.0.31 is ok [ OK ]
[cyh888@m01 ~]$ cat hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5 lb01
172.16.1.6 lb02
172.16.1.7 web02
172.16.1.8 web01
172.16.1.51 db01 db01.etiantian.org
172.16.1.31 nfs01
172.16.1.41 backup
172.16.1.61 m01
===================2016-05-08=====
[cyh888@m01 ~]$
查看对方系统版本
[oldboy@web01 ~]$ sh view.sh
====172.16.1.41====CentOS release 6.7 (Final)
====172.16.1.31====CentOS release 6.7 (Final)
[oldboy@web01 ~]$ cat view.sh
#!/bin/sh
for n in 41 31
do
echo -n "====172.16.1.$n====" -n代表不换行
ssh -p 22 172.16.1.$n cat /etc/redhat-release
done
[oldboy@web01 ~]$ sh view.sh "cat /etc/redhat-release"
====172.16.1.41====CentOS release 6.7 (Final)
====172.16.1.31====CentOS release 6.7 (Final)
[oldboy@web01 ~]$ cat view.sh
#!/bin/sh
for n in 41 31
do
echo -n "====172.16.1.$n===="
ssh -p 22 172.16.1.$n $1 $1脚本当中第一个参数
done
[oldboy@web01 ~]$ sh view.sh “iostat” 查看系统中的IO
====172.16.1.41====Linux 2.6.32-573.el6.x86_64 (backup) 05/06/2016 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.00 0.14 0.10 0.00 99.76
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.01 0.00 264 0
sda 0.18 4.90 0.77 99662 15746
====172.16.1.31====Linux 2.6.32-573.el6.x86_64 (nfs01) 05/06/2016 _x86_64_(1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.03 0.03 0.22 0.20 0.00 99.53
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.00 0.00 264 0
sda 0.51 14.88 12.88 1153072 997908
[oldboy@web01 ~]$ sh view.sh "free -m"
====172.16.1.41====
total used free shared buffers cached
Mem: 475 107 367 0 11 34
-/+ buffers/cache: 60 414
Swap: 1023 0 1023
====172.16.1.31====
total used free shared buffers cached
Mem: 475 417 57 0 28 288
-/+ buffers/cache: 100 374
Swap: 1023 0 1023
脚本里面将echo -n中的-n取消即可
批量分发文件:(housts
)
[oldboy@web01 ~]$ scp -P22 hosts 172.16.1.41:~
hosts 100% 349 0.3KB/s 00:00
[oldboy@web01 ~]$ scp -P22 hosts 172.16.1.31:~
hosts 100% 349 0.3KB/s 00:00
脚本内容
[oldboy@web01 ~]$ sh fenfa.sh
hosts 100% 349 0.3KB/s 00:00
hosts 100% 349 0.3KB/s 00:00
[oldboy@web01 ~]$ cat fenfa.sh
#!/bin/sh
for n in 41 31
do
echo -n "====172.16.1.$n===="
scp -P22 hosts 172.16.1.$n:~
done
另一种方法:
[oldboy@web01 ~]$ sh fenfa.sh hosts
hosts 100% 349 0.3KB/s 00:00
hosts 100% 349 0.3KB/s 00:00
[oldboy@web01 ~]$ cat fenfa.sh
#!/bin/sh
for n in 41 31
do
echo -n "====172.16.1.$n===="
scp -P22 $1 172.16.1.$n:~
done
控制不输入任何命令进行操作
[oldboy@web01 ~]$ sh fenfa.sh
USAGE:/bin/sh fenfa.sh FILENAME
[oldboy@web01 ~]$ cat fenfa.sh
#!/bin/sh
if [ $# -ne 1 ];then $#参数多少
echo "USAGE:/bin/sh $0 FILENAME" $0脚本名字
exit 1 1脚本执行后的状态
fi
for n in 41 31
do
echo -n "====172.16.1.$n===="
scp -P22 $1 172.16.1.$n:~ 对应第一个执行命令
done
[oldboy@web01 ~]$ sh fenfa.sh
USAGE:/bin/sh fenfa.sh FILENAME
[oldboy@web01 ~]$ sh fenfa.sh hosts 成功ok 失败no
dis hosts to 172.16.1.41 [ OK ]
dis hosts to 172.16.1.31 [ OK ]
脚本内容
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then
echo "USAGE:/bin/sh $0 FILENAME"
exit 1
fi
for n in 41 31
do
scp -P22 $1 172.16.1.$n:~ &>/dev/null
if [ $? -eq 0 ];then
action "dis $1 to 172.16.1.$n" /bin/true
else
action "172.16.1.$n" /bin/false
fi
done
expect
语言 解决非交互式输入密码的问题
yum -y install expect
默认不存在需要安装
[root@m01 ~]# which expect
/usr/bin/expect
ssh+rsync+sersync
简单易用
Saltstack
pupet
大网站用
ansible
(不需要客户端)
cfengine
(已淘汰)
SSH批量管理步骤:
1、ssh优化和hosts解析
2、创建用户
3、生成密钥对
4、分发公钥到所有服务器 ssh-copy-id
5、测试 远程连接ssh
远程执行命令ssh ifconfig
远程拷贝文件scp rsync-e
隧道模式