SSH 简介

SSH,Secure Shell, 是一种用于计算机之间加密远程登录的网络协议。

传统的网络通信中,如 FTP、Pop 和 Telnet 等,使用明文传输数据,一旦被截获,很容易受到中间人攻击

值得注意的是 SSH 只是一种协议,存在着多种实现,既有商业实现,也有开源实现,目前使用最多的是 OpenSSH。SSH 分为客户端与服务端,如果只用来连接远程服务器则只需要客户端,如果需要被其他主机连接则需要安装服务端。SSH 的 1.x 版本与 2.x 版本并不兼容,即 1.x 的客户端不能连接到 2.x 的服务端上,OpenSSH 2.x 同时支持 SSH 1.x 和 2.x。

服务端是一个进程守护(daemon),一般为 sshd 进程,提供了对远程连接的处理,包括公共密钥认证、密钥交换、对称密钥加密和非安全连接。

客户端包含 ssh 程序以及 scp(远程拷贝,文件上传下载)、slogin(远程登录)、stfp(安全文件传输)等其他应用程序。

SSH 安装

CentOS 系统中,采用 rpm -qa | grep ssh 查看是否安装了客户端和服务端,下图中 openssh-server 即为服务端,openssh-clients 即为客户端。

IfHaveSSH

查看服务是否启动 systemctl status sshd.service 或采用查看进程方式 ps -e | grep ssh

启动服务 systemctl start sshd.service

重启服务 systemctl restart sshd.service

开机自启动 systemctl enable sshd.service

SSH 验证方式

SSH 具有两种级别的验证方式

第一种是基于口令的安全验证。通过账户名和密码登录到远程主机,所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想要连接的服务器,可能是其他主机冒充的服务器,也就是受到中间人攻击。

另一种是基于密钥的安全验证。通过RSA 算法创建密钥对,RSA 算法是一种非对称加密算法,即加密密钥与解密密钥不同,所以生成的密钥对一个为公开密钥,一个为私有密钥,并且通过公开密钥无法推断出私有密钥。公开密钥放在想要连接的服务器上,私有密钥放在保存在客户端。在登陆时通过对随机生成的字符串进行加密和解密便可以实现身份验证,无需传密用户名和密码,安全性更高,可以有效防止中间人攻击。

加密方式以及连接方式

加密方式——对称加密与非对称加密

对称加密:加密和解密使用同一个密钥,即消息发送方与接收方使用同一个密钥在传输过程中加解密。
优点:加解密效率高,对计算机要求更低。
缺点:需要有安全通道协商密钥;无法验证发送者身份;密钥容易泄露。

非对称加密:产生一对密钥,分公钥和私钥,公钥加密则对应的私钥才能解密;私钥加密则对应的公钥才能解密。公钥可以以公开方式传递。
优点:无需协商密钥,只需公开分享公钥。
缺点:加解密效率低,对计算机要求更高。

SSH 连接方式

账户密码方式 非对称加密方式沟通口令,用该口令对称加密传输数据。

口令登录

密钥登录方式 利用密钥对完成身份认证

密钥登录

基本用法

  1. 远程登录

    1
    2
    ssh user@host
    ssh root@192.0.0.1

    当远程用户名与本地一致时,登陆时可以省略用户名

    1
    2
    ssh host
    ssh 192.0.0.1
  2. 密钥登录

    首先需要生成密钥对

    1
    ssh-keygen

    根据提示回车,其中可以对私钥设置口令。运行结束后,在 ~/.ssh/ 目录下会生成两个文件 id_rsaid_rsa.pub ,前者是私钥,后者是公钥。

    而后通过ssh-copy-id user@host将公钥上传到服务端。

    如果不行,则需要配置服务端,/etc/ssh/sshd_config

    1
    2
    3
    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys

    然后重启 ssh 服务~

  3. authorized_keys 文件

    远程主机将用户的公钥,保存在登录后的用户主目录的 \$HOME/.ssh/authorized_keys 文件中.

    上面的 ssh-copy-id 命令便是保存公钥,可以解析命令为

    1
    ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
  4. 保持长连接

    保持客户端与服务端长连接可以分别从客户端和服务端两方面出发,配置任一

    客户端~/.ssh/config 或者 /etc/ssh/ssh_config 中加入

    1
    2
    3
    TCPKeepAlive=yes
    ServerAliveInterval 60 # 客户端每60s向服务端发送一次请求
    ServerAliveCountMax 3 # 当服务端三次没有响应时,断开连接

    或者在命令行中使用 ssh -o serveraliveinterval=60 Host

    服务端/etc/ssh/sshd_config 中添加

    1
    2
    3
    TCPKeepAlive=yes
    ClientAliveInterval 60 # 服务端每60s向客户端发送一次请求
    ClientAliveCountMax 3 # 当客户端三次没有响应时,断开连接
  5. 修改默认登录端口

    SSH 的默认登录端口为 22,可以通过修改/etc/ssh/sshd_config中的 Port 22修改登录端口

    远程登录时采用 p 参数修改端口

    1
    2
    ssh -p 888 user@host
    ssh -p 888 root@192.0.0.1

scp 传输文件

scp 是 secure copy 的缩写,scp 是 linux 系统下基于 ssh 登录进行安全的远程文件拷贝命令。

  1. 从服务器上下载文件

    1
    scp username@servername:/path/filename /local/path
  2. 上传本地文件到服务器

    1
    scp /local/path/local_filename username@servername:/path
  3. 从服务器下载整个目录

    1
    scp -r username@servername:/path /path
  4. 上面目录到服务器

    1
    scp  -r  /path  username@servername:/path

    指定端口需要使用 -P 参数。

多个私钥管理

~/.ssh/config 文件保存不同 host 使用的 ssh 私钥。

1
2
3
4
5
6
7
8
9
10
Host github-A
HostName github.com
User git
IdentityFile /Users/xxx/.ssh/id_rsa_A
IdentitiesOnly yes
Host github-B
HostName github.com
User git
IdentityFile /Users/xxx/.ssh/id_rsa_B
IdentitiesOnly yes

上面这个配置是多个 GitHub 账号的使用场景。

Host 用于指定这个 key 的 Host 名字,使用命令时对应的名字,如 ssh github-A
HostName 对应 Host 具体的域名
User 配置的用户
IdentityFile 指向私钥文件
IdentitiesOnly yes 表示仅用于身份验证

服务端配置文件

相关参数详细含义,参考: 配置文件相关参数详细说明

reference

  1. https://baike.baidu.com/item/ssh/10407
  2. https://blog.csdn.net/nuanxin2396/article/details/84636056
  3. https://www.sohu.com/a/327212161_760387
  4. http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html
  5. https://www.cnblogs.com/tectal/p/9478326.html