ssh

参考

SSH 介绍

  • Secure Shell(安全外壳协议,简称 SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境

  • SSH 通过在网络中创建安全隧道来实现 SSH 客户端与服务器之间的连接

  • 在设计上,SSH 是 Telnet 和非安全 shell 的替代品,Telnet 和 Berkeley rloginrshrexec 等协议采用明文传输,使用不可靠的密码,容易遭到监听、嗅探中间人攻击

  • SSH使用客户端-服务器模型,标准端口为 22。服务器端需要开启SSH守护进程以便接受远端的连接,而用户需要使用 SSH 客户端与其创建连接

  • SSH 的经典用途是登录到远程电脑中执行命令。除此之外,SSH 也支持隧道协议端口映射X11 连接。借助 SFTPSCP 协议,SSH 还可以传输文件

应用篇

SSH 常用命令

  • ssh -v <user>@<hostip> - 打印运行情况和调试信息

  • ssh -vv <user>@<hostip> - 打印更详细的运行情况和调试信息

  • ssh -vvv <user>@<hostip> - 打印最详细的运行情况和调试信息

$ ssh root@aliyun -v
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to aliyun [106.15.72.140] port 22.
debug1: Connection established.
...
  • identity file type .../.ssh/id_* type <number> 中的数字只是 sshkey_types 枚举 的整数值(基于零),-1表示错误

    • KEY_RSA, // id_rsa has type 0

    • KEY_DSA, // id_dsa has type 1, but as you have no id_dsa key file, -1 is used

    • KEY_ECDSA, // id_ecdsa has type 2

  • debug [123]: 行前缀中的数字表示其后面的消息的调试级别。它对应于您在命令行上给出的 -v 的数量(3 是最大值)。即如果设置 -v,将打印 debug1 消息,使用 -vv,您将获得 debug1 和 debug2,最多是三级,即 -vvv

  • ssh -T git@xxx.com - 测试 ssh 密钥连接是否成功

    # github
    $ ssh -T git@github.com
    # gitee
    $ ssh -T git@gitee.com
    # coding
    $ ssh -T git@e.coding.net
  • ssh <user>@<hostip> - 登录 host

  • ssh <user>@<hostip> "[command]" - 登录 host 并执行命令

  • ssh -J <跳板机登录用户>@<ip>:<port> <目标机登录用户>@<ip> -p <port>- 通过跳板机登录目标机

ssh 命令登录失败后,重试时总是卡住,一般在重试前先重启 sshd 服务就可以解决

  • ssh <user>@<hostip> <command> - 登录 host 直接执行命令

# 本地 ~/file 文件通过 ssh 加密传输到 hostip 的 ~ 目录下
$ ssh <user>@<hostip> 'tar cz file' | tar zxv
# hostip 的 ~/file 文件通过 ssh 加密传输到本地的 ~ 目录下
$ ssh <user>@<hostip> 'tar cz file' | tar xzv
  • ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no <user>@<hostip> - 不验证 host key 登录

  • ssh -L <port_a>:<remote host>:<port_b> user_b@ip_b - 本地端口转发

  • ssh -R <port_a>:<remote host>:<port_a> user_a@ip_a - 远程端口转发

  • ssh -g -L <port_a>:<remote host>:<port_b> user_b@ip_b - 路由转发

  • ssh -D <port> user@remote_ip - 动态端口转发

ssh-keygen 常用命令

  • ssh-keygen - 默认在 ~/.ssh/ 下生成 RSA 公私密钥对

  • ssh-keygen -t dsa - 在 ~/.ssh/ 下生成 dsa 公私密钥对

  • ssh-keygen -t rsa -C '电子邮箱'

  • ssh-keygen -y -f [私钥路径] > [公钥路径] - 私钥生成公钥

$ ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
  • ssh-keygen -f "/home/xcq/.ssh/known_hosts" -R "192.168.7.47" - 删除指定 known_hosts 文件中的主机公钥

  • ssh-keyscan

  • ssh-keysign

  • ssh-add

ssh-copy-id 常用命令

  • ssh-copy-id <user>@<hostip> - 默认将本地主机公钥 ~/.ssh/id_rsa.pub 添加到远程服务器 <user>/.ssh/authorized_keys 文件中,实现无密码登录

  • ssh-copy-id -i <公钥路径>/id_rsa.pub <user>@<hostip> - 将本地主机公钥 公钥路径 中的 id_rsa.pub 添加到远程服务器 <user>/.ssh/authorized_keys 文件中,实现无密码登录

SCP 常用命令

  • scp <local_file_path> <user>@<hostip>:<remote_folder_path> - 上传本地文件到远程

  • scp -r <local_file_path> <user>@<hostip>:<remote_folder_path> - 上传本地文件夹到远程

  • scp <user>@<hostip>:<remote_folder_path> <local_file_path> - 下载远程文件到本地

  • scp -r <user>@<hostip>:<remote_folder_path> <local_file_path>- 下载远程文件夹到本地

  • Linux 和 Windows 实现 scp 互传文件

因为 Windows 系统本身不支持 ssh 协议,所以要想实现两者 scp 互传文件,必须在 Windows 客户端安装 ssh for windows 的客户端软件,比如 winsshd,使 Windows 系统支持 ssh 协议

  • scp /root/README.md administrator@<winIP>:/d:/test/ - 通过 scp 命令上传本地 (Linux) 文件到远程 (Windows)

  • scp administrator@<winIP>:/d:/test/README.md /root/ - 通过 scp 命令下载远程 (Windows) 文件到本地 (Linux)

scp -o "ProxyCommand=nc -X connect -x <proxy_ip>:<proxy_port> %h %p"  filename  <username>@<target_ip>:/<target_path>
scp -o "ProxyCommand=nc -X connect -x 47.101.133.201:22 %h %p"  /home/xcq/test1  root@54.250.52.188:/root

无密码公钥登陆

Linux

ssh-keygen
ssh-copy-id <user>@<remote_ip>

Windows

ssh-keygen
scp C:\Users\<Windows_User>\.ssh\id_rsa.pub <user>@<remote_ip>:~/.ssh/id_rsa.win.pub
cat ~/.ssh/id_rsa.win.pub >> ~/.ssh/authorized_keys

Windows 下的 openssh 没有 ssh-copy-id 命令。故手动将本地公钥添加至远程服务器的 ~/.ssh/authorized_keys 文件中即可。

ssh 常用配置

常用配置文件

  • /etc/ssh/ssh.config - 客户端配置文件

  • /etc/ssh/sshd.config - 服务的配置文件

  • ~/.ssh/known_hosts - 查看已知主机的公钥

  • ~/.ssh/authorized_keys - 存放需要密钥登录本机的 host 公钥

一、配置密钥登录

1、生成本地 RSA 或 DSA 密钥对

$ ssh-keygen
# 一路回车就可
# root 用户生成公私钥在:/root/.ssh/
# 非 root 用户:在自己主目录下的 .ssh/

2、将本地公钥内容追加到远程服务器的/root/.ssh/authorized_keys 或 用户目录下的.ssh/authorized_keys

# 也可以使用 ssh-copy-id
$ ssh-copy-id root@192.168.56.101
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.56.101's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.56.101'"
and check to make sure that only the key(s) you wanted were added.

3、重启 ssh,退出再次登陆即可实现无密码登录

二、开启密钥认证登录

  # 开启密钥验证
  RSAAuthentication yes
  PubkeyAuthentication yes RSAAuthentication yes
  # 制定公钥文件路径
  AuthorsizedKeysFile $h/.ssh/authorized_keys

三、开启密码登录

PasswordAuthentication yes

四、开启 root 登录

PermitRootLogin yes

五、关闭 hostkeychecking,初次登录时不用输入 yes

StrictHostKeyChecking no

原理篇

密码学加密算法

  • 加密方法可以分为两大类,一类是单钥加密( private key cryptography ),还有一类叫做双钥加密( public key cryptography )。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码

  • 【mì yuè】读音下的“密钥”的意思:紧密的锁闭。这里的用法用了“密钥”的动词性质。

  • 【 mì yào】读音下的“密钥”的意思:密码学中的专有名词,指解密所需要的特殊代码。这里用了“密钥”的名词性

对称密钥加密 - Symmetric-key algorithm

  • 又称为对称加密、私钥加密、共享密钥加密、单钥加密

  • 这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥,所以这被称为 "对称加密算法"

  • 1976 年以前,所有的加密算法都使用 "对称加密算法",通用的单钥加密算法为 DES( Data Encryption Standard )

  • 在对称密钥加密的情况下,密钥只有一把,所以密钥的保存变得很重要。一旦密钥泄漏,密码也就被破解

公开密钥加密 - Public-key cryptography

  • 又称为非对称加密 - asymmetric cryptography

  • 公开密钥加密需要两个密钥,一个是公开密钥( 加密使用 ),另一个是私有密钥( 解密使用 )

SSH 原理简述

  1. 用户使用ssh user@host 命令对远程主机发起登陆

  2. 远程主机将自己的公钥返回给请求主机

  3. 请求主机使用公钥对用户输入的密码进行加密

  4. 请求主机将加密后的密码发送给远程主机

  5. 远程主机使用私钥对密码进行解密

  6. 最后,远程主机判断解密后的密码是否与用户密码一致,一致就同意登陆,否则反之

  1. 用户使用ssh user@host 命令对远程主机发起登陆

  2. 远程主机对用户返回一个随机串

  3. 用户所在主机使用私钥对这个随机串进行加密,并将加密的随机串返回至远程主机

  4. 远程主机使用分发过来的公钥对加密随机串进行解密

  5. 如果解密成功,就证明用户的登陆信息是正确的,则允许登陆;否则反之

SSH 中间人攻击

由于 SSH 不像 https 协议那样,SSH 协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。这就导致如果有人截获了登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪,用户再通过伪造的公钥加密密码,再发送给冒充主机,此时冒充的主机就可以获取用户的登陆密码了,那么 SSH 的安全机制就荡然无存了,这也就是我们常说的中间人攻击

代理

https://kanda.me/2019/07/01/ssh-over-http-or-socks/

最后更新于