読み取り権限がない場合、スクリプトを実行することは可能ですか? ルート モードでスクリプトを作成し、他のユーザーにこのスクリプトの実行を許可しますが、読み取りは許可しません。chmod
読み取りと書き込みを禁止し、実行を許可するように設定しましたが、ユーザー モードでは、「権限が拒否されました」というメッセージが表示されました。
答え1
問題は、実行されているのはスクリプトではなく、インタープリタ ( bash
、perl
、python
など) であることです。そして、インタープリタはスクリプトを読み取る必要があります。これは、ls
インタープリタのようにプログラムがカーネルに直接ロードされるという点で、 などの「通常の」プログラムとは異なります。カーネル自体がプログラム ファイルを読み取るため、読み取りアクセスを気にする必要はありません。通常のファイルを読み取る必要があるのと同様に、インタープリタはスクリプト ファイルを読み取る必要があります。
答え2
これはバイナリの場合にのみ可能です。
$ chown foo:foo bar
$ chmod 701 bar
権限のないユーザーとして:
$ ls -lha bar
-rwx-----x 1 foo foo 7.0K 2012-03-15 03:06 bar
$ cat bar
cat: bar: Permission denied
$ ./bar
baz
さて、ここで問題です。ファイルは従来の方法では読み取れませんが、ファイルの読み取りを阻止することはできません。これは実際にはhttp://smashthestack.org/hktrace
(レベル 13)。を使用してファイルを読み取ることができる、というよく知られたユーティリティがありますptrace
。
答え3
前述の記述には半分真実が含まれています。スクリプトを設定して、ユーザーが読み取れないようにすることができますが、実行は可能です。プロセスは少し長くなりますが、/etc/sudoer に例外を作成して、ユーザーがパスワードを要求されることなく一時的にスクリプトを自分自身として実行できるようにすることで実現できます。この方法には次の利点があります。 - 他のディストリビューションの setuid パッチを回避します。 - ユーザーにすべてに対する sudo 権限を与えずに、特定のスクリプトに対して一時的に昇格された権限を与えることができます。
この投稿の指示に従ってください: ファイル権限は実行のみ
答え4
おそらく、 を使ってこれを行うことができますsetuid
。
ただし、ほとんどのディストリビューションでは(どうやら)重大なセキュリティホールのため無効になっているため、できませんsetuid
。私のディストリビューションでは無効になっているため、この回答が実際に機能するかどうかはわかりませんが、それでも投稿します。すべき。
とにかく、あなたがやりたいことをやりたいなら、そしてsetuid
スクリプトが有効になっているディストリビューションを持っていたら、私は次のようにします:
$ chmod 700 myscript
$ cat > myscript-nonroot
#!/bin/sh
bash myscript
^D
$ sudo chown root:root myscript-nonroot
$ sudo chmod 4755 myscript-nonroot # make SURE this isn't world-writable!
つまり、ルート読み取り専用スクリプトを呼び出し、それをルートが所有するように変更し、setuid 権限を与えることを唯一の目的とする別のスクリプトを作成します。(他のすべてのユーザーによる書き込み不可ステータスも伴います。)
myscript-nonroot 関数は誰でも読み取り可能なので、読み取りと実行が可能であり、実際にスクリプトを実行する行 ( bash myscript
) に到達すると、スクリプトは root として実行されます (または任意のユーザーとして実行できます。ラッパー ファイルが同じユーザーに所有されている限り、正確なユーザーは関係ありません)。