Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

移除 wget/curl/ncftp 或限制使用
post by tommy @ 18 元月, 2007 14:02
前幾天, 發生了兩次有人透過 apache 把檔案放到我的伺服器上頭 , 不過我並沒有抓到別人是怎麼進來的, 幾個查到有問題的程式, 雖然我也有使用, 不過... 由 log 來看, 並沒有看到類似的存取記錄. 雖然目前把這些有問題的地方修正之後, 裝上 mod_security.so 之後, 目前沒有任何新的入侵記錄 (也有可能人家試了兩天就放棄不玩我的機器了), 不過為了防止程式利用 wget/curl/ncftp 由別的地方抓檔案來放. 就想了下頭的這個方法來避免.

其實... 如果可以, 你的 web server 上頭, 把 wget/curl/ncftp 甚至是 perl 都不要裝上, 應該會更安全些 (如果你沒用到的話). 不過, 一般人都是一台機器多種用途, 很難不裝上這類的程式來使用. 所以, 我的想法是, 那就先寫一個小程式, 取代這些程式, 在這個小程式上頭先檢查是目前執行的使用者, 是否允許執行這類的程式, 如果可以, 才去呼叫原本的程式來使用.

以 wget 為例. 一般 wget 都放在 /usr/bin/ 下頭, 我們可以建立一個目錄, 如 /usr/bin/wrap 之類的目錄, 然後把 wget 移到該目錄下頭, 然後寫一個 wget 的 shell script 放到 /usr/bin/ 下頭, 取代原本的 wget:

#!/bin/sh

/usr/local/bin/check_wget_user.php wget $*
if [ "$?" == "1" ]; then
echo "You are not allowed to use wget!"
exit;
fi

/usr/bin/wrap/wget $* 

然後寫一個 php 的小程式 check_wget_usr.php 放在 /usr/local/bin/ 下頭:

#!/usr/bin/php -Cq
<?php

$uid = posix_getuid();
$user = posix_getpwuid($uid);

$fp = @fopen('/etc/users/wget', 'rt');
if ($fp) {
while (!feof($fp)) {
$buf = trim(fgets($fp));
if ($buf === $user['name']) {
fclose($fp);
exit(0);
}
}
fclose($fp);
}

$fp = @fopen('/tmp/$user['name'].'-'.strftime('%Y%m%d').'.log', 'at');
if ($fp) {
fputs($fp, strftime('%T').' '.$user['name']);
for ($i = 1; $i < $argc; $i++)
fputs($fp, ' '.$argv[$i]);
fputs($fp, "\n");
fputs($fp, "\n");
fclose($fp);
}

exit(1);

?> 

這個 php 的 script, 會檢查 /etc/users/wget 這個設定檔, 如果目前執行的使用者, 存在這個設定檔中,  會傳回 0, 如果不存在, 就會傳回 1. 如果不存在時, 會寫一筆記錄到 /tmp/ 的一個記錄檔中, 我們可以檢查這個檔案, 看看是否有一些應該要使用這個程式的帳號沒被列入, 或者是有那些不該使用的帳號, 執行了這個指令要做些什麼事情.

同來的做法, 套用到不同的程式上,  就可以限制允許的帳號來執行某些程式了.

如果你的需求是在那個設定檔中的帳號才不允許執行的話,  把那個 php 改一改同樣就可以做到了.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 61 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS