给公司阿里云的ECS配置SSH认证,中间遇到一些问题,主要是概念不很清楚。ECS服务器OS 是CENTOS 7 自带OPENSSH服务
netstat -ntlp | grep 22 就可以看到 22端口 和服务SSHD
SSHD服务的配置文件在/etc/ssh/sshd_config。
先讲下认证过程
一般先在客户端上生成密钥,我在windows 上生成,自然是我的工作电脑上。
使用Bitvise client客户端工具,login->User keypair manager->Generate New... 按钮
开启生成密钥界面:
Slot是槽位号,这个只限于该工具使用。
Algorithm是加密算法,默认是RSA.另外下拉框可以选择DSA 等加密算法。
Size:加密后长度。
Passphrase:短语,在登陆的时候输入下短语
Comment: 备注,说明这个是那个工具生成的。
基本上短语和备注都清空。
生成完了后 我们要把密钥导出来,选择Export.... 按钮
先导出公钥,并且选择OPENSSH FORMAT格式
导出后,我们把它上传到LINUX服务器上。比如说MYSQL这个用户
我们使用XSHELL 工具链接LINUX服务,并且使用XFTP工具把公钥上传到/home/mysql 目录中。
当然前提你的MYSQL用户可以正常登陆!
USER=mysql
PUBKEY=mysql_pc_public_key
mkdir /home/$USER/.ssh
chmod 700 /home/$USER/.ssh
touch /home/$USER/.ssh/authorized_keys
chmod 750 /home/$USER/.ssh/authorized_keys
cat /home/$USER/$PUBKEY >> /home/$USER/.ssh/authorized_keys
在linux服务器上使用mysql用户运行上面的脚本。
我们在用户下面新建个.ssh 隐藏目录 和存放公钥的文件。
然后切换到ROOT用户下 VIM /etc/ssh/sshd_config
注意 很多参数都被注解了,注解并不表示无效,只是它是有效的,并且使用了默认值。默认值就在注解里面!
第一个参数
AuthorizedKeysFile :存放该用户可以用来登录的 RSA/DSA 公钥。 该指令中可以使用下列根据连接时的实际情况进行展开的符号: %% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名。 经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。 默认值是".ssh/authorized_keys"。
-
PasswordAuthentication 是否允许使用基于密码的认证。默认为"yes"。
-
PermitRootLogin 是否允许 root 登录。可用值如下: "yes"(默认) 表示允许。"no"表示禁止。
-
Port 指定 sshd(8) 守护进程监听的端口号,默认为 22 。
-
PubkeyAuthentication 是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。
-
UseDNS 指定 sshd(8) 是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。
-
其它参数可以参考:https://blog.csdn.net/a351945755/article/details/22661411
AuthorizedKeysFile 指示公钥文件名,当然你可以随便更改。
PasswordAuthentication 默认开启的 所以如果我们使用公钥的话,这里设置为NO
Port端口 如果网管没有限制端口的话,你可以更改别的端口,比如38端口。
PubkeyAuthentication 这个是被注解的,我们 echo "PubkeyAuthentication yes " >> /etc/ssh/sshd_config 方式添加到配置文件后面。
PermitRootLogin 是让ROOT登陆,默认是YES,一般我们要更改成NO。
搞定后 保存wq
service sshd restart
我们重启SSH服务。如果配置没有问题,那我使用客户端登陆下。如下图,正常是使用密码方式是不可以的。
提示使用publickey-slot 1密钥登陆。
OK ! 差不多讲完了。
假如 密码认证默认YES的话,会怎么样呢?PasswordAuthentication YES
会都会,密码和密钥两者都可以认证登陆。 即可也可模式,也就是或模式。
LINUX 下如何呢?
以前我做RAC时候,需要两个LINUX服务器 SSH认证。始终不太明白,经常无法搞定。日后在11下面直接使用RAC图行界面安装SSH和SSH认证。不在终端使用命令来认证。
其实LINUX服务器包含了SSH服务端和客户端。
使用ssh-keygen 命令生成密钥
ssh-keygen -t rsa 指定加密算法
Generating
public
/
private
rsa key pair.
Enter file
in
which to save the key (/root/.ssh/id_rsa):
Created directory
'/root/.ssh'
.
Enter passphrase (empty
for
no passphrase):
Enter same passphrase again:
Your identification has been saved
in
/root/.ssh/id_rsa. #私钥文件
Your
public
key has been saved
in
/root/.ssh/id_rsa.pub. #公钥文件
The key fingerprint
is
:
8e:5f:78:ca:fc:79:cc:e0:c7:18:2a:31:2f:0a:8d:40 root@wulaoer
The key's randomart image
is
:
省略。。。。。
[root@wulaoer ~]# cd /root/.ssh/ #如果是ubuntu的话是家目录下的用户名下的.ssh目录下。
[root@wulaoer .ssh]# ls
id_rsa id_rsa.pub
id_rsa 保存私钥的文件
id_rsa.pub 是保存公钥的文件。
同样 该目录下有个
authorized_keys 这个是服务端的公钥保存的文件。
我们要把id_rsa.pub 客户端的公钥文件 COPY 到对方服务器上,对应目录下的 并且把内容添加到 对方服务端的
authorized_keys 文件中。
同样 对方服务器也经过上面的操作,生成密钥后把公钥添加到我方服务端的文件里。
这样我们两台服务器都拥有对方的公钥了!
这样我们搞清楚了两个服务器的文件关系了。
下面看认证过程:简单地说客户发送请求,服务端去查找,查找到了生成个密码,然后使用公钥对其加密,回送给客户端,客户端使用私钥进行解密,然后就OK了
说明:
(1) 首先在客户端生成一对密钥(ssh-keygen);
(2) 并将客户端的公钥ssh-copy-id 拷贝到服务端;
(3) 当客户端再次发送一个连接请求,包括ip、用户名;
(4) 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:qwer;
(5) 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
(6) 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
(7) 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
回头看看原来的密码认证过程:
说明:
(1) 当客户端发起ssh请求,服务器会把自己的公钥发送给用户;
(2) 用户会根据服务器发来的公钥对密码进行加密;
(3) 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。