next up previous contents
Next: 安全機制 Up: CHROOT Previous: php 執行 shell 指令   Contents

apache sudo chroot

  1. 讓 apache 可以 sudo 執行 chroot
    [root@dywang tmp]# visudo 
    [root@dywang tmp]# grep apache /etc/sudoers
    apache ALL=(ALL) NOPASSWD:/usr/sbin/chroot
    
  2. 「程式練習測驗系統」使用 php 執行 sudo chroot 來執行並比對學生答案。實際運作時發生很多 sudo 執行完但 process 卻沒關閉,甚至變成 zombie 疆屍程序。檢查 log 檔中也發現主機名稱無法解析的錯誤訊息,可能 chroot 後 dns 不存在,因此我在 /etc/hosts 上加入主機與 ip 的對應,真的解決問題,不過問題的真正原因,還有待確認。
    [root@dywang tmp]# cat /etc/hosts
    127.0.0.1   dywang localhost localhost.localdomain dywang.csie.cyut.edu.tw
    ::1         localhost localhost.localdomain
    163.17.10.68 dywang.csie.cyut.edu.tw  #%* 加入主機名稱與 ip 對應*)
    
  3. 無窮迴圈的程式。
    [root@dywang tmp]# cat yes.php 
    <?php
    system('yes');
    ?>
    
  4. 限制每次執行 shell 指令的時間,可以有效避免無窮迴圈的程式。
    [root@dywang tmp]# cat yest.php 
    <?php
    system('timeout 1s yes');
    ?>
    [root@dywang tmp]# cat yest.php 
    [root@dywang tmp]# php yest.php 
    y
    y
    y
    y
    y
    
  5. 限制輸出前 10 行 10 個字
    [root@dywang tmp]# vim exehead.php 
    [root@dywang tmp]# cat exehead.php 
    <?php
    exec('timeout 1s yes | head -c 10', $results);
    print_r($results);
    ?>
    [root@dywang tmp]# php exehead.php 
    yes: standard output: Broken pipe
    yes: write error
    Array
    (
        [0] => y
        [1] => y
        [2] => y
        [3] => y
        [4] => y
    )
    



2017-10-27