名前

setpriv - 別の Linux 特権によりプログラムを実行する

書式

setpriv [options] program [arguments]

説明

execve(2) を通じて受け継いだ、 さまざまな Linux 特権設定項目を、 設定または検索する。

su(1) や runuser(1) と比較すると、 setpriv は PAM を利用せず、 またパスワードプロンプトを行わない。 これは、 ユーザー ID の変更を行わない、 単純な execve(2) に対するラッパープログラムである。 これを用いれば、 daemontools にある setuidgid(8)、 runit にある chpst(8)、あるいはそれ以外のサービスマネージャーが提供する同種のツールと、 同じようにして権限削除を行うことができる。

オプション

--clear-groups

補助グループ (supplementary group) をクリアする。

-d, --dump

現在の特権の状態をダンプ出力する。 このオプションは複数個の指定が可能であり、 ほとんど不要かもしれないが、 追加の情報を得ることができる。 他のオプションと同時に指定することはできない。

--groups group...

補助グループを設定する。 引数は、 GID または名前をカンマで区切ったリストである。

--inh-caps (+|-)cap..., --ambient-caps (+|-)cap..., --bounding-set (+|-)cap...

継承 (inheritable) ケーパビリティー、 ambient ケーパビリティー、 あるいはケーパビリティーバウンディングセットを設定する。 capabilities(7) を参照のこと。 引数には、 +cap エントリーや -cap エントリーをカンマで区切ったリストとして指定する。 これを使って、 エントリーの追加または削除を行う。 cap に指定できる形式は、 1 つは capabilities(7) に示されている、 わかりやすい名称を用いるものであり、 プレフィックス cap_ は取り除いて指定する。 もう 1 つは、 cap_N の書式で指定するものであり、 ここで N は、 Linux が内部で利用しているケーパビリティーのインデックス値である。 +all あるいは -all は、 ケーパビリティーのすべてを追加または削除する。

ケーパビリティーセットの指定は、 --inh-caps では、 現在の継承セットとして指定する。 同様に、 --ambient-caps では、 現在の ambient セットとして、 --bounding-set では、 現在のバウンディングセットとして指定する。

このケーパビリティーセットの変更に関しては、 以下に示す制約があることに注意すること (詳しくは capabilities(7) に説明されている)。

·

ケーパビリティーを継承セットに追加するためには、 その時点で、 バウンディングセット内にそれが存在している必要がある。

·

ケーパビリティーを ambient セットに追加するためには、 その時点で、 許可 (permitted) セットおよび継承セット内の両方に、それが存在している必要がある。

·

setpriv に文法が存在しているが、 カーネルでは、 バウンディングセットに対して許可ケーパビリティーを追加することはできない。

バウンディングセットからケーパビリティーを削除する際に、 それを継承セットからは削除しなかったとしたら、 混乱の元になる可能性があるため、 これを行ってはならない。

--keep-groups

補助グループを維持する。 --rgid--egid--regid と合わせて使う場合にのみ用いる。

--init-groups

initgroups3 を使って、 補助グループを初期化する。 --ruid--reuid と合わせて使う場合にのみ用いる。

--list-caps

既存のケーパビリティーをすべて表示する。 このオプションは、 単独で用いなければならない。

--no-new-privs

no_new_privs ビットを設定する。 このビットがセットされていると、 execve(2) は新たな権限を許可しない。 たとえば、 set-user-ID ビット、set-group-ID ビット、 ファイルケーパビリティーは無効化される。 (これらのビットがセットされた状態で、 バイナリを実行すると、 処理動作は行われる。 ただし特権を取得することはできない。 特定 の LSM、 特に AppArmor においては、 特定プログラムの実行に失敗する場合がある。) このビットは子プロセスに継承され、 設定をクリアすることはできない。 prctl(2) または Linux カーネルソース内の Documentation/prctl/no_new_privs.txt を参照のこと。

no_new_privs ビットは Linux 3.5 からサポートされている。

--rgid gid, --egid gid, --regid gid

実 (real) GID、 実効 (effective) GID、 その両方の GID をそれぞれ設定する。 引数 gid は、 グループ名での指定も可能である。

プライマリ gid を設定する場合は、 安全のために、 --clear-groups--groups--keep-groups--init-groups のうちの 1 を指定しておかなければならない。

--ruid uid, --euid uid, --reuid uid

実 (real) UID、 実効 (effective) UID、 その両方の UID をそれぞれ設定する。 引数 uid は、 ログイン名での指定も可能である。

uid または gid 設定しても、 ケーパビリティーは変更されない。 ただし最終の exec 呼び出しによって、 ケーパビリティーが変更される可能性がある。 このことはつまり、 root ユーザーであれば、 以下のようなことが可能であることになる。

setpriv --reuid=1000 --regid=1000 --inh-caps=-all

--securebits (+|-)securebit...

セキュアビット (securebit) をセットまたはクリアする。 引数はカンマ区切りのリストである。 セキュアビットの有効な値は、 norootnoroot_lockedno_setuid_fixupno_setuid_fixup_lockedkeep_caps_locked である。 keep_capsexecve(2) によってクリアされるので、 利用はできない。

--pdeathsig keep|clear|<signal>

親プロセスの death シグナル (parent death signal) に対して、 維持、 クリア、 設定を行う。 一部の LSM、 特に SELinux と AppArmor においては、 プロセスの資格情報が変更されると、 そのシグナルはクリアされる。 --pdeathsig keep を指定すると、 この状況を改善するように資格情報の変更を行うと、 親プロセスの death シグナルが復元される。

--selinux-label label

特定の SELinux 遷移 (dyntrans ではなく exec による遷移) を要求する。 SELinux が用いられていない場合は、 要求が失敗して、 setpriv は終了する。 そして、 おそらくは遷移が無視されるか、 SELinux が動作不定となって execve(2) が失敗するかもしれない。 (特に、 no_new_privs と組み合わせても、 動作する可能性は低い。) これは runcon(1) と似ている。

--apparmor-profile profile

特定の AppArmor プロファイル (exec による遷移) を要求する。 AppArmor が用いられていない場合は、 要求が失敗して、 setpriv は終了する。 そして、 おそらくは遷移が無視されるか、 AppArmor が動作不定となって execve(2) が失敗するかもしれない。

--reset-env

TERM を除く環境変数すべてをクリアする。 つまり、 ユーザーの passwd エントリーに基づいて、 環境変数 HOMESHELLUSERLOGNAME を初期化する。 そして PATH の値として、 通常ユーザーには /usr/local/bin:/bin:/usr/bin、 root ユーザーには /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin を設定する。

環境変数 PATH は、 /bin/sbin/usr にマージされているシステムでは異なることがある。 環境変数 SHELL のデフォルトは、 ユーザーの passwd エントリーに指定がなければ、 /bin/sh である。

-h, --help

ヘルプを表示して終了する。

-V, --version

バージョンを表示して終了する。

注意

指定されたオプションのどれか 1 つでも処理に失敗した場合、 program は実行されず、 setpriv は終了ステータス 127 を返す。

このツールの利用にあたっては、 予期しないセキュリティ上の結果が引き起こされるかもしれないため、十分注意すること。 たとえば、 no_new_privs を設定してから、 SELinux により制限されている (当ツールと同じような) プログラムを実行すると、 SELinux による制限が、 うまく働かない可能性がある。

su(1) と runuser(1) の組み合わせか、 あるいは sudo(8) (-g オプションなし) による同様の処理を必要とするなら、 以下のように実行するとよい。

setpriv --reuid=1000 --regid=1000 --init-groups

daemontools の setuid(8) を真似るのであれば、 以下を行う。

setpriv --reuid=1000 --regid=1000 --clear-groups

作者

関連項目

runuser(1), su(1), prctl(2), capabilities(7)

バグ報告

バグ報告は、 以下にある issue トラッカーを利用すること。 <https://github.com/util-linux/util-linux/issues>.

入手方法

setpriv コマンドは util-linux パッケージの一部であり、 以下からダウンロードできる。 Linux Kernel Archive <https://www.kernel.org/pub/linux/utils/util-linux/>.