نمایش نتایج: از شماره 1 تا 1 , از مجموع 1

موضوع: قدم به قدم | امن کردن لینوکس

  1. #1
    عضو جدید
    تاریخ عضویت
    Dec 2009
    نوشته ها
    3
    تشکر تشکر کرده 
    0
    تشکر تشکر شده 
    38
    تشکر شده در
    3 پست

    پیش فرض قدم به قدم | امن کردن لینوکس

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

    راستی مطالبی که گفته میشه روی لینوکس redhat هست، تعصب خاصی نیست و دلیل این انتخاب فقط برمیگرده به این که ردهت بیشترین سهم رو برای استفاده روی سرور ها داره ( ۲۹٪ )

    دیگه حاصل تجربه است دیگه ، امیدوارم مفید واقع بشه

    -----------------------------------------------------------------------------------------------------------------------------
    در پست اول چند نکته کلی مدیریتی رو برای امنیت خدمتتون عرض میکنم و در پست های بعدی کم کم وارد قسمت های فنی تر و کاربردی تر میشم.
    خب قدم اول در امنیت سرور ها چیه؟ همه با هم میگید physical security
    همیشه یادتون باشه که هرچقدر هم سرورتون امن باشه اگه امنیت فیزیکی قابل قبول نداشته باشید ، خب هکر به جای اینکه بخواد به database شما نفوذ کنه ، سیستم شما رو میزنه زیر بغلش و الفرار
    بسته به محیطی که توش هستین ممکنه نیاز به استفاده از پسورد برای bootloader هم باشه.
    نکته مدیریتی بعدی که باید در نظر بگیرید اینه که حتما از shell script ها و cron job ها جهت عملیات hardening خود استفاده کنید، یادتون باشه که بهترین admin ها هم از اشتباه معصوم نیستند.
    همچنین حتما یه شل اسکریپت داشته باشید که آخرین حالت های اسکریپت های امنیتی رو به شما گزارش بده تا از درست کار کردن همشون اطمینان حاصل کنید.
    نکته بعد اینه که حتما از backup گیری استفاده کنید که انواع اون بر میگرده به استراتژی سازمانی صاحبین اون سرور.
    نکته خیلی مهم که حتی تو امتحان LPI هم همیشه جزء مقدماتی ترین سوالات بوده اینه که یک سرور باید پارتیشن های جدا برای بخش های مختلف داشته باشه و حد اقل پارتیشن های زیر جدا باشند:

    / /boot /var /usr /tmp /home
    نکته بعدی تنظیم پارامتر های امنیتی کرنل لینوکس هست که در روزهای آینده در همین thread در موردش حرف میزنم.
    با توجه به استراتژی میتونید از SELinux هم استفاده کنید ( لینک مفید برای SELinux )
    از سرویس های legacy که مشکلات امنیتی جز لاینفک اونا هست استفاده نکنید مثل ftp و telnet و rlogin
    به جاش از سرویس های امن تر جایگزین مثل sftp و ssh و scp استفاده کنید.
    بدرود

    ---------- Post added at 01:50 PM ---------- Previous post was at 01:49 PM ----------

    درود
    خیلی مهمه که شما بدونید دقیقا از سرور چه توقعی دارید و این سرور باید برای شما چی کار کنه؟!
    اینجا بازم میگم بسته به سیاستگذاری های سازمانی و ... میتونید ۲ راه حل داشته باشید.
    اولی اینه که لینوکسی بسازید که فقط مخصوص نیازهای خودتون باشه ( که برای این کارهم دو روش داریم: اولی LFS یعنی از صفر لینوکس رو بسازید - لینک کمکی - دومی هم remaster کردن هست که به اندازه کافی داکیومنت برای لینوکس های مختلف وجود داره )
    دومی که اینجا بررسی میکنیم اینه که لینوکس را به صورت base نصب کنیم و سپس نرم افزارهای غیرضروری رو حذف کنیم.
    بازم تاکید میکنم که این بخش از بخش هایی هست که معمولا توجه کمی بهش میکنن ولی خیلی مهمه - من خودم به عنوان white hat خاطرات تلخی در این مورد دارم و همینطور به عنوان black hat خاطرات شیرین )
    شما باید حواستون باشه که به هیچ عنوان ابزار توسعه و یا همون develop نباید روی یک سرور باشه.
    همچنین سرویس های غیر ضروری نه تنها disable بلکه کلا باید حذف شوند.
    ابزارهای دسکتاپ هم نباید روی سرور باشند نظیر x server و ...
    یک لیست از نرم افزارهای نصب شده تهیه کنید و هر از چند گاهی توسط اسکریپت ها این لیست رو چک کنید.
    و حواستون باشه که تغییر نکنه مگر این که داکیومنت شده باشه ( مثلا فلان نرم افزار نصب شد به دلیل فلان بررسی شده در تاریخ فلان توسط فلانی - که زیرش هم باید امضای مدیرتون باشه )
    برای این کار از دستور زیر استفاده کنید:

    rpm -qa
    میتونید لیست نرم افزارها رو به وصیله redirection از stdin تو یه فایل بریزید:

    rpm -qa > software-list.txt
    اگه اطلاعات بیشتری در مورد یک package خاص میخواید از دستور زیر استفاده کنید:

    rpm -qi <packagename>
    حالا که این کارا رو کردید وقتشه که اونایی که نمیخواید رو حذف کنید با دستور :
    rpm -e <packagename>
    ولی حواستون باشه که حتی حذف package ها هم باید داکیومنت بشه و همچنین شما حق ندارید بدون در نظر گرفتن عواقب یه بسته رو حذف کنید. ممکنه وقتی یه package رو حذف میکنید چند تا نرم افزار دیگه که به اون package احتیاج داشتن بد کار کنن. برای حل این مشکل از این دستور به صورت زیر استفاده کنید:

    rpm -e --test <packagename>
    اینجوری package حذف نمیشه و فقط به شما یه گزارش میده که اگه بسته رو حذف کنید چه اتفاقاتی میفته.
    ممکنه که شما نیاز داشته باشید چندین سرور مثل هم نصب کنید.
    خب عاقلانه نیست که واسه تک تک این سرور ها مراحل بالا رو انجام بدید! چی کار کنیم؟
    میتونید از kickstart استفاده کنید ، در این صورت فقط واسه یه سرور باید این مراحل رو انجام بدید و بقیه به صورت اتوماتیک نصب مبشن ( لینک کمکی برای kickstart )

    بدرود

    ---------- Post added at 01:51 PM ---------- Previous post was at 01:50 PM ----------

    خب نیاز به توضیح نداره و همه میدونید که پورت باز بی مصرف ، بسته باید گردد
    در این راستا در این پست چند روش برای پیدا کردن و در پست بعدی نحوه بستن اونا رو میگم.
    برای مشاهده یه لیست از پورت های باز اعم از tcp یا udp از دستور زیر استفاده میکنیم:

    netstat -tulp

    اگه نمیدونید option هایی که به کار رفته هر کدوم چی کار میکنه وقتو تلف نکنید ، فورا manual دستور رو بخونید.
    با دستور بالا خروجی پورت ها با نام نمایش داده میشن ، اگه میخواید شماره هاشونو ببینید از n نیز به عنوان option استفاده کنید.
    خب لازمه که یه port scanning هم از یه ماشین دیگه به این ماشین انجام بشه

    nmap -sTU <remote_host>

    ( اینجاس که متوجه یه سری تفاوت ها میشید که دلیلش هم اینه که بعضی از سرویس ها فقط به صورت local راه اندازی شدن مثل mail server که معمولا به صورت default فقط local هست و برای استفاده واقعی در سطح اینترنت باید relay بشه.
    و اما آخرین روش برای پیدا کردن سوکت های باز udp و tcp به شرح زیر میباشد:

    lsof -i -n | egrep 'COMMAND|LISTEN|UDP'

    خب شاید بگید این همه روش به چه کار میاد یکیش هم بسه دیگه
    اولا که شما همیشه ابزار های مثل nmap و ... رو در اختیار ندارید.
    ثانیا که برای مصاحبه های استخدام هم دونستن تمام روش ها برای انجام یه کار خیلی مهمه.

    ---------- Post added at 01:52 PM ---------- Previous post was at 01:51 PM ----------

    یکی از اقلام مهم hardening بستن سرویس های بلا استفاده در هنگام startup سیستم است.
    در این راستا شما ابزار بسیار کارامد chkconfig رو دارید.

    chkconfig --list

    این دستور تمام سرویس ها و حالات پیش فرض آنها هنگام بالا آمدن در runlevel ها رو برای شما لیست میکنه.
    میتونید اونو پایپ کنید به grep on تا فقط خطوطی که در اونا on هست رو مشاهده کنید.
    میدونید که برای start یا stop یک سرویس اسکریپت هایی موجود است.
    شما حتی میتونید این اسکریپت ها رو دستکاری کنید ( مثلا وقتی آپاچی بالا میاد سرویس دیگری که برای مونیتورینگ آپاچی هست هم باهاش بالا بیاد)
    اسکریپت های start و stop سرویس ها در runlevel های مختلف زیر دایرکتوری etc/init.d/ هست.
    برای disable کردن یک سرویس به صورت موقتی و لحظه ای ( مثلا آپاچی ) از دستور زیر استفاده می کنیم.

    /etc/init.d/apache2 stop

    اگر میخواید سرویس رو به هنگام بالا اومدن سیستم stop کنید و یا مثلا در یک runlevel آن را stop و در runlevel دیگر آن را start کنید میتونید از دستور chkconfig استفاده کنید( به دلیل زیاد بودن option ها طرز کار رو میسپرم به خودتون ، فراموش نکنید که اولین مرحله یادگیری لینوکس اینه که یاد بگیرید manual هر دستور رو بخونید )

    ---------- Post added at 01:54 PM ---------- Previous post was at 01:52 PM ----------

    سرویس xinetd جایگزینی برای inetd هست که تمامی سرویس های شبکه ای که تحت xinetd تنظیم شدن رو مونیتور میکنه. و سرویس ها رو start میکنه و ...
    با دستور زیر ببینید xinetd فعال هست یا نه؟

    chkconfig --list xinetd
    اگه خواستید شماره کارمندیش (همون شماره پروسس) هم ببینید از دستور زیر استفاده کنید

    /etc/init.d/xinetd status
    اگه xinetd فعال باشه خیلی مهمه که بدونید چه سرویس های تحت xinetd فعالیت میکنن ( راستی اصطلاحا به xinetd میگن superserver )
    دستور زیر به شما میگه که چه سرویس هایی تحت xinetd کانفیگ شدن و همچنین میگه که پورت های کدومشون توسط خود xinetd مونیتور میشه .
    HTML کد:
    chkconfig --list | awk '/xinetd based services/,/""/'
    اگه فقط سرویس هایی که پورتشون توسط xinetd مونیتور میشه رو میخواید ببینید از دستور زیر استفاده کنید.

    chkconfig --list | awk '/xinetd based services/,/""/' | grep -v off
    خب با مثال بریم جلو.
    فرض میکنیم telnet بالا هست و تحت xinetd هم هست ، میدونید که telnet به دلایل زیادی که یکی از اونا clear text فرستاده شدن data هست ، تحت عنوان legacy services شناخته میشه و همونطور که قبلا اشاره کردم نباید تو یه سرور general purposed استفاده بشه.
    با دستور زیر میبنید که telnet روشن است.

    chkconfig --list telnet
    با دستور زیر یک خط از فایل کانفیگ telnet رو میبینید که باز هم دلیل بر فعال بودن این سرویس و اون هم تحت xinetd هست.

    cat /etc/xinetd.d/telnet | grep disable
    با دستور زیر هم telnet رو خاموش میکنیم (روش های دیگه هم هست - به عهده خودتون میسپرم )

    chkconfig telnet off
    میتونید دستورات قبلی رو اجرا کنید تا مطمئن شید که telnet غیر فعال شده.
    طبق توصیه ای که قبلا کرده بودم اصلا بهتره که telnet server رو از سیستم حذف کنید و به جاش از ssh استفاده کنید.

    rpm -e telnet-server
    خب ممکنه یه سرویس تحت xinetd باشه که اصلا شما نمیدونید چی هست و به چه درد میخوره؟
    میخواید بفهمید که اون سرویس چیه؟!
    آیا disable کنید یا نکنید!
    راه اول اینه که گوگل کنید.
    با تمام احترامی که واسه دکتر گوگل قائل هستم باید بگم که این راه دوم هستش ( بهترین منبع برای یادگیری لینوکس ، لینوکس است )
    خب پس میریم سراغ خود لینوکس:
    فرض میکنیم با دستورات بالا به این نتیجه رسیدیم که سرویس authd تحت xinetd هست و ما هم نمیدونیم چیه!
    به ترتیب زیر عمل میکنیم
    با دستور زیر میبینید که دقیقا daemon این سرویس تو چه مسیری قرار گرفته

    grep " server" /etc/xinetd.d/auth
    اینم خروجیش :

    server = /usr/sbin/in.authd
    server_args = -t60 --xerror --os -E
    خب اول میریم سراغ manual :

    man in.authd
    ای وای ، manual نداره!
    عیب نداره ، یه query از package manager میگیریم که ببینیم این in.authd تو کدوم package بوده و از کجا اومده؟

    rpm -qf /usr/sbin/in.authd
    اینم خروجیش :

    authd-1.4.1-1.rhel3
    خب حالا یه query از package میگیریم و description اونو میکشیم بیرون :

    rpm -qi authd-1.4.1-1.rhel3 | awk '/Description/,/""/'
    اگه خواستید تمام فایل های داخل این package رو هم ببینید دستور زیر به دردتون میخوره :

    rpm -ql authd-1.4.1-1.rhel3
    حالا با توجه به description که خوندید و با در نظر گرفتن سیاست گذاری سازمانی که توش هستید اگه خواستید این سرویس رو disable کنید دستور زیر رو به کار ببرید

    chkconfig auth off
    برای اطلاعات بیشتر در مورد xinetd به اینجا مراجعه کنید
    بدرود

    ---------- Post added at 01:55 PM ---------- Previous post was at 01:54 PM ----------

    بر همه روشن است که پدر تمامی پروسس ها در لینوکس init هست که شماره کارمندیش ( همون process id ) یک هست.
    وقتی مراحل اولیه بوت پس از روشن کردن کامپیوتر انجام میشه init به عنوان اولین پروسس میاد تو و میره فایل inittab رو میخونه که ببینه چه کارهایی باید انجام بده. فایل inittab در مسیر etc/inittab/ قرار داره.
    تو inittab نوشته شده که چه کارهایی هنگام boot باید انجام بشه مثلا oracle از inittab استفاده میکنه که ببینه هنگام بوت باید سرویس cluster رو بیاره بالا یا نه! ( البته inittab چیزای دیگه هم توشه ، برای اطلاعات بیشتر manual اش رو بخونید با دستور man inittab )
    اولین قدم اینه که ctrlaltdel رو یا حذف کنیم یا جلوش بگیم که اگه مثلا این سیگنال اومد بجای reboot فلان کار رو کن.
    ما برای جلوگیری از reboot شدن های اتفاقی با دستور زیر حذفش میکنیم( تبدیل به کامنت میکنیم)

    sed -i 's/ca::ctrlaltdel:/#ca::ctrlaltdel:/g'
    شاید بگید چرا با ویرایشگر معمولی این کار رو نکردی!؟
    جواب : شما ممکنه برای اتصال به سرور مجبور به استفاده از یه ترمینال تک رنگ چند خطی باشی که نتونه ویرایشگر های iteractive رو load کنه! ( تو بعضی از بانک ها با این تجربه مواجه شدم)
    پس ممکنه ناچار به استفاده از ابزارهایی مثل sed بشید.
    همچنین به نظر من یک سرور عملیاتی که قراره بار بکشه نباید دارای X11 باشه ، پس default runlevel رو روی ۳ بگذارید.
    همچنین بسته به محیطی که توش هستید ممکنه نیاز به استفاده از بخش ups باشه یا نباشه.
    اگه نیاز ندارید comment کنید.
    تمام این تغییرات سری بعد که boot میکنید اعمال میشه ، اگه میخواید همین الان تغییرات اعمال بشه از دستور زیر استفاده کنید.

    init q
    در حقیقت این دستور signal شماره ۱ یا همونSIGHUP رو به پروسس init میفرسته و init میفهمه که باید یک بار دیگه فایل کانفیگ خودشو بخونه.
    همچنین etc/rc.local/ نیز اسکریپتی هست که بعد از بوت شدن در سیستم اجرا میشه! و میتونه کاملا لوکالیزه باشه و واسه هر سرور فرق کنه . فقط باید چک بشه که از نظر امنیتی دستور مشکل زایی توش وجود نداشته باشه.
    بدرود

    ---------- Post added at 01:56 PM ---------- Previous post was at 01:55 PM ----------

    میدونید که برای محافظت سرور از سرورها و شبکه های خارجی از firewall استفاده میشه.
    و البته در بعضی موارد نیاز به محافظت از سیستم توسط TCP Wrapper داریم.
    سوپر سرور xinetd که همراه اکثر distro ها وجود داره ( قبلا هم در موردش صحبت کردیم ) شامل یک TCP Wrapper هست که به صورت built-in در اون تعبیه شده.
    به راحتی میشه ازش برای در دسترس قرار دادن یا ندادن سرویس های شبکه ای از سرور ها و شبکه های خارج استفاده کرد.
    این tcp wrapper هم مثل سایر سرویس های لینوکسی دارای فایل هایی هست ( خوندن manual فراموش نشه )
    دو فایل که توسط این tcp wrapper مورد استفاده قرار میگیرن etc/hosts.deny/ و etc/hosts.allow/ هستند.
    حواستون باشه که hosts.allow بر hosts.deny حق تقدم داره.
    ضمنا این دو فایل قابل خوندن برای همه هستن ( اگه دوست دارید میتونید اجازه read رو بردارید )
    توصیه ای که میشه داشت ( وحی منزل نیست و بسته به سیاست سازمان میتونه فرق کنه ) اینه که اجازه ورود رو به همه ببندید و فقط اونایی که نیاز دارید رو باز بزارید.
    این چیزیه که اینجا میخوام براتون توضیح بدم :
    برای اینکه تمام دسترسی های خارجی به سرویس های شبکه ای که تحت نظر xinetd هستن رو ببندید خط زیر رو در etc/hosts.deny/ اضافه کنید.

    ALL: ALL
    حالا مثلا میخوایم اجازه بدیم host های eychenz1 و eychenz2 و eychenz3 بتونن به سرورمون ssh کنن.
    پس خطوط زیر رو به etc/hosts.allow/ اضافه میکنیم.

    sshd: eychenz1 eychenz2 eychenz3
    اگه میخواید سیستم های یه subnet خاص هم اجازه ssh داشته باشن به این ترتیب عمل کنید
    HTML کد:
    sshd: eychenz1 eychenz2 eychenz3 .subnet.example.com
    اگه میخواید تمام سیستم های یک subnet اجازه وصل شدن داشته باشن ولی فقط یه سیستم از این subnet این اجازه رو نداشته باشه به صورت زیر عمل کنید .

    ALL: .subnet.example.com EXCEPT cracker.subnet.example.com
    نسخه ای از tcp wrapper که همراه redhat میاد option های خیلی پیچیده تری نیز دارد که قابلیت های فوق العاده ای به اون میده. که از جمله اونها spawn کردن یک برنامه خارجی به tcp wrapper هست.
    توصیه میکنم حتما به داکیومنت های اون مراجعه کنید به خصوص manual های hosts_options و hosts_access رو بخونید تا تمامی قابلیت های اونو ببینید.

    ---------- Post added at 01:57 PM ---------- Previous post was at 01:56 PM ----------

    خیلی از سرویس های شبکه ای مثل telnet و rlogin و rsh نسبت به استراق سمع یا همون sniff آسیب پذیر هستند و این اصلی ترین دلیله که میریم سراغ ssh .
    default config ردهت خیلی از جوانب امنیتی رو برای ssh رعایت کرده ولی با این حال ممکنه یکی مثل شما که خواننده این پست هستی دلش بخواد یه تغییراتی تو etc/ssh/sshd_config/ بده در ردهت خودش بده.
    در پست قبلی توضیحاتی در مورد محدود کردن access از خارج دادیم و اینجا میگیم که بنا به احتیاط بیشتر بهتره که لاگین کردن توسط کاربر ارشد یا همون root رو غیرفعال کنید.

    PermitRootLogin no
    همچنین باید اطمینان داشته باشید که privilege separation فعال باشه ، در این صورت کد های دارای permission های خاص به راحتی نمیتونن از permission خودشون سو استفاده کنن.(بخشی از کد با root اجرا میشه و بخش دیگه در زندان chroot اجرا میشه)
    این بخش در ردهت های قدیمی دارای bug بود که قابل شکستن بود که در آینده در بخش denial of service توضیح کاملتری میدم.

    UsePrivilegeSeparation yes
    از اونجایی که پروتکل ورژن ۱ ssh به اندازه پروتکل ورژن ۲ ویژگی های امن سازی نداره از شماره ۲ استفاده کنید.

    Protocol 2
    همچنین توصیه میکنم port forwarding و X11 forward رو غیر فعال کنید که جلوی سواستفاده های احتمالی به عنوان پرو-کسی رو بگیرید:
    HTML کد:
    AllowTcpForwarding no
    X11Forwarding no
    یه directive هم داره که باید enable کنید و کارش اینه که مشخصات مهم از قبیل صاحب و permission بندی فایل های مهم از قبیل ssh./~ و authorized_key./~ و ... را در home directory هر کاریر چک میکنه و به محض دیدن خطا یا چیز غیر عادی از login شدن کاربر جلوگیری میکنه:

    StrictModes yes
    همچنین تمام authentication های host-based رو به صورت زیر disable کنید.

    IgnoreRhosts yes
    HostbasedAuthentication no
    RhostsRSAAuthentication no
    و بسته به سیاست گذاری سازمان اگه از sftp استفاده نمیکنید اونو غیرفعال کنید:

    #Subsystem sftp /usr/lib/misc/sftp-server
    برای اعمال همه تغییرات سرویس ssh رو restart کنید:

    /etc/init.d/sshd restart
    میتونستید مثل موردی که تو پست های قبل داشتیم به جای restart سیگنال شماره ۱ یا همون hangup signal رو برای ssh daemon بفرستید که تغییرات اعمال بشه ، در این صورت نیازی به restart کردن سرویس ssh نیست.

    ---------- Post added at 01:57 PM ---------- Previous post was at 01:57 PM ----------

    انتخاب سرویس دهنده ایمیل چیزی نیست که بشه توصیه کرد و فقط به سیایت گذاری سازمان و همچنین نیازسنجی خودتون بستگی داره و شما دارای option های زیادی برای انتخاب هستید اعم از sendmail و qmail و postfix و exim و ...
    مهمترین نکته اینه که سرورهایی که مخصوص mail server نیستند یا خاص برای relay server نیستند به هیچ عنوان نباید external email دریافت کنند ( اگه mail server هم دارند باید لوکال باشه )
    من در اینجا نمیخوام آموزش امن سازی mail server ها رو بدم ( اون خودش کلی کار داره )
    اینجا قراره سرورهای معمولی و general purpose رو امن کنیم تا از جهت mail server ضربه نخورند.
    در سیستم های امروزی لینوکس sendmail برای ارسال و دریافت نامه های داخلی کانفیگ شده و به هیچ درخواستی از خارج جواب نمیده.
    در فایل کانفیگ sendmail یا همون sendmail.cf یک خط هست که تو این خط گفته فقط به درخواست های ارسال و دریافت نامه که local هستند پاسخ داده بشه :

    O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
    حال اگه در سیستم شما چنین چیزی نیست باید مراحل زیر رو انجام بدید :
    باید پارامتر DAEMON_OPTIONS رو در فایل etc/mail/sendmail.mc/ از حالت کامنت خارج کنید ( uncomment کنید)
    سپس دستورات زیر رو به ترتیب اجرا کنید :

    # mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old
    # m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
    # /etc/init.d/sendmail restart
    سپس توسط ابزارهای نظیر telnet و یا nmap میتونید مطمئن بشید که sendmail شما به هیچ درخواست خارجی گوش نمیده و فقط به درخواست های local گوش میکنه.

    ---------- Post added at 02:01 PM ---------- Previous post was at 01:57 PM ----------

    درود
    NFS به سرور ها اجازه میده که فایل هاشونو در سطح شبکه share کنن. اما مثل سایر سرویس ها شامل خطراتی نیز هست.
    ابتدا باید به مسائل زیر توجه کنید :
    ۱. NFS نباید enable باشه اگه ازش استفاده نمیکنید.
    ۲. اگه به NFS نیاز دارید از TCP wrapper برای محدود کردن دسترسی های remote استفاده کنید.
    ۳. اطمینان حاصل کنید که فقط به ماشین هایی که قراره در NFS باشند دسترسی داده بشه.
    ۴. کاملا از domain name ها استفاده کنید تا خطرات حملات spoofing رو کاهش بدید.
    ۵. NFS رو فقط برای دایرکتوری های مورد نیاز فعال کنید.
    ۶. هر جا که میشه ، به صورت ReadOnly عمل export رو انجام بدید.
    ۷. از NFS فقط تحت پروتکل TCP استفاده کنید.
    ------------------------------------------------------------------------------------------------------
    اگه احتیاجی به file sharing ندارید از disable بودن اون اطمینان حاصل کنید.

    # service nfs status
    rpc.mountd is stopped
    nfsd is stopped
    rpc.rquotad is stopped
    # chkconfig --list nfs
    nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
    در این صورت احتمالا به سرویس portmap هم احتیاج ندارید (سرویس portmap توسط سرویس های rpc-based مثل NFS و NIS استفاده میشه)

    # service portmap status
    portmap is stopped
    # chkconfig --list portmap
    portmap 0:off 1:off 2:off 3:off 4:off 5:off 6:off
    اگه شما باید از NFS استفاده کنید با دستورات زیر در میتونید اونو راه بندازید:

    chkconfig portmap on
    chkconfig nfs on
    service portmap start
    service nfs start
    برای اینکه ببینید portmapper چه پورت هایی رو جهت سرویس های rpc-based رجیستر کرده میتونید از دستور زیر استفاده کنید که خروجیش هم می بینید:


    # rpcinfo -p <server>
    program vers proto port
    100000 2 tcp 111 portmapper
    100000 2 udp 111 portmapper
    100011 1 udp 607 rquotad
    100011 2 udp 607 rquotad
    100011 1 tcp 610 rquotad
    100011 2 tcp 610 rquotad
    100003 2 udp 2049 nfs
    100003 3 udp 2049 nfs
    100003 2 tcp 2049 nfs
    100003 3 tcp 2049 nfs
    100005 1 udp 623 mountd
    100005 1 tcp 626 mountd
    100005 2 udp 623 mountd
    100005 2 tcp 626 mountd
    100005 3 udp 623 mountd
    100005 3 tcp 626 mountd
    محدود کردن درخواست های NFS ورودی :
    همونطور که در چند پست قبلی به نام "محدود کردن سرور از دسترسی های خارجی" توضیح دادم یکی از نکات استراتژیک در سرور ها اینه که تمام دسترسی ها رو قطع کنید و فقط به host های مورد نیاز اجازه ارتباط بدهید.
    portmap و بعضی از برنامه های NFS شامل یک TCP wrapper به صورت built-in هستند. برای اینکه ببینید نسخه ای که شما دارید دارای tcp wrapper هست یا نه میتونید از دستورات زیر استفاده کنید :

    # strings /sbin/portmap | egrep "hosts.deny|hosts.allow|libwrap"
    hosts_allow_table
    hosts_deny_table
    /etc/hosts.allow
    /etc/hosts.deny
    # strings /usr/sbin/rpc.rquotad | egrep "hosts.deny|hosts.allow|libwrap"
    libwrap.so.0
    # ldd /usr/sbin/rpc.rquotad | grep libwrap
    libwrap.so.0 => /usr/lib/libwrap.so.0 (0x00874000)
    اگر hosts.allow و hosts.deny و یا libwrap نشون داده شد یعنی که یه tcp wrapper وجود داره.
    اگه هیچ کدوم از این رشته ها نشون داده نشد احتمالا اضافه کردن اسم برنامه به etc/hosts.allow/ و etc/hosts.deny/ بی فایده خواهد بود.
    حالا خودتون باید etc/hosts.deny/ رو ویرایش کنید و ALL: ALL رو توش بنویسید که تمام دسترسی های خارجی محدود بشه. (رجوع کنید به پست "محدود کردن سرور از دسترسی های خارجی" در همین thread)
    سپس از یک کامپیوتر دیگه صحت این قضیه رو تست کنید :

    # rpcinfo -p <server>
    No remote programs registered.
    برای اینکه اجازه بدید که ماشین های مورد نیاز بتونن از NFS استفاده کنند باید اونا رو توی etc/hosts.allow کانفیگ کنید.
    برای اینکه اجازه بدید درخواست های NFS بین ماشین های linux1.ashiyane.com و linux2.ashiyane.com و linux3.ashiyane.com و ساب نت subnet.ashiyane.com. رد و بدل بشه فایل etc/hosts.allow رو به صورت زیر ویرایش کنید:

    portmap: linux1.ashiyane.com linux2.ashiyane.com linux3.ashiyane.com .subnet.ashiyane.com
    rpc.mountd: linux1.ashiyane.com linux2.ashiyane.com linux3.ashiyane.com .subnet.ashiyane.com
    rpc.rquotad: linux1.ashiyane.com linux2.ashiyane.com linux3.ashiyane.com .subnet.ashiyane.com
    حال اگه از سرورهایی که trust کردید rpcinfo بزنید خروجی زیر رو میگیرید

    کد:
    # rpcinfo -p <server>
       program vers proto   port
        100000    2   tcp    111  portmapper
        100000    2   udp    111  portmapper
        100011    1   udp    607  rquotad
        100011    2   udp    607  rquotad
        100011    1   tcp    610  rquotad
        100011    2   tcp    610  rquotad
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    2   tcp   2049  nfs
        100003    3   tcp   2049  nfs
        100005    1   udp    623  mountd
        100005    1   tcp    626  mountd
        100005    2   udp    623  mountd
        100005    2   tcp    626  mountd
        100005    3   udp    623  mountd
        100005    3   tcp    626  mountd
    ولی اگه از یه سیستم که un-trusted هست این کارو انجام بدید خروجی زیر رو میگیرید:

    # rpcinfo -p <server>
    No remote programs registered
    export کردن فایل سیستم NFS\
    برای اینکه به یک کلاینت اجازه دسترسی به یک فولدر یا فایل سیستم رو بدید باید اونو تو فایل etc/exports/ کانفیگ کنید.

    /pub *.subnet.ashiyane.com(ro,sync)
    خیلی مهم هست که به کلاینت اجازه write ندید اگه واقعا نیاز نیست.
    ro به معنی readonly میباشد
    اگه اجازه write هم خواستید بدید باید از rw استفاده کنید.
    مثلا اگه بخوایم به ماشین های linux1.ashiyane.com و linux2.ashiyane.com و linux3.ashiyane.com اجازه read/write در دایرکتوری data/oracle/ بدیم به صورت زیر عمل میکنیم:

    /data/Oracle linux1.ashiyane.com(rw,sync) linux2.ashiyane.com(rw,sync) linux3.ashiyane.com(rw,sync)
    وجه داشته باشید که option ها نباید از اسم host فاصله داشته باشه.
    تمامی دایرکتوری هایی که اینجا export میشن به صورت root-squash هستن : یعنی حتی اگه کاربر ارشد ( root ) روی یک کلاینت بخواد به یک دایرکتوری دسترسی پیدا کنه اونجا permission های root رو نداره!
    دلیلش هم واضحه : چون اینجوری اگه تو یه سیستم root بشیم به راحتی میتونیم با یه نرم افزار S-permission دار در دایرکتوری share شده ، به کل سیستم sharing دسترسی پیدا کنیم.

    هنگامیکه تمام تغییرات رو در etc/exports/ انجام دادید برای export کردن دایرکتوری ها و فایل سیستم ها از دستور زیر استفاده کنید :

    # exportfs -a
    و برای un-export کردن همه اونا از دستور زیر استفاده کنید :

    # exportfs -ua
    برای اینکه تمام فایل سیستم ها و دایرکتوری های share شده رو ببینید از دستور زیر استفاده کنید :

    # showmount -e localhost
    Export list for localhost:
    /pub *.subnet.ashiyane.com
    /data/Oracle linux3.ashiyane.com,linux2.ashiyane.com,linux1.ash iyane.com
    از NFS تحت پروتکل TCP استفاده کنید :
    استفاده از NFS تحت UDP میتونه واستون دردسر ساز بشه. و احتمال سو استفاده خیلی بالا میره.
    صحبت در مورد سو استفاده هایی که میشه کرد ( اگه از UDP استفاده کرده باشید ) رو به بعد موکول میکنم.
    برای اینکه مطمئن بشید که NFS شما TCP رو support میکنه از دستور wire-test استفاده کنید.
    اگه خروجی زیر رو داد یعنی ساپورت میشه :
    HTML کد:
    # wire-test localhost
    Network 1: wire="172.16.1.0" (netnumber=172.16.1).
    Network 2: wire="172.16.1.1" (netnumber=172.16.1).
    My IP address is 0xac100101.
    NFS Version and protocol tests to host "localhost"...
    testing vers=2, proto="udp" -> found version 2.
    testing vers=3, proto="udp" -> found version 3.
    testing vers=2, proto="tcp" -> found version 2.
    testing vers=3, proto="tcp" -> found version 3.
    اگه خروجی زیر رو داد یعنی ساپورت نمیشه :
    HTML کد:
    # wire-test localhost
    Network 1: wire="172.16.1.0" (netnumber=172.16.1).
    Network 2: wire="172.16.1.1" (netnumber=172.16.1).
    My IP address is 0xac100101.
    NFS Version and protocol tests to host "localhost"...
    testing vers=2, proto="udp" -> found version 2.
    testing vers=3, proto="udp" -> found version 3.
    testing vers=2, proto="tcp" -> failed!
    testing vers=3, proto="tcp" -> failed!
    برای اینکه هنگام mount کردن از پروتکل tcp استفاده بشه باید به صورت زیر mount رو انجام بدید :

    # mount -o proto=tcp <nfs_server_name>:/pub /usr/local/pub
    برای verify کردن این قضیه میتونید از دستور mount استفاده کنید :

    # mount
    ...
    nfsserver:/pub on /usr/local/pub type nfs (rw,proto=tcp,addr=172.16.10.8)
    ...
    برای اینکه یه دایرکتوری رو هنگام بوت کردن mount کنید میتونید اونو تو etc/fstab/ قرار بدید:

    nfsserver:/pub /usr/local/pub nfs rsize=8192,wsize=8192,timeo=14,intr,tcp 0 0

    ---------- Post added at 02:03 PM ---------- Previous post was at 02:01 PM ----------

    تنظیم برخی از پارامترهای امنیتی کرنل
    در ادامه به لیستی از پارامترهای قابل تنظیم کرنل میرسیم که برای امنیت بیشتر میتونید اونا رو تنظیم کنید ( با توجه به سیاست گذاری سازمانتون )
    برای هرمورد چیزی که باید تو فایل etc/sysctl.conf/ باید edit یا add بشه رو میگم.
    برای اعمال تغییرات میتونید reboot کنید ولی میتونید با دستور زیر هم تغییرات رو بلافاصله اعمال کنید (شاهکاره لینوکسه ها که بدون reboot مبشه یه پارامتر توی کرنل سیستم عامل رو تغییر داد)

    sysctl -p
    فعال سازی TCP SYN Cookie Protection
    حملات syn از نوع حملات Denial Of Service هستند که تمام منابع سیستم رو مشغول میکنند. هر سروری که به شبکه متصل هست میتونه حدف اینجور حملات باشه. برای فعال کردن این protection خط زیر رو تو فایل etc/sysctl.conf/ ویرایش کنید :

    net.ipv4.tcp_syncookies = 1
    غیر فعال کردن IP Source Routing
    source routing برای مشخص کردن مسیر routing بین مبدا و مقصد استفاده میشه. ازش برای چک کردن صحت و سلامت شبکه استفاده میشه. ولی اگه نفوذگر قادر به فرستادن source routed packet باشه میتونه جلوی reply های سرور رو بگیره و در این صورت دیگه سرور نمیفهمه که آیا client مورد نظر trusted هست یا نه ! برای غیرفعال کردنش تو فایل etc/sysctl.conf/ خط زیر رو ویرایش کنید :

    net.ipv4.conf.all.accept_source_route = 0
    غیرفعال کردن ICMP Redirect Acceptance
    این feature توسط روترها استفاده میشه برای اینکه به سرور بگن راهی بهتر از راهی که خود سرور انتخاب کرده وجود داره.
    نفوذگر میتونه با ایجاد ترافیک زیاد از این ویژگی برای عوض کردن route table های سرور استفاده کنه و مسیر ارسال packet ها رو به سمتی که شما نمیخواید و اون میخواد منحرف کنه. برای غیر فعال کردنش خط زیر رو ویرایش کنید :

    net.ipv4.conf.all.accept_redirects = 0
    فعال کردن IP Spoofing Protection
    دیگه نیازی به توضیح نیست ! اگه این ویژگی رو فعال نکنید سرورشما میتونه هدف خوبی برای DOS از طریق ip-spoofing باشه. برای اطلاعات بیشتر در مورد ip-spoofing به اینجا مراجعه کنید . برای فعال کردن این protection خط زیر رو ویرایش کنید :

    net.ipv4.conf.all.rp_****** = 1
    فعال سازی Ignoring to ICMP Requests
    اگه میخواید سرورتون به ping پاسخ نده اینو enable کنید. در این صورت اسکنرهای زیادی من جمله nmap به صورت پیش فرض نمیتونن سرور شما رو scan کنند مگر اینکه از p0- استفاده کنند ( یعنی شروع اسکن بدون پینگ ) :
    HTML کد:
    net.ipv4.icmp_echo_ignore_all = 1
    فعال سازی Ignoring Broadcasts Request
    اگه میخواید سرورتون به broadcast ها توجه نکنه اینو enable کنید . باعث میشه خیلی از sniffer ها نتونند تو شبکه محلی کارشون رو درست انجام بدن :

    فعال سازی Bad Error Message Protection
    اگه میخواید هر error که تو شبکه به وجود میاد توسط لینوکستون به شما alert داده بشه این feature رو فعال کنید :

    net.ipv4.icmp_ignore_bogus_error_responses = 1
    فعال سازی Logging ...
    فعال کردن این feature باعث log شدن اتفاقات زیر میشه که تک تکشون رو بالاتر توضیح دادم
    spoofed packets - source routed packets - redirect packets

    net.ipv4.conf.all.log_martians = 1
    برای اطلاعات بیشتر در مورد پارامترهای قابل تنظیم کرنل برای شبکه به اینجا مراجعه کنید.

    ---------- Post added at 02:04 PM ---------- Previous post was at 02:03 PM ----------

    منبع : Ashiyane.org

  2. تعداد تشکر ها از4cheshmi به دلیل پست مفید


  3. # ADS




     

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •