Ssh
創建打破現有權限的新使用者
我有一台執行 Ubuntu 的機器,其中
~/.ssh/config
包含具有以下權限的 SSH 配置文件(創建新文件時的預設設置)-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.
Google搜尋似乎表明我可以通過執行來解決 ssh 問題
chmod 600 ~/.ssh/config
,但為什麼這甚至會成為一個問題?我怎樣才能係統地解決這個問題,因為我認為這也會影響其他文件?謝謝!
在 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; }