前言

最近准备把随身携带的小玩具,连接一下暗网,可能会做个暗网的服务端之类的小实验。

但是在那之前,现在自己的小玩具还是靠ssh 密码连接,感觉不太安全,想了想打算把密码连接,换成公钥连接。

于是有了这一篇东东。

正文

1. sshd_config 和 ssh_config

一般来说ssh_config放的是客户端默认ssh配置,sshd_config放的是服务端默认ssh配置。

这里我们来看看sshd_config是什么样的,不同OS可能sshd_config不太一样,有的直接说sshd_config文件,有的可能存放在/etc/ssh/sshd_config.d/这个目录下面,我们这里看见的是我们有一个/etc/ssh/sshd_config的文件,打开文件看见下面的描述

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the 
# default value

Inclue /etc/ssh/sshd_config.d/*.conf

#Port 22
...

我们这里看见这里的策略其实是有一个默认的sshd_config文件,然后还会Include /etc/ssh/sshd_config.d/*.conf

打开sshd_config.d/文件夹,我们发现下面什么也没有。但是我们看见了在这个comment里面有这样一句话Uncommented options override the default value,这就说明我们这个sshd_config文件其实就是我们现在ssh环境的配置文件,那我们直接为了方便简单起见,直接改这个文件就可以了。

2. 服务端配置

我们需要对sshd_config以下几个属性来进行uncommented

PubkeyAuthentication yes  # 允许公钥认证

PasswordAuthentication no # 既然允许了公钥,就不需要密码登录了

PermitRootLogin no        # 看个人选择prohibit-password 或者 no, 我这里不需要root登录安全起见

# Optional 看个人选择
#AuthorizedKeysFile .ssh/authorized_keys # 如果有需要可以自定义,这里我默认存放在 ~/.ssh/authorized_keys下面,这里的是用户目录,而不是/etc/

修改完成我们直接:

sudo systemctl restart sshd

如果你的系统没有systemctl,那么就如下命令:

sudo service ssh restart

这样服务端方面应该就已经设置好了。

3. 客户端配置

客户端方面,我们首先要生成一对公私钥,我们这里使用ssh-keygen,直接去到~/.ssh/目录,使用以下命令:

ssh-keygen -t rsa -b 8192

然后他会询问你一些问题

Enter file in which to save the key (~/.ssh/id_rsa): <filename>
Enter passphrase (empty for no passphrase): <password>
Enter same passphrase again: <password>

写完之后,我们上传公钥到服务器,我们可以手动上传到服务器~/.ssh/文件夹下并且更名为authorized_keys,或者直接使用如下命令,他会将你最近生成的keys的公钥上传到指定服务器:

ssh-copy-id <username>@<server IP address>

指令成功你大概会得到如下的图片,其中id_rsa.52pi.pub就是我上传的公钥,可见图片显示Number of key(s) added: 1 表示成功:

image.png

我们检查了一下客户端的~/.ssh/目录,发现authorized_keys文件确实在下面,并且储存了我们的公钥。

为了系统起见,我们也需要在客户端下的ssh_config设置一下我们的配置

 Host server
	Hostname 192.168.0.135
	Port 22                                                                                                                  
	User sean
	PasswordAuthentication no
	IdentityFile ~/.ssh/id_rsa.52pi
	ForwardAgent yes

这样我们每次连接直接使用ssh server,就能够连接上我们的192.168.0.13522端口了~,并且以sean用户名的身份~。

4. ssh_host_rsa_key额外小知识

在我捣鼓Pi的/etc/ssh/文件夹的时候,发现了有一个/etc/ssh/ssh_host_rsa_key这个东西,我还在思考这是什么的东西,上网一查,于是发现,这是ssh服务器的公私密钥,用来验证服务器的身份的,具体可以理解为在客户端和服务器之间连接的时候,/etc/ssh/ssh_host_rsa_key用来验证服务器的身份。

整个过程大致如下:

  1. 当SSH客户端尝试连接到SSH服务器时,服务器会将/etc/ssh/ssh_host_rsa_key文件中的公钥发给客户端。
  2. 客户端接收到服务器的公钥的时候,会使用一定的算法来验证服务器的身份,这通常涉及到检查公钥是否与客户端之前保存的该服务器的公钥匹配。
  3. 如果客户端能够成功验证服务器的公钥,则建立加密的连接。如果不能验证,客户端将警告用户,可能是因为中间人攻击或服务器密钥已经更改(更改的话需要请求并且确认新的,不能直接在known_hosts直接删除来解决这个问题,否则就太不负责任了。)

总结

主要是为了记录一下这个流程,下次做的时候可以有个东西对比着来~。

并且同时了解了,ssh服务器的host密钥 和 ssh客户端的密钥。服务器相关的内容存放在/etc/ssh/,客户端相关的内容存放在~/.ssh/

参考

[1] ChatGPT
[2] 自己

Q.E.D.


立志做一个有趣的碳水化合物