شنبه, 27 شهریور 1395 16:37

آموزش امن سازی پوشه های /tmp و /var/tmp و /dev/shm در سرور لینوکس

پوشه‌های موقت مثل /tmp یا /var/tmp و /dev/shm در سرورهای لینوکسی قابلیتی دارند که هکر میتواند اسکریپت یا برنامه خود (مثل RootKit) را اجرا کند. این بر نامه های مخرب اجرایی، برای آزار یا ایجاد اختلال در سرور شما بکار برده می‌شوند.

بنابراین روش ایده‌آل این است که پوشه /tmp را به پارتیشن خودش mount کنیم. یعنی کاری کنیم که قابلیت های noexec (جلوگیری از اجرای کدها) و nosuid (جلوگیری از دسترسی با قدرت کاربر ریشه) در این پوشه ها (در حقیقت پارتیشن ها) وجود داشته باشد.

 

مراحل ایمن سازی سرور لینوکس بصورت خلاصه

  1. ساخت یک فایل 1 یا 2 گیگابایتی در لینوکس
  2. فرمت کردن فایل ایجاد شده به فرمت ext4
  3. بکاپ گیری از پوشه /tmp فعلی
  4. mount کردن فایل ساخته شده به پوشه /tmp
  5. تنظیم سطح دسترسیِ پارتیشن ساخته شده به 1777
  6. انتقال محتوای /tmp قدیمی به /tmp جدید
  7. افزودن پارتیشن جدید به فایل /etc/fstab (برای mount شدن خودکار، بعد از ری استارت)
  8. تغییر نام /var/tmp به چیز دیگری مثل /var/temp2
  9. ساخت یک شورتکات (Symbolic link) از /var/tmp به /tmp
  10. انتقال محتویات قدیمی از /var/temp2 به /tmp
  11. ری استارت نمودن تمام سرویس هایی که از /tmp استفاده میکنند (مثل FTP و Apache و غیره)
  12. افزودن noexec و nosuid به tmpfs در فایل /etc/fstab
  13. Remount نمودن /dev/shm تا تغییرات را حس کند و اگر خطایی در انجام عملیات هست نمایش دهد

 

مراحل ایمن سازی سرور لینوکس بصورت مشروح

قدم اول: ساخت فایل 1 یا 2 گیگابایتی در لینوکس

با استفاده از دستور dd میتوان در لینوکس فایلی با حجم دلخواه ساخت، مثلا برای ساخت فایلی با یک گیگ از دستور زیر استفاده میکنیم:

#dd if=/dev/zero of=/dev/tmpDir bs=1024 count=1000000

if=/dev/zero = آدرس فایل ورودی، فایلی که فقط صفر تولید میکند و به فایل تولیدی ما حجم میدهد (if = Input File)

of=/dev/tmpDir = آدرس فایل خروجی، که به دلخواه tmpDir گذاشتم. (of = Output File)

bs = سایز هر بلاک بر اساس بایت (bs = Block Size)

count = تعداد بلاک هایی که در فایل خروجی باید نوشته شوند

بنابراین من در دستور بالا یک فایل 1 گیگی ایجاد کردم ( 1024Byte * 1,000,000 = 1GB)

نکته: قبل از ساختن فایل، با دستور #df -kh از داشتن فضای کافی مطمئن می شوم.

قدم دوم: فرمت کردن فایل ساخته شده با ext4

 برای فرمت کردن فایلی که در مرحله قبل ساختم به فرمت ext4، از دستور زیر استفاده میکنم:

# /sbin/mkfs.ext4 /dev/tmpDir

بعد از نوشتن دستور بالا، اینتر را میزنم، برای اطمینان از من بله یا خیر می پرسد که با نوشتن y و فشردن اینتر، کار فرمت فایل 1 گیگی آغاز میشود.

قدم سوم: گرفتن پشتیبان از پوشه /tmp فعلی

از پوشه /tmp کنونی که هنوز mount نشده، یک پشتیبان می‌گیرم تا اطلاعاتش و سطح دسترسی فایل‌های درونش حفظ شود و بعداً بتونم به /tmp جدید که mount شده، منتقل کنم.

# cp -Rpf /tmp /tmpbak

میدونم که دستور cp برای کپی گرفتن استفاده میشه و R یا برای اینه که از پوشه های تو در تو هم کپی بگیره (recursive) و p برای اینه که حالت، مالکیت و برچسب زمانی فایل هایی که کپی میشن حفظ بشه (preserve) و f برا اینه که اگر پوشه یا فایلی که داریم روی مقصد کپی میکنیم از پیش موجود بود ولی برای کپی شدن باز نشد، حذف بشه و مجددا ساخته بشه (force).

 قدم چهارم: mount کردن فایل ساخته شده به پوشه /tmp

 حالا عملیات mount سازی /tmp قدیمی به /dev/tmpDir رو شروع میکنم. با این کار از این به بعد /tmp به فایل 1 گیگابایتی ای که ساختم اشاره میکنه و بصورت یک پارتیشن محسوب میشه:

# mount -o loop, noexec, nosuid, rw /dev/tmpDir /tmp

 قدم پنجم: تنظیم سطح دسترسیِ پارتیشن ساخته شده به 1777

 حال سطح دسترسی /tmp جدید را به 1777 تغییر میدهیم:

# chmod 1777 /tmp

این هم یه آموزش برای اینکه بدونیم معنی عدد 1 در سطح دسترسی 1777 در لینوکس چیست؟

قدم ششم: انتقال محتوای /tmp قدیمی به /tmp جدید

حالا اطلاعات پوشه موقت قدیمی رو به پوشه موقت جدید که بصورت یک پارتیشن محسوب میشه منتقل میکنم، یعنی اول وارد پوشه پشتیبان موقت قدیمی میشم و بعد دستور کپی اطلاعات رو از اونجا به پارتیشنی که ساختم میکنم:

# cd /tmpbak
# cp -Rpf * /tmp/

حالا که کل اطلاعات رو از /tmpbak به /tmp جدید انتقال دادم، یکبار دیگه دستور کپی رو انجام میدم ولی اینبار برای انتقال فایل هایی که پنهان هستند (فایل های پنهان در لینوکس با نقطه شروع میشن):

# cp -Rpf .* /tmp/

قدم هفتم: افزودن پارتیشن جدید به فایل /etc/fstab

برای اینکه عمل mount شدن بعد از ری‌استارت سیستم، بصورت خودکار انجام بشه باید پارتیشنی رو که ساختیم به فایل /etc/fstab اضافه کنیم. اینطوری:

# /dev/tmpDir /tmp ext4 loop,nosuid,noexec,rw 0 0

خُب! تا اینجا مرحله اول کار ما، یعنی ایمن سازی پوشه موقت /tmp لینوکس انجام شده و فقط مونده تست کردن و مطمئن شدن. برای اینکار یک فایل اجرایی (.sh) رو توی /tmp جدید قرار داده و اقدام به اجرا می کنیم تا ببینیم اجرا می‌شود یا نه. اگر اجرا نشد، یعنی پارتیشن ما (/tmp جدید) امن شده است.

دیدگاه شما