2009-11-06 2 views
5

Linux에서 실행되는 C로 작은 사용자 정의 웹 서버 응용 프로그램을 작성했습니다. 응용 프로그램이 요청을 받으면 fork()를 호출하고 별도의 프로세스에서 요청을 처리합니다.이 프로세스는 사용 가능하게하려는 파일이 들어있는 특정 디렉토리로 chroot됩니다.Windows 서버 응용 프로그램의 fork/chroot 해당

응용 프로그램을 Windows로 포팅하려고하지만이 플랫폼에서는 fork() 및 chroot()도 사용할 수 없으며 직접적인 동등한 프로그램이없는 것 같습니다. Windows에서이 기능을 제공하는 코드의 간단한 (그리고 잘 작성된) 예제를 가르쳐 주시겠습니까? 내 C는 그다지 좋은 것이 아니므로 더 간단할수록 좋습니다.

+0

지금까지 fork()에 대한 간단한 대안이 없다는 답변이 나왔습니다. 쓰래드가 새로운 프로세스를 포크하는 것이 아니라 코드 예제를 좋아할 것입니다. 이 문제의 fork() 및 chroot() 부분을 처리해야하는 Windows (예 : Apache)에서 실행되는 많은 웹 서버가 있으며 일반적으로 취해진 접근법과 관련 부분에 대한 링크를 간단히 받아들입니다 아파치 (또는 다른) 소스의. – codebox

+0

귀하의 의견을 감안할 때 Cygwin 샘플 소스를 기반으로하지 말고 대신 Apache Portable Runtime 라이브러리를 사용하여 세부 정보를 처리하는 것이 좋습니다. –

+0

나도 네가 어떤 도서관에 가야한다고 생각해. 참조 : http://www.gnu.org/software/libmicrohttpd/ - Windows와 Unix를 모두 지원하는 HTTP 서버 라이브러리. 프로그램에 웹 서버 기능을 내장하는 데 사용됩니다. http://abyss.sourceforge.net/ - win/unix 용 웹 서버 또한 스레드와 프로세스를 잊어 버리고 논 블로킹 IO를 사용할 수 있습니다. 이 방법을 사용하면 하나의 프로세스 만 필요하고 목록이나 배열의 연결을 추적 할 수 있습니다. 예를 들면 다음과 같습니다. http://www.cubicsky.com/files/shinyhttpd-0.1.3-src.tar.gz –

답변

9

우선 Windows의 chrootRUNAS이고 이는 documented here입니다. 프로그램에서이 작업을 수행해야하는 경우 this C++ source code을 공부하면 Windows API 사용 방법을 이해하는 데 도움이됩니다. 그것은 정확히 chroot()과 같지 않지만 Windows 사람들은 매우 제한된 권한을 가진 사용자를 생성하고 해당 사용자에게 응용 프로그램 폴더에 대한 읽기 권한을 부여하고 데이터에 대해 하나의 폴더에 대한 쓰기 권한을 부여하여 chroot jail과 같은 것을 생성합니다.

Windows에서 fork()을 정확하게 에뮬레이트하고 싶지는 않을 것입니다. 왜냐하면 그렇게해야 할 것처럼 들리지 않기 때문입니다. 프로세스 생성을위한 Windows API와이 프로세스가 fork()과 다른 점을 이해하려면 Mr. Peabody Explains fork()을 확인하십시오. Cygwin's fork implementation의 실제 현재 소스 코드는 현재의 상태를 보여줍니다.

CreateProcess()CreateThread()에 대한 Microsoft 설명서는 그 차이점에 대한 추가 정보를 찾는 곳입니다.

마지막으로, 모든 핵심적인 플랫폼 세부 정보를 배우고 싶지 않으면 Windows 및 Unix에서 작동하는 휴대용 프로그램을 작성하십시오. Apache Portable Runtime library을 사용하지 않는 것이 어떻습니까? Here are some docs on process creation with some sample code, C에서 새 프로세스를 만듭니다.

+1

chroot()가 아니며 chroot는 사용자의 루트 디렉토리를 변경합니다. – Hasturkun

+4

chroot()가 없기 때문에 chroot()가 아니지만 RUNAS.EXE는 무엇입니까? Windows 사용자는 UNIX chroot jail과 비슷한 것을 만들 수 있습니다. –

+3

RUNAS는 chroot jail과 유사하지 않습니다. –

3

Windows에 fork()과 같은 것은 없습니다. CreateProcess()에 전화해야합니다. (별다른 절차가 없으며 대부분 fork()을 호출 한 다음 생성 된 프로세스에 즉시 exec()을 호출합니다) 매개 변수를 전달합니다. 전용 디렉토리에서 처리 할 데이터가 모두있는 것처럼 보이기 때문에 lpCurrentDirectory 매개 변수를 CreateProcess()으로 만들 수 있습니다. 이전에 사용했던 디렉토리 경로를 chroot()으로 전달하면됩니다.

+1

'lpCurrentDirectory'는 chroot()가 아니라 chdir()에 해당합니다. –

+0

고마워,하지만이게 내가 원하는 건 아니야 - chroot를 사용하는 주된 이유는 보안이다. (../ ..를 사용하는 사람들이 요청 URL에서 파일 시스템의 다른 곳에있는 파일에 접근하는 것을 막는다.) 현재 디렉토리를 설정하지 않는다. 이것을 제공하십시오. 또한 fork 된 프로세스에서 필요로하는 메모리에 많은 값을 가지고 있습니다. afaik를 통해 exec를 통해 전달하는 유일한 방법은 명령 줄 인수가 될 것이고 나는 거기에 가고 싶지 않습니다 ... – codebox

+2

글쎄, 다시 Windows에서 프로세스를 복제하는 fork()와 같은 것은 없습니다. 어쨌든 어떤 형식의 IPC를 사용해야 할 것입니다. 아마도 명령 줄이나 임시 파일을 통과하는 것이 가장 쉬운 방법 일 것입니다. chroot()에 관해서는 다음을 할 수 있습니다 : 임시 폴더를 제외하고 권한이없는 작업자 프로세스를 실행하기위한 별도의 계정을 생성하고 그 계정으로 작업자 프로세스를 실행하십시오. – sharptooth

0

포크/chroot를 사용하는 것은 단순히 Windows에서 작업하는 방식이 아닙니다. 하위 프로세스의 보안이 염려되는 경우 사용하려는 가상화 또는 샌드 박스의 형태 일 수 있습니다. 복잡한 정보를 서브 프로세스에 전달하는 것은 RPC-solution의 일부 양식으로 수행 할 수 있습니다.

당신이 유닉스 방식으로 응용 프로그램을 설계 한 것처럼 들리는데 지금은 아무 것도 변경하지 않고 Windows에서 실행하려고합니다. 이 경우 Cygwin을 사용하는 것이 좋습니다. Cygwin이 chroot을 에뮬레이션하는 경우/확실하지 않습니다.

+1

예, cygwin에 chroot가 있습니다. –

2

가장 간단한 방법은 Windows 용 무료 유닉스 에뮬레이션 레이어 인 Cygwin을 사용하는 것입니다. 그것을 다운로드하고 완벽한 개발 환경을 설치하십시오. (설치 프로그램에서 선택하십시오.) 운이 좋으면 프로그램을 그대로 컴파일 할 수 있습니다. 전혀 변경되지 않습니다.

물론 단점이 있으며 일부는이 "부정 행위"를 고려할 수도 있지만 가장 간단한 해결책을 요청했습니다.

+1

cygwin의 chroot jail이 완벽하지 않다는 것을 이해합니다. cygwin 이외의 컴파일 된 태스크가 발생할 수 있습니다. –

+0

Sanjaya, 당신은 아마 맞을 것이지만, 대부분의 목적을 위해서는 작동해야합니다. –

0

SUA (Unix 용 Windows 서비스)를 고려하십시오. 응용 프로그램을 포팅하는 데 필요한 거의 모든 것이 있습니다. 호환성 프레임 워크 (는 Interix, Cygwin에서, ...) 당신은 이런 종류의에 대한 Windows 패러다임을 사용하여보고있는를 사용하지 않고

man chroot(interix)

1

.

fork/vfork는 유닉스에서 저렴한 작업이므로 멀티 스레딩에 비해 자주 사용됩니다. Windows의 경우 CreateProcess()은 비싼 작업이기 때문에 스레드 대신에 CreateThread()을 만들어야합니다. 거기에 많은 예제 코드가 CreateThread()에 있습니다.

chroot()의 관점에서 Windows에는 이러한 개념이 없습니다. 거기에 필요한 라이브러리를 모방한다고 주장하는 라이브러리가 있습니다. 그러나 그것은 왜 chroot를 원 하느냐에 달려있다.

사람들이 ../../../../ (기타 등등)으로 트리를 올라가는 것을 단순히 멈추게하는 것이라면, chroot가 그 일을 할 것이지만, 처음에는 입력을 파싱하고 그것이 정상적인지를 확인하기위한 대체 수단이 아닙니다 : 많은 부모가 지정되면 알려진 루트 디렉토리에 사용자를 잠급니다. 아파치가 작동하도록 chroot() 환경을 만들 필요가 없었기 때문에 아파치는 거의 확실하게 이것을 수행합니다 ...