zoukankan      html  css  js  c++  java
  • 第三十天-ssh key企业批量分发自动化管理案例

    本文实现一个应用ssh key 批量分发案例

    目录

      一、ssh key 原理及案例原理简图

        1、ssh key 简介

        2、rsa和dsa区别

        3、ssh-copy-id的特殊应用

        4、ssh-copy-id的原理

        5、案例简图

      二、操作步骤

      三、具体实现步骤

        服务端A:

        客户端B:

        客户端C:

      四、ssh 批量分发与管理方案小结

      五、企业级生产场景批量管理,自动化管理方案

    一、ssh key 原理及案例原理简图

    1、ssh key 简介

      特别提示:在整个方案实现中,公钥(public key)和私钥(private key)仅需要建立一对即可,可以在A、B、C任意机器上来执行,本文选择在A服务器来生成密钥对。
      ssh-kengen -t dsa 中的-t参数指建立密钥的类型,这里指建立的dsa类型,也可以执行  

      ssh-kengen -t rsa 建立的是rsa类型
    2、rsa和dsa区别:
      rsa:是一种加密算法,是由Ron Rivest、Adi Shamir和Leonard Adleman这三个人的名字的第一个字母连接起来的。
      dsa:就是数字签名算法的英文全称的简写,即Digital Signature Algorithm
      rsa既可以进行加密,也可以进行数字签名实现认证,而dsa只能用于数字签名从而实现认证。
      -t type
      指定要创建的密钥类型,可以使用"rsa1"(SSH-1) "rsa"(SSH-2) "dsa"(SSH-2)

      ~/.ssh/identity        该用户默认的RSA身份认证私钥,此文件的权限应当至少限制为"600"
      ~/.ssh/identity.pub 该用户默认RSA身份认证公钥。此文件无需保密。
                                         此文件的内容应该添加到所有RSA的目标主机~/.ssh/authorized_keys文件中
    3、ssh-copy-id的特殊应用
      如果ssh 修改了特殊端口,如52113,那么,在用ssh-copy-id命令时,需要指定端口,操作命令如下:
      ssh-copy-id id_dsa.pub "-p 52113 oldboy@10.0.0.142"   #-->特殊端口分发,要加引号。

    4、ssh-copy-id的原理
      就是把.ssh/id_dsa.pub复制到10.0.0.8下面.ssh目录(提前创建权限700)下,并做了更改名字的操作,名字改为authorized_keys,权限为600

    5、案例简图

     

    二、操作步骤:
      1、打开3台虚拟机,A,B,C,在每台虚拟机上添加用户oldboy,并设置用户密码123456
      2、在其中一台虚拟机A中切换到建立的用户oldboy下,建立密钥对。
           命令为:ssh-keygen -t dsa, 一直回车即可
      3、在A中分别执行
            ssh-copy-id .ssh/id_dsa.pub oldboy@B
            ssh-copy-id .ssh/id_dsa.pub oldboy@C
      4、在A服务器的oldboy用户下,测试A到B,A到C是否ok,免密码验证。

    三、具体实现步骤

    服务端A:

    [oldboy@A ~]$ ifconfig |awk -F '[ :]+' 'NR==2 {print $4}'
    192.168.1.110
    [xiaorui@lrz ~]$ sudo su -
    [sudo] password for xiaorui:
    [root@lrz ~]# hostname A
    [root@lrz ~]# logout
    [xiaorui@lrz ~]$ sudo su -
    [root@A ~]# useradd oldboy
    [root@A ~]# su - oldboy
    [oldboy@A ~]$ 

    1、生成一对密钥

    [oldboy@A ~]$ ssh-keygen -t dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/oldboy/.ssh/id_dsa):
    Created directory '/home/oldboy/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/oldboy/.ssh/id_dsa.
    Your public key has been saved in /home/oldboy/.ssh/id_dsa.pub.
    The key fingerprint is:
    ef:42:23:fb:5e:dc:24:38:d9:2c:cd:24:48:a6:25:c6 oldboy@A
    The key's randomart image is:
    +--[ DSA 1024]----+
    |   .o +          |
    |   .E* .         |
    |    . . . .      |
    |         X       |
    |        S * .    |
    |      . o= +     |
    |       + .+ .    |
    |      . .o       |
    |       oo..      |
    +-----------------+

    2、拷贝公钥到客户端

    [oldboy@A ~]$ ssh-copy-id -i ~/.ssh/id_dsa.pub oldboy@192.168.1.113
    oldboy@192.168.1.113's password:
    Now try logging into the machine, with "ssh 'oldboy@192.168.1.113'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    [oldboy@A ~]$ ssh-copy-id -i ~/.ssh/id_dsa.pub oldboy@192.168.1.114
    The authenticity of host '192.168.1.114 (192.168.1.114)' can't be established.
    RSA key fingerprint is e2:93:c3:1f:ad:27:c6:38:a0:49:8a:dc:cf:53:d3:74.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.1.114' (RSA) to the list of known hosts.
    oldboy@192.168.1.114's password:
    Now try logging into the machine, with "ssh 'oldboy@192.168.1.114'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.

    3、创建测试文件并分发

    [oldboy@A ~]$ touch test.txt
    [oldboy@A ~]$ echo 123 >test.txt
    [oldboy@A ~]$ cat test.txt
    123
    [oldboy@A ~]$ scp test.txt oldboy@192.168.1.113:~
    test.txt                                                                                                      100%    4     0.0KB/s   00:00    
    [oldboy@A ~]$ scp test.txt oldboy@192.168.1.114:~
    test.txt                                                                                                      100%    4     0.0KB/s   00:00
    在客户端查看:
    [oldboy@B ~]$ ls
    test.txt
    编写分发脚本:
    [oldboy@A ~]$ vim fenfa.sh
    [oldboy@A ~]$ chmod +x fenfa.sh
    [oldboy@A ~]$ sh fenfa.sh
    Usage:scp .....
    [oldboy@A ~]$ sh fenfa.sh test.txt /home/oldboy
    test.txt                                                                                                      100%    4     0.0KB/s   00:00    
    test.txt                                                                                                      100%    4     0.0KB/s   00:00
    [oldboy@A ~]$ cat fenfa.sh
    #!/bin/sh
    
    if [ $# -ne 2 ]
    then
        echo "Usage:scp ....."
        exit 1
    fi
    
    for n in 113 114
    do
        scp $1 oldboy@192.168.1.$n:$2    
    done
    
    exit 0
    更专业的脚本:
    [oldboy@A ~]$ cat fenfa.sh
    #!/bin/sh
    
    file="$1"
    remotedir="$2"
    . /etc/init.d/functions
    
    if [ $# -ne 2 ]
    then
        echo "Usage:/bin/sh $0 arg1 arg2"
        exit 1
    fi
    
    for n in 113 114
    do
        scp -rp $file oldboy@192.168.1.$n:$2 >/dev/null 2>&1
        if [ $? -eq 0 ]
        then
            action "scp $file to $remotedir is ok" /bin/true
        else
            action "scp $file to $remotedir is fail" /bin/false
        fi    
    done
    
    exit 0
    实施效果:
    [oldboy@A ~]$ sh fenfa.sh test.txt /home/oldboy/
    scp test.txt to /home/oldboy/ is ok                        [  OK  ]
    scp test.txt to /home/oldboy/ is ok                        [  OK  ]

    客户端B:

    [oldboy@B ~]$ ifconfig |awk -F '[ :]+' 'NR==2 {print $4}'
    192.168.1.113
    [xiaorui@lrz ~]$ sudo su -
    [sudo] password for xiaorui:
    [root@lrz ~]# hostname B
    [root@lrz ~]# hostname
    B
    [root@lrz ~]# logout
    [xiaorui@lrz ~]$ sudo su -
    [root@B ~]# useradd oldboy
    [root@B ~]# su - oldboy
    [oldboy@B ~]$ 

    客户端C:

    [oldboy@C ~]$ ifconfig |awk -F '[ :]+' 'NR==2 {print $4}'
    192.168.1.114
    [xiaorui@lrz ~]$ sudo su -
    [sudo] password for xiaorui:
    [root@lrz ~]# hostname C
    [root@lrz ~]# hostname
    C
    [root@lrz ~]# logout
    [xiaorui@lrz ~]$ sudo su -
    [root@C ~]# useradd oldboy
    [root@C ~]# su - oldboy
    [oldboy@C ~]$

    四、ssh 批量分发与管理方案小结:
      1、利用root做ssh key验证。
           优点:简单、易用
           缺点:安全差,同时无法禁止root远程连接。
      2、利用普通用户来做,思路是先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝到服务器的指定目录。
           优点:安全
           缺点:配置复杂。
      3、拓展:同方案2,只是不用sudo,而是设置suid对固定命令提权。
           优点:相对安全
           缺点:复杂,安全性较差,任何人都可以处理带有suid权限命令

    五、企业级生产场景批量管理,自动化管理方案:
      1、最简单最常用ssh key,功能最强大的,一般中小型企业会用,50-100台服务器
      2、sina cfengine较早的批量管理工具,现在基本没有企业用
      3、门户级别比较流行的,puppet批量管理工具,复杂,笨重
      4、saltstack批量管理工具,特点:简单,功能强大(配置复杂)

    本文源自:根据老男孩教育视频整理总结而成

  • 相关阅读:
    你人生中的那口井挖了没有?
    Stream接口
    console (控制台)
    assert.fail()
    assert.strictEqual()
    assert.equal()
    assert.ifError()
    assert.ok()
    nodejs assert 模块
    闭包
  • 原文地址:https://www.cnblogs.com/migongci0412/p/5058656.html
Copyright © 2011-2022 走看看