~/.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;
}
答え2
これはsshに関連しています。 sshでは、~/.ssh/config
影響を受けるユーザーだけがファイルを読み取ることができ、他のユーザーは読み取ることができないことを要求します。ほとんどのシステムのファイル権限は、デフォルトで664または644(rw-rw-r--またはrw-r--r--)です。 umaskを設定してこれを制御できます。
git clone
リポジトリはsshを使用して複製されており、複製がhttp(s)で実行されていても、initはいくつかのsshエントリを使用している可能性があります。
リンク: