一、什么是SSH?
SSH 是 Secure Shell 的简写
SSH protocol 安全外壳协议 ,是建立在应用层上的安全协议
SSH协议通过加密的方式保护客户机和服务器之间的连接。
所有用户身份验证、命令、输出和文件传输都经过加密,以防止网络中的攻击。
SSH客户机和服务器
二、SSH密钥和公共密钥认证
1. SSH密钥
SSH 协议使用公钥加密对主机和用户进行身份验证
身份验证密钥(这里称为SSH密钥)是使用keygen程序创建的
2. 公共密钥认证
公共密钥认证避免了将密码存在文件中,从而提高了安全性,并消除了服务器盗取用户密码的可能性
但是,SSH密钥和密码一样也是身份验证凭证,所以对SSH密钥也要进行类似于用户名的管理,
当不需要这些密钥时应该有一个适当的终止处理来移除密钥
3. ssh-keygen
SSH-keygen是为SSH创建新的身份验证密钥对的工具。
生成的密钥对常用于自动登录、单点登录和认证主机
4. ssh-copy-id
ssh-copy-id是公钥安装工具,可以在服务器上安装一个SSH密钥作为授权密钥
目的是使客户端每次登录登录能被允许而不需要登录密码
这有助于使用 SSH 协议实现自动、无密码登录和单点登录
5. 创建和使用SSH密钥对
# # 密钥的生成 # #
#-------------------------------------------------------------
# 生成前可以先检查一下有没有生成过ssh
ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist
# 不带参数以默认方式生成密钥,这是最简单的生成方式
ssh-keygen
# 执行后会有以下输入提示:
Enter file in which to save the key :
## 输入密钥保存位置,可以为空,为空默认保存在用户目录的.ssh目录中
### Windows下默认保存在 /c/Users/系统用户名/.ssh/id_rsa
### Linux下默认保存在 /home/系统用户名/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
## 设置密码短语并输入验证,这个密码短语用于对密钥进行加密
### 设置了密码短语后,即使别人获得了私钥文件也无法使用该密钥
### 但是设置密码短语,每次使用SSH通信都需要再次输入该短语进行验证
### 为了方便起见,可以不设置
# 默认的密钥文件名取决于算法,文件名为 id_算法名
# 例如使用默认算法RSA时为密钥文件名为 id_rsa 公钥文件名为 id_rsa.pub
# SSH还会自动生成一个 known_hosts 文件,ssh会把你每个你访问过计算机的公钥都记录在该文件
# 下次访问相同的计算机时,OpenSSH会核对公钥
ssh-keygen -t rsa -N '' -f id_rsa -q # 无需回车快捷生成密钥对
# ----------------------------------------------------------------------------------
# # 密钥的使用 # #
# 要使用公钥进行认证,必须将公钥复制到服务器并添加到授权的密钥文件中
# 可以通过 ssh-copy-id 工具方便地完成
ssh-copy-id -i ~/.ssh/mykey user@host
# 一旦在服务器上配置了公钥,服务器将允许拥有私钥的任何用户连接。
# 连接过程中,客户端通过对密钥交换进行数字签名来证明拥有私钥
6. keygen 工具常用语法及常用选项
常用语法
keygen常用选项
选项 | 含义 | 说明 |
-b | Bits | 用于指定密钥中的位数,以比特为单位 |
-t | Type | 指定创建密钥的(算法)类型 |
-f | File | 指定保存生成密钥的文件名(带路径) |
-c | Comment | 修改密钥文件的注释 |
-q | Silence | 静默模式,不现实输出 |
-v | Verbose | 详细模式,ssh-keygen 将会输出处理过程的详细调试信息。常用于调试模数的产生过程。 重复使用多个 -v 选项将会增加信息的详细程度(最大3次) |
-N | New | 提供新的密码短语 |
-P | Passphrase | 提供旧的密码短语 |
-p | Change the passphrase | 要求改变某私钥文件的密码短语而不重建私钥,可以根据提示修改,也允许通过后面加
|
-R | Remove | 从 known_hosts 文件中删除所有属于 hostname 的密钥 这个选项主要用于删除经过散列的主机 |
-F | hostname | 在 known_hosts 文件中搜索指定的 hostname,并列出所有的匹配项 这个选项主要用于查找散列过的主机名/ip地址,还可以和 -H 联用打印找到的公钥的散列值 |
-H | Hash | 对 known_hosts 文件进行散列计算。这将把文件中所有主机名/ip地址替换为相应的散列值 原来文件的内容将会添加一个”.old“后缀后保存。这些散列值只能被 ssh 和 sshd 使用 这个选项不会修改已经散列过的主机名/ip地址,因此可以在部分公钥已经散列过的文件上安全使用 |
-l | | 显示公钥文件的指纹数据,也支持RSA1的私钥 对于RSA和DSA密钥,将会寻找对应得公钥文件,然后显示其指纹数据 |
7. SSH支持的算法
① RSA(-rsa)
SSH的默认密钥算法
是一种基于大数分解困难原理的老算法,普遍认为是目前最优秀的公钥方案之一
RSA公开密钥密码体制的原理:
根据数论,寻求两个大素数比较简单,而将它b们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥
推荐RSA密钥大小至少为2048 bits,设置为4096 bits 更好
由于因数分解正在取得重大进展,在可预见的未来,RSA实际上很有可能被破解,选择不同的算法可能是更明智的选择
② DSA(-dsa)
一种美国政府老式的数字签名算法,基于计算离散对数的困难性,也不推荐使用
③ elliptic curve DSA(-ecdsa)
一种由美国政府标准化的椭圆曲线数字签名算法,对当前来说是个很好的算法
只支持三种键大小:256 bits、384 bits、521 bits
建议总是使用521 bits ,因为密钥仍然很小并且可能会比键更小的更安全(尽管应该它们都是安全的)
大多数SSH客户机现在都支持这种算法,推荐使用
④ ed25519
这是OpenSSH中添加的一个新算法,客户端对它的支持还不普遍,因此,在通用应用程序中使用它可能还不可取
三、关于密码短语(Passphrase)
什么是是密码短语?
密码短语类似于密码,但密码一般用来验证身份以登录到系统,而密密码短语用来生成密钥
加密密钥来自于密码短语并用于加密受保护的资源
密码短语应该是什么样的?
一个好的密码短语至少应该有15个字符,最好是20个字符,并且是难以猜测的。
它应该包含大小写字母,数字,最好至少有一个标点符号。其中任何部分都不应该是从用户或家庭信息衍生出来的
密码短语的作用
SSH密钥用于对信息系统中用户身份进行身份验证,而SSH密钥本身为私钥
密码短语的作用通常是加密私钥,这使得密钥文件本身对攻击者来说毫无用处
要使用加密密钥,通常需要还密码短语。从某种意义上说,密码短语和密钥是认证中两个独立的因素
私钥使用从密码短语派生出来的对称加密密钥来进行进一步加密,密钥派生使用哈希函数完成
密码短语通常用于交互式用户的密钥,强烈建议使用密码短语来减少密钥泄露的风险
但事实上90%的SSH都没有密码短语,建议使用适当的SSH密钥管理工具
SFTP (SSH File Transfer Protocol),SSH文件传输协议 是一种安全的文件传输协议,它运行再SSH协议之上