SSH

113 阅读3分钟

SSH

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

1. 简介

1.1 是啥

SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。

1.2 历史

SSH 1 -> SSH 2(付费) -> OpenSSH(基于SSH 1最后一个版本)

OpenSSH 支持 SSH 协议的版本 1.3、1.5、和 2。自从 OpenSSH 的版本2.9以来,默认的协议是版本2,该协议默认使用 RSA 钥匙

1.3 架构

服务器-客户端模式(Server:sshd --- Client:ssh)

2. 基本用法

# hostname是主机名,它可以是域名,也可能是 IP 地址或局域网内部的主机名
# 用户名不填取当前用户名
ssh hostname
ssh user@hostname
# -l指定用户名
ssh -l user hostname
# -p指定端口,默认是22
ssh -p 8821 hostname

3. 连接流程

ssh user@host.com
  1. 验证服务器指纹

    The authenticity of host 'host.com (127.0.0.1)' can't be established.
    ECDSA key fingerprint is SHA256:G+wecxGS5yovj9DDlnUmw8OL+TTAKKWoPLvFLfZskt9.
    Are you sure you want to continue connecting (yes/no)?
    

    中间人攻击:TODO

  2. 输入yes后会将服务器公钥的指纹添加到~/.ssh/known_hosts,再次连接就不会出现警告

  3. 输入密码后登录成功

服务器密钥变更

执行如下命令,删除本地known_hosts中的域名

ssh-keygen -R hostname

4. 非交互式命令

ssh username@hostname command
# example
ssh root@host.com ls /

5. 客户端配置文件

全局配置:/etc/ssh/ssh_config

用户配置:~/.ssh/config (可能不存在)

栗子:多个ssh-key配置

  1. 创建ssh-key
ssh-keygen
# -C 设置密钥注释
ssh-keygen -t rsa -C "邮箱地址"
  1. 创建config
touch ~/.ssh/config
  1. 输入配置
Host github.com
    HostName github.com
    User root # 这个字段待验证,有的例子给的是邮箱 TODO
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github
Host gitlib.com
    HostName gitlib.com
    User tom
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_gitlib

7. SSH密钥登录

7.1 非对称加密

  • 使用公钥加密,只有私钥能解密
  • 使用私钥加密,只有公钥能解密

公钥与私钥:zhuanlan.zhihu.com/p/371379366

7.2 登录过程

  1. 将客户端公钥放入服务器指定位置
  2. 客户端发起ssh登录请求
  3. 服务器接收到请求,发送随机数给客户端
  4. 客户端使用私钥对数据进行签名,再发送给服务器
  5. 服务器收到签名,使用公钥解密,数据和原始随机数一致,允许用户登录

7.3 密钥生成

# 注意:路径默认是~/.ssh/id_rsa,不修改会覆盖之前的,路径只填名称就是相对当前目录,可填完整路径或者相对路径
ssh-keygen
# 指定加密算法,默认是rsa
ssh-keygen -t dsa
# 防止其他用户去读,600设置拥有者可读写,其他人不可读写执行
chmod 600 ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa.pub

7.4 密钥上传

# 手动上传
cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 自动上传,推荐下面的 还能校验是否重复添加了
ssh-copy-id -i ~/.ssh/id_rsa.pub user@host

# 查看文件权限是否对,不对的话再配置,权限不对ssh服务器可能会报错
ll ~/.ssh/authorized_keys
chmod 644 ~/.ssh/authorized_keys

8. SSH服务器

8.1 常用命令

# 启动
sudo systemctl start sshd.service
# 停止
sudo systemctl stop sshd.service
# 重启
sudo systemctl restart sshd.service
# 开机启动
sudo systemctl enable sshd.service

8.2 sshd配置文件

  • 路径:/etc/ssh/sshd_config

    # 例如指定端口
    Port 2020
    # 或者
    Port = 2020
    
  • sshd 命令

    # 指定配置
    sshd -f /usr/local/ssh/my_config
    # 测试配置文件
    sshd -t
    # 重启
    sudo systemctl restart sshd.service
    

参考