ssh登陆分两种,一种是密码登陆,一种是公钥登陆。
密码登陆:
当本地发送 ssh someuser@someip命令后,远端机器将把尝试把自己的私钥的指纹发回,用户确认该指纹和远端机官网贴出的内容一致之后,选择同意,远端机器则将自己的公钥发送给本地。此时,该公钥将被保存在本地的.ssh/known_hosts文件中。
有了该公钥之后,用户输入自己的登陆密码,ssh会用远端机器的公钥加密密码,远端机器用自己的私钥解密发现密码正确,允许登陆。
公钥登陆:
每一次输入密码都很麻烦,所以可以采用这种登录方式。
本地用户通过ssh-copy-id命令将自己的公钥发送给远端机器,其实现机制实际上就是先从本地ssh到远端机器,然后把本地的id_rsa.pub(公钥)文件追加在在远端机器的.ssh/authorized_keys文件中。
登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
例子:github
github中,如果将机器A的公钥拷贝到某个人的github账户的ssh配置中,那么这台机器相当于就能够访问该用户能够访问的所有github repo,并且权限和该用户一致。
验证公钥指纹
github中设置了一个公钥后,再次浏览时公钥只会以指纹的方式展示,所以要检查自己机器上的公钥是否在github上存在的话需要执行这个命令
ssh-keygen -lf ~/.ssh/id_rsa.pub
ssh-agent:
1.不用重复输入密码,私钥存放内存,更加安全
如果你对你的私钥不放心,生怕别人登陆了你的机器后把你的公秘钥全部拷贝走了,也没关系,你可以在ssh-kengen的时候设置一下私钥的passphrase。
但是这样的话,即使把自己的公钥放到远端机器了,ssh时也要提醒你输入passphrase的密码,很麻烦。
所以需要使用ssh-agent命令,该命令和ssh-add配合使用。首先先要执行ssh-agent命令,然后执行ssh-add,会提示输入passphrase,该命令会用passphrase对 ~/.ssh/id_rsa(本地私钥)解密,然后加载到ssh-agent进程的内存中。
这样以后执行ssh登陆远端机器就可以不输入密码了。
2. forward私钥(猜想,有待考证)
如果有b,c,d三台机器,
b是外网的机器,比如一台跑着app的ruby或者node代码的服务器,c是跳板机,d是能访问数据库和内部API的内网机器或者类似github这样的机器。
通常的场景是d上放置b的公钥。然后通过c把b和d连接起来。这是怎么做到的呢?
首先在b上运行ssh-agent,然后从b机器ssh连接到c机器时,b内存中的私钥也会被forward到c机器上。这样在c机器访问d机器时,会使用b机器的私钥进行加密,然后d也用b机器的公钥进行解密。