Debian で www-data ユーザーを使用して sudo でスクリプトを実行することはできません。

Debian で www-data ユーザーを使用して sudo でスクリプトを実行することはできません。

Raspberry Pi(最新リリースCLI)に依存ポータルを設定しており、私のWebアプリケーションはログインしている人に応じてNFTablesルールを変更します。私はLaravel 8をPHPフレームワークとして使用してLEMPスタックを設定しました。

Nginx/php ユーザーは でありwww-data、このユーザーは sudoers ファイルを設定しました。www-data ALL=(ALL) NOPASSWD:/var/www/vportal.getvs.net/app/Python/vportal.py

ls -alPythonスクリプトは次のとおりです。-rwxr-xr-x 1 pi www-data 765 Dec 21 11:19 vportal.py

Laravelコントローラコードから:

        $process = new Process(['python3','/var/www/vportal.getvs.net/app/Python/vportal.py']);
        $process->run(); // executes after the command finishes

        if (!$process->isSuccessful()) {
            throw new ProcessFailedException($process);
         }
         echo $process->getOutput();

Pythonスクリプト:

import subprocess
#import os
#import pwd
#print(pwd.getpwuid(os.getuid()).pw_name)
subprocess.run("sudo nft add table nat", shell=True)
subprocess.run("sudo nft 'add chain nat postrouting { type nat hook postrouting priority 100; }'", shell=True)
subprocess.run("sudo nft add rule ip nat postrouting oifname \"wlan0\" masquerade", shell=True)
subprocess.run("sudo nft add table ip filter", shell=True)
subprocess.run("sudo nft 'add chain ip filter forward { type filter hook forward priority 0; policy accept; }'", shell=True)
subprocess.run("sudo nft add rule ip filter forward iifname \"wlan0\" oifname \"wlx000e3b337325\" ct state related,established  accept", shell=True)
subprocess.run("sudo nft add rule ip filter forward iifname \"wlx000e3b337325\" oifname \"wlan0\" accept", shell=True)

アイデアは、Laravel 8のパスが特定のパスでSymfonyコマンドを処理するコントローラを介してPythonスクリプトを起動することです。 sudoを必要としないコマンドは問題なく実行できますが、私のスクリプトはsudoとは何の関係もありません。www-datasudo権限を使用して特定のスクリプトを「安全に」実行する方法はありますか?

注:これはローカルネットワークでのみ使用され、インターネットに接続されません。リスクが少ないというわけではありませんが、少なくともその事実は知っていると思いました。

答え1

.sudoの下にあるsudoersファイルを使用して、特定のユーザーにsudoを使用して特定のコマンドを実行する権限を付与できます/etc/sudoers.d/

使用できる形式は次のとおりです。

user host=(who to run as) [Options] Command

注:すべての編集はvisudoで行う必要があります。

したがって、すべてをrootとして実行できるようにwww-data権限を付与するには、次の内容を含むnftファイルを生成できます。/etc/sudoers.d/www-data

www-data ALL = (root) nft

これはスクリプトにあるので、パスワードを求めるメッセージを表示したくありません。

この場合、NOPASSWD:オプションを追加する必要があります。

www-data ALL = (root) NOPASSWD: nft

権限のみを希望する場合は、nft add次のことができます。

www-data ALL = (root) NOPASSWD: nft add*

www-data ユーザーが root で複数のコマンドを実行できるようにするには、コマンドをコンマで区切ります。

www-data ALL = (root) NOPASSWD: nft, ls, cat

これにより、www-dataはパスワードなしでnft、ls、またはcatをsudoできます。

注:sudoersファイルを編集するときは注意してください。構文が正しくないと、ユーザーが実行したsudoコマンドでエラーが発生します。

これを使用してvisudo -c sudofileファイルを確認できます。だから私が使用したサンプルファイルの場合visudo -c /etc/sudoers.d/www-data。コマンドが出力されると、www-data: parsed OK構文は正しいです。

答え2

あなたは一つ持っています。主な安全欠陥ファイルでは、sudoersWebユーザーはroot権限でシステムのどこからでもPythonファイルを実行できます。ファイルにbashネットワークソケットに接続するための呼び出しが含まれていることを検討してください。

www-data ALL=(ALL) NOPASSWD:/var/www/vportal.getvs.net/app/Python/vportal.py, /usr/bin/python3

/usr/bin/python3できるだけ早く削除してください。

これで完了したので、要件が失敗した理由を見てみましょう。vportal.pyで特定のスクリプトを実行することを許可しましたが、;としてsudo呼び出されませんでしたsudo。代わりに、スクリプト自体には、www-dataがrootとして実行されることを(正しく)許可しない複数の行がsudo nft […]ありますnft

スクリプト内からコマンドを削除し、.Aをsudo使用し、sudoそのアカウントがスクリプト自体または親ディレクトリに書き込めないことを確認しますwww-user

関連情報