http://blog.csdn.net/sdcxyz/article/details/41487897

https://developer.github.com/guides/using-ssh-agent-forwarding/

http://zgu.me/blog/2014/08/21/use-ssh-agent-forwarding-in-your-private-network/

ssh密码认证

ssh client向目标机器发起tcp连接(一般22端口)并发送username (username是SSH协议的一部分)
目标机器ssh daemon回应需要密码
ssh client提示用户输入密码,然后将密码发送到服务器端
ssh daemon如果密码匹配成功, 则认证通过
# 不适合于管理多台机器.若每台机器使用相同的密码,如果密码泄露,所有机器都被攻破。若使用不同密码,则密码太多很难记住,因此也不可能使用很强的密码

ssh公钥认证

ssh client向目标机器发起tcp连接(一般22端口)
ssh client提示用户输入passphrase以解密私钥
ssh client发送私钥签名的包含username和公钥等信息的message.
目标机器ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证 # 私钥(如.ssh/id_rsa)是广义的,既包含了私钥,也包含了公钥,也有可能还包含了其他信息(比如证书)。比如通过ssh-keygen -y ~/.ssh/id_rsa就可以看到id_rsa里面的公钥。用作认证的私钥最好通过passphrase进行加密,否则会有很大安全隐患,只要私钥泄露,别人就能访问你能访问的所有远程机器。每次登陆都得输入passphrase

使用ssh agent的公钥认证

ssh client向目标机器发起tcp连接(一般22端口)
ssh client向本地的agent请求, 得到私钥签名的包含username和公钥等信息的message
ssh client向目标机器发送此message和签名
目标机器ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证 # 私钥只存在于agent的内部(内存中), ssh client并没有获取到私钥。使用ssh-agent后,只需在将key纳入agent管理时输入passphrase,之后的ssh相关操作就不必输入passphrase了。但如果从本机A登陆机器B后,又想从B登陆C (或从B传输文件到C),仍然需要输入passphrase

配置

# eval `ssh-agent`
Agent pid 11485 # ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa) # ssh -p 29922 root@10.0.153.45
Last login: Wed Jun 15 17:49:40 2016 from 10.10.32.80 自启动,自停止
.bash_profile
eval `ssh-agent` > /dev/null .bash_logout
kill $SSH_AGENT_PID

使用ssh agent forwarding的公钥认证

假设用户已经从homepc连接到了第一台机器server。homepc的agent中已保存了用户的私钥
server: 用户从server向server2发起ssh连接请求
server: ssh client向本地(server)的agent请求, 得到私钥签名的包含username和公钥等信息的message。 注意server上其实ssh-agent压根就没有启动,ssh client只是检查$SSH_AUTH_SOCK这个环境变量是否存在,如果存在,则和这个变量指定的domain socket进行通信。而这个domain socket其实是由server上的sshd创建的。所以ssh client其实是和sshd在通信。 而server的sshd并没有私钥信息,所以sshd做的事情其实是转发该请求到homepc的ssh client,再由该client将请求转发给本地(homepc)的agent。该agent将需要的消息和签名准备完毕后,再将此数据按原路返回到server的ssh client. 路径如下所示 agent_homepc --($SSH_AUTH_SOCK)-- ssh_homepc --(tcp)-- \
sshd_server --($SSH_AUTH_SOCK)-- ssh_server --(tcp)-- \
sshd_server2
这下明白为什么叫agent forwarding(转发)了吧,就是所有中间节点的sshd和ssh都充当了数据转发的角色,一直将私钥操作的request转发到了本机的agent,然后再将agent的response原路返回。 server: ssh client向目标机器server2发送此message和签名 server2: ssh daemon通过检查消息中指定用户的$HOME/.ssh/authorized_keys,确定公钥是否可用作认证并验证签名的合法性, 如果两者都ok, 则通过认证

ssh-agent && ssh-agent forward && SSH ProxyCommand的更多相关文章

  1. SSH无密码登陆Agent admitted failure to sign using the key

    A :CentOS_Master B:Slave_1 C:Slave_2 普通用户hxsyl 1.现在A 上 ssh-keygen -t rsa 一路回车,不需要输入密码 执行该操作将在/home/h ...

  2. SSH连接GitHub并配置ssh key

    SSH连接GitHub并配置ssh key 配置git的ssh提交,主要需要以下三步: 1.设置Git的user name和email 2.生成ssh 3.配置git 的ssh key 一.设置Git ...

  3. 如何给 GitHub 添加 SSH key, 如何生成 SSH key 详细图文教程!

    如何给 GitHub 添加  SSH key, 如何生成  SSH key 详细图文教程! 一. 生成  SSH key https://ide.c9.io/xgqfrms/ 创建一个空项目:(或使用 ...

  4. Gravitational Teleport 是一个先进的 SSH 服务器,基于 Golang SSH 构建,完全兼容 OpenSSH

    Gravitational Teleport 是一个先进的 SSH 服务器,可通过 SSH 或者 HTTPS 远程访问 Linux 服务器.其目的是为了替代 sshd.Teleport 可以轻松让团队 ...

  5. git错误--ssh: Could not resolve hostname ssh.github.com: Name or service not known--解决方式

    错误如下: git push origin ssh: Could not resolve hostname ssh.github.com: Name or service not known fata ...

  6. 不能ssh连接ubuntu linux 服务器 secureCRT不能ssh连接服务器 不能远程ssh连接虚拟机的ubuntu linux

    我是用的是secureCRT,远程连接我的虚拟机里面的ubuntu 直接报错,连接不上 1,先分别在windows上ipconfig和ubuntu上ifconfig下 互ping一下,是可以ping通 ...

  7. git ssh免登陆,以及ssh config

    git去连接github或gitlab上的远程仓库,可以使用ssh方式,也可以使用git的账号密码登录 这里介绍使用ssh方式实现免登陆(第一步和第二步即可实现)   第一步:生成ssh秘钥 ssh- ...

  8. ssh之为什么要放弃ssh?

    本文经转载, 源出处不详.https://www.cnblogs.com/hackxiyu/p/6849085.html 最近听一些朋友说,招聘面试的很多人简历都差不多,大部分人的简历上面都写了熟悉s ...

  9. Debian9安装SSH并允许root用户SSH登录

    安装SSH # apt install openssh-server openssh-client 启动SSH服务 # /etc/init.d/ssh start 添加SSH开机启动 # update ...

随机推荐

  1. 在本地开发环境没问题,但是发布到服务器出现:未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\106f9ae8\cc0e1169\App_global.asax.haz99mum.dll”--“拒绝访问。 ”错误

    解决方法: 1,通常的解决方法:原因是由于系统目录下的Temp目录无相应的权限所致,具体操作如下:C:\Windows\temp-->属性-->安全-->编辑-->添加NETW ...

  2. Codeforces Round #532 (Div. 2)- C(公式计算)

    NN is an experienced internet user and that means he spends a lot of time on the social media. Once ...

  3. 8.11zju集训日记

    今天的比赛打得很不好,前一个小时的看的题目都非常难,没有做出题目,中期看到两道题,一道题是我读题,金大佬solo的,另外一道题是金大佬读题,写了代码但wa了,然后我和zz找bug,最后发现答案的范围是 ...

  4. 上传文件插件dropzone的实例

    html: <div class="field"> <div id="file" class="dropzone"> ...

  5. Java的Protected

    没想到接触Java这么多年,今天竟然才发现一直有一个误解 Proteced只能被同一个包内的或者子类的class访问 那么在另一个包的如下代码有问题吗? Sub sub = new Sub(); su ...

  6. select随笔

    粘贴下面代码 select 美化 <!doctype html> <html lang="en"> <head> <meta charse ...

  7. google chrome浏览器自动填充解决方案

    在chrome浏览器中,浏览器对于[1]type为password和text的.[2]带有name或者id属性的<input>标签会有自动填充表单功能,虽然会给用户记住密码带来一定的便利, ...

  8. thinkPHP5.0获取器

    获取器的作用是在获取数据的字段值后自动进行处理,例如,我们需要对状态值进行转换,可以使用: class Cate extends Model { public function getTypeAttr ...

  9. math.random()方法的使用

    一:导言 以前总是被数字的范围正则搞的头大,在此总结了一下 二:用法 Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包含n但不包含m的整数: ...

  10. Django-4 模板层

    你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datet ...