چرا گنو لینوکس رو دوست دارم: پاسخ دادن به اینکه آیا سیستم ما وضعیت عادی داره یا مورد حمله است

ما سروری داریم که تازه تحویلش دادیم ولی هر روز حوالی ظهر با مشکل مواجه می شه. کار اصلی رو پروسه ای انجام می ده که اینجا بهش می گیم A. چندین پروسه A می تونن همزمان بالا باشن و کار کنن و ما گفتیم حداکثر این تعداد باید ۱۰۰ باشه. یعنی در صورت زیاد شدن بار، ۱۰۰ تا A بالا می یان و تقریبا صد برابر بهتر از یک A کار می کنن. یک بررسی سریع نشون می ده که در لحظه بروز مشکل دقیقا ۱۰۰ تا از پروسه A فعاله:

# ps -ef | grep A | wc -l
101

مشخصه دیگه: ps -ef پروسه ها رو نشون می ده، grep A فقط خط هایی که توشون A هست رو جدا می کنه و در نهایت wc -l تعداد خط ها رو می شمره (اگر گفتین چرا به جای ۱۰۰ تا شده صد و یکی؟).

علی الحساب تعداد Aها رو به حداکثر ۱۰۰۰ عدد افزایش می دیم و می ریم سراغ سوالی که مطرحه:

آیا ما مورد حمله هستیم؟ آیا حوالی ظهر سیستمی شروع به کار با سیستم ما می کنه که فشار رو به شکل غیرعادی بالا می بره؟ یا واقعا این شرایط عادی است و اینقدر از این سیستم استفاده می شه؟

ما لاگ هایی به این شکل داریم که حاصل کار A هستن:

127.0.0.1 -  26/Jul/2015:03:48:53 +0430 "POST /index.php?_url=xxxxx" 200 /home/adp/www/xxx/public/index.php 357.489 2048 86.72%
127.0.0.1 -  26/Jul/2015:03:48:58 +0430 "POST /index.php?_url=qqqq" 200 /home/adp/www/xxx/public/index.php 91.281 1280 98.60%
127.0.0.1 -  26/Jul/2015:03:49:32 +0430 "GET /index.php?aaa" 200 /home/adp/www/xxx/public/index.php 373.649 1792 56.20%
127.0.0.1 -  26/Jul/2015:03:50:03 +0430 "HEAD /index.php" 200 /home/adp/www/xxx/public/index.php 43.501 1280 91.95%
127.0.0.1 -  26/Jul/2015:03:55:03 +0430 "HEAD /index.php" 200 /home/adp/www/xxxx/public/index.php 63.519 1280 94.46%

من از چند روز پیش این لاگ ها رو فعال کردم تا همه درخواست ها ذخیره بشن و حالا کافیه بشمرم ببینم چه خبره! اول بذارین همه لاگ هار و به همدیگه بچسبونیم:

jadi@funlife:/tmp/dir$ ls -ltrh 
total 36M
-rw------- 1 jadi jadi 9.2M Jul 22 03:17 www.access.log-20150722
-rw------- 1 jadi jadi 6.0M Jul 23 03:10 www.access.log-20150723
-rw------- 1 jadi jadi 6.4M Jul 24 03:25 www.access.log-20150724
-rw------- 1 jadi jadi 2.5M Jul 25 03:25 www.access.log-20150725
-rw------- 1 jadi jadi 7.4M Jul 26 03:45 www.access.log-20150726
-rw------- 1 jadi jadi 4.2M Jul 26 15:17 www.access.log
jadi@funlife:/tmp/dir$ cat www.access.log-* www.access.log > all.log
jadi@funlife:/tmp/dir$ ls -ltrh 
total 72M
-rw------- 1 jadi jadi 9.2M Jul 22 03:17 www.access.log-20150722
-rw------- 1 jadi jadi 6.0M Jul 23 03:10 www.access.log-20150723
-rw------- 1 jadi jadi 6.4M Jul 24 03:25 www.access.log-20150724
-rw------- 1 jadi jadi 2.5M Jul 25 03:25 www.access.log-20150725
-rw------- 1 jadi jadi 7.4M Jul 26 03:45 www.access.log-20150726
-rw------- 1 jadi jadi 4.2M Jul 26 15:17 www.access.log
-rw-rw-r-- 1 jadi jadi  36M Jul 26 15:30 all.log

راحت و سر راست. دستور cat که محتوای فایل ها رو نشون می ده، کل فایل ها رو چسبونده به هم تا یک فایل بزرگ به اسم all.log داشته باشیم که هر خطش چنین فرمی داره:

127.0.0.1 -  26/Jul/2015:03:48:53 +0430 "POST /index.php?_url=xxxxx" 200 /home/adp/www/xxx/public/index.php 357.489 2048 86.72%

کافه من تاریخ رو جدا کنم. دستور کات همیشه دوست منه:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | head
20/Jul/2015:12:03:35
20/Jul/2015:12:03:36
20/Jul/2015:12:03:39
20/Jul/2015:12:03:39

جذاب نیست؟ به سادگی گفتم کات کن با جدا کننده اسپیس و فیلد چهارم رو به من بده ولی حالا فقط چند خط اول رو نشون بده (head). عملا کار تموم شده! کافیه این خطها رو بشمرم؛ البته بعد از حذف کردن ثانیه و دقیقه. برای حذف اینها کافیه شش کاراکتر آخر هر خط رو بردارم یا با همون دستور کات دوباره بگم بر اساس :‌ جدا کنه و فیلد اول و دوم رو به من بده. این راه دوم برای من سر راست تره:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | cut -d: -f1,2 | head
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12
20/Jul/2015:12

چقدر عالی. دیگه فقط کافیه سورت کنیم و بگیم بشمره. دستور uniq‌ می تونه با سوییچ های مختلف کارهای مختلف کنه. مثلا فقط خط های غیرتکراری بده، فقط خط های تکراری رو بده، از هر خط بیشتر از یکبار نده، بشمره از هر خط چند تا هست و … و البته این دستور وابسته به اینه که ورودی اش مرتب شده باشه. پس:

jadi@funlife:/tmp/dir$ cut -d' ' -f4 all.log | cut -d: -f1,2 | sort -n | uniq -c > data
jadi@funlife:/tmp/dir$ head data
   2795 20/Jul/2015:12
   2363 20/Jul/2015:13
   2383 20/Jul/2015:14
   2251 20/Jul/2015:15
   1796 20/Jul/2015:16
   1599 20/Jul/2015:17
    843 20/Jul/2015:18
    704 20/Jul/2015:20
    765 20/Jul/2015:19
   1039 20/Jul/2015:21

چه کردیم! (: فقط کافیه ترسیمش کنیم:

تعداد درخواست های سرور

و هر کسی که آمار یا حداقل نمودارهای نرمال بدونه می تونه بگه اتفاق غیرعادی ای در جریان نیست – حداقل در سطح درخواست ها. از ساعت هشت درخواست ها بالا می رن و بعد به شکلی نسبتا طبیعی افزایش پیدا می کنن تا آخر وقت اداری که دوباره آروم آروم پایین بیان. این پترن برای سایتی که مردم باهاش کار می کنن طبیعی است. مطمئنا می شه برنامه ما رو بهتر کرد ولی هدف من به عنوان مدیر سیستم این هست و بود که نشون بدم اتفاقی غیر عادی (درخواست ناگهانی از یک سیستم سر یک ساعت مشخص، حمله هکرها و …) در جریان نیست که تقریبا ثابت شده. اگر نمودارهای این تیپی دوست دارین بگین که بازم نمودارهایی واقعی از کارهای واقعی یک مدیر سیستم رو با هم مرور کنیم.

  • sepehrnoush

    فوق العادست. هم راه حل نهایی رو میگی هم مسیری که باید رفت رو یاد میدی. :-)

    من به خیلی‌ها برای یاد گرفتن گنو/لینوکس این روش رو پیشنهاد میکنم اما متاسفانه اکثرا دنبال مربی‌ای هستن که بهشون جزوه بگه بنویسن.

  • مجید

    حتما جادی عالیه
    اینکه آدم دقیقا بدونه بعد از اینکه یه سری آموزش رو دید باید دقیقا سر کار چه چیزی رو پس بده خیلی خوبه !

  • alikal

    عدد ۱۰۱ بخاطر پروسه خود grep A هستش :D

  • کاربر

    با سلام.
    طبق معمول عالی بود.
    لطفا دوباره از این نمونه ها بگذار.
    ممنون

  • عماد

    چقدر جالب و خوب.
    من برای یاد گرفتن این دستورات و کلا ترمینال لینوکس و آشنایی با خود گنو/لینوکس به نظرت از چه کتابی شروع کنم؟ می‌تونی کتابی که خودت دوست داشتی بهم بگی؟ زبان اصلی هم باشه چه بهتر. خیلی کتاب پیدا کردم اما نمی‌دونم کدوم بهتر باشه. البته می‌دونم نظرت اینه که کتاب کتابه :)
    راستی این تیپ کارها را با ترمینال مک هم میشه کرد فکر کنم؟! چون لینوکس هم نوعی یونیکس هست آیا؟! اگه پرت گفتم شرمنده :)

    • جادی

      عماد عزیز این کارها رو تقریبا با هر سیستمی که ابزارهای صحیح رو نصب باشه می شه کرد. نکته اینه که این ابزارها در لینوکس به شکل پیش فرض نصب هستن. در واقع اینها مجموعه ابزارهای پروژه گنو هستن که خیلی هاشون توی مک هم نصبه.

  • moh3en

    یعنی کف کردم!! مخصوصا اون نمودار اخرش خیلی برام جالب بود. چطوری درستش کردی؟ با زبان R ؟

    • جادی

      اینجا رو با اوپن افیس درست کردم. حتما یک مطلب کوتاه در مورد شیوه درست کردنش در چیزهای دیگه می نویسم. عملا راحتتر است .. شاید هم نه (:

      • saar

        جادی عزیز، خیلی دیدم که با اپن‌آفیس نمودار می‌کشی. البته خوبه‌ها ولی وقتی gnuplot هست، چرا از اون استفاده نمی‌کنی؟ خیلی هم راحت‌تر و کاستومایز ایبل تره.

  • تهمورس

    داداش تمام این کارهایی رو که به اسم لینوکس تمام می کنی تو ویندوز با استفاده از برنامه های مناسب خیلی راحتتر می شه انجام داد. (مثلا جدا کردن صدای خواننده از آهنگ با استفاده از کاراوکه) انجام این کارها تو لینوکس مثل آش خوردن با چنگاله!! لینوکس فقط واسه ژست گرفتن با کلاس گذاشتن شاید خوب باشه:-)

    • محمد

      دوست عزیز قبول که شما حرفه ای هستی و راه های ساده تری بلدی ولی خارج از بحثی گفتی نقطه قوت لینوکس توی ابزار های خط فرمانشه و درسته که شما وقتی می خوای اون کار رو یک بار با رابط گرافیکی انجام بدی ممکنه خیلی سریعتر باشه ولی خب حسن خط فرمان اینه که میتونی اون اسکریپت رو دخیره کنی و بار بعد اجراش کنی و خیلی سریع انجامش بدی. و البته اینکه رابط گرافیکی برای سرور و استفاده تو کد عملا چیز بی معناییه.
      خب ویندوز هم خط فرمان داره ولی کافیه PowerShell رو با دستورات لینوکس مقایسه کنی تا بفهمی که به طور وحشتناکی مسخره و پیچیدست.
      در ضمن 90 درصد سرور ها اینترنت به دست همین چنگالی که شما میفرمایید اداره میشه.

      • حامد

        سلام

        کاری به حرفای دیگه‌ی شما ندارم ولی کی گفته 90 درصد سرو‌ر‌های اینترنت با گنو/لینوکس مدیریت میشن؟
        طبق آمار حدود 33 درصد سرور‌ها ویندوز و 67 درصد یونیکس/شبه یونیکس هستن که که بخواییم این درصد‌هارو هم بشکنیم حدود 36 درصد لینوکس و بقیه ‌BSD یا نامشخص هستن. آمار و اطلاعات نادرست گمراه کننده‌است. سعی کنید اطلاعاتتون رو به روز کنید.

        • محمد

          این طور که من دیدم این آمار شما محدود به سرورهای <وب سایت>هاست. آمار کل سرور ها نزدیک ۹۵٪ ا

  • محسن

    مرسی جادی بخاطر گام به گام پیش رفتن مراحل
    من چند روز پیش کلی ایمیل داشتم توی فایل های متنی جدا جدا و اینارو می خواستم بریزم توی دیتابیس
    خیلی راحت با دستور
    cat * >all
    همه رو یکی کردم در عرض یک ثانیه که مجموعا شد 2 میلیون خط…سرعتی که من مانندشو هیچ جا ندیده بودم.
    با دستور
    cat all|wc -l
    تعداد ایمیل هارو شمردم
    و در آخر با دستور
    LOAD DATA LOCAL INFILE ‘/tmp/foo.txt’ INTO TABLE foo

    هر ایمیل رو توی یک رکورد از جدول mysql ام ریختم.خیلی راحت و سرراست

    با اجازه عمو جادی من جوابی به آقا تهمورس بدم
    قضیه این نیست که چنین کاری فقط توی لینوکس قابل انجامه.بحث اینه که کلی برنامه ی مختلف مثل تیکه های لگو وجود دارن که شما می تونی باهاشون هر کاری دلت می خواد انجام بدی.توی ویندوز شما باید برای چنین کاری که جادی کرد یا من کردم باید یک برنامه کاملا اختصاصی بنویسی/بخری/بدزدی یا هرچی (بقول جادی) ولی توی لینوکس با کمی خلاقیت می شه با ترکیب این برنامه های کوچولو موچولو کارهای بزرگ کرد

    • تهمورس

      چنین لاگهایی توی ویندوز سرور هم ذخیره می شه. کافیه که این لاگها را با چند تا کلیک وارد نرم افزار اکسل بکنی. خود اکسل به طور اتوماتیک، تاریخ ها و ساعت را در ستون های جداگانه قرار می ده. در نهایت از این ستونها یک نمودار مثل نمودار جادی رسم می کنی و تمام. کل پروسه تقریبا با 50 تا کلیک و کمتر از 10 دقیقه وقت.

      مهم ایده ی پشت این قضیه است مثلا من خودم نمی دونستم با استفاده از یک همچین نموداری می شه ادعا کرد که سیستم مورد حمله قرار نگرفته!

      یا مثلا من برای جدا کردن صدای خواننده از نرم افزار رایگان nero waver استفاده کردم که با ده تا کلیک همون کار رو انجام می ده.

      بت پرستی تو هر دوره ای خودشو به یک شکلی نشون می ده

      • جادی

        تهمورس عزیز این پروسه کمتر از یک دقیقه وقت می گیره. من در واقع فقط خط آخر رو می زنم و اگر بحث آموزش نباشه که خط به خط جلو نمی ریم. بدون شک تقریبا هر کار عمومی که در هر کامپیوتر و سیستم عاملی می شه کرد رو توی یک کامپیوتر و سیستم عامل دیگه هم می شه کرد و فقط بحث داشتن ابزارهای مناسب است. مثلا یکبار سعی کن فایل دو گیگابایتی رو توی اکسل باز کنی ببینی نتیجه چی می شه (: اینجا عملا در زمان تفاوت خاصی نمی کنه فایل ده مگ باشه یا صد مگ یا یک گیگ. از اونطرف در لینوکس الان این نمودار روزمره درست و برای من ایمیل می شه بدون اینکه نیازی باشه یک نفر رو بشونیم پشت سرور روزی ده دقیقه پنجاه تا کلیک بکنه. مطمئنا در ویندوز هم می شه کار مشابهی کرد و فقط باید بلد باشیم و سراغ ابزارهای درست بریم.

        اگر بخوای متهم به بت پرستی کنی بقیه هم می تونن بگن مثلا تو مشغول دفاع از بت های قدیمی هستی (: تهمت و متلک تو این بحث کاربرد نداره به نظرم.

        من همیشه می گم سیستم عامل ابزار است و مهمه که برای کار درست ابزار درست انتخاب کنی.

        • تهمورس

          اون تیکه آخرش که فقط یک شوخی بود منتها شکلک خنده رو یادم رفت بزارم وگرنه متوجهم بحث این چیزها نیست :)
          فقط بعضی کامنتها را که می خونم به نظر می آد طرف گیج شده، احساس می کنه چون لینوکس بلد نیست اگر همچین نیازهایی پیدا بکنه نمی تونه برطرفش بکنه.

          • جادی

            خب من توی مطالب دیگه سعی می کنم این مساله رو گوشزد کنم و یادم نره. اینجا نکته مهم تحلیل نمودار است وگرنه اون نمودار رو در نهایت هر کس با هر وسیله ای که استفاده می کنه می تونه در بیاره. جذابیت لینوکسی ماجرا برای من سریع بودن راه حل ها و بامزگی وصل کردن این اجزای ریز برای رسیدن به یک چیز کارا است.

  • محمد

    جادی خیلی با حال بود اگه ترسیسم رو هم تو بش مینوشتی باحال میشد
    فکر کنم یه سری ابزار برای نظارت روی شبکه وجود داره که اینا رو مانیتور میکنه و البته اینکه بیشتر فایروال هم باید اینو داشته باشند اگه نرم افزارشو میشناسی معرفی کن
    یه سوال فعال بودن access log آپاچی کُندش نمیکنه؟

  • :)

    سلام
    ممنون از پست مفیدت

    بازم از آموزش های کاربردی و تجربه های شخصیت بیشتر بزار

  • احمد

    یه سوال: اون یه روزی که آمار درخواستا نسبت به بقیه خیلی پایینه چیه ماجراش؟

  • احمد

    روز تعطیله آیا؟ خاصه که یکی از هفتاس.

    • جادی

      بله بله دقیقا (: روز تعطیله.