Ssh

創建打破現有權限的新使用者

  • October 28, 2020

我有一台執行 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;
}

引用自:https://unix.stackexchange.com/questions/616527