iGBlog

iGuan7u

iOS 出身的小伙子,对 Objective-C、Swift、以及 Javascript 有浓厚的兴趣。热衷使用原生实现所有功能,厌恶一切的跨平台开发技术。喜欢分享工作过程中遇到的问题以及日常工作中遇到的新技术。希望这个博客能给你带来一点启发。

GET IN TOUCH

期待与你的联系。

密钥文件的用户权限

前言

笔者在 github 上配置了 ssh key 用于 git 同步操作,通过 ssh 方式操作 clone 不需要输入 github
的账号密码,在开发设备迁移过程中有很好的体验,同时也能避免泄漏自己的 github 账号跟密码。但是每次迁移后,首次操作 git 必定能收到以下的错误信息:

The authenticity of host 'github.com (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:+fingerprint.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'script_file_path' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "script_file_path": bad permissions
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

之前为止解决这个问题,一直都很机器式的输入 chmod 600 script_file_path 命令,解决权限问题,完全不明白为什么会遇到以上的报错信息、
600 是什么内容。在这里,深入记录一下。

原因

从提示信息中很容易看出,0644 这个权限对于 ssh 私钥文件过于开放了,因此限制了私钥文件的使用。但是 0644 这个权限代表了什么呢?我们在
~/.ssh/ 目录中敲入一下命令,可以看到对应的结果

.ssh $: ls -l .
.ssh $: total 32
-rw-r--r--@ 1 iGuan7u staff 1499 Jan 15 17:43 private_key

其中 -rw-r-—r—-@ 就是对应文件 private_key 的权限。在 linux 系统中,文件权限总共 10 个字符,在 macOS
系统中,可能会出现 11 个字符,我们将其分为四组:

密钥文件的用户权限.png

第一组

其中第一组仅一个字符:

  • - 指普通文件
  • d 指文件夹
  • l 指连接文件

第二、三、四组

第二、三、四组的逻辑都一致,我们将其拆分为三个字符看:r 为读取权限、w 为写入权限、x 为执行权限,**-**
为对应位置不支持该权限,举例:

  • rw- 为可读性可写权限,不可执行
  • r— 为仅可读权限

而二、三、四组分别对应不同的用户范围,其中:

  • 第二组代表创建该文件的用户权限(创建者权限)
  • 第三组代表创建者所在的用户组的权限
  • 第四组代表其他用户组的权限

@

@ 这个字符是 macOS 系统特有的,代表该文件拥有拓展属性,我们可以在 macOS 中使用 xattr -l $file_path
查看对应文件的拓展属性。

拓展属性属于操作系统特有的,macOS、Windows
都有相关的功能,拓展属性中内容并不会直接记录到文件内容中。在开发过程中用于保存一些与特定文件强相关的持久性数据,非常好用。如文件的下载进度…

解答问题

那,600 跟 rw-r—r— 有什么关系呢?

我们依然将权限分为三组,而每一组的三个字符分别对应二进制中的位数,rw- 可以看成 110,对应的十进制数字就是
6,其他的两组同样的方式操作,即可以转换为方便理解的三位十进制数字了。(上述的 rw-r—r— 对应的十进制表示方式为 644)

回到问题,设置为 600 权限,即代表除了当前用户外,其他的用户都无权查看、编辑、执行该文件。ssh 强制密钥不能被其他用户查看,从而保证密钥的安全性。