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
-
验证服务器指纹
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
-
输入yes后会将服务器公钥的指纹添加到
~/.ssh/known_hosts,再次连接就不会出现警告 -
输入密码后登录成功
服务器密钥变更
执行如下命令,删除本地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配置
- 创建ssh-key
ssh-keygen
# -C 设置密钥注释
ssh-keygen -t rsa -C "邮箱地址"
- 创建config
touch ~/.ssh/config
- 输入配置
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 非对称加密
- 使用公钥加密,只有私钥能解密
- 使用私钥加密,只有公钥能解密
7.2 登录过程
- 将客户端公钥放入服务器指定位置
- 客户端发起ssh登录请求
- 服务器接收到请求,发送随机数给客户端
- 客户端使用私钥对数据进行签名,再发送给服务器
- 服务器收到签名,使用公钥解密,数据和原始随机数一致,允许用户登录
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