LINUX SSH 密钥认证登陆配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZengMuAnSha/article/details/83094892

给公司阿里云的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"。

  1.  PasswordAuthentication     是否允许使用基于密码的认证。默认为"yes"。

  2. PermitRootLogin       是否允许 root 登录。可用值如下:             "yes"(默认) 表示允许。"no"表示禁止。

  3.   Port   指定 sshd(8) 守护进程监听的端口号,默认为 22 。

  4.  PubkeyAuthentication   是否允许公钥认证。仅可以用于SSH-2。默认值为"yes"。

  5.    UseDNS  指定 sshd(8) 是否应该对远程主机名进行反向解析,以检查此主机名是否与其IP地址真实对应。默认值为"yes"。

  6. 其它参数可以参考: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) 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。

猜你喜欢

转载自blog.csdn.net/ZengMuAnSha/article/details/83094892