ssh 的简单运用 🌼
本文是我在项目部署之后的总结笔记 ✍,记录了 SSH 的简单运用
什么是 SSH?
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH 最初是 UNIX 系统上的一个程序,后来又迅速扩展到其他操作平台。SSH 在正确使用时可弥补网络中的漏洞。SSH 客户端适用于多种平台。几乎所有 UNIX 平台—包括 HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行 SSH。(百度百科)
其实就是端到端的一种加密的网络传输协议,一般用于linux。
SSH 的俩种连接方式
密码登录
$ ssh user@host -p
# user 远程服务器的用户
# host 远程服务器的主机名或者IP地址
第一次登录会出现下面提示 👇:
The authenticity of host 'host (xx.xx.xx.xx))' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)?
上面的意思是,无法确认 host 主机的真实性,只知道它的公钥指纹,你确定要继续连接吗?
公钥指纹:公钥一般都比较长(采用 RSA 算法,长达 1024 位),比较难对比,所以对其进行了 MD5 或者 SHA256 计算,将它变成一个 128 位的指纹(上面是 16 进制表示),再进行比较,就相对简单了一些
那如何对比呢?答案是没有好办法,需要自己去远程服务器上通过以下命令确认 👇
$ ssh-keygen -lf ~/.ssh/id_rsa.pub
较新的 SSH 命令会将指纹列为SHA256密钥
如果需要将其与旧指纹进行比较,还需要指定使用 MD5 指纹散列函数。
ssh-keygen -E md5 -lf ~/.ssh/id_dsa.pub
经过确认以后,决定接受这个远程主机的公钥。
Are you sure you want to continue connecting (yes/no)? yes
shell 紧接着会出现以下提示,表示 host 主机已经得到认可。
Warning: Permanently added 'host,xx.xx.xx.xx' (RSA) to the list of known hosts.
紧接着会让你输入密码(远程服务器登录密码)
Password: (enter password)
密码正确即会登录成功
初次登录成功后,远程 host 的公钥就会被保存在文件~/.ssh/known_hosts 中,下次在连接这台 host,系统会自动识别到这台公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码
免密登录
每次登录都需要输入密码,非常麻烦,所以就需要换一种方式登录->免密登录
免密登录原理:就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录 shell,不再要求密码。
这时候就需要通过ssh-keygen生成秘钥对 👇:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -C xxx
# -t: 密钥类型, 可以选择 dsa | ecdsa | ed25519 | rsa; 省略的情况下默认是rsa
# -f: 密钥目录位置,指定生成密钥的保存路径和文件名。省略的情况下, 默认为当前用户home路径下的.ssh隐藏目录, 也就是~/.ssh/, 同时默认密钥文件名以id_rsa开头.
# -C: 指定此密钥的备注信息, 需要配置多个免密登录时, 建议携带;生成的公钥会在最后面显示此备注信息
运行结束后,在~/.ssh/目录下,会新生成俩个文件:id_rsa.pub 和 id_rsa。前者是公钥,后者是私钥。
备注:在未指定私钥时,id_rsa 私钥是连接任意 host 时使用的私钥(/etc/ssh/ssh_config)
接着需要将公钥添加到远程 host 的~/.ssh/authorized_keys 文件中
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
后续就可以直接进行 ssh 免密登录了
私钥太多怎么办?
场景:当你的电脑需要经常 ssh 不同的服务器时,不同的服务器需要不同的私钥来连接,这时候你就需要在连接时指定私钥,这样比较麻烦
使用ssh-agent
ssh-agent 是一种控制用来保存公钥身份验证所使用的私钥的程序,其实 ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。
备注:在我使用的过程中,ssh-agent 在会话结束(shell 关闭)就停止了,每次都需要 ssh-agent bash 启动,然后通过 ssh-add xxx 添加私钥
可以通过 ssh-add -l 查看缓存区内的私钥(秘钥指纹显示),不会显示默认秘钥
参考文章:zhuanlan.zhihu.com/p/126117538
创建配置文件
在~/.ssh/目录下创建 config 文件,例如:
Host git
HostName github.com
Port 22
User git
IdentityFile ~/xxxx #私钥的路径
这样以后连接就可以通过以下命令
ssh -T git
# -T:测试连接
大白话理解公钥 🔓 和私钥 🔑
公钥就是锁,私钥就是钥匙,当你拿到这套装备时,首先需要将锁安装到门上(authorized_keys),然后通过钥匙(私钥)来解锁,由于有家人,所以家人也会有钥匙(私钥),又因为家里面锁很多,需要不同的钥匙来解锁,钥匙多了不容易记住,所以可以给钥匙上面贴个条 📄 标注哪个锁(利用配置文件快速连接)。
备注:这套锁和钥匙不仅仅可以用在一个地方(copy),只要是能上锁的地方都能用(一对秘钥对可以在多个地方使用)
git clone 俩种方式的区别
HTTPS:不管是谁,拿到 url 随便 clone,但是在 push 的时候需要验证用户名和密码。
SSH:clone 的项目你必须是拥有者或者管理员,而且需要在 clone 前添加 SSH Key。SSH 在 push 的时候,是不需要输入用户名的,如果配置 SSH key 的时候设置了密码(passparse),则需要输入密码的,否则直接是不需要输入密码的。
备注 ❗
~ :当前用户的根目录
普通用户一般在/home/xxx
root 的根目录在/root
passparse :私钥的密码。如果担心私钥的安全,可以在生成秘钥对的时候设置,就会加密私钥,在使用私钥时都会让你输入 passparse 来解密。
/etc/ssh/ssh_config:全局的 ssh客户端配置文件。里面是默认配置,指定了~/.ssh/id_rsa 为默认私钥,还有很多配置有待发掘...