ساخت یک اینترفیس تحت وب برای کارهای سیستمی با php و python
by Ahmed on ۲۴/۰۵/۱۳۸۹مدتها پیش مقاله ای نوشته بودم در باب اجرای دستورات خط فرمان درphp تو اون اشاره کرده بودم که در php توابعی وجود داره که میشه دستورات سیستمی مثل ls,pwd,.. رو اجرا کرد .
اما امروز بر اون شدم که با راهنمایی های استادم، اقای مقدم یه رابط کاربری تحت وب برای کارهای سیستمی بسازم!
اول رفتم سراغ php که مثلا بلدمش!و از اونجایی که حسو حال ساختن فرم ورود اطلاعات رو نداشتم از سایت http://www.phpform.org استفاده کردم و یه اینترفیس برای یه دیوار اتش ساده ساختم به شکل زیر:
و بعد از اون امدم خروجی فرم بالا رو گرفتم و تبدیل کردم به دستور موردنظر با کمک آرایه های انجمنی:
$query=”iptables “;
foreach($_POST as $name=>$value){
if($name!=”form_id” && $name!=”submit”)
if($value!=”")
$query.=”-”.$name.” “.$value.” “;
}
file_put_contents(“query”, $query);
?>
اما چرا تو این کد من به جای ریختن دستور ساخته شده درون یک فایل از همون توابع exec یا system استفاده نکردم؟ خوب بخاطر اینکه در این توابع، برد دستوراتی که میتونن اجرا کنن مساوی با برد کاربری که php و apache رو اجرا میکنه و ایشونم جناب nobody هست که کمترین مجوز ها رو داره و نمیتونه دستور iptabels رو اجرا کنه پس ما دستور ساخته شده رو میریزیم تو یک فایل و بعد با یک روش دیگه و سطح دسترسی بالاتر اونو اجرا میکنیم!
برا این کار بنده میام به فایل query مجوز اجرایی میدم بعد این فایل رو با استفاده از crontab مدام، مثلا هر یک دقیقه اجرا میکنم!
crontab -e
*/1 * * * * /var/www/web_interface/query 2&1>/cron.log
برای آشنایی با cron به لینک زیر مراجعه کنید:
http://adminschoice.com/crontab-quick-reference
اما خدا روز بد نده که اجرا نشدنشو دنبال ارور گشتنو کد ۱۲۷ ما بقی چیز میزاو این مرجع:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/exitcodes.html
ما رو بد جور سر کار گزاشت، نگو باید مسیر کامل دستور رو بنویسیم که در توزیعی که من استفاده میکنم به این صورته:
/sbin/iptables
و می باید کد بالا رو تصحیح کنم شما هم با دستور whereis میتونید بفهمید این دستورتون تو کدوم مسیره!
خلاصش این شد که پس از کلی تحقیق و آزمون خطا که شما خیلی خلاصه دارید میبینید تونستم با تاخیر حداکثر یک دقیقه ای هر دستوری رو که بخوام با رابط کاربری سمت وب بسازمو اجرا کنم!
ولی خوب اینجا چند تا بحث هست!
چه طور میشه این تاخیر یک دقیقه ای رو بر داشت؟
چطور میشه امنیت کل موضوع رو تضمین کرد؟
اصلا چرا از اول، کاربر آپاچی رو root نکنیمو راحت با توابعی مثل exec کارمونو نکنیم؟
از آخر شروع میکنم ! بخاطر اینکه اگه یه باگ تو آپاچی و php و … باشه، یه هکر با استفاده از اون باگ و سطح دسترسی root دخل سرورو میاره!
اینکه چطور میشه امنیت رو تضمین کرد؟ ! جواب هیچطوره، ولی میشه محکم کاری کرد با جدا کردن اینترفیس و قسمت اجرایی کد و چک کردن کد ها قبل از اجرا و یا مثلا به جای استفاده از apache که برای این کار یه غول بیابونی حساب میشه از lighttpd استفاده کینم و برای محکم کاری بیشتر حتی اونو توjail اجرا کنیم یا مثلا با drop root privilege اجراش کنیم!
و میرسیم به جواب اولین سوال: میشه بجای کرون از یه برنامه پرل یا پایتون یا .. استفاده کنه که یه daemon مستقر کنه و همیشه در حال مانیتور باشه. اینجوری اگه وب سرورو اینترفیس ما هک شد این daemon میتونه ایزوله بمونه!
حالا ممکنه سوال پیش بیاد این daemon با وب اینترفیس چطور ارتباط برقرار میکنه؟
میتونه یه فیلدو مثلا هر ۵ ثانیه تو دیتابیش چک کنه که اگه یک بود بره دستورو اجرا کنه و اون فیلدو صفر کنه.
یا مثلا از unix socket استفاده کنه یا یه پورت رو ۱۲۷٫۰٫۰٫۱ باز کنه و اینطوری ارتباط برقرار کنه.
البته شاید بشه از stored procedure در بعضی پایگاه داده ها برای این کارا استفاده کردو دیگه اینهمه کار نخواد!
خوب برای دیدن خروجی که با php ساخته شده به لینک زیر مراجعه کنید وحتما اضافه کردن کرون یادتون نره.
دریافت اینترفیس تحت php
در مرحله بعد فکر کردم آیا میشه این کارو آسونتر و به صورت مجتمع انجام داد که فکرم رفت سراغ پایتون و توفیقی شد که با این زبان زیبا و آسونم آشنا بشم.
اول دنبال یه وب سرور با زبان پایتون گشتم که به لینک زیر رسیدم:
http://fragments.turtlemeat.com/pythonwebserver.php
که از کتابخونه BaseHTTPServer ایتفاده میکنه و خیلی زیباس:
http://docs.python.org/library/basehttpserver.html
http://wiki.python.org/moin/BaseHttpServer
http://docs.python.org/release/2.5.2/lib/module-BaseHTTPServer.html
http://docs.python.org/library/simplehttpserver.html
http://www.pylearn.com/fa/wiki/index.php/Tricks:web_server
و کار اون بخش قبلی رو که با آرایه های انجمنی انجام میدادم تو این قسمت به صورت زیر انجام دادم :
myquery=”/sbin/iptables “
for key, value in query.items():
if value[0] “” :
if key “j” :
myquery=myquery+”-”+key+” “
myquery=myquery+value[0]+” “
else:
temp=value[0]
myquery=myquery+” -j “+temp
و در کل برای اجرای کدهای python به چند نکته اشاره میکنم اول اینکه
myquery=”/sbin/iptables “
بر اساس جایی که در توضیع شما هست تنظیم کنید و بعد با sudo python webserver.py
وب سرورو اجرا کنن و با ادرس
http://127.0.0.1:8080
اونو ببنید!
این برنامه هم هنوز خیلی ناقصه و خیلی جاهاش باید تصحیح بشه ولی در حد نشون دادن ایدش هست:
اینترفیس تحت وب با python
شاید استفاده از CGI به صلاح تر باشه ! یه سری لینک مفید دیگه :
http://wiki.python.org/moin/CgiScripts
http://wiki.python.org/moin/WebProgramming
http://wiki.python.org/moin/WebServers
http://wiki.python.org/moin/IntegratedDevelopmentEnvironments
پ .ن : این وردپرس بابامو در آودر بس که نتونست لینک کنه یا مثلا دایرکشنو درست کنه! خلاصه شما ببخشین من سعیمو کردم
پ . ن .۲ : چون کل برنامه داره سعی میکنه فایروالو با اینترفیس پیاده کنه شما باید آشنایی خوبی با iptables داشته باشین ! البته وب اینترفیس باید کاری کنه که این علم لازم نباشه ولی فعلا که نتونسته برای آشنایی با این دستور دعوت میکنم مقاله دوستم آقای حبیبی رو مطالعه کنید .
مقاله آشنایی با iptables آقای حبیبی
There are 5 comments in this article: