ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ssh-keygen免密登录、ssh-agent代理、authorized_keys介绍

2022-06-10 18:04:09  阅读:208  来源: 互联网

标签:免密 私钥 登录 keys 密匙 agent ssh 服务器


以下来自原文:https://blog.csdn.net/WilliamEvano/article/details/123065764
1、ssh-keygen介绍

SSH 为 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
从客户端来看,SSH提供两种级别的安全验证:
第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人”这种方式的攻击。


第二种级别(基于密匙的安全验证)ssh-keygen:需要依靠密匙,你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。用这种方式,你必须知道自己密匙的口令。但是,与第一种级别相比,第二种级别不需要在网络上传送口令。第二种级别不仅加密所有传送的数据,而且“中间人”这种攻击方式也是不可能的(因为他没有你的私人密匙)。但是整个登录的过程可能需要10秒 。
 
ssh-keygen有很多的参数,比如这里的-t -b -C都是他的一些参数

-t即指定密钥的类型,密钥的类型有两种,一种是RSA,一种是DSA:


-b 指定密钥长度。对于RSA密钥,最小要求768位,默认是2048位。命令中的4096指的是RSA密钥长度为4096位。
DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。

命令后面还可以增加-C "注释内容"
-C表示要提供一个新注释,用于识别这个密钥,可以是任何内容,一个用来识别的key

2、免密登录配置

登录到本机服务器A,切换到响应的操作系统用户,执行命令,生成秘钥文件【按照提示直接回车,回车代表密码为空也就是没有密码】
ssh-keygen -t rsa
将公钥传送到对端服务器B上面【user@host为对端服务器帐号及IP】
ssh-copy-id -i ~/.ssh/id_rsa.pub  user@host
然后在本机服务器A上ssh命令验证是否免密码登录生效【user@host为对端服务器帐号及IP】
ssh user@host

可能出现的错误

 

a) 服务器B上.ssh目录的权限必须是700

b) 服务器B上.authorized_keys文件权限必须是600或者644

c) 服务器B上用户家目录文件权限必须是700,比如用户名是aischang,则/home/aischang这个目录权限必须是700

如果不是700,在服务器A上查看/var/log/secure文件会报错

sshd为了安全,对属主的目录和文件权限有所要求。如果权限不对,则ssh的免密码登陆不生效。

 

 

d) 服务器B上SELinux关闭为disabled,可以使用命令修改setenforce 0 ,查看状态的命令为getenforce或者 查看/etc/selinux/config 文件中是否是disabled

e) 有可能是StrictModes问题

编辑 vi /etc/ssh/sshd_config

找到#StrictModes yes改成StrictModes no

f) 有可能是PubkeyAuthentication问题

编辑 vi /etc/ssh/sshd_config

找到PubkeyAuthentication改成yes

 

 

以下内容来自原文:https://blog.csdn.net/zhouguoqionghai/article/details/92134462

介绍:ssh 推荐的登录方式是使用私钥登录。但是如果生成私钥的时候,设置了口令/密码(passphrase),每次登录时需要输入口令也很麻烦。可以通过 ssh-agent 来管理私钥,把私钥加载进内存,之后便不用再输入密码。

操作步骤如下:
1、通过 ssh-agent bash 或者 eval `ssh-agent`  (这里是shell 的命令替换符)来启动。
2、通过 ssh-add Identity_Linux 为 ssh-agent 添加私钥。这里的 Identity_Linux 是我的私钥文件。
添加之后,可通过 ssh-add -l 来查看已经添加的私钥。

第一条命令,因为服务器设置了只能使用私钥认证登录,所以直接登录失败了。如果私钥不是放在 ssh 客户端缺省读取的位置或者不是默认的名字,就需要使用 -i 选项显示的指定私钥文件。 在给代理添加私钥时,需要输入一次私钥的口令。准备就绪之后,之后不再指定私钥也不需口令即可登录了。

多进程共享 ssh-agent
上边的步骤保障了当前的 shell 能够使用 ssh-agent 代理的密钥;如果要开多个 shell , 如何共享一个  ssh-agent 进程来保存密钥呢?所以深入的探究一下原理。
eval 命令是对字符串参数进行求值,执行字符串表达的命令。比如 eval "ls -lha" 就等同于直接运行 ls -lha 命令。
直接运行 ssh-agent,输出如下:

原来 eval `ssh-agent` 不过首先启动 ssh-agent 进程,然后为当前 shell 环境设置正确的 SSH_AUTH_SOCK 和 SSH_AGENT_PID 这两个环境变量,便能通过环境变量指定的本地套接字与 ssh-agent 进程取得通信,从而获得被代理的密钥。
所以只要在 ssh-agent 启动之后,保存下这两个值,在之后需要的 shell 里用保存的值设置相应的环境变量即可。

1 里将 ssh-agent 启动时的输出记录到文件里,因为此时没有设置正确的环境变量,所以 2 处 ssh-add 无法链接代理。3 处使用 source 命令加载保存的环境变量,所以 4 处能够正常连上。在另外一个 shell 当中重复相同的操作,即图中标注的 5,6,7。8 处添加一个密钥,可以在右边已经连上的 shell 里,看到刚刚添加的密钥,对应第 9 处标注。

整个流程整理成脚本 login.sh,包含 ssh-agent 进程是否启动的检测。逻辑也很简单:如果 ssh-agent 没有启动,在启动的同时将输出记录到文件当中,并且为 ssh-agent 添加有效的密钥;如果已经启动,直接从文件中加载环境变量。

 

以下内容来自原文:https://www.503error.com/2020/%E4%BD%A0%E7%9C%9F%E7%9A%84%E4%BA%86%E8%A7%A3authorized_keys-%E4%B9%88%EF%BC%9F/1718.html

authorized_keys介绍 : authorized_keys 是linux 操作系统下,专门用来存放公钥的地方,只要公钥放到了服务器的正确位置,并且拥有正确的权限,你才可以通过你的私钥,免密登录linux服务器

我们来看一下普通的authorized_keys 长的什么样子:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCzch9SZMR7rCu3FPU6doJrSMN75sIE/YciTPk/NNtQEWOQbLZT+A4EOO4oDVGuj0UbegP8DX5OJmijkqHC0LzqPTtKJ/mvI5LUqs8BuXZPQvV8ScnQxzWbRCUc91z4oxIl2q7l5btsOaZhHpJNv0lgJYTJrNKify1lr2rfELsm7TLrKInrjUCCF23jGKRac7gAok3p89bx5f968udARJDzfFjNewLMwKjmC1c8kxk7EtsqCOuiS+VHecnEtqJohFHIotgKNyMurJaRyu6pdZJygbXwRtpeAulWsH9aasdfasdfao3glNzus3XHVeFPgyC5R38NQUdYhO4XRw0QGP6SXDPWpTRdQpX9I1WtGIC1tXFMFzmrfMQDHcBHofPXVjIhlmPWiLWDxZjEMYUB9Cwvk2+nIYw0pNKh+ztKuEaZDjUs4/ngqNIEgkgAqaYasdasdfasiq4/6BG9EsnUvHKqVMqDXceS8bK7OUpkEQpiudlgEfGju80dqreXyWhbSJj1AN+D59CbSKCyTadsfasdfasvQiasdfasdfasdfasdfasdg5DqjIQ== zhiming@503error.com

但是,并不是所有的authorized_keys都只是长这个样子,下面介绍一下常用的其他参数:

command=”command”

这个参数项的作用是当某人通过这把公钥登录的时候,登录进来默认要执行的命令,例如,你希望通过这个公钥的人进来,第一件事情是运行某个脚本,但是其他人如果不是通过这个公钥进来的,就不执行(这就是和bashrc的区别,bashrc里边的内容是无论怎么进来,都会执行),注意,这个参数会被ForceCommand 覆盖,如果设置了ForceCommand , 此项不会生效

environment=”NAME=value”

这个参数项的意义在于当某人通过这把公钥登录的时候,额外增加新的环境变量,并且,通过这个途径增加的环境变量会覆盖其他途径的环境变量

from=”pattern-list”

这个参数项的意义在于,限制私钥的使用机器(IP),例如,你的私钥不小心丢了(尽量不要发生),但是如果你设置了from这个参数,只允许从你公司的地址登录,哪怕别人有了你的私钥,也无法使用,因为他不会满足from 的前提条件其他的参数用的就更少了,可以参考如下例子:

# Comments allowed at start of line
ssh-rsa AAAAB3Nza...LiPk== user@example.net 
from="*.sales.example.net,!pc.sales.example.net" ssh-rsa AAAAB2...19Q== john@example.net
command="dump /home",no-pty,no-port-forwarding ssh-dss AAAAC3...51R== example.net
permitopen="192.0.2.1:80",permitopen="192.0.2.2:25" ssh-dss AAAAB5...21S==
ssh-rsa AAAA...==jane@example.net
zos-key-ring-label="KeyRingOwner/SSHAuthKeysRing uniq-ssh-rsa"
from="*.example.com",zos-key-ring-label="KeyRingOwner/SSHAuthKeysRing uniq-ssh-dsa"

 

标签:免密,私钥,登录,keys,密匙,agent,ssh,服务器
来源: https://www.cnblogs.com/kongbursi-2292702937/p/16364110.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有