ssh服务认证类型主要有两个:

    基于口令的安全验证:

  基于口令的安全验证的方式就是大家一直在用的,只要知道服务器的ssh连接账户、口令、IP及开发的端口,默认22,就可以通过ssh客户端登陆到这台远程主机上。此时,联机过程中所传输的数据都是加密的。

    基于密钥的安全验证:

  基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公钥放在需要访问的目标服务器上,另外,还需要把私钥放到ssh的客户端或对应的客户端服务器上。

此时,如果想要连接到这个带有公钥的ssh服务器,客户端ssh软件或客户端服务器就会向ssh服务器发出请求,请求用联机的用户密钥进行安全验证。ssh服务器收到请求后,会先在ssh服务器上连接的用户家目录下寻找放上去的对应用户的公钥,然后把它和连接的ssh客户端发送过来的公钥进行比较,如果两个密钥一致,ssh服务器就用密钥加密“质询”并把它发给ssh客户端。ssh客户端收到“质询”之后就可以用自己的私钥解密,再把它发给ssh服务器。使用这种方式,需要知道联机用户的密钥文件,与地中基于口令验证的方式相比,第二种方式不需要再网络上传送口令密码,所有安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被黑客获取了,危险就很大了。

案例:批量分发管理(一把钥匙开多把锁)

测试场景:

主机名:nfs-server  网卡eth0:192.168.43.117  用途:中心分发服务器

主机名:lamp01    网卡eth0:192.168.43.118    用途: 接收客户端服务器

主机名:lamp02    网卡eth0:192.168.43.119    用途: 接收客户端服务器

主机名:backup    网卡eth0:192.168.43.200    用途: 接收客户端服务器

=================================================================

首先需要更改局域网机器的主机名与IP地址都要对应到hosts文件里去,方便访问解析快。

通过scp命令发向其他机器上。

scp -r /etc/hosts root@192.168.43.200: /etc

创建一个分发管理用户

创建一个密钥对:(分发机器上创建,切换到分发用户下创建一对密钥)

rsa与dsa密钥类型的区别:

rsa即可以进行加密,也可以进行数字签名实现认证,而dsa只能用于数字签名从而实现认证。

su – bqh01

ssh-keygen –t dsa

ssh-keygen是生产密钥的工具,-t参数指建立密钥的类型,这是是建立dsa类型密钥,也可以建立rsa类型密钥。

也可以用此命令直接生成一对密钥:ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa

此时我们需要把产生的公钥(锁)发给局域网中的各个机器上:

ssh-copy-id -i .ssh/id_dsa.pub bqh01@192.168.43.118

ssh-copy-id -i .ssh/id_dsa.pub bqh01@192.168.43.119

ssh-copy-id -i .ssh/id_dsa.pub bqh01@192.168.43.200

如果ssh修改了特殊端口,如8886,那么用上面的ssh-copy-id命令就无法进行分发公钥了,如果仍要用ssh-copy-id的话,可以用:

ssh-copy-id –I id_dsa.pub “-p 8886 bqh01@192.168.43.118”  //特殊端口分发,要适当加引号。

我们可以上118服务器上查看是否分发过来了:

ok。

此时我们就可以批量管理各个机器了:

例如查看各个机器上的ip地址:可以写一个简单脚本

vi fenfa.sh

ssh -p22 bqh01@192.168.43.118 /sbin/ifconfig eth0

ssh -p22 bqh01@192.168.43.119 /sbin/ifconfig eth0

ssh -p22 bqh01@192.168.43.200 /sbin/ifconfig eth0

  1. 简单脚本:
  2.  
  3. #!/bin/sh
  4.  
  5. for n in 118 119 200
  6.  
  7. do
  8.  
  9. ssh p22 bqh01@192.168.43.$n /sbin/ifconfig eth0
  10.  
  11. done

ok。

接下来我们分发一个文件:先要把分发的文件拷贝到普通用户家目录下

vi fenfa.sh

scp -P22 hosts bqh01@192.168.43.118:~

scp -P22 hosts bqh01@192.168.43.119:~

scp -P22 hosts bqh01@192.168.43.200:~

  1. 简单脚本:
  2.  
  3. #!/bin/sh
  4.  
  5. for n in 118 119 200
  6.  
  7. do
  8.  
  9. scp P22 hosts bqh01@192.168.43.$n:~
  10.  
  11. done

我们从其他机器上查看是否分发过去了:

ok。

当我们批量分发到远程机器的其他目录下会出现以下错误提示:

错误:原因是bqh01没有/etc下的权限。批量分发时需要注意权限问题。

我们可以通过以下方法来解决:

1、  利用root做ssh key验证

2、  利用普通用户如bqh01sudo提权来做

3、设置suid对固定命令授权

例如:利用普通用户如bqh01来做,sudo提权拷贝分发的文件发到远程对应权限的目录下

把普通用户加入到sudoers里去,并授予rsync权限(注意:在所有机器上操作)

echo ‘bqh01 ALL=(ALL)  NOPASSWD:/usr/bin/rsync’ >>/etc/sudoers

visudo -c

我们切换到普通用户下推送一下hosts到/etc/ceshi下试试看:

出现Connection to 192.168.43.118 closed.这种提示表表示执行成功

我们再从其他机器上查看是否推送过来了:

ok。

可以写一个分发脚本:

  1. 脚本优化:
  2. #!/bin/sh
  3. . /etc/init.d/functions
  4.  
  5. if [ $# -ne 2 ]
  6. then
  7. echo "USAGE:$0 localfile remotedir"
  8. exit 1
  9. fi
  10. for n in 118 119 200
  11. do
  12. echo ===============192.168.43.$n==============
  13. scp -P22 -r $1 bqh01@192.168.43.$n:~ &>/dev/null &&\
  14. ssh -t bqh01@192.168.43.$n sudo rsync $1 $2 &>/dev/null
  15. if [ $? -eq 0 ]
  16. then
  17. action "fenfa $1 ok" /bin/true
  18. else
  19. action "fenfa $1 failed" /bin/false
  20. fi
  21. done

执行脚本后效果如下:

我们从其他机器上查看是否分发过来了:

ok。

当然我们可以用隧道模式传输:rsync -avz hosts -e 'ssh -p 22' bqh01@192.168.43.200:~

例如:设置suid对固定命令授权(同上方法,只是不用sudo提权,而是设置suid权限)

我们先去除之前推送过去的文件:

将目标主机上的rsync命令增加s权限(存在危险)

chmod 4755 /usr/bin/rsync

sh fenfa.sh hosts /etc/ceshi/

我们从其他机器上查看是否分发过来了:

ok。

ssh批量分发与管理方案小结:适用于(5-70台服务器)

1、利用root做ssh key验证

优点:简单,易用

缺点:安全差,同时无法禁止root远程连接这个功能。

企业应用:80%的中小型企业在用此方法。

2、利用普通用户如bqh01来做

先把分发的文件拷贝到服务器用户家目录下,然后sudo提权拷贝分发的文件发到远程对应权限的目录下

优点:安全,无需禁用root远程连接这个功能。

缺点:配置比较复杂。

3、同方法2,只是不用sudo,而是设置suid对固定命令授权

优点:相对安全

缺点:复杂,安全性较差。任何人都可以处理带有suid权限的命令。

在生产场景中ssh适用于:批量分发数据、代码、管理等用途。

=================================================================

SSH批量分发管理的更多相关文章

  1. (转)SSH批量分发管理&非交互式expect

    目录 1 SSH批量分发管理 1.1 测试环境 1.2 批量管理步骤 1.3 批量分发管理实例 1.3.1 利用sudo提权来实现没有权限的用户拷贝 1.3.2 利用sudo提权开发管理脚本 1.3. ...

  2. (转)Linux SSH批量分发管理

    Linux SSH批量分发管理 原文:http://blog.51cto.com/chenfage/1831166 第1章 SSH服务基础介绍 1.1 SSH服务 1.1.1SSH介绍 SSH是Sec ...

  3. SSH认证原理和批量分发管理

    SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...

  4. Linux使用ssh公钥实现免批量分发管理服务器

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 管理机器外网IP10.0.0.61(内网172.16.1.61) 服务器外网1 ...

  5. ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs

    ssh key 免密码登陆服务器,批量分发管理以及挂载远程目录的sshfs 第一部分:使用ssh key 实现服务器间的免密码交互登陆 步骤1: 安装openssh-clients [root@001 ...

  6. [svc]ssh批量分发key/批量用户管理

    centos6 sshpass批量分发key yum install sshpass -y ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" 命令说 ...

  7. SSH-KEY服务及批量分发与管理实战

    SSH服务 一.SSH服务介绍 SSH是Secure Shell Protocol的简写,由IETF网络工作小组制定:在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后再进行数据 ...

  8. 【SSH项目实战三】脚本密钥的批量分发与执行

    [SSH项目实战]脚本密钥的批量分发与执行 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  9. SSH批量管理 expect自动交互

    SSH批量管理 expect自动交互 原创博文http://www.cnblogs.com/elvi/p/7662908.html # SSH批量管理 # expect自动交互 ########### ...

随机推荐

  1. linux查看系统的硬件信息【转】

    linux查看系统的硬件信息,并不像windows那么直观,这里我罗列了查看系统信息的实用命令,并做了分类,实例解说. cpu lscpu命令,查看的是cpu的统计信息. blue@blue-pc:~ ...

  2. postgresql 清空数据表数据

    在 mysql中,只需要执行: TRUNCATE table_name; 即可,数据会情况,而且自增id也会变回0: 但在 postgresql 则稍有不同,因为 postgresql 的自增id是通 ...

  3. HttpServletRequest.getInputStream() 只能读取一次

    问题:在使用HTTP协议实现应用间接口通信时,服务端读取客户端请求过来的数据,会用到request.getInputStream(),第一次读取的时候可以读取到数据,但是接下来的读取操作都读取不到数据 ...

  4. SSL编程(3).NET实现SSL服务端

      准备开发用数字证书 一般学习和开发调试场合,不会随便使用正式的SSL服务器证书的私钥.由于服务器验证对于SSL来说是必须的,SSL服务器端必须有拥有一个服务器 证书,即能够访问到证书的私钥.对于要 ...

  5. FFmpeg进行视频帧提取&音频重采样-Process.waitFor()引发的阻塞超时

    由于产品需要对视频做一系列的解析操作,利用FFmpeg命令来完成视频的音频提取.第一帧提取作为封面图片.音频重采样.字幕压缩等功能: 前一篇文章已经记录了FFmpeg在JAVA中的使用-音频提取&am ...

  6. Git Windows客户端保存用户名和密码

    解决Git Windows客户端保存用户名和密码的方法,至于为什么,就不想说了. 1. 添加一个HOME环境变量,值为%USERPROFILE% 2. 开始菜单中,点击“运行”,输入“%Home%”并 ...

  7. [转]小程序web-view组件

    本文转自:https://www.cnblogs.com/-nothing-/p/7910355.html 1,web-view这个组件是什么鬼? 官网的介绍:web-view 组件是一个可以用来承载 ...

  8. WPF备忘录(1)有笑脸,有Popup

    1.画个笑脸给大家娱乐一下: <Canvas Width="200" Height="180" VerticalAlignment="Cente ...

  9. C++切割文件

    void CFileCutter::DoSplit() { ; //计数 CString strSourceFile = m_strSource; //取得全局变量赋值给局部变量,方便操作 CStri ...

  10. Java的类加载过程

    一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译与运行.编译即将Java文件通过Javac命令生成.class文件的过程,运行就是将.class文件交给JVM进行执行. 类加载过程即是 ...