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 -al
Pythonスクリプトは次のとおりです。-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-data
sudo権限を使用して特定のスクリプトを「安全に」実行する方法はありますか?
注:これはローカルネットワークでのみ使用され、インターネットに接続されません。リスクが少ないというわけではありませんが、少なくともその事実は知っていると思いました。
答え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
あなたは一つ持っています。主な安全欠陥ファイルでは、sudoers
Webユーザーは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
。