欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

ssh互信 ssh私钥免密登录

发布时间:2024/3/24 编程问答 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 ssh互信 ssh私钥免密登录 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

环境相关:
OS:CentOS release 6.9
IP:192.168.77.10

1. 简单解释

ssh服务可以生成公私钥,公私钥的类型有两种:rsa和dsa,作用是使用私钥免输入密码登录到公钥所在的主机的用户,这就是ssh的是要免密登录。
ssh互信是指多个用户之间相互配置免密登录,可以是自己配置免密登录自己,做互信用的公私钥可以是多套也可以是一套。
下面介绍几个常用的免密登录或者互信的使用场景。

2. 相关目录和权限说明

相关环境目录和文件说明:

# 某用户的ssh公私钥所在目录在用户家目录的.ssh目录下 # 主机安装后,如果该用户从来没有使用过ssh命令连接到任何主机,此时~/.ssh目录是不存在的 # 不建议手动创建,使用一次ssh命令连接自己即可创建出来 useradd vincent echo vincent|passwd --stdin vincent su - vincent ls -la .ssh # ls: cannot access .ssh: No such file or directory ls -la ~/.ssh # ls: cannot access /home/vincent/.ssh: No such file or directory # 以英文据点开始的文件或者目录是隐藏的,使用ls -a参数可以查看到ssh 127.0.0.1 # The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. # RSA key fingerprint is 02:da:60:ad:4f:3e:d2:6b:33:b3:9a:27:d5:e3:80:e7. # Are you sure you want to continue connecting (yes/no)? # 显示以上信息时.ssh目录已经创建了,此时直接ctrl+c结束掉即可 # 也可以输入yes回车,然后输入密码进行ssh登录,以用户自己登陆到主机的回环地址下的用户自己ls -ld ~/.ssh/ # drwx------ 2 vincent vincent 4096 Jan 2 12:22 /home/vincent/.ssh/ # 如果要手动创建,则该目录的权限要设置成700,不推荐手动创建,创建命令如下: # su - vincent # mkdir ~/.ssh # chmod 700 ~/.sshcd ~/.ssh # 上一步ctrl+c结束掉,此时该目录为空 # 如果上一步没有ctrl+c结束掉,正常登录后该目录会有一个叫做 known_hosts 文件 # 记录已经连接过的主机信息ssh 127.0.0.1 # The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established. # RSA key fingerprint is 02:da:60:ad:4f:3e:d2:6b:33:b3:9a:27:d5:e3:80:e7. # Are you sure you want to continue connecting (yes/no)? yes # Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts. # 这一句警告就是说将 127.0.0.1 (RSA)信息添加到已知的主机信息中,即known_hosts文件中 # vincent@127.0.0.1's password: exit ls -l known_hosts # -rw-r--r-- 1 vincent vincent 391 Jan 2 12:32 known_hosts # 文件权限是644,完全没有必要手动创建ssh -o StrictHostKeyChecking=no localhost # Warning: Permanently added 'localhost' (RSA) to the list of known hosts. # vincent@localhost's password: # Last login: Tue Jan 2 12:32:28 2018 from 127.0.0.1 exit # 如果不想在第一次连接到某主机某的用户时交互的输入yes(即known_hosts文件中没有该主机的该用户的信息) # 可以使用 -o StrictHostKeyChecking=no 参数默认自动添加未知主机到known_hosts文件中 # 这是一个非常技巧性的参数# 生成rsa的公私钥 ssh-keygen -t rsa # 输入该命令敲回车之后,还需要连续敲三次回车,当然每次回车之前是可以输入一些信息的 # 比如第一次是指定生成的公私钥文件名,一般建议默认,第二次和第三次是输入密码和确认密码 ls -l # -rw------- 1 vincent vincent 1675 Jan 2 12:45 id_rsa # -rw-r--r-- 1 vincent vincent 397 Jan 2 12:45 id_rsa.pub # 文件id_rsa就是默认生成的私钥文件,权限只能是600,如果不是这个权限,则会出问题 # 文件id_rsa.pub是默认生成的公钥文件,权限是644# 理论上讲只要某台机器的某个用户上有刚才生成的公钥文件,那么用私钥文件就能够免密码登录到该机器 # 公钥像锁,私钥像该锁的钥匙,把公钥放到某主机的某用户下,相当于在某用户的门上安装了一把自己有钥匙的锁 # 自己拿着钥匙就能开锁进门了 # 但是公钥可能有很多个,比如多个用户都要免密码登录到一个主机的某个用户下 # 因此公钥文件不能直接使用,而要生成另外一个文件存放所有公钥用于免密登录 cat id_rsa.pub >> authorized_keys chmod 600 authorized_keys ssh 127.0.0.1 date # 该文件的权限只能是600,否则也是无法免密登录的 # ssh IP CMD 是指ssh到主机后执行命令CMD,然后退出主机# 以上配置authorized_keys文件是手工配置,是有正规的命令自动配置的 ssh-copy-id 127.0.0.1 # vincent@127.0.0.1's password: # Now try logging into the machine, with "ssh '127.0.0.1'", and check in: # .ssh/authorized_keys # to make sure we haven't added extra keys that you weren't expecting. # 推荐该操作 # 使用 ssh-copy-id 命令,会在authorized_keys不断追加公钥信息# 生成dsa的公私钥 ssh-keygen -t dsa # 操作上只有这一个区别 # 一般只生成rsa的公私钥即可

3. 场景一:某用户自己免密登录自己

# 环境清理: rm -rf ~/.ssh # 正式开始设置: mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa cd ~/.ssh cat *.pub >> authorized_keys # 因为生成了rsa和dsa的密钥,因此需要将两个公钥文件内容写入authorized_keys文件 chmod 600 authorized_keys ssh -o StrictHostKeyChecking=no 127.0.0.1 date ssh -o StrictHostKeyChecking=no localhost date ssh -o StrictHostKeyChecking=no $(hostname) date ssh -o StrictHostKeyChecking=no $(hostname -i) date # 以上四条命令是指连接到回环地址,回环地址主机名,主机名,主机名对外IP地址 # 这四条命令是必须要执行的,因为一般或者某些第三方程序测试互信的时候不会使用参数 -o StrictHostKeyChecking=no 的 # 此时known_hosts没有相关信息,需要手动输入yes,或者测试互信就直接失败掉了 # 比如oracle的10gRAC搭建过程中测试互信的时候就会发生该类问题,导致互信检测失败

4. 场景二:某用户要批量控制多个主机多个用户

rm -rf ~/.ssh mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa # 配置私钥 ssh-copy-id root@192.168.77.67 ssh -o StrictHostKeyChecking=no root@192.168.77.67 date # 当前用户可以免密登录到对应IP的root用户,当前用户是否为root,没有限制 ssh-copy-id root@192.168.1.251 ssh -o StrictHostKeyChecking=no root@192.168.1.251 date # 多个网段也是可以的,只要IP和端口是通的即可

5. 场景三:两用户(多用户)互信

useradd vincent1 useradd vincent2 useradd vincent3 echo vincent|passwd --stdin vincent1 echo vincent|passwd --stdin vincent2 echo vincent|passwd --stdin vincent3 # 创建三个用户作为实验用模拟用户su - vincent1 mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa ssh-copy-id vincent1@127.0.0.1 ssh-copy-id vincent2@127.0.0.1 ssh-copy-id vincent3@127.0.0.1 ssh -o StrictHostKeyChecking=no vincent1@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent2@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent3@127.0.0.1 date exit # 配置vincent1的公私钥,配置vincent1到自己和另外两个用户的免密登录su - vincent2 mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa ssh-copy-id vincent1@127.0.0.1 ssh-copy-id vincent2@127.0.0.1 ssh-copy-id vincent3@127.0.0.1 ssh -o StrictHostKeyChecking=no vincent1@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent2@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent3@127.0.0.1 date exit # 配置vincent2的公私钥,配置vincent2到自己和另外两个用户的免密登录su - vincent3 mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa ssh-copy-id vincent1@127.0.0.1 ssh-copy-id vincent2@127.0.0.1 ssh-copy-id vincent3@127.0.0.1 ssh -o StrictHostKeyChecking=no vincent1@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent2@127.0.0.1 date ssh -o StrictHostKeyChecking=no vincent3@127.0.0.1 date exit # 配置vincent3的公私钥,配置vincent3到自己和另外两个用户的免密登录

6. 场景四:全部一套公私钥

所有的主机都是用同一套公私钥和authorized_keys文件,这个情况是偷懒的方法,也容易留下后门,不推荐使用,如果有人攻破了你一台主机,那么相当于你的所有机器都被攻破:

mkdir ~/.ssh chmod 700 ~/.ssh ssh-keygen -t rsa ssh-keygen -t dsa cd ~/.ssh cat *.pub >> authorized_keys scp -r ~/.ssh USER@IP:~/ # 使用scp 分发该目录,分发到哪里,哪里就能相互的直接互信 # 相当方便,但请不要跟别人讲是从本博文看到的方法。┏(゜ω゜)=☞ 走你。

[TOC]

总结

以上是生活随笔为你收集整理的ssh互信 ssh私钥免密登录的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。