コマンドを使用してグループのメンバーと管理者を変更し、gpasswd
ユーザーをグループ管理者として追加すると、Linuxはそのユーザーがrootでスケジュールされたタスクを実行できるようにします。
前任者。
[test1@centos ~]$ gpasswd -a test6 test
Adding user test6 to group test
管理者として追加されていないユーザーとして同じ操作を実行しようとすると、許可されません。
[test2@centos ~]$ gpasswd -a test7 test
gpasswd: Permission denied.
これはどこかで追跡されるべきです。このgpasswd
コマンドは SUID ビットを設定しますが、制限対象を表しません。
これはどこで追跡されますか?gpasswd
誰が高い権限を与えられたのか、コマンドはどのようにわかりますか?
答え1
これはどこで追跡されますか? gpasswdコマンドは、誰が昇格された権限を与えられたかをどのように知ることができますか?
実際、それ自体は「追跡」ではありません。 gpasswd
ユーザーがさまざまな方法でコマンドを使用する権限を持っているというルールがあり、これらのルール/権限はコマンドが実行されるたびにテストされます。これらのテストの結果はキャッシュまたは保存されません。
通常、実行するにはgpasswd
ルートまたはターゲットグループの管理メンバーとして定義する必要があります。最初あなたがターゲティングするグループのメンバーです。
具体的な内容を知りたい場合は、次のgpasswd
内容の出所などを確認してください。シャドウユーティリティプロジェクト。
~によるとgpasswdソース(GitHubミラー#ifdef SHADOWGRP
)、およびsumの結果に応じて、#ifdef FIRST_MEMBER_IS_ADMIN
またはフラグを使用しない呼び出しに対して関数で3つのチェックのいずれかを実行しますcheck_perms
(以下の説明は私が書いたものです)。gpasswd
-A
-M
/* Check 1 */
if (!amroot && !is_on_list (sg->sg_adm, myname)) {
failure ();
}
/* Check 2 */
if (!amroot) {
if (gr->gr_mem[0] == (char *) 0) {
failure ();
}
if (strcmp (gr->gr_mem[0], myname) != 0) {
failure ();
}
}
/* Check 3 */
if (!amroot) {
failure ();
}
amroot
rootユーザーが呼び出すとtrueになるブール値ですgpasswd
。それは次のように定義されますここ:
/* The UID of the caller */
static uid_t bywho;
/* Indicate if gpasswd was called by root */
#define amroot (0 == bywho)
ルートになると、検査 1、検査 2、検査 3 を「通過」(スキップ)します ( amroot
will be true
、つまり!amroot
will be を意味false
するので if 文をスキップします)。
ルート以外のユーザーは、ターゲットグループの管理メンバーである場合は確認1に合格できます。これは、ターゲットグループ(sg-> sg_adm)の管理メンバーのリストと、呼び出すユーザーgpasswd
のユーザー名(myname)を関数に渡すことによってテストされますis_on_list
。ここ。呼び出し側のユーザーがグループ管理者リストにある場合は反転し、ユーザーが確認1に合格できるようにis_on_list
返します。true
false
ルート以外のユーザーは確認2を通過できます(ルート以外の場合)。変更したいグループの最初にリストされたメンバー。これは、ターゲットグループの最初のユーザーが呼び出されたユーザーと同じであることを確認してテストされますgpasswd
。
ルート以外のユーザーはスキャン3を通過できません。
注:すべてのソースリンクは、ソースリポジトリの「debian / 4.2-3」タグへのリンクを提供します。これは一貫した参照を提供するためのものです。