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構文は正しいです。

おすすめ記事