Linux|SSH免密登录配置ssh-copy-id

A、B两台Linux终端,其中需要A通过SSH远程登录B时,能够免密码直接通过用户名进行登录的配置
介绍 公钥私钥 1、什么是公私钥
  • 公钥和私钥成对出现
  • 公开的密钥叫公钥,只要自己知道的叫私钥
  • 用公钥加密的数据只要对应的私钥能够 解密
  • 用私钥加密的数据只要对应的公钥能够解密
  • 假如能够用公钥解密,则必定是对应的私钥加的密
  • 假如能够用私钥解密,则 必定是对应的公钥加的密
总结
  • 用公钥加密数据,用私钥来解密数据
  • 用私钥加密数据(数字签名),用公钥来验证数字签名。
【Linux|SSH免密登录配置ssh-copy-id】原理
SSH (1)客户机向远程主机发送登录请求,并且把自己的公钥发送给远程主机。
(2)远程主机收到用户的登录请求,首先判断对应的用户主目录下是否存在.ssh/authorized_keys并且这个文件中有没有有客户机的公钥时;
如果条件不成立,就会使用账户口令登录登录的方式,同时向客户机返回
  • 自己的公钥
如果条件成立,则会使用公私钥登录的方式,同时向客户机返回
  • 自己的公钥;
  • 客户机公钥加密过的一些验证信息
账户口令登录登录的方式:(每次都需要输入密码,不能免密钥登录)
(3)用户使用这个公钥,将登录密码加密后,发送回来。
(4)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。
基于公私钥登录的方式:(可以实现 免密钥登录)
能用到这种方式的前提是,用户已经将自己的公钥储存在远程主机上,这个是重点,也就是所谓的“公密钥分发”。
(3)用户用自己的私钥解密“随机信息”后,接着用“私钥”加密签名该“随机信息”,最后再用远程主机的公钥加密发送给远程主机。
(4)远程主机先用自己的私钥解密,然后在用事先储存的客户机公钥进行解密认证,得出“随机信息”,如果“随机信息”正确,就证明用户是可信的,直接允许登录shell,不再要求密码。
ssh-copy-id命令解析
  • ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上
  • ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
ssh-copy-id命令可以把本地的ssh公钥文件安装到远程主机对应的账户下。
达到的功能:
ssh-copy-id - 将你的公共密钥填充到一个远程机器上的authorized_keys文件中。
使用模式:
ssh-copy-id [-i [identity_file]] [user@]machine

描述:
ssh-copy-id 是一个实用ssh去登陆到远程服务器的脚本(假设使用一个登陆密码, 因此,密码认证应该被激活直到你已经清理了做了多个身份的使用)。它也能够改变远程用户名的权限,/.ssh和/.ssh/authorized_keys删除群组写的权限(在其它方面,如果远程机上的sshd在它的配置文件中是严格模式的话,这能够阻止你登陆。)。
如果这个 “-i”选项已经给出了,然后这个认证文件(默认是~/.ssh/id_rsa.pub)被使用,不管在你的ssh-agent那里是否有任何密钥。
另外,命令 “ssh-add -L” 提供任何输出,它使用这个输出优先于身份认证文件。如果给出了参数“-i”选项,或者ssh-add不产生输出,然后它使用身份认证文件的内容。一旦它有一个或者多个指纹,它使用ssh将这些指纹填充到远程机~/.ssh/authorized_keys文件中。
环境配置 关闭防火墙
  • iptables
# 临时关闭 systemctl stop iptables service iptables stop# 永久关闭 systemctl disable iptables chkconfig iptables off

  • firewalld
# 临时关闭 systemctl stop firewalld.service// 停止firewall# 永久关闭 systemctl disable firewalld.service// 禁止firewall开启启动 firewall-cmd --state// 查看firewall状态

关闭SELinux
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。
# 临时关闭(0为关闭,1为开启) setenforce 0# 永久关闭 修改 /etc/selinux/config 文件 将 SELINUX=enforcing 修改为 disabled 重启生效# 查看状态 getenforce /usr/sbin/sestatus -v

配置远程权限 如果使用root帐号进行远程登录,需要授权 root 允许远程登录的权限
# 修改 /etc/ssh/sshd_config PermitRootLogin yes//允许root登录 PermitEmptyPasswords yes //允许不输入密码登录# 重启 sshd 服务生效 systemctl restart sshd

密钥设置 配置SSH权限
# 编辑 /etc/ssh/sshd_config 文件,去掉下面几行的注释 '#' RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile.ssh/authorized_keys# 重启 sshd 服务 systemctl restart sshd service sshd restart

生成密钥
# 执行命令,三次默认回车 ssh-keygen -t rsa# 生成两个文件 id_rsa: 私钥 id_rsa.pub:公钥

导入公钥 方法一:创建文件并进行拷贝,将公钥导入到另一台终端的认证文件中
cat id_rsa.pub >> ~/.ssh/authorized_keys

设置文件访问权限
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

方法二:在本机通过ssh-copy-id命令直接将公钥分配给目标终端
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.1# 可简写 ssh-copy-id // 其中在 /etc/hosts中 配置,用户默认为本机运行用户

    推荐阅读