新しいユーザーを作成すると、既存の権限が削除されます。

新しいユーザーを作成すると、既存の権限が削除されます。

~/.ssh/config次の権限を持つSSH設定ファイルでUbuntuを実行しているコンピュータがあります(新しいファイルを作成するときのデフォルト)。

-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ファイルがグループに書き込み可能な場合は、明示的にグループごとに1つのメンバーを強制的に適用することがわかります。

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;
}

おすすめ記事