web-dev-qa-db-ja.com

ファイル許可実行のみ

他のユーザーだけが実行可能で、読み取り/書き込みはできないようにファイルを設定するにはどうすればよいですか。この理由は、ユーザー名で何かを実行しているのですが、パスワードを教えたくないためです。私は試した :

chmod 777 testfile
chmod a=x
chmod ugo+x

別のユーザーとして実行すると、引き続き権限が拒否されます。

12
c0mrade

スクリプトを実行するには、スクリプトの読み取り権限と実行権限の両方が必要です。スクリプトの内容を読み取ることができない場合、スクリプトを実行することもできません。

tony@matrix:~$ ./hello.world
hello world
tony@matrix:~$ ls -l hello.world
-rwxr-xr-x 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ chmod 100 hello.world
tony@matrix:~$ ls -l hello.world
---x------ 1 tony tony 17 Jul 13 22:22 hello.world
tony@matrix:~$ ./hello.world
bash: ./hello.world: Permission denied
10
EightBitTony

前のステートメントには半分真実があります。ユーザーが読み取れないようにスクリプトを設定できますが、実行可能です。プロセスは少し引き出されていますが、/ etc/sudoerで例外を作成することで実行でき、ユーザーはパスワードの入力を求められることなく、自分でスクリプトを一時的に実行できます。以下の例:

ユーザーと共有したいスクリプト:

me@OB1:~/Desktop/script/$ chmod 700 somescript.pl
me@OB1:~/Desktop/script/$ ls -l somescript.pl
-rwx------ 1 me me 4519 May 16 10:25 somescript.pl

「somescript.pl」を呼び出すシェルスクリプトを作成し、/ bin /に保存します。

me@OB1:/bin$ Sudo cat somescript.sh
[Sudo] password for me: 
#!/bin/bash
Sudo -u me /home/me/Desktop/script/somescript.pl $@

オプションステップ/bin /にあるsomescript.shへのシンボリックリンクを作成します。

Sudo ln -s /bin/somescript.sh /bin/somescript

シェルスクリプトがユーザーに対して読み取り可能/実行可能であることを確認します(書き込みアクセス権なし)。

Sudo chmod 755 /bin/somescript.sh
me@OB1:/bin$ ls -l somescript*
lrwxrwxrwx 1 root root  14 May 28 16:11 somescript -> /bin/somescript.sh
-rwxr-xr-x 1 root root 184 May 28 18:45 somescript.sh

次の行を追加して、/ etc/sudoerで例外を作成します。

# User alias specification
User_Alias  SCRIPTUSER = me, someusername, anotheruser

# Run script as the user 'me' without asking for password
SCRIPTUSER ALL = (me) NOPASSWD: /home/me/Desktop/script/somescript.pl

プディングの証明:

someuser@OB1:~$ somescript
***You can run me, but can't see my private parts!***

someuser@OB1:~$ cat /home/me/Desktop/script/somescript.pl
cat: /home/me/Desktop/script/somescript.pl: Permission denied

この方法は、特定のユーザーがリバースエンジニアリングできるFilter::CryptoまたはPAR::Filter::CryptoまたはAcme::Bleachで難読化しようとするよりも優れています。スクリプトをバイナリにコンパイルする場合も同様です。この方法に問題がある場合はお知らせください。より高度なユーザーの場合は、User_Aliasセクションを完全に削除し、SCRIPTUSERを '%groupname'に置き換えます。このように、usermodコマンドを使用してスクリプトユーザーを管理できます。

13
santana

他のユーザーにプログラムの実行を許可すると、プログラムファイルが読み取り可能かどうかに関係なく、他のユーザーはプログラムが実行しているすべてのことを知ることができます。彼らがする必要があるのは、デバッガー(または strace などのデバッガーのようなプログラム)をポイントすることだけです。バイナリ実行可能ファイルは、実行可能で読み取り不可能であれば実行できます(インタープリターがスクリプトを読み取る必要があるため、スクリプトは実行できません)。ただし、これによってセキュリティが確保されるわけではありません。

他の人がプログラムを実行していることを正確に知らせずに、プログラムをブラックボックスとして実行できるようにしたい場合は、スクリプトに昇格した特権を与える必要があります: setuid をユーザーに送信します。 rootだけが デバッグツール をsetuidプログラムで使用できます。安全なsetuidプログラムを書くのは簡単ではなく、ほとんどの言語は適切ではないことに注意してください。詳細については、 シェルスクリプトでsetuidを許可する を参照してください。 setuidプログラムを作成する場合は、安全なsetuidスクリプトを可能にすることを明示的に意図したモード(汚染モード)を備えたPerlを強くお勧めします。