MacOSXのchrootされたPHP環境で実行しているときにCurlが必要とするファイルまたはソケットを見つけるにはどうすればよいですか?
最近、chrooting PHPでウェブサイトを保護しましたが、APIを介したAmazon S3へのすべての呼び出しが失敗し、エラーメッセージが表示されます。
_Resource id #43; cURL error: Couldn't resolve Host 's3.amazonaws.com'
_
Chrootされていないコマンドラインから呼び出された場合も同じコードが正常に機能するため、CURLで開く必要のあるファイルのセットが開かれていません。
Chrootされたdirectoyにマップできるように、開こうとしているファイルを特定するにはどうすればよいですか?
Andreiの提案により、デバッグ出力を取得するためにstraceを使用しました(または、Macに相当するものを破棄しました)。
これはchrootされたリクエストであり、機能しません。
_lstat64("/lib/amazonWS/lib\0", 0x7FFF5FBF97D0, 0x26) = 0 0
lstat64("/lib/amazonWS\0", 0x7FFF5FBF9630, 0x182) = 0 0
open("/lib/amazonWS/lib/requestcore/requestcore.class.php\0", 0x0, 0x1B6) = 5 0
fstat64(0x5, 0x100A9F448, 0x8) = 0 0
fstat64(0x5, 0x100A9F448, 0x90) = 0 0
fstat64(0x5, 0x100A9F448, 0x1001B1FE4) = 0 0
mmap(0x0, 0x72D1, 0x1, 0x1, 0x5, 0xFFFFFF8016E89160) = 0x3BF0000 0
stat64("/lib/amazonWS/lib/requestcore/requestcore.class.php\0", 0x10621CD68, 0x10621C847) = 0 0
munmap(0x103BF0000, 0x72D1) = 0 0
close(0x5) = 0 0
setitimer(0x2, 0x7FFF5FBFBCE0, 0x0) = 0 0
kqueue(0x7FFF5FBFB000, 0x0, 0x50) = 5 0
kevent(0x5, 0x7FFF5FBFB000, 0x1) = 0 0
socket(0x1, 0x1, 0x0) = 6 0
setsockopt(0x6, 0xFFFF, 0x1022) = 0 0
connect_nocancel(0x6, 0x7FFF5FBFADD0, 0x6A) = -1 Err#2
close_nocancel(0x6) = 0 0
close_nocancel(0x5) = 0 0
kqueue(0x7FFF5FBFB000, 0x0, 0x50) = 5 0
kevent(0x5, 0x7FFF5FBFB000, 0x1) = 0 0
socket(0x1, 0x1, 0x0) = 6 0
setsockopt(0x6, 0xFFFF, 0x1022) = 0 0
connect_nocancel(0x6, 0x7FFF5FBFADD0, 0x6A) = -1 Err#2
close_nocancel(0x6) = 0 0
close_nocancel(0x5) = 0 0
open_nocancel(".\0", 0x0, 0x0) = 5 0
fstat64(0x5, 0x7FFF5FBFBA80, 0x0) = 0 0
fcntl_nocancel(0x5, 0x32, 0x7FFF5FBFBCB0) = 0 0
close_nocancel(0x5) = 0 0
stat64("/basereality\0", 0x7FFF5FBFB9F0, 0x0) = 0 0
lstat64("/basereality/../BaseReality/html/50x.html\0", 0x7FFF5FBFB730, 0x23D) = 0 0
_
これはnotchrootされて機能するリクエストです:
_ 1806/0x1dd3: 149524 5 3 open("/documents/projects/intahwebz/intahwebz/lib/amazonWS/lib/requestcore/requestcore.class.php\0", 0x0, 0x1B6) = 5 0
1806/0x1dd3: 149525 3 0 fstat64(0x5, 0x100A9F578, 0x8) = 0 0
1806/0x1dd3: 149527 2 0 fstat64(0x5, 0x100A9F578, 0x90) = 0 0
1806/0x1dd3: 149528 2 0 fstat64(0x5, 0x100A9F578, 0x1001B1FE4) = 0 0
1806/0x1dd3: 149531 5 2 mmap(0x0, 0x72D1, 0x1, 0x1, 0x5, 0x1F) = 0x3BF0000 0
1806/0x1dd3: 149535 4 2 stat64("/documents/projects/intahwebz/intahwebz/lib/amazonWS/lib/requestcore/requestcore.class.php\0", 0x1061966D0, 0x106196057) = 0 0
1806/0x1dd3: 149565 6 3 munmap(0x103BF0000, 0x72D1) = 0 0
1806/0x1dd3: 149568 4 2 close(0x5) = 0 0
1806/0x1dd3: 149661 4 1 setitimer(0x2, 0x7FFF5FBFBCE0, 0x0) = 0 0
1806/0x1dd3: 149767 90 2 kqueue(0x7FFF5FBFB000, 0x0, 0x50) = 5 0
1806/0x1dd3: 149770 4 1 kevent(0x5, 0x7FFF5FBFB000, 0x1) = 0 0
1806/0x1dd3: 149782 12 8 socketpair(0x1, 0x1, 0x0) = 0 0
1806/0x1dd3: 149792 12 9 sendto_nocancel(0x6, 0x105D8FCF0, 0x3A) = 58 0
1806/0x1dd3: 149796 7 3 sendmsg_nocancel(0x6, 0x7FFF5FBFAD30, 0x0) = 1 0
1806/0x1dd3: 149797 4 0 close_nocancel(0x9) = 0 0
1806/0x1dd3: 149802 45 4 recvfrom_nocancel(0x7, 0x7FFF5FBFAD7C, 0x4) = 4 0
1806/0x1dd3: 149806 5 2 close_nocancel(0x7) = 0 0
1806/0x1dd3: 149814 6 3 socketpair(0x1, 0x1, 0x0) = 0 0
1806/0x1dd3: 149816 4 1 sendto_nocancel(0x6, 0x105D8FCF0, 0x3A) = 58 0
1806/0x1dd3: 149818 5 2 sendmsg_nocancel(0x6, 0x7FFF5FBFAD30, 0x0) = 1 0
1806/0x1dd3: 149819 3 0 close_nocancel(0x9) = 0 0
1806/0x1dd3: 149822 215 2 recvfrom_nocancel(0x7, 0x7FFF5FBFAD7C, 0x4) = 4 0
1806/0x1dd3: 149840 20 17 close_nocancel(0x7) = 0 0
1806/0x1dd3: 149843 4 1 kevent(0x5, 0x7FFF5FBFB000, 0x1) = 0 0
1806/0x1dd3: 149844 3 1 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149846 2 0 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149848 5 2 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149851 5 1 recvfrom_nocancel(0x6, 0x105D8FCF0, 0x40) = 64 0
1806/0x1dd3: 149856 8 3 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 1 0
1806/0x1dd3: 149861 3 1 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 149863 4 1 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149864 3 1 recvfrom_nocancel(0x6, 0x105D85990, 0x42) = 66 0
1806/0x1dd3: 149867 4 1 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 0 0
1806/0x1dd3: 149869 2 0 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 149871 3 1 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149872 2 0 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149873 2 0 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149874 2 0 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149876 4 1 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149877 4 0 recvfrom_nocancel(0x6, 0x105D859E0, 0x40) = 64 0
1806/0x1dd3: 149879 3 1 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 1 0
1806/0x1dd3: 149881 2 0 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 149883 3 0 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149884 3 0 recvfrom_nocancel(0x6, 0x105D85A20, 0x42) = 66 0
1806/0x1dd3: 149886 3 1 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 0 0
1806/0x1dd3: 149888 2 0 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 149889 2 0 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149890 2 0 kevent(0x5, 0x0, 0x0) = 0 0
1806/0x1dd3: 149900 389953 9 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149904 60 1 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149909 7 3 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149913 7 2 recvfrom_nocancel(0x6, 0x105D8FD10, 0x2E) = 46 0
1806/0x1dd3: 149921 9 4 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 0 0
1806/0x1dd3: 149928 5 1 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 149932 3 1 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149932 2 0 kevent(0x5, 0x0, 0x0) = 0 0
1806/0x1dd3: 149945 439745 12 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149952 13 3 kevent(0x5, 0x0, 0x0) = 1 0
1806/0x1dd3: 149961 15 6 recvfrom_nocancel(0x6, 0x7FFF5FBFAE30, 0x1C) = 28 0
1806/0x1dd3: 149969 11 4 recvfrom_nocancel(0x6, 0x105D8FD10, 0x2A) = 42 0
1806/0x1dd3: 149981 16 8 select_nocancel(0x7, 0x7FFF5FBFADB0, 0x0) = 0 0
1806/0x1dd3: 149987 9 3 kevent(0x5, 0x7FFF5FBFA860, 0x1) = 0 0
1806/0x1dd3: 150002 19 9 sendto_nocancel(0x6, 0x105D8FCF0, 0x1C) = 28 0
1806/0x1dd3: 150011 12 5 sendto_nocancel(0x6, 0x105D8FCF0, 0x1C) = 28 0
1806/0x1dd3: 150025 22 10 close_nocancel(0x5) = 0 0
1806/0x1dd3: 150095 26 18 socket(0x2, 0x1, 0x6) = 5 0
1806/0x1dd3: 150109 12 4 setsockopt(0x5, 0xFFFF, 0x1022) = 0 0
1806/0x1dd3: 150113 9 2 fcntl(0x5, 0x3, 0x0) = 2 0
1806/0x1dd3: 150117 7 2 fcntl(0x5, 0x4, 0x6) = 0 0
1806/0x1dd3: 150191 81 73 connect(0x5, 0x7FFF5FBFB9F0, 0x10) = -1 Err#36
1806/0x1dd3: 150217 689426 21 select(0x6, 0x7FFF5FBFB730, 0x7FFF5FBFB6B0, 0x7FFF5FBFB630, 0x7FFF5FBFB7D0) = 1 0
1806/0x1dd3: 150226 72 2 getsockopt(0x5, 0xFFFF, 0x1007) = 0 0
1806/0x1dd3: 150230 6 2 getpeername(0x5, 0x7FFF5FBFB780, 0x7FFF5FBFB6FC) = 0 0
1806/0x1dd3: 150232 4 1 getsockname(0x5, 0x7FFF5FBFB700, 0x7FFF5FBFB6FC) = 0 0
1806/0x1dd3: 150332 23 17 open_nocancel("/opt/local/share/curl/curl-ca-bundle.crt\0", 0x0, 0x1B6) = 7 0
1806/0x1dd3: 150339 6 2 fstat64(0x7, 0x7FFF5FBFB440, 0x7FFF5FBFB50C) = 0 0
1806/0x1dd3: 150350 14 9 read_nocancel(0x7, "##\n## lib/ca-bundle.crt -- Bundle of CA Root Certificates\n##\n## Certificate data from Mozilla as of: Thu Nov 22 00:12:21 2012\n##\n## This is a bundle of X.509 certificates of public Certificate Authorities\n## (CA). These were automatically extracted from Mo", 0x1000) = 4096 0
_
したがって、プロセスで失敗しているのは直接のファイルアクセスではなく、ソケット送信のようです。 chrootされた環境に/ dev/urandomおよびその他の非ファイルパスを設定するためのいくつかの指示に従っていますが、ここでも、ソケットsocketpair(0x1, 0x1, 0x0)
が何であるかを知る方法はありますか?闇?
アップデート2
Chroot内でDNSルックアップを実行することはOSXの既知の問題です: https://lists.macosforge.org/pipermail/macports-dev/2011-April/014565.html
どうやら私は/ path/to/chroot/var/run/mDNSResponderでmDNSResponderサービスを実行する必要があります
したがって、明らかにOSXでは、gethostbyname
へのすべてのシステムコールは、/ var/run/mDNSResponderでソケットとして実行されているmDNSResponderサービスを介して送信されます。これは、DNS要求が次のようなファイルを介して送信されるLinuxプラットフォームとは異なります。 resolv.conf。
mDNSResponderはchrootされた環境では使用できないため、すべてのDNSルックアップが失敗します。
理論的には、/ chroot/var/run/mDNSResponderのソケットでリッスンしている重複したmDNSResponderサービスを作成することが可能です。しかし、実際にこれを行った人はいないようです。
はるかに簡単なのは、プロキシサービスを設定することです。 Squidman localhostで実行し、それを介してすべてのHTTPリクエストを作成します。
また、chroot内にmknod
を使用して独自のdev/randomおよびdev/urandomを作成すると、ランダム性が不足するため機能しないようであり、プロキシ要求は失敗します。代わりに、それらをSudo ln -s /dev/urandom /chroot/dev/urandom
とリンクする必要があります
おそらくDNSの問題があります。chroot環境で正しいresolv.confがあるかどうかを確認してください。