每天学五分钟 Liunx 010 | ssh
Liunx ssh known_hosts
known_hosts是做服务器认证的。当用 ssh 连接到一个新的服务器的时候,ssh 会让你确认服务器的信息(域名、IP、公钥),如果你确认了,就会把这些信息写到 known_hosts (~/.ssh/known_hosts) 里,下次登录的时候就不需要再确认了。
[***@localhost ~]$ ssh -i test.pem test@10.57.***.***
The authenticity of host '10.57.***.*** (10.57.***.***)' can't be established.
ECDSA key fingerprint is SHA256:lmHAb/8OpqvHfFHpu03VchRuHh92PBmxO1Ms+NYDy58.
ECDSA key fingerprint is MD5:61:82:03:13:ee:b8:a9:54:7f:75:f1:70:34:79:bb:88.
Are you sure you want to continue connecting (yes/no)?
以后再连接到这个服务器,但是信息改变了(通常是公钥改变了),就会提示你服务器信息改变了,你可以把它从 known_hosts 里删除,然后重新确认。
查看 client 中的 known_hosts 的公钥:
10.57.***.*** ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNy4eymcWeMRMUsKL2ddxa8ZIoRpzUjo+wtO4pHb+SDjt/S+Q=
当 client 登录 server 的时候,server 会将 /etc/ssh/ssh_host_ecdsa_key.pub 公钥发给 client,它自己有 ssh_host_ecdsa_key 这个私钥,用来确认这个 client 是可以登陆自己的。
cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBq+u0FxfHDFmiZLeymcWeMRMUsKL2ddxa8ZIoRpzUjo+wtO4pHb+SDjt/S+Q=
手动改掉 server 的 pub 和 private key,从 client 登陆 server,提示 Host Key verification failed:
[test@localhost ~]$ ssh -i test.pem cbam@10.57.***.***
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:1ZxM8C4eKvSfkD+ShGPEqCZvBz/LFwzwGHOhD2DtVuA.
Please contact your system administrator.
Add correct host key in /home/installer/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/installer/.ssh/known_hosts:1
ED25519 host key for 10.57.193.147 has changed and you have requested strict checking.
Host key verification failed.
[test@localhost ~]$
删除 client 的 known_hosts 文件,重新登陆,登陆成功!
Liunx ssh no_password & no_user
设置免密登陆:
- client 上执行 “ssh-keygen -t rsa”,生成 pub 和 private key,无视提示,一路 Enter。
- 公钥 ~/.ssh/id_rsa.pub 复制到远程机器的 /home/username/.ssh 目录并命名为 authorized_keys。
- 本机登陆用户和远程登陆用户一致的话,就可以直接 ssh hostname 登陆,如果不一致的话通过 ssh user@hostname 登陆,要注意 authorized_keys 的权限,如果用户不一致的话要将权限设为 640。
ssh 的时候不需要询问是否确认服务器信息是因为这些信息已经存在 ~/.ssh/known_hosts 文件了。
更改远程主机的 hostname,通过 ssh user@other_hostname 的形式登陆: 在 /etc/hosts 文件中加上 “10.57.***.*** test.local”,test.local 是 10.57.***.*** 的别名,然后就可以通过 ssh test@test.local 的方式登陆 server。
再去 known_hosts 中查看新加了一个 hostname 和 key:
test.local ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIL7PlX4ltPy+WYRiexdY/r/XBX38oRm0m3uB8fIgTG94
ps: /etc/hosts 文件,它是配置 ip 地址和其对应主机名的文件。可以记录本机或者其它主机对应的 ip 和主机名。它分为三部分:主机 ip / 主机名 / 主机名别名。
-
免用户名登陆: 在 .ssh/config 文件(如果没有的话可以自己新建一个)中写入 Host 和 user 的对应关系,如下:
Host test.local
user test
-
使用 ssh test.local 登陆 server,成功!
Liunx 静态检查
如果 client 端的 known_hosts 里没有 server 的信息,或者 server 的信息改变的话,那么下次登陆就会做公钥(静态)检查。但是,对于一些自动化脚本来说,执行静态检查会使得任务执行失败,此时取消静态检查是很有必要的。
两种方式取消静态检查:
1. ssh -o StrictHostKeyChecking=no hostname
[***@localhost ~]$ rm -rf .ssh/known_hosts
[***@localhost ~]$ ssh ***.local
The authenticity of host 'cbam.local (10.57.***.***)' can't be established.
ED25519 key fingerprint is SHA256:1ZxM8C4eKvSfkD+ShGPEqCZvBz/LFwzwGHOhD2DtVuA.
ED25519 key fingerprint is MD5:19:89:9b:62:5d:70:8b:29:b6:05:01:41:73:bb:29:05.
Are you sure you want to continue connecting (yes/no)? no
Host key verification failed.
[***@localhost ~]$ cd .ssh/
[***@localhost .ssh]$ ls
authorized_keys config id_rsa id_rsa.pub
[***@localhost .ssh]$ ssh -o StrictHostKeyChecking=no test.local
Warning: Permanently added 'test.local,10.57.***.***' (ED25519) to the list of known hosts.
Last login: Fri Jul 12 11:50:30 2019 from 10.57.193.149
[test@*** ~]$ exit
logout
Connection to cbam.local closed.
[***@localhost .ssh]$ ls
authorized_keys config id_rsa id_rsa.pub known_hosts
注意,静态检查不意味着不会将 server 的信息加载到 known_hosts 中,只是说不做检查了。同时,Warning 信息还是会有的,取消静态检查并不会取消掉 Warning。
2. 在 ~/.ssh/config (如果没有的话创一个) 文件中添加 StrictHostKeyChecking no 这一句:
cat ~/.ssh/config
StrictHostKeyChecking no
补充:禁用静态检查会导致如果 server 的公钥改变的话,会提示告警,但是 client 还是可以登陆上去:
[***@localhost .ssh]$ vi known_hosts
[***@localhost .ssh]$ ssh -o StrictHostKeyChecking=no ***.local
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:1ZxM8C4eKvSfkD+ShGPEqCZvBz/LFwzwGHOhD2DtVuA.
Please contact your system administrator.
Add correct host key in /home/installer/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/installer/.ssh/known_hosts:1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
Last login: Fri Jul 12 12:14:32 2019 from 10.57.193.149
[***@*** ~]$ exit
取消这种告警,无视公钥改变可指定 “UserKnownHostsFile=/dev/null” ,提示信息就会变为首次连接的提示。
“ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null” 配合使用则公钥改变也不会出现告警。
[root@*** ~]cat ~/.ssh/config
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
[root@*** ~]# ssh root@10.57.***.***
Warning: Permanently added '10.57.***.***' (ECDSA) to the list of known hosts.
Last login: Fri Mar 6 00:22:15 2020 from 10.57.200.86
[root@*** ~]#
注意,设置了 UserKnownHostsFile=/dev/null,client 在登陆 server 的时候不会将 server 的信息添加到 known_hosts 中。
(完)
芝兰生于空谷,不以无人而不芳。