• ssh-agent && ssh-agent forward && SSH ProxyCommand


    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, 则通过认证
    
  • 相关阅读:
    VS2012 窗口布局, update1 和 英语语言包 离线安装方法
    C/C++ 笔记
    MFC学习笔记
    理解虚基类、虚函数与纯虚函数的概念
    ffmpeg使用
    gif制作 & word2007插入gif
    WIN8电脑开机怎么进入安全模式啊?
    vs2012 win8 64 visual assistX 中文 ??
    21 获取文件大小的方法
    20 线程中添加超时的方法
  • 原文地址:https://www.cnblogs.com/liujitao79/p/4203815.html
Copyright © 2020-2023  润新知