پوشههای موقت مثل /tmp
یا /var/tmp
و /dev/shm
در سرورهای لینوکسی قابلیتی دارند که هکر میتواند اسکریپت یا برنامه خود (مثل RootKit) را اجرا کند. این بر نامه های مخرب اجرایی، برای آزار یا ایجاد اختلال در سرور شما بکار برده میشوند.
بنابراین روش ایدهآل این است که پوشه /tmp
را به پارتیشن خودش mount کنیم. یعنی کاری کنیم که قابلیت های noexec
(جلوگیری از اجرای کدها) و nosuid
(جلوگیری از دسترسی با قدرت کاربر ریشه) در این پوشه ها (در حقیقت پارتیشن ها) وجود داشته باشد.
مراحل ایمن سازی سرور لینوکس بصورت خلاصه
- ساخت یک فایل 1 یا 2 گیگابایتی در لینوکس
- فرمت کردن فایل ایجاد شده به فرمت ext4
- بکاپ گیری از پوشه
/tmp
فعلی - mount کردن فایل ساخته شده به پوشه
/tmp
- تنظیم سطح دسترسیِ پارتیشن ساخته شده به 1777
- انتقال محتوای
/tmp
قدیمی به/tmp
جدید - افزودن پارتیشن جدید به فایل
/etc/fstab
(برای mount شدن خودکار، بعد از ری استارت) - تغییر نام
/var/tmp
به چیز دیگری مثل/var/temp2
- ساخت یک شورتکات (Symbolic link) از
/var/tmp
به/tmp
- انتقال محتویات قدیمی از
/var/temp2
به/tmp
- ری استارت نمودن تمام سرویس هایی که از
/tmp
استفاده میکنند (مثل FTP و Apache و غیره) - افزودن
noexec
وnosuid
بهtmpfs
در فایل/etc/fstab
- 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 جدید) امن شده است.