ssh
一旦开发场景涉及到更多的主机,必然需要加密连接,这里简单介绍加密连接的基本概念和常见配置。
基本概念¶
诞生背景。在计算机网络应用层中,我们介绍了安全外壳协议 SSH。基于该协议,工程师开发了加密传输程序 ssh 作为客户端和服务端之间的加密连接工具。
鉴权方式。ssh 支持「密码」和「密钥」两种连接鉴权方式。其中密码鉴权不怎么安全,所以大多数场景下我们会选择密钥鉴权,不过密钥鉴权也可以设置额外的密码,一般被称为 Passphrase。
快速开始¶
考虑到密钥连接鉴权的场景更多,这里我们重点介绍密钥连接的方式。
Tip
密钥对即一个公钥和一个私钥,可以类别为,公钥就是锁,私钥就是钥匙,远程服务器就是一座房子。我们拥有这座房子,就可以用公钥上锁,之后随时使用私钥进入。
第一步:客户端生成密钥对¶
ssh-keygen ~/.ssh/<key_file_name>
# 之后设置 Passphrase,这一步是可选的,直接回车表示不设置
# 之后需要重复一次 Passphrase,同理,直接回车表示不设置

之后 ~/.ssh 文件夹下应当会出现一个 <key_file_name> 私钥文本文件和一个 <key_file_name>.pub 公钥文本文件。其中公钥文件的数据组成为:
第二步:将公钥上传至服务端¶
在服务器新建文本文件:
将公钥 <key_file_name>.pub 中的内容复制进去并保存:
Note
authorized_keys 可以存放多个公钥,以供多人连接使用。公钥末尾的 <user_name>@<computer_name> 可自定义。
修改文件和文件夹的权限与属主:
第三步:客户端测试 ssh 连接¶
ssh -i </path/to/private_key> -p <port> <user_name>@<ip_address>
# -i 表示指定私钥路径
# -p 表示指定服务器的 SSH 协议端口,默认 22
常见配置¶
ssh 有客户端和服务端两处配置:
- 客户端配置在
~/.ssh/config文本文件中(Linux 也可以全局配置在/etc/ssh/sshd_config文本文件中)。 - 服务端 (daemon) 配置在
/etc/ssh/sshd_config文本文件中。
ssh config¶
连接时显式指定 ip、端口、私钥地址等信息是很麻烦的,需要记住很多东西,为了简化连接,我们可以把这些信息写到一处并取一个别名来表示。例如:
Host MyServer # 远程名称(自定义)
HostName xxx.xxx.xxx.xxx # 远程服务器的域名或 IP
Port 7890 # 连接端口(默认 22)
User root # 登录用户名
IdentityFile ~/.ssh/<private_key> # 本地私钥路径
之后只需输入 ssh MyServer 即可 ssh 连接。
sshd config¶
/etc/ssh/sshd_config 可以用来配置服务端的 ssh 逻辑,例如:
修改配置后需要重启服务端的 ssh 守护进程:
FAQ¶
private key are too open¶
如果你的私钥不是通过 ssh-gen 工具生成的,请确保私钥文件的权限为 400 或 600,否则 ssh 会因为私钥权限过高而主动忽略它,警告如下:
Permissions 0644 for '<your_private_key>' are too open,
It is required that your private key files are not accessible by others.
This private key will be ignored,
load key "<your_private_key>": bad permisions
Permission denied (publickey)
只需要使用 chmod 命令将私钥权限修改为 400 或 600 即可: