pg_dump는 PHP를 통해 실행되지 않습니다.

pg_dump는 PHP를 통해 실행되지 않습니다.

이 질문은 다른 여러 게시물에서 다루어졌지만 나에게 도움이 되지 않는 것 같습니다.

내 문제는 터미널에서 다음 스크립트를 실행하면 문 pg_dump이 작동한다는 것입니다.

$strBK = '/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --role "mizk" --no-password  --format plain --data-only --inserts --column-inserts --verbose --file "/home/khalid/tmp/esm/x1" --table "public.\"tblCustomerCategories\"" --table "public.\"tblSellers\"" "dbESM" 2>&1';
    //User has submitted form. Start making backup.
    echo "ok " . shell_exec($strBK);

하지만 PHP에서 다음과 같은 오류가 발생합니다.

 ok pg_dump: [archiver (db)] connection to database "dbESM" failed:
 fe_sendauth: no password supplied
 pg_dump: *** aborted because of error

표시된 대로 비밀번호를 묻지 않지만 스크립트는 인증에 대한 오류를 보고합니다.

www-data내 가정은 터미널 덤프가 컴퓨터 사용자로 실행되는 동안 PHP가 실행된다는 것입니다 . 그렇다면 이 문제를 안전한 방법으로 해결하려면 어떻게 해야 합니까?

답변1

다음을 실행하여 이론을 테스트할 수 있습니다( www-data명령을 실행할 수 없음).

sudo -iu www-data /usr/bin/pg_dump ...

아마도 이~이다이 문제와 보안에 미치는 영향이 다른 여러 가지 해결 방법이 있습니다.

  • setuid가 적용된 사용자가 소유한 덤프를 실행하는 스크립트를 만듭니다( chmod 4755 <filename>). 이거 운영하는 사람이 운영할 거야~처럼파일의 소유자입니다. 스크립트를 PHP에서도 편집할 수 있거나 스크립트가 어떻게든 악용될 수 있는 경우 보안에 대한 명백한 영향이 있습니다.

  • 중개인을 이용하세요. PHP에서 파일에 쓰고 cron-job(올바른 사용자로 실행)에서 읽을 수 있습니다. 파일이 있으면 덤프를 실행하고 파일을 삭제합니다. 이는 상당히 안전하지만 크론 간격만큼만 순간적입니다. 대안에는 다음과 같은 것이 포함됩니다.셀러리이는 선택적으로 다른 사용자에게 작업을 일괄 처리하거나 연기하는 데 좀 더 산업적입니다.

  • www-dataPostgres를 제치고 데이터 액세스를 허용하세요 . 비밀번호를 통해 이 작업을 수행하는 것이 좋지만 이렇게 해도 www-data사용자가 제공하는 모든 항목에 해킹된 액세스가 허용됩니다 .

명령 pg_dump에는 몇 가지 특징이 있을 수도 있습니다. SE와 관련하여 특히 도움이 될 수 있는 몇 가지 스레드가 있습니다.

관련 정보