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 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config
准备工作
优化SSH
sed -i '13 iPort 52113nPermitRootLogin nonPermitEmptyPasswords
nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config
sed -i '13 iPort 52113nPermitRootLogin no n 禁止root登录 PermitEmptyPasswords no n 禁止使用密码 UseDNS non 禁用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隧道模式
相关文章:
- Kubernetes 1.14 二进制集群安装
- 老男孩Shell企业面试题30道 [答案]
- Shell 基础介绍 [1]
- Shell 变量及函数讲解 [2]