linux关于ssh免密登录、known_hosts文件

本文详细介绍了SSH协议的功能和安全性,对比了对称加密与非对称加密,并深入解析了SSH免密登录的原理与配置方法。

1. 关于ssh

SSH 是 Secure Shell 的缩写,SSH 为建立在应用层基础上的安全协议。SSH 是目前广泛采用的安全登录协议,专为远程登录会话和其他网络服务提供安全性的协议,替代以前不安全的Telnet协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

scp、sftp等都是基于ssh协议来进行远程传输的。

2. 对称加密和非对称加密

  • 对称加密:例如AES,加密和解密使用同一个密钥,不安全,如果密钥丢失,加密的信息就会被窃取,并且可以篡改信息,重新加密;对于接收方来说,并不知道这串加密的信息是受信任的发来的还是黑客伪造的。

  • 非对称加密:例如RSA,加密和解密使用不同的密钥,存在一对密钥对,公钥和私钥,公钥可以发送给别人,私钥需要自己保存。常用的公钥加密,私钥解密,例如:小明要发送消息给小红,小红把自己的公钥给小明,小明利用小红的公钥加密发送给小红,小红再使用自己的私钥进行解密。即使小红的公钥被窃取,黑客没有小红的私钥也解密不了信息。

3. ssh免密登录原理

服务器A要免密登录服务器B,则要把服务器A的公钥存到服务器B的授权公钥文件中;先在服务器A上生成一对秘钥(ssh-keygen),然后将公钥拷贝到服务器B的authorized_keys文件中。

原理:

  • 服务器A向服务器B发送一个连接请求,信息包括服务器A此时登录的用户名、服务器A的ip以及要免密登录的服务器B的用户名;
  • 服务器B收到请求,会从服务器A要免密登录服务器B的用户名家目录下 authorized_keys 中查找是否有相同的服务器A用户名、服务器Aip;
  • 如果有,服务器B会随机生成一个字符串,然后使用服务器A的公钥进行加密,再发送给服务器A;
  • 服务器A接到服务器B发来的信息后,会使用私钥进行解密,然后将解密后的字符串发送给服务器B;
  • 服务器B接到服务器A发来的信息后,会和之前生成的字符串进行比对,如果一致,则允许免密登录。
4. ssh免密登录配置

在进行配置之前需要先关闭防火墙,并且最好给服务器设置主机名,并配置 /etc/hosts 文件映射。

systemctl status firewalld.service # 查看防火墙状态
systemctl stop firewalld.service # 关闭防火墙
systemctl disable firewalld.service # 移除防火墙开机自启动

步骤:

  1. 假设A服务器需要免密登录B服务器,那么在A服务器执行命令:ssh-keygen -t rsa(默认就是RSA加密算法,可不用加-t rsa);密钥对生成过程会提示输入私钥加密密码,可以直接回车不使用密码保护。命令执行完成后会在~/.ssh目录下生成两个文件:id_rsa(私钥)和id_rsa.pub(公钥)
  2. 将公钥文件id_rsa.pub中的内容拷贝到B服务器的~/.ssh目录下的授权公钥文件authorized_keys中
5. ssh免密登录注意事项

首先,假设A服务器要免密登录B服务器,我们将A服务器通过ssh-keygen命令生成的公钥写进B服务器authorized_keys文件中。涉及以下注意事项:

A服务器生成的公钥如下:root@sangfor-node7 代表这是root用户生成的公钥

请添加图片描述

如果我们将其拷贝到B服务器/root/.ssh/authorized_keys文件中,那么A服务器就能以B服务器的root账号免密登录成功,也就是:ssh root@B服务器 可以免密登录成功;但是如果是以B服务器的其它账号进行登录,则无法免密,例如:ssh admin@B服务器 需要输入admin账号的密码才可以登录。

如果我们希望A服务器也能以B服务器的admin账号免密登录成功,那么还需要将A服务器的公钥拷贝到B服务器:/home/admin/.ssh/authorized_keys文件中(即admin用户的家目录下)。

另外,A服务器生成的公钥文件中包含 root@sangfor-node7 代表这是root用户生成的公钥;如果A服务器是以root账号去执行命令:ssh root@B服务器 可以免密登录成功;但是如果A服务器是以其它账号,例如wyf,去执行命令:ssh root@B服务器 则需要输入密码;因为B服务器/root/.ssh/authorized_keys文件中存储的是A服务器root用户的公钥,如果我们希望A服务器以wyf账号登录去执行命令:ssh root@B服务器 也可以免密登录成功;那么需要在A服务器切换成wyf账号,执行 ssh-keygen,那么生成的公钥文件位于 /home/wyf/.ssh/ 目录下,并且包含 wyf@sangfor-node7 ,代表这是wyf用户的公钥。再把这个公钥写入B服务器authorized_keys文件中即可。

如下:

请添加图片描述
请添加图片描述

最后,还需要注意域名问题,由于A服务器配置了主机名为 sangfor-node7,因此生成的公钥文件包含主机名,如:root@sangfor-node7,但是B服务器并不知道这个主机名代表哪个ip地址,因此需要在B服务器的 /etc/hosts 文件中配置 sangfor-node7 主机名和ip的映射。

6. github配置本机ssh公钥步骤及原理

如果我们要把本地代码以ssh方式push到github上,为避免每次push都需要输入github账号和密码,则需要配置本机免密登录github,免密登录原理和A服务器免密登录B服务器一样。

配置步骤参考文档:https://blog.youkuaiyun.com/wenfu814/article/details/120625844

7. known_hosts文件

A通过ssh首次连接到B,B会将公钥1(host key)传递给A,A将公钥1存入known_hosts文件中,以后A再连接B时,B依然会传递给A一个公钥2,OpenSSH会核对公钥,通过对比公钥1与公钥2 是否相同来进行简单的验证,如果公钥不同,OpenSSH会发出警告,并且需要用户交互式的输入yes/no, 避免受到DNS Hijack之类的攻击;如果公钥相同,则不会发出警告。

例如:
A服务器首次ssh登录B服务器,由于A服务器的known_hosts文件中没有B服务器的公钥,因此控制台会发出警告,并且需要用户输入yes/no

请添加图片描述

当我们输入yes之后,A服务器的known_hosts文件会增加一条记录(B服务器的公钥);再输入B服务器的密码,ssh登录成功

请添加图片描述

当A服务器再次ssh登录B服务器,B依然会传递给A一个公钥,OpenSSH会核对公钥,将该公钥和A服务器known_hosts文件保存的B服务器的公钥进行对比,由于相同,则不会发出警告,直接让用户输入密码

请添加图片描述

如果我们不希望在进行ssh登录时进行公钥检查,可以加上 "StrictHostKeyChecking no" 跳过公钥检查,就不需要用户手动输入yes/no(这在一些自动化场景经常使用到)

请添加图片描述

备注:如果A通过ssh登陆B时提示 Host key verification failed.;原因是A的known_hosts文件中记录的B的公钥1与连接时B传过来的公钥2不匹配。
解决方法:删除A的known_hosts文件中记录的B的公钥,当再次ssh登录B时,重新写入B服务器最新的公钥即可。

<think>我们正在配置Linux系统的SSH免密登录。根据引用内容,免密登录的配置主要涉及生成SSH密钥对,并将公钥复制到目标服务器的authorized_keys文件中。以下是详细步骤: 1. **生成SSH密钥对**: 在本地机器上打开终端,执行以下命令生成RSA密钥对: ```bash ssh-keygen -t rsa ``` 按照提示,可以设置密钥的保存路径(默认是`~/.ssh/id_rsa`)和密码(如果不想设置密码,直接按回车跳过)。生成后,在`~/.ssh`目录下会生成两个文件:`id_rsa`(私钥)和`id_rsa.pub`(公钥)[^1][^4]。 2. **将公钥复制到目标服务器**: 有两种常用方法: - **使用`ssh-copy-id`命令**(推荐): 执行以下命令,将公钥复制到目标服务器(将`username`替换为目标服务器的用户名,`hostname`替换为目标服务器的IP或主机名): ```bash ssh-copy-id username@hostname ``` 执行后需要输入目标服务器上对应用户的密码。成功后,公钥会被添加到目标服务器用户家目录下的`~/.ssh/authorized_keys`文件中[^1][^3]。 - **手动复制**: 如果无法使用`ssh-copy-id`,可以手动操作: 1. 将本地公钥文件(`id_rsa.pub`)的内容复制到剪贴板。 2. 登录目标服务器,进入用户家目录下的`.ssh`目录(如果不存在则创建): ```bash mkdir -p ~/.ssh chmod 700 ~/.ssh ``` 3. 将公钥内容追加到`authorized_keys`文件中: ```bash echo "粘贴的公钥内容" >> ~/.ssh/authorized_keys ``` 4. 设置`authorized_keys`文件的权限: ```bash chmod 600 ~/.ssh/authorized_keys ``` 注意:权限设置非常重要,否则可能导致免密登录失败[^4]。 3. **测试免密登录**: 在本地机器上执行: ```bash ssh username@hostname ``` 如果配置成功,将无需输入密码直接登录到目标服务器[^3]。 4. **权限问题**: 如果遇到权限问题,确保目标服务器上相关文件和目录的权限正确: - 用户家目录权限:`700`(`drwx------`) - `.ssh`目录权限:`700`(`drwx------`) - `authorized_keys`文件权限:`600`(`-rw-------`)[^4]。 5. **多台服务器配置**: 如果需要在多台服务器上配置免密登录,重复执行上述步骤(使用`ssh-copy-id`或手动复制)到每一台服务器即可[^1]。 注意:如果使用非默认的密钥文件(比如自定义名称的密钥),在`ssh-copy-id`时可能需要通过`-i`选项指定公钥文件,例如: ```bash ssh-copy-id -i ~/.ssh/my_key.pub username@hostname ``` 通过以上步骤,即可实现从本地机器到目标服务器的SSH免密登录。 §§相关问题§§ 1. 如何为不同的服务器使用不同的SSH密钥? 2. 配置SSH免密登录后仍然需要输入密码,可能是什么原因? 3. 如何禁用SSH的密码登录以提高安全性?</think>### 如何在Linux上配置SSH免密登录 以下是配置SSH免密登录的完整步骤,适用于Linux系统: #### 1️⃣ 生成SSH密钥对(本地机器) ```bash ssh-keygen -t rsa -b 4096 ``` - 按3次回车(默认路径+不设密码) - 生成文件: - `~/.ssh/id_rsa`(私钥,需保密)[^1] - `~/.ssh/id_rsa.pub`(公钥)[^1] #### 2️⃣ 复制公钥到目标服务器 **方法一:使用`ssh-copy-id`(推荐)** ```bash ssh-copy-id username@server-ip ``` - 示例:`ssh-copy-id user@192.168.1.100` - 需输入目标服务器密码[^1][^3] **方法二:手动复制** ```bash # 本地操作 cat ~/.ssh/id_rsa.pub | ssh username@server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys" ``` #### 3️⃣ 设置文件权限(目标服务器) 登录目标服务器执行: ```bash chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ``` ⚠️ **权限错误是免密登录失败的常见原因** [^4] #### 4️⃣ 测试免密登录 ```bash ssh username@server-ip ``` 成功将直接进入服务器终端,无需密码[^3] --- ### 关键目录与文件说明 | 文件/目录 | 作用 | |-----------|------| | `~/.ssh/` | SSH配置目录 | | `id_rsa` | 私钥(本地存储) | | `id_rsa.pub` | 公钥(复制到服务器) | | `authorized_keys` | 存储授权公钥(目标服务器)[^1] | | `known_hosts` | 记录访问过的主机公钥[^1] | --- ### 常见问题解决 1. **权限错误**: ```bash sudo chown -R $USER:$USER ~/.ssh # 修复属主 sudo chmod 700 ~/.ssh # 目录权限 sudo chmod 600 ~/.ssh/* # 文件权限[^2][^4] ``` 2. **多服务器配置**: ```bash # 批量配置多台服务器 for host in hadoop102 hadoop103 hadoop104; do ssh-copy-id user@$host done ``` 3. **非默认端口配置**: ```bash ssh-copy-id -i ~/.ssh/id_rsa.pub -p 2222 user@server-ip ``` --- ### 免密登录原理 SSH免密登录基于非对称加密: 1. 客户端用私钥签名 2. 服务器用`authorized_keys`中的公钥验证 3. 验证通过即建立连接[^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值