今天重装 CentOS 后发现按照之前的步骤来配置 SSH 后一直提示 Permission denied ,第一反应反应就是 /etc/ssh/sshd_config 配置出错,但是仔细检查一遍之后并没有发现什么错误。后来网上找到原因是权限问题,赶快记笔记,防止以后再遇上这个坑而不知道。

索性把配置 SSH 服务端的流程都过一遍,这里以 CentOS 为例,其它发行版只是包管理器的差别。

安装 openssh

这一步一般情况下不需要,以为几乎全部的 Linux 发行版都自带的 SSH。当然,如果机器上没有安装,可以手动安装。

在服务器上执行以下命令:

1
$ sudo yum install -y vim openssh net-tools

这里除了安装 openssh 之外还安装 vim 用来修改配置文件以及 net-tools 获取服务器的公网/内网 IP。

创建 SSH 密钥

要实现免密登录,我们需要把自己机器(这里使用的是MacOS,其它平台一样)产生的 SSH 公钥部署到服务器上。回到客户端,执行命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ ssh-keygen -t rsa -C "your identification"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/dashmrl/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/dashmrl/.ssh/id_rsa.
Your public key has been saved in /Users/dashmrl/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:FswSkdc/aU/axbfdudyclEbzuAXW1+hiYDeWsOJtplw 2333
The key's randomart image is:
+---[RSA 2048]----+
| oo . |
| .+. o |
| ..+ + o +.|
| ...+ X =oB|
| .S+ = X.+@|
| .. E + =*=|
| . = . .+++|
| o .+o|
| |
+----[SHA256]-----+

选择默认的路径和文件保存密钥对,提示输入 passphrase 时,可以直接回车不设置,但 更好的实践方式 还是设置一个密码来提高安全性。执行完后会在 ~/.ssh 目录下生成两个文件:id_rsaid_rsa.pub ,第二个文件就是我们需要部署到服务器上的公钥。

使用 GitHub 应该都会经过这一步骤

部署本机 SSH 公钥

SSH 服务端有了,客户端密钥也有了,还需要把公钥部署到服务器上才可以实现 SSH 秘钥登录。先登录服务器,执行 ifconfig 获取到 IP 地址,然后在 客户端 执行 ssh <servername>@<ip> 进行登录,这时候是可以通过 <servername> 的密码进行登录的。

登录后,执行 sudo vim /etc/ssh/sshd_config 打开 SSH 服务端配置文件,搜索 PubkeyAuthentication ,修改值为 yes ,搜索 PasswordAuthentication ,修改值为 no ,最后搜索 PermitRootLogin 并修改为 no ,然后保存。实现的效果是不允许使用密码登录,不予许使用 root 用户进行登录,只可以使用 公钥 的方式进行登录。

在配置文件中还可以看到 AuthorizedKeysFile .ssh/authorized_keys 这样的键值对,这里指明了保存公钥的文件路劲。那么接着执行 mkdir ~/.ssh && touch ~/.ssh/authorized_keys 来创建保存公钥的文件,然后打开它 vim ~/.ssh/authorized_keys ,把客户端生成公钥粘贴进去,保存即可。

然后执行 sudo service sshd restart 重启 SSH 服务。

核心的步骤到这里就都完成了。

权限问题

完成到上一步理论上免密登录的基础就打好了,但是这时登录会提示 Permission denied XXX ,这其实是 .ssh 目录的权限问题, 所以造成了 SSH 不认可这个目录及里面的文件。所以还需要修改权限:

1
$ chmod 700 ~/.ssh && chmod 0600 ~/.ssh/authorized_keys

完成后就可以开心的使用 SSH 公钥进行服务器登录了。

踩了一个坑,对 SSH 的了解更多,然后也发现自己在 Linux 权限方面的不足