بنابراین روش ایدهآل این است که پوشه /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 جدید) امن شده است.