実行権限があるファイルの権限にsetuidビットを追加すると、 x
が変更されます。 s
に つまり、そのファイルを実行すると、実際に実行している人ではなく、ファイルの所有者として実行されます。
しかし、 s
を追加すると 許可しますが、 x
を削除します S
に変更する権限 権限リストにあります。どういうわけか、これは実行できなかったことを意味しますが、実行できれば所有者として同時に実行されますか?そうですか?
私はこの許可を誤解していますか?それは何のために使われますか?どういう意味ですか?
承認された回答:
4つの組み合わせすべてが存在し、意味があります。
「このファイルの実際の所有者はファイルを実行できますか?」 および「システムはこのファイルを実行しているふりをしますか?」 2つの別々の質問です。 4つの組み合わせすべてが可能で意味があります。
ls -l
によって表示される権限文字列 またはstat-c%A
表示、所有者の実行位置(つまり、?
の代わり) ---?------
)、4つの異なる文字、組み合わせごとに1つ:
-
-
所有者ができないことを意味します ファイルを実行し、所有者以外が実行する場合は、他のユーザーとして実行します。 。 -
x
所有者ができることを意味します ファイルを実行し、所有者以外が実行する場合は、他のユーザーとして実行します。 。 -
S
所有者ができないことを意味します ファイルを実行し、所有者以外が実行する場合は、代わりに所有者として実行します。 。 -
s
所有者ができることを意味します ファイルを実行し、所有者以外が実行する場合は、代わりに所有者として実行します。 。
setuidビットとexecuteビットは別々のビットであり、モード string これは、許可ビットを表示するための便利な方法です。それについて考える別の方法は次のとおりです:
-
x
またはs
実行ビットが設定されていることを意味します。-コード> または
S
そうではないことを意味します。 -
s
またはS
setuidビットが設定されていることを意味します。-コード> または
x
そうではないことを意味します。
同様に、グループはファイルに対する実行権限を持っている場合と持っていない場合があり、実行された場合、それを実行するユーザーのIDとは異なるグループIDで実行される場合とされない場合があります。ファイルを実行するユーザーのグループIDではなく、グループ所有者のグループIDでファイルを実行するには、setgidビット( ------ s ---
)を設定します。 または------S ---
。
S
個別のモードビットを表すものではありません。これは、setuid(またはsetgid)ビットが設定されているが、対応する実行可能ビットが設定されていないことを示すための単なる方法です。
$ touch foo
$ chmod u+S foo
chmod: invalid mode: ‘u+S’
Try 'chmod --help' for more information.
ビット自体を調べることができます。
これらが別々のビットであることを確認するには、%a
を使用します stat
のフォーマット指定子 %A
の代わりに 。簡単にするために、他のすべてのモードビットの設定を解除しました。
$ touch a b c d
$ chmod u=,g=,o= a
$ chmod u=x,g=,o= b
$ chmod u=s,g=,o= c
$ chmod u=xs,g=,o= d
$ stat -c '%A %n' a b c d
---------- a
---x------ b
---S------ c
---s------ d
$ stat -c '%04a %n' a b c d
0000 a
0100 b
4000 c
4100 d
それはそれを明らかにします…もしあなたが8進数に慣れているなら。バイナリで表示したい場合( 結局のところビット)表現を変換することができます:
$ stat -c '%a %n' a b c d | perl -pe 's/\d+/sprintf("%012b", oct($&))/e'
000000000000 a
000001000000 b
100000000000 c
100001000000 d
Setuidは、実際のユーザーIDではなく、実効ユーザーIDを設定します。
実行ビットは、ファイルの実行の試行が成功するかどうかを制御し、setuid / setgidビットは、作成が許可されている場合に新しいプロセスが実行されるIDを制御します。したがって、権限の組み合わせについて一貫性のない、または驚くべきことは何もありません S
( -x、+ s
を表します )。これは、所有者が実際に実行したために所有者として実行されている実行可能ファイルが、誰かが実行したがsetuidであったために、所有者として実行された実行可能ファイルとまったく同じように機能した場合でも同様です。しかし、それはそれがどのように機能するかではありません。
カーネルは複数の番号を使用して、実行中のプロセスのユーザーIDを追跡します。そのような番号の1つはUIDであり、もう1つはEUIDです。詳細については、この記事を参照してください。 setuidビットによりEUID(実効ユーザーID)が変更されますが、UID(実際のユーザーID)は同じままです。これを使用して、UIDを共有しているがEUIDが異なるプロセス間で信号を交換できるようにしますが、もう1つは、setuidビットを実行者を確認するように設計されたプログラムを使用できるようにすることです。>> 。
たとえば、 passwd
パスワードデータベースのエントリを変更できるのはrootのみであるため、setuidにする必要があります。
$ ls -l "$(command -v passwd)"
-rwsr-xr-x 1 root root 54256 May 16 19:37 /usr/bin/passwd
-rwsr-xr-x
r-x
があります 最後に、その他 。 x
が原因 、rootまたはrootグループに属していないユーザーでも、 passwd
を実行できます。 。そしてそれはrws
を持っています 冒頭近く、所有者 。 s
のため 、プログラムは、所有者以外が実行している場合でも、rootとして実行されます。 ただし、 passwd
を実行すると 自分で、rootではなくパスワードをリセットします。
passwd
対応 rootの有効なユーザーIDで実行されるため、ユーザーとパスワードのデータベースに変更を加えることはできません。ただし、実際のユーザーIDを確認するため、ユーザーがrootである場合を除いて、ユーザー以外のユーザーのパスワードの変更を拒否するように設計されています。
これは、setuid実行可能ファイルの一般的な使用例です。setuid実行可能ファイルのコードによってチェックされる制限された方法で、あるユーザーが別のユーザーとしてアクションを実行できるようにするインターフェイスを作成します。したがって、設計されたプログラムにsetuidビット(またはsetgidビット)を設定することだけが安全です。 それらの権限を持つために。
これは、権限が S
である理由を理解するためのパズルのもう1つのピースです。 謎ではないことを意味します:setuidビットが与える力はありません 所有者としてプログラムを実際に実行するのと同じことを達成する 、プログラムの実行が許可された後でも。
id
のコピーを使用してUIDとEUIDを確認する setuidがどのように機能するかを示しています。
さて、実際の有効なユーザーIDがどのように影響を受けるかを示すために、実行可能ファイル用に設計されていない実行可能ファイルにsetuidビットを設定します。
- 実行可能ファイルはコピーになります
id
の とりわけ、実際の有効なユーザーIDを報告するプログラム。このプログラムはsetuidとして設計されていませんが、出力を生成することを除いて、何も変更するようには設計されていないため、これはかなり安全です。ただし、後で削除する必要があります。 (あなたのコピー。オリジナルではありません。) - 私たちはコピーを使用していますが、ではありません オリジナルの権限を変更します。 しない
sudo
を使用する必要があります または、これのルートとして任意のアクションを実行します。 - 別のユーザーとして実行するには、2つ目のユーザーアカウントが必要ですが、
su
を使用できます そのとしてアクションを実行する ユーザー。 (デフォルトでは、root
アカウントではパスワードを使用してログインすることはできません。そのため、間違えてsu
を実行した場合 切り替えたいユーザー名を指定しないと、rootログインも有効にしていない限り、誤ってrootになることはありません。本当にsudo-u userを使用したい場合
su userの代わりに -c
、しかし、あなたはそうすることができます。)
私のメインユーザーアカウントはek
と呼ばれています 2番目のアカウントはek2
です 。違っていても大丈夫です。まず、 ek
として 、 id
をコピーします 現在のディレクトリ(私のホームディレクトリ内のどこかにあります)へ:
$ type -a id
id is /usr/bin/id
$ cp /usr/bin/id .
コピーには、コピーしたroot以外のユーザーの所有権がありますが、元の権限は次のとおりです。
$ ls -l id /usr/bin/id
-rwxr-xr-x 1 ek ek 39760 Oct 5 11:23 id
-rwxr-xr-x 1 root root 39760 Mar 2 2017 /usr/bin/id
-n
を渡す id
へ ID番号の代わりに名前を表示します-u
ユーザー(グループなどの他の情報ではない)と -r
を表示します 実際のユーザーIDが表示されます。 -r
なし 、 -u
有効なユーザーIDを示します。この動作は、コピーに完全に適用されます。 id
の 作ったばかりです。
代替ユーザーとして実行すると、実際のユーザーIDと有効なユーザーIDの両方が変更されます。これは、 su
の一部です。 およびsudo
書かれており、 su
の単なる結果ではありません それ自体はsetuidrootですが、そうです。 (これが私が passwd
を使用した理由です su
ではなく、典型的なsetuid実行可能ファイルの例として またはsudo
。)これは、 id
を確認するためのベースラインです。 現在のディレクトリで期待どおりに機能します:
$ ./id -nu # ek runs id, displaying the effective user
ek
$ ./id -nur # ek runs id, displaying the real user
ek
$ su ek2 -c './id -nu' # ek2 runs id, displaying the effective user
Password:
ek2
$ su ek2 -c './id -nur' # ek2 runs id, displaying the real user
Password:
ek2
次に、この id
のローカルコピーを作成します setuid:
$ chmod u+s id
$ ls -l id
-rwsr-xr-x 1 ek ek 39760 Oct 5 11:42 id
これを実行すると、実際のユーザーIDは実行したユーザーのIDのままですが、有効なユーザーIDは ek
のユーザーIDです。 ek2
の場合でも 実行します:
$ ./id -nu # ek runs id, displaying the effective user
ek
$ ./id -nur # ek runs id, displaying the real user
ek
$ su ek2 -c './id -nu' # ek2 runs id, displaying the effective user
Password:
ek
$ su ek2 -c './id -nur' # ek2 runs id, displaying the real user
Password:
ek2
今、私は所有者から実行可能権限を奪いますが、他のすべての人にそれらを残します:
$ chmod u-x id
$ ls -l id
-rwSr-xr-x 1 ek ek 39760 Oct 5 11:42 id
ek2
ek
と同じように実行できます ek
であっても、の有効なユーザーID 実行できません:
$ ./id -nu # ek runs id, displaying the effective user
-bash: ./id: Permission denied
$ ./id -nur # ek runs id, displaying the real user
-bash: ./id: Permission denied
$ su ek2 -c './id -nu' # ek2 runs id, displaying the effective user
Password:
ek
$ su ek2 -c './id -nur' # ek2 runs id, displaying the real user
Password:
ek2
ただし、示されているように、これは ek
と同じ結果を生成しませんでした 実際に実行しています。 ek2
ek
が実際にできることはありません ek
プログラムで許可されていない限り、プログラムの実行が許可されました。
(その後、 rm id
を実行しました ファイルを削除するため、ホームディレクトリに不要なsetuid実行可能ファイルが存在することはありません。または、 chmod -s id
を使用してsetuidビットの設定を解除することもできます。 。)