我有一台运行 Ubuntu 的机器,其中有一个 SSH 配置文件,具有~/.ssh/config
以下权限(创建新文件时默认)
-rw-rw-r-- 1 dev dev 75 Oct 26 20:13 config
创建与现有用户 (dev) 具有相同主组 (dev) 的新用户 (test) 后,以 dev 身份登录时我无法再进行 git clone 操作。
dev@vm:~$ git clone ...
Cloning into ...
Bad owner or permissions on /home/dev/.ssh/config
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
谷歌搜索似乎表明我可以通过运行来修复 ssh 问题chmod 600 ~/.ssh/config
,但为什么这会成为一个问题呢?我怎样才能系统地解决这个问题,因为我认为这也会影响其他文件?
谢谢!
答案1
在openssh-7.6p1源代码文件中readconf.c
我们可以看到权限检查被委托给了一个函数secure_permissions
:
if (flags & SSHCONF_CHECKPERM) {
struct stat sb;
if (fstat(fileno(f), &sb) == -1)
fatal("fstat %s: %s", filename, strerror(errno));
if (!secure_permissions(&sb, getuid()))
fatal("Bad owner or permissions on %s", filename);
}
这个函数是在misc.c
我们可以看到,如果文件是组可写的,它确实明确强制每个组有一个成员:
int
secure_permissions(struct stat *st, uid_t uid)
{
if (!platform_sys_dir_uid(st->st_uid) && st->st_uid != uid)
return 0;
if ((st->st_mode & 002) != 0)
return 0;
if ((st->st_mode & 020) != 0) {
/* If the file is group-writable, the group in question must
* have exactly one member, namely the file's owner.
* (Zero-member groups are typically used by setgid
* binaries, and are unlikely to be suitable.)
*/
struct passwd *pw;
struct group *gr;
int members = 0;
gr = getgrgid(st->st_gid);
if (!gr)
return 0;
/* Check primary group memberships. */
while ((pw = getpwent()) != NULL) {
if (pw->pw_gid == gr->gr_gid) {
++members;
if (pw->pw_uid != uid)
return 0;
}
}
endpwent();
pw = getpwuid(st->st_uid);
if (!pw)
return 0;
/* Check supplementary group memberships. */
if (gr->gr_mem[0]) {
++members;
if (strcmp(pw->pw_name, gr->gr_mem[0]) ||
gr->gr_mem[1])
return 0;
}
if (!members)
return 0;
}
return 1;
}
答案2
这个和ssh有关。 ssh 要求文件~/.ssh/config
只能由受其影响的用户读取,其他人不能读取。大多数系统上的文件权限默认为 664 或 644(rw-rw-r-- 或 rw-r--r--)。您可以通过设置 umask 来控制它。
git clone
正在使用 ssh 克隆存储库,即使克隆是从 http(s) 完成的,它也可能在 init 上使用一些 ssh 东西。
链接: