大多时候我们都会使用 ssh 来配置服务器。本期内容介绍了 SSH 的通讯原理,不对称加密以及如何设定免密码登录。

如何安全的通讯

所谓安全的通讯,一方面是指通讯的内容不被篡改,另一方面是指通讯双方身份不被篡改。

我们可以通过加密来确保通讯的安全。但这里有个问题,就是如何安全地传递密钥。

这就需要提到“不对称加密”了。

所谓不对称加密,就是有一对完全不同的密钥,假设为 A 和 B,A 和 B 之间没有任何联系,既不可以通过 A 来推算出 B,也不可以通过 B 来推算出 A。你可以使用 A 来加密信息,但是解密只能通过 B。或者使用 B 来加密,但解密只能通过 A。

因为这个特性,我们就可以公开一个密钥,但是不会破坏加密的安全性。

因此呢,A 和 B 会有一个密钥公开给对方作为公钥,另一个密钥自己保存作为私钥。

有了不对称加密,就可以非常容易的实现安全通讯。比如:

假设有甲乙二人,甲有一对密钥 A(私钥)和 B(公钥),乙有一对密钥 C(私钥)和 D(公钥)。

甲乙就可以非常简单的实现安全通讯。

甲可以使用乙的公钥 D 来加密信息发送给乙,乙收到后用自己的私钥 C 解密获取信息, 之后乙可以使用甲的公钥 B 来加密信息回复给甲,甲收到信息后,使用自己的密钥 A 来解密获取信息。 如此往复。

完美,不但解决了通讯的内容不被篡改,而且通讯双方的身份也完成了认证。公钥本身就是对对方身份认证。因为只有持有公钥对应的私钥,才可以解密信息。

但是现实却不会这样通讯,因为不对称加密的开销非常大,计算成本很高, 用不对称加密来加密大量数据效率非常的低下。 因此,不对称加密主要是用来身份认证以及传递另外的非常高效的一个临时的随机的对称加密密钥,姑且称为临时密钥,传递好密钥之后双方使用临时密钥进行加解密信息。

简单说下 SSH 的通讯过程:

  1. 客户端 C 向服务器端 S 发送连接请求
  2. S 发送其公钥 SPub 给到 C
  3. C 登记/验证 SPub,确定 SPub 确实是 C 的公钥。
  4. C 生成一个临时密钥 X,使用 SPub 来加密并传递给 S
  5. S 通过自己的私钥 SPri 来解密获得临时密钥 X
  6. 注意上述两个步骤实际情况会更复杂些。临时密钥 X 事实上不是 C 单方决定的,而是双方共同商议的结果,而且过程中除了商议确认密钥也会商议确认对称加密算法,这里不做细表。
  7. 双方使用密钥 X 来完成双方的通讯。
  8. 到此为止,S 的身份已经通过 SPub 认证过了,但是 C 的身份并没有认证过。因此 C 还需要发送用户名密码给 S 认证身份。
  9. 当然 C 也可以使用公钥来验证自己的身份。C 发送其公钥 CPub 给 S。
  10. S 在其数据库中验证用户和 CPub,并生成一个随机数并使用 CPub 加密,并传送给 C。
  11. C 使用私钥解密并将这个随机数发送给 S。
  12. S 收到这串数字并跟之前的随机数做比较以确认 C 的身份。确认通过后进行通讯。

配置 ssh

每次 ssh 输入密码都很麻烦,我们可以利用密钥来省略输入密码。

Client:

#!/bin/sh
#
# 首先生成密钥对
ssh-keygen
# press enter for saving in default location
#     private key: ~/.ssh/id_rsa
#     public key:  ~/.ssh/id_rsa.pub
# press enter unless you need a password
#
# 将公钥传至服务器
# scp -r ~/.ssh/id_rsa.pub [email protected]:~/terry.pub
ssh-copy-id [email protected]
#
# 在客户端的ssh配置中,指定私钥的位置,如果私钥文件为~/.ssh/id_rsa,这句可省略。
echo "IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

Server:


#!/bin/sh
#
# cat ~/terry.pub >> ~/.ssh/authorized_keys
#
#
sed -i '' -e "s/^#*PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
# sed -i '' -e "s/^#RSAAuthentication.*/RSAAuthentication yes/g" /etc/ssh/sshd_config
sed -i '' -e "s/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i '' -e "s/^#*AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/g" /etc/ssh/sshd_config

禁用 sendmail

一般来说,sendmail 是一个只有在 mail server 上使用的服务,一般可以禁用。 /etc/rc.conf 中添加

sendmail_enable="NONE"

升级 FreeBSD

freebsd-upgrade fetch
freebsd-upgrade install

在 /etc/crontab 中加入以下条目:

@daily                                  root    freebsd-update cron

每天运行一次 freebsd-update 工具。 用这种方法, 使用了 cron 参数, freebsd-update 仅检查是否存在更新。 如果有了新的补丁,就会自动下载到本地的磁盘, 但不会自动给系统打上。root 会收到一封电子邮件告知需手动安装补丁。

如果出现了错误,可以使用下面的 freebsd-update 命令回退到上一次的修改:

freebsd-update rollback

老张说:

支持我们

如果您喜欢这篇文章,您可以分享给您的朋友,分享到您的社交账号比如:

或者 点击这个链接 观看广告支持我【广告内容与我们无关,请不要轻易相信并打开弹出的广告】。
若您经济宽裕,更欢迎通过下面的方式小额赞助以支持我们的创作。