话说早些日子,某人犯事了,就会大喊“我爸是李刚”。搞得“李刚”二字已经不是人名,变成了一块牌子,什么牌子?自然是免死金牌。是真金还是镀金,尚且不得知,只知道受到了诸多舆论的谴责。实际上,别说是“李刚”,你喊“李玉刚”,人家也不待见你啊。归根结底是那人觉得自己是含着金钥匙出生的,就可以为所欲为。

 

其实,我们avamar也是含着金钥匙诞生的产品,这可不是镀金的,那是真真的足金。以上抛砖引玉之后,各位仁兄,你们好,我们要进入主题开始Avamar的技术讨论了,今天我们要来告诉各位一个新玩意,那就是撬开Avamar的金钥匙。

 

在之前的版本中,我们经常说登录到Avamar之后,要运行”ssh-agent bash”,然后添加key”ssh-add ~/.ssh/dpnid”,然后我们就可以为所欲为不需要密码地登录到任何一台存储节点。那大家有没有回头来想过avamar到底是如何如火纯清地运用Key,体验到Key的好处呢?


在介绍Key之前,我们先来温习下什么是密钥?密钥在SSH的远程登录时候是如何工作的?


密钥(Key)顾名思义就是用来加密和解密的钥匙,如同一把锁,我们用钥匙把东西锁住,然后再用钥匙把东西解开。例如对一串字符进行加密后,就会变成一堆无法人类识别的字符码或者是乱码,这样没有key的话就无法解开这个加密,也无法获知里面的具体内容。因此市面上大量使用的有两种密钥:私用密钥和公共密钥。


对称加密算法在加密时和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key, 简称私钥),公钥是可以对外发布和传输,而私钥是保存在拥有者的一方。


对称加密的原理图(加密和解密都是用同一个Key):

1.png

非对称加密原理图(私钥加密,公钥解密;公钥加密,私钥解密):

2.png

既然密钥有此等好处,那么就促成了常见的两种应用。


  1. 1. 加密发送数据。

比如用户A要给用户B发送加密的邮件,那么用户A使用用户B的公钥来加密,把加密后的邮件发送给用户B,用户B自然可以用自己的私钥来解密邮件,这样就可以防止邮件在网络传输过程中,被黑客截取之后直接读取里面的明文内容。这就是加密数据的一种应用。

 

  1. 2. 公钥验证。

公钥验证就是将要发送的数据进行数字签名,而接收方在收到数据后,便通过数字签名来验证数据是否属实,而且当中有没有被篡改过。因此公钥验证运用的最多就是数字签名。简而言之就是用户A用自己的私钥进行加密,把加密后的数据发送给用户B,用户B使用用户A的公钥来解密,如果能正确解密,那就说明数据确实是来自用户A,并且数据的内容没有篡改过。


接下来我们来介绍下SSH Key的原理。SSH是帮助我们用putty等工具来远程登录服务器的协议。正常情况下我们使用SSH命令来登录远端服务器,每次登录时候,我们需要手动输入账号和密码。但是对于Avamar产品来说,我们每次要在Utility Node上登录到Storage Node的时候不断输入账号和密码是非常头疼和不方便的事情。所以我们必须要借助Avamarkey来实现SSH无密码登录功能。


SSH采用基于公钥和私钥的加密技术来进行自动化认证。通常是通过ssh-keygen命令创建认证密钥。公钥必须放置在服务器中(将其加入文件~/.ssh/authorized_keys),与公钥对应的私钥放在客户机的~/.ssh目录中。因此公钥和私钥是非常重要的。

3.png


我们再来复习下下面图:

4.png


SSH无密码登录的过程如下:

  1. a. 客户端有一个私钥和自己的公钥,客户端的公钥被放在服务器端上。
  2. b. 当客户端登录服务器端的时候,服务器会生成一个随机的序号,然后用客户机的公钥加密。
  3. c. 客户机用私钥来机密,并把序号发回。
  4. d. 服务器就认证客户机成功,这样客户机就可以登录了。


所以我们的Avamar也是用这把金钥匙来实现在Utility NodeStorage Node之间的来回登录。那么我们Avamar是使用常规的SSH命令吗?答案当然不是的。Avamar自然有一套自己的登录妙招。


妙招一、ssh-agent bash

该命令是用来缓存需要解密的私钥。启用ssh之前的准备工作。


妙招二、ssh-add ~/.ssh/dpnid

DPN账号的私钥放入到缓存中,因此会自动把私钥给获取出来。


妙招三、ssh-add -l

此招是用来列出目前加载进来的所有密钥。


妙招四、ssn 0.*

我们可以在utility node上用ssn命令来登录任何一个storage node0.*storage nodeID号,如0.00.2等节点。由于Avamar目前只能最多有16个节点,因此第11个节点的ID0.A,而最大的节点的ID号是0.F


既然我们可以用ssn方式来任性地登录任何一个节点,我们可以查看Avamarnode上哪些文件是和SSH有关的?


  • /home/admin/.ssh 文件夹内容:

-r-------- 1 admin admin 744 May 31 2011 admin-id-2.dsa         ## admin账号的私钥

-r-------- 1 admin admin 951 May 31 2011 admin_key                ## admin账号的私钥

    -r--r--r-- 1 admin admin 223 May 31 2011 admin_key.pub       ## admin账号的公钥

-r-------- 1 admin admin 823 May 31 2011 authorized_keys2   ## 被允许登录这个节点的所有公钥

    -r-------- 1 admin admin 27 May 31 2011 config          ##admin的配置文件夹

    -r-------- 1 admin admin 668 May 31 2011 dpnid                  ## dpn的私钥

lrwxrwxrwx 1 admin admin 9 May 31 2011 id_rsa -> admin_key         ## adminrsa私钥的链接


  • /home/dpn/.ssh文件夹内容:

-r-------- 1 dpn admin 0 May 31 2011 authorized_keys2            ##被允许登录这个节点的所有公钥

-r-------- 1 dpn admin 27 May 31 2011 config           ## dpn账号的配置文件夹

-r-------- 1 dpn admin 668 May 31 2011 dpnid                  ## DPN账号的私钥

-r--r--r-- 1 dpn admin 600 May 31 2011 dpn_key.pub            ## DPN账号的公钥

lrwxrwxrwx 1 dpn admin 5 May 31 2011 id_rsa -> dpnid      ## DPN RSA私钥的链接


  • /root/.ssh文件夹内容:

    -r-------- 1 root root 1209 May 31 2011 authorized_keys2    ##被允许登录这个节点的所有公钥

    -r-------- 1 root root 27 May 31 2011 config                       ## 配置文件


接下来我们来看看私钥是长什么样子?其实对于我们人类来说就是看不懂的样子,因为是钥匙嘛,干嘛要看得懂里面写的是什么样子呢。


admin@gen4-util:~/>: cat /home/admin/.ssh/dpnid

-----BEGIN DSA PRIVATE KEY-----

MIIBuwIBAAKBgQCWUMSv1kpW6ekyej2CaRNn4uX0YJ1xbzp7s0xXgevU+x5GueQS

mS+Y+DCvN7ea2MOupF9n77I2qVaLuCTZo1bUDWgHFAzc8BIRuxSa0/U9cVUxGA+u

+BkpuepaWGW4Vz5eHIbtCuffZXlRNcTDNrqDrJfKSgZW2EjBNB7vCgb1UwIVANlk

FYwGnfrXgyXiehj0V8p9Mut3AoGANktxdMoUnER7lVH1heIMq6lACWOfdbltEdwa

/Q7OeuZEY434C00AUsP2q6f9bYRCdOQUeSC5hEeqb7vgOe/3HN02GRH7sPZjfWHR

/snADZsWvz0TZQuybs8dEdGh/ezGhiItCINFkVg7NvSXx85dMVsB5N9Ju0gDsZxW

/d41VXYCgYBH0zIlb3lvioedyZj2mKF6fycnCZIeeDnL8wZtZPStRht6i4PFTCX1

Y/Ogw0L0bhuthOx+VTgICB87r0TmXElNUDLSncsxuw7pmHa669idUkv43CjeDkH0

kGFEHt4QA6/xw1Xq9oNpRJTo62ZsFmv0Pwp3uE7up8s0LW1O6fr+OwIVAKCJZ8nm

UwIdhEc9aU7sBDTFijP+

-----END DSA PRIVATE KEY-----

admin@gen4-util:~/>: cat /home/admin/.ssh/admin_key

-----BEGIN RSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,DFDBC4B8EF3708FC

f2/1GJu45AtuQBlhokUib9T3m4o54cehWHx5z/BdbUYpTqsf7420/Dsb2o69ALR0

....................................

TcPSa3ARIpbuoPzOkR4osl+gzZzTaSHXUTbMPh79d3E=

-----END RSA PRIVATE KEY-----

 

看过了私钥的样子,现在我们来看看公钥的样子:

admin@gen4-util:~/>: cat /home/admin/.ssh/authorized_keys2

  1. ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAsf14EqXZb6MtXwAbou+UWEBU0Rj3ZBwaJUzSAHgPdWj35wK9l/z7mUfw4hzAmHJ+v/AOSZ++WDg9zi9JrpiSUdbkOKcoWPjEqbYjGMYbwyyIkUaNevY3sFgkh/+46lh/DYSJqVcbeUo1rSoUCJ03T5BtXQo/KEp/O27fHyry3FU= dpn_admin_key àà admin_key.pub
  2. ssh-dss AAAAB3NzaC1kc3MAAACBAJZQxK/WSlbp6TJ6PYJpE2fi5fRgnXFvOnuzTFeB69T7Hka55BKZL5j4MK83t5rYw66kX2fvsjapVou4JNmjVtQNaAcUDNzwEhG7FJrT9T1xVTEYD674GSm56lpYZbhXPl4chu0K599leVE1xMM2uoOsl8pKBlbYSME0Hu8KBvVTAAAAFQDZZBWMBp3614Ml4noY9FfKfTLrdwAAAIA2S3F0yhScRHuVUfWF4gyrqUAJY591uW0R3Br9Ds565kRjjfgLTQBSw/arp/1thEJ05BR5ILmER6pvu+A57/cc3TYZEfuw9mN9YdH+ycANmxa/PRNlC7Juzx0R0aH97MaGIi0Ig0WRWDs29JfHzl0xWwHk30m7SAOxnFb93jVVdgAAAIBH0zIlb3lvioedyZj2mKF6fycnCZIeeDnL8wZtZPStRht6i4PFTCX1Y/Ogw0L0bhuthOx+VTgICB87r0TmXElNUDLSncsxuw7pmHa669idUkv43CjeDkH0kGFEHt4QA6/xw1Xq9oNpRJTo62ZsFmv0Pwp3uE7up8s0LW1O6fr+Ow== dpn@dpn41s àà dpn_key.pub.pub


可以看到公钥都放在了authorized文件里面。


那我们怎么判断密钥是不是匹配和正确呢?我们自然有妙招:

妙招五、ssh-keygen -y -f <private key file>

这样可以看得到的公钥是不是和真实的公钥一样。

例如我们用这个命令来计算出公钥,然后用真实的公钥来和我们计算出的公钥比较,如果一样,那就说明匹配,不然就不匹配。


admin@gen4-util:~/>: ssh-keygen -y -f /home/admin/.ssh/dpnid

ssh-dss AAAAB3NzaC1kc3MAAACBAJZQxK/WSlbp6TJ6PYJpE2fi5fRgnXFvOnuzTFeB69T7Hka55BKZL5j4MK83t5rYw66kX2fvsjapVou4JNmjVtQNaAcUDNzwEhG7FJrT9T1xVTEYD674GSm56lpYZbhXPl4chu0K599leVE1xMM2uoOsl8pKBlbYSME0Hu8KBvVTAAAAFQDZZBWMBp3614Ml4noY9FfKfTLrdwAAAIA2S3F0yhScRHuVUfWF4gyrqUAJY591uW0R3Br9Ds565kRjjfgLTQBSw/arp/1thEJ05BR5ILmER6pvu+A57/cc3TYZEfuw9mN9YdH+ycANmxa/PRNlC7Juzx0R0aH97MaGIi0Ig0WRWDs29JfHzl0xWwHk30m7SAOxnFb93jVVdgAAAIBH0zIlb3lvioedyZj2mKF6fycnCZIeeDnL8wZtZPStRht6i4PFTCX1Y/Ogw0L0bhuthOx+VTgICB87r0TmXElNUDLSncsxuw7pmHa669idUkv43CjeDkH0kGFEHt4QA6/xw1Xq9oNpRJTo62ZsFmv0Pwp3uE7up8s0LW1O6fr+Ow==

root@gen4-util:~/>: cat /home/dpn/.ssh/dpn_key.pub

ssh-dss AAAAB3NzaC1kc3MAAACBAJZQxK/WSlbp6TJ6PYJpE2fi5fRgnXFvOnuzTFeB69T7Hka55BKZL5j4MK83t5rYw66kX2fvsjapVou4JNmjVtQNaAcUDNzwEhG7FJrT9T1xVTEYD674GSm56lpYZbhXPl4chu0K599leVE1xMM2uoOsl8pKBlbYSME0Hu8KBvVTAAAAFQDZZBWMBp3614Ml4noY9FfKfTLrdwAAAIA2S3F0yhScRHuVUfWF4gyrqUAJY591uW0R3Br9Ds565kRjjfgLTQBSw/arp/1thEJ05BR5ILmER6pvu+A57/cc3TYZEfuw9mN9YdH+ycANmxa/PRNlC7Juzx0R0aH97MaGIi0Ig0WRWDs29JfHzl0xWwHk30m7SAOxnFb93jVVdgAAAIBH0zIlb3lvioedyZj2mKF6fycnCZIeeDnL8wZtZPStRht6i4PFTCX1Y/Ogw0L0bhuthOx+VTgICB87r0TmXElNUDLSncsxuw7pmHa669idUkv43CjeDkH0kGFEHt4QA6/xw1Xq9oNpRJTo62ZsFmv0Pwp3uE7up8s0LW1O6fr+Ow== dpn@dpn41s

 

然后我们登录到一台storage node上,我们会发现所有只要通过SSH登录成功的机器,他们的公钥都会存在每个账号的known_lists里面的。因为avamar有三个系统账号:admindpnroot。因此只要用哪个账号来ssh登录过的,在这个账号的known_lists里面就会有这个账号的公钥:

admin@gen4-data1:~/.ssh/>: cat known_hosts

 

  1. 10.32.167.88 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA49Ueggi8WrdvTP+1cenYNSSrPv8GMJyiFqcsmDyqOQuQiLxiirtORm7P633JZrW4vzpHQZzdd0Q4ASybYXbaHB2F+S3UMl9x9OGaWigk06SgWLF6Kh9kbjFgFYCIIpZW1RTo75N7r7f+rUmLCCmrYYi3Cy1XhEEMedKB948WnG0=
  2. 10.32.167.84 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAsV1RM7h5RDT7EfBktWbU0Ezm96QlHYZoq6JbbMJkThzleOzX+GzO5qqIBXUiDvIP08jSNuDlfCO9aTEQivYmZZoHpYdsPpxW/YZIw0a4+Pa+mzwqFkmwwZGe+ck/nUjJ+3tfpiDtNbMBg+cAJGrrkUyo4drL7SW0D5qfg5cU/0c=
  3. 192.168.255.1 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA74EBveMGzDU5laPV2vBhaAODFOPHUO33hacBIzotX+mBnyq+jhBBuuFU12PstkBleUUWOz6JrefT/HPaTXojyzqQWdVD+j97RZg9EZY3JqwRjFrcjEZ89JfNY43T7lJGx8tKLAt2HB2gg9CU82QLvOOdgTuewh6736G3CVu1LI0=
  4. 10.32.167.135 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA7mZB7Eksd6S2SZGbm/yp/caQsSKi+bUItDog4uh12GuT5oxe6hFZtM2gJEMlGQvbqQMw+gMpUckrrYINWB7iaNXgzdK08YCd4/EUP8E74WvbG2h3WCqsYJ8FoP2qR3DXPzzoUQkwyNoTsGL3NDcVqRnylYDarRyWlHCfXCVNJNM=
  5. 10.32.167.99 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA74EBveMGzDU5laPV2vBhaAODFOPHUO33hacBIzotX+mBnyq+jhBBuuFU12PstkBleUUWOz6JrefT/HPaTXojyzqQWdVD+j97RZg9EZY3JqwRjFrcjEZ89JfNY43T7lJGx8tKLAt2HB2gg9CU82QLvOOdgTuewh6736G3CVu1LI0=
  6. gen4-util ssh-rsa

AAAAB3NzaC1yc2EAAAABIwAAAIEA74EBveMGzDU5laPV2vBhaAODFOPHUO33hacBIzotX+mBnyq+jhBBuuFU12PstkBleUUWOz6JrefT/HPaTXojyzqQWdVD+j97RZg9EZY3JqwRjFrcjEZ89JfNY43T7lJGx8tKLAt2HB2gg9CU82QLvOOdgTuewh6736G3CVu1LI0=

 

如上面的案例,我们可以发现该storage nodeadmin账号里,有多个其他节点包括Utility Node的公钥。


我们再来介绍最后两个有用的妙招:

妙招六、ssn --user=root 0.<node ID>

我们可以通过root账号来登录到任何一个节点。如下面的例子:

5.png


妙招七、mapall命令

这个命令可以帮助我们同时列出多个节点上的信息。但是前提是需要ssh-agent bashssh ~/.ssh/dpnid来加载key后,通过ssh的方式来使用。

6.png

如使用这个命令,我们可以通过SSH的方式同时列出所有节点的online的天数。当然这个命令还可以搭配别的参数来使用。这个以后我们还可以详细来介绍。


怎么样?今天对我们的SSHkey有所了解了吧?下次我们将介绍SSH KeyDD上的使用以及如何来排错和纠正SSH Key的错误?SSH Key是非常重要的东东,因为我们在《如何给Avamar航班做个高效的飞行体检》中讲到过如何使用proactive check脚本来检查整个avamar系统,而使用这个脚本的前提就是要加载SSH的密钥,不然这个脚本也无法运行。

有了Avamar的这把金钥匙,我们就可以“任性”地在任何节点上来回穿梭和干活。当下流行“有钱就任性”,在我们Avamar的产品中,“有Key就任性”!