
Raspberry Pi(최신 릴리스 CLI)에 종속 포털을 설정 중이며 내 웹 애플리케이션은 로그인하는 사람에 따라 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
파이썬 스크립트는 다음과 같습니다:-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();
파이썬 스크립트:
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에서 수행해야 합니다.
따라서 모든 것을 루트로 실행할 수 있도록 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 사용자가 루트로 여러 명령을 실행할 수 있도록 하려면 명령을 쉼표로 구분하면 됩니다.
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
웹 사용자는 루트 권한으로 시스템의 어느 곳에서나 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가 루트로 실행되는 것을 (올바르게) 허용하지 않는 여러 줄이 sudo nft […]
있습니다 nft
.
스크립트 내부에서 명령을 제거하고 .A를 sudo
사용하고 sudo
해당 계정이 스크립트 자체 또는 상위 디렉토리에 쓸 수 없는지 확인합니다 www-user
.