私の問題の簡単な紹介:このコマンドはps
システムプロセスに関する情報を印刷します。
ところで、ログインしてみます。根x
そして権限の変更ps
chmod -x /bin/ps
chmod u+x /bin/ps
ls -l /bin/ps
-rwxr--r-- 1 root root ...... ps
次に、新しいシェルスクリプトファイルを作成します。call_ps_via_root.sh
#!/bin/bash
ps
そしてx
権限の設定
chmod +x /bin/call_ps_via_root.sh
ls -l /bin/call_ps_via_root.sh
-rwxr-xr-x 1 root root ...... call_ps_via_root.sh
その後、一般ユーザーとしてログインしました。男の名前、その後、入力するとps
印刷されます。
Permission denied
私は入る/bin/call_ps_via_root.sh
まだ拒否されました。どのように機能させることができますかcall_ps_via_root.sh
?
答え1
あなたはできません:/bin/ps
rootとしてのみ実行可能にすると、rootでのみ実行できます。権限検証をバイパスするためにスクリプトをラップすることはできません。
ユーザーIDの設定
一般ユーザーにrootとして呼び出すには、ps
set-uid権限を確認する必要があります。 ~からsetuid 記事ウィキペディアから:
setuidとsetgid(それぞれ「実行時のユーザーID設定」および「実行時のグループID設定」の略)1ユーザーが実行可能ファイルの所有者またはグループの権限で実行可能ファイルを実行できるようにするUnixアクセス権フラグ。これは、コンピュータシステムのユーザーが一時的に昇格した権限でプログラムを実行して特定のタスクを実行できるようにするためによく使用されます。指定された仮定されたユーザーIDまたはグループID権限が常に昇格されるわけではありませんが、少なくとも具体的です。
chmod のマニュアルページも参照してください。
Sudo
一般ユーザーに root でのみ実行可能ファイルを実行させるにはsudo
。これにより、どのユーザーがどのタスクを実行できるかを構成できます。
答え2
-rwxr--r-- 1 root root ...... ps
これは、それを所有するユーザーに読み取り、書き込み、および実行権限があり、他のすべてのユーザーには読み取り権限しかないことを意味します。だからルート以外は誰もそれを実行できませんps
。
あなたが書いたスクリプトは誰でも実行できますが、それを呼び出す人の権限を継承しているので、スクリプトを実行しようとするとps
まだ一般ユーザーであるため、「許可を拒否」というメッセージが表示されます。
私の考えでは、通常のユーザーが特定のオプションを使用して実行するのを防ぎたいのですがps
(私にはわかりません)、スクリプトに少し以上を追加する必要がありますsetuid
(詳細についてはマニュアルページを参照)。これにより、スクリプト呼び出し元から権限を取得するのではなく、スクリプトを所有している人から権限を取得できます。setgid
chmod
しかし注意してください。:suid
スクリプトにビットを設定することは本質的に安全ではありません。シェルにコマンドを実行するように指示するなど、環境変数を使用して多くの操作を実行でき、その後rootとして実行されます(ここでは固定ビットを持つカスタムCプログラムがより良いソリューションです)。
編集する:別の解決策は、sudo
edプログラムが許可するパラメータをここで設定することですsudo
。
編集2:ユーザーを無効にするのはなぜ良くないと思いますかps
?私が知っている限り、すべての情報ps
出力はシステムを介しても可能です/proc
。したがって、他の措置を講じない場合は、難読化によってセキュリティ(または達成しようとしているすべてのもの)を達成するだけです。
答え3
一般的に言えば、「sudo」を使用することをお勧めします。 sudoがインストールおよび構成されていない場合
su - someuser -c "/yourscript.sh"
答え4
のフル機能へのアクセスをsudo
提供せずに、ルートツールを介してのみ利用可能な情報へのアクセス権をユーザーに付与したい場合があります。smartctl -A
smartctl
プログラムを例に挙げましょうhddtemp
。ドライブのSMARTデータから特定のハードドライブの温度を読み取り、それを標準出力に印刷します。これを行うには通常root権限が必要ですが、プログラムはrootとして実行され、rootではなくクライアント要求をバックグラウンドで待機し、ソケットに接続したときに出力を渡すデーモンモードも提供します。このようにして、ps
クライアントが必要なときに実行され、出力をリダイレクトするデーモン(rootとして起動)を実装できます。
次のPythonの例を検討してください(rootとして実行する必要があるかもしれません)。
import socket, subprocess
HOST = '127.0.0.1'
PORT = 50006
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((HOST,PORT))
s.listen(1)
while True:
conn,addr = s.accept()
pipe = subprocess.Popen(["/bin/ps"],stdout=subprocess.PIPE).stdout
for line in pipe:
conn.send(line)
conn.close()
netcat localhost 50006
その後、1つを入力するとcall_ps_via_root.sh
完了します。