php 세션 - www-data가 아닌 다른 사용자가 실행하는 서버 스크립트를 트리거할 수 있습니까?

php 세션 - www-data가 아닌 다른 사용자가 실행하는 서버 스크립트를 트리거할 수 있습니까?

저는 램프 우분투 클라우드 서버(Amazon EC2)에서 php+mysql 사이트를 실행하고 있습니다. 나는 PHP 세션을 사용합니다. Apache PHP 사용자는 www-data라고 합니다.

모든 세션(SID)에 대해 www의 하위 디렉터리이고 이름이 세션 ID인 임시 폴더를 만들어야 합니다(예측할 수 없으므로 미리 만들 수 없음). 예: /var/www/fileStore/s35S10nT3Mp/.

나중에 자바스크립트(클라이언트 측) 기능을 통해 이 폴더의 파일에 액세스하게 됩니다.

나는 다음과 같은 가정 하에 작업하고 있습니다.

  1. PHP 코드에 의해 실행(또는 호출)되는 모든 것은 www-data 사용자로 실행됩니다.
  2. 클라이언트측 javascript는 OUTSIDE www 하위 디렉터리에 액세스할 수 없습니다(예: /var/outsideFileStore/s35S10nT3Mp/, 여기서 webroot = public_html = /var/www).

나는 위의 사항 중 하나 또는 둘 다에 대해 틀리고 싶습니다. 왜냐하면 그렇게 하면 더 이상 고민할 필요 없이 내 문제가 해결될 것이기 때문입니다. 내 가정 중 하나라도 틀리지 않은 경우를 대비해:

www의 하위 디렉토리에 있는 사용자 www-data 쓰기 권한(php에서 새 폴더를 mkdir로 설정하는 데 필요함)을 부여하는 데 보안 문제가 있습니다. 그렇게 하면 이 폴더의 서버와 데이터가 너무 노출되기 때문입니다.

PHP 세션이 www-data가 아닌 다른 사용자(/var/www/fileStore/에서 쓰기 권한을 받는) 아래에서 실행되는 서버 스크립트/프로세스를 트리거(또는 호출)할 수 있는지 알고 싶습니다. 그런 다음 이 프로세스는 이러한 임시 폴더를 생성(및 가비지 수집)합니다.

결과: 아파치에서 이 작업을 수행할 수 없는 경우 Tomcat이 도움이 될까요(http_server가 아닌 Java에서 PHP를 실행한 경우)?

결과 2: 소켓 연결(PHP 내부에서)을 소켓 서버(C++에 있음)로 실행하고 소켓 서버(당연히 다른 사용자)가 파일 생성을 수행하도록 하면 어떻게 될까요? 이건 과잉인가?

답변1

당신이 사용할 수있는setuid()다른 사용자로서 스크립트 및 기타 작업을 실행하는 기능.

아래 래퍼 스크립트를 사용하여 www-dataApache 웹 서버의 특정 목적이 아닌 다른 사용자로 다른 스크립트를 실행합니다.

suid_wrapper.c:

#include <stdlib.h>

/*
 * C wrapper to run script as other user from Apache.
 *
 * Instructions:
 *   Run as root:
 *     gcc suid_wrapper.c -o make_stats.cgi
 *     chmod a+s make_stats.cgi
 */

// User ID and Group ID for wanted user.
int uid = 503;
int gid = 506;
// Path to script to be executed as above user.
const char* scriptpath = "/home/user/public/stats/make_stats.sh";

int main()
{
    // setgid() must be before setuid(); otherwise one has forsaken the privilege to change group.
    setgid(gid);
    setuid(uid);
    system(scriptpath);
    return 0;
}

Apache에서 호출하기만 make_stats.cgi하면 위 파일에 제공된 스크립트가 위 파일에 지정된 사용자로 실행되어야 합니다.

관련 정보