Linux 之 ssh 免密登陆

背景

为了让两个linux机器之间使用ssh不需要用户名和密码。所以采用了数字签名RSA或者DSA来完成这个操作。

场景分析

假设 A (192.168.20.59)为客户机器,B(192.168.20.60)为目标机。

要达到的目的:

  • A机器ssh登录B机器无需输入密码;

  • 加密方式选 rsa|dsa均可以,默认dsa

ssh-keygen -t rsa #使用rsa加密

具体操作流程

单向免密登陆(能满足上边的目的):

  1. 登录A机器,生成 A 机器的公钥。 使用命令 ssh-keygen -t [rsa|dsa],然后一直按回车,最后将会生成密钥文件和私钥文件 id_rsa,id_rsa.pubid_dsa,id_dsa.pub

  2. 将公钥复制到 B 机器,有两种方式:

    • 将 .pub 文件复制到B机器的 .ssh 目录, 并 cat id_dsa.pub >> ~/.ssh/authorized_keys
    • 使用 ssh-copy-id 用户名@10.0.0.1
  3. 设置文件和目录权限:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        # 设置authorized\_keys权限  
    $ chmod 600 authorized\_keys
    # 设置.ssh目录权限
    $ chmod 700 -R .ssh

    4. 完成;(直接运行 `ssh 192.168.20.60`)


    ### 双向免密登陆

    1. 两个节点都执行操作:`ssh-keygen -t [rsa|dsa]` 然后全部回车,采用默认值.

    2. 这样两个节点都生成了一对密钥,存放在各自用户目录的~/.ssh下。将公钥考到对方机器的用户目录下,并将其复制到~/.ssh/authorized_keys中(操作命令:`cat id\_dsa.pub >> ~/.ssh/authorized\_keys`)。

    3. 设置文件和目录权限:

    设置authorized_keys权限

    $ chmod 600 authorized_keys

    设置.ssh目录权限

    $ chmod 700 -R .ssh

    1
    2
    3
    4

    4. 要保证.ssh和authorized\_keys都只有用户自己有写权限。否则验证无效。

    其实仔细想想,这样做是为了不会出现系统漏洞。提示错误如下:

he authenticity of host ‘slave1.hadoop (10.122.104.78)’ can’t be established.
ECDSA key fingerprint is SHA256:HtONnJHkgp1aQ6xhiqGR0IHwxWauxJ7dMz0nwHQr6d4.
ECDSA key fingerprint is MD5:09:7d:1c:12:86:48:38:37:f6:a9:b4:b1:d4:01:70:1c.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘slave1.hadoop,10.122.104.78’ (ECDSA) to the list of known hosts.



## ssh免密登录配置无效失败原因

ssh免密登录配置无效失败原因的汇总分析。多数情况下,可以登录成功。但是也会出现配置不正确,导致失败的时候。

1. 检查authorized_keys文件权限,并设置为700

    `chmod 700 authorized_keys`

2. 检查/etc/ssh/sshd_config文件

    将 `#StrictModes yes` 设置为`StrictModes no`


## 注意事项

1. 文件和目录的权限千万别设置成chmod 777.这个权限太大了,不安全,数字签名也不支持。

2. 生成的rsa/dsa签名的公钥是给对方机器使用的。这个公钥内容还要拷贝到对方机器~/.ssh/authorized\_keys 文件中


## 几个文件的作用说明

### ~/.ssh/identity

该用户默认的 RSA1 身份认证私钥(SSH-1)。此文件的权限应当至少限制为"600"。

生成密钥的时候可以指定采用密语来加密该私钥(3DES)。

[ssh](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh)将在登录的时候读取这个文件。


### ~/.ssh/identity.pub

该用户默认的 RSA1 身份认证公钥(SSH-1)。此文件无需保密。

此文件的内容应该添加到所有 RSA1 目标主机的 ~/.ssh/authorized\_keys 文件中。


### ~/.ssh/id\_dsa

该用户默认的 DSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。

生成密钥的时候可以指定采用密语来加密该私钥(3DES)。

[ssh](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh)将在登录的时候读取这个文件。


### ~/.ssh/id\_dsa.pub

该用户默认的 DSA 身份认证公钥(SSH-2)。此文件无需保密。

此文件的内容应该添加到所有 DSA 目标主机的 ~/.ssh/authorized\_keys 文件中。


### ~/.ssh/id\_rsa

该用户默认的 RSA 身份认证私钥(SSH-2)。此文件的权限应当至少限制为"600"。

生成密钥的时候可以指定采用密语来加密该私钥(3DES)。

[ssh](http://www.openbsd.org/cgi-bin/man.cgi?query=ssh)将在登录的时候读取这个文件。


### ~/.ssh/id\_rsa.pub

该用户默认的 RSA 身份认证公钥(SSH-2)。此文件无需保密。

此文件的内容应该添加到所有 RSA 目标主机的 ~/.ssh/authorized\_keys 文件中。


### ~/.ssh/known_hosts

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







Linux 之 ssh 免密登陆
https://flepeng.github.io/002-Linux-Linux-之-ssh-免密登陆/
作者
Lepeng
发布于
2021年3月30日
许可协议