سعید خلیفی
متخصص سرویس های مایکروسافت

SMB CIFS چیست و چگونه آن را امن کنیم؟

همه شما که به نحوی با شبکه های کامپیوتری سروکار دارید، حتما برایتان پیش آمده که فایل ، فولدر و یا پرینتری را به اشتراک بگذارید. یا اینکه نرم افزاری اجرا کنید که تحت شبکه کار میکند. حتما در Share های پیش فرض کامپیوتر خود، با $IPC برخورد کرده اید. آیا تا به حال به این فکر کرده اید که ویندوز چگونه و با استفاده از چه سرویس یا پروتکلی، فایل ها و فولدر های شما را به اشتراک میگذارد؟ یا از خود پرسیده اید که $IPC چیست و چه کاری انجام میدهد؟جواب این پرسش ها در پروتکلی به نام SMB نهفته است.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

SMB چیست؟

در شبکه های کامپیوتری، (SMB (Server Message Block که به آن (CIFS (Common Internet File System نیز گفته می شود، به عنوان یک پروتکل لایه 7 (Application Layer) بیشتر برای فراهم کردن دسترسی به فایل ها، پرینترها و پورت های سریال به اشتراک گذاشته شده، و ارتباطات گوناگون بین دستگاه های داخل شبکه عمل می کند. SMB همچنین یک مکانیزم IPC احراز هویت شده (Authenticated Inter-Process Communication) را فراهم می کند.اغلب استفاده SMB شامل سیستم عامل های مایکروسافتی می شود. (قبل از معرفی پیاپی نسخه های Active Directory، شبکه های مایکروسافتی به Microsoft Windows Network شناخته می شدند). سرویس های ویندوزی مربوط به SMB، سرویس "Server Service" برای بخش سرور و "Workstation Service" برای بخش کلاینت می باشد. پروتکل Server Message Block می تواند با لایه Session (ولایه های پایین تر) به راه های گوناگونی فعالیت کند:

  • مستقیما روی پورت 445 TCP
  • از طریق API مربوط به NetBIOS، که در نتیجه می تواند روی چند پروتکل لایه Transport نیز فعالیت کند.
  • روی پورتهای( UDP 137,138 و TCP 137,139 (NetBIOS over TCP/IP
  • روی چند پروتکل قدیمی مانند NBF (که به آن به اشتباه NetBEUI اطلاق میشود)

روش های پیاده سازی SMB

1- روش کلاینت - سرور

SMB از طریق روش کلاینت - سرور، طوری که کلاینت درخواست های معینی ارسال می کند و سرور به آنها پاسخ می دهد، عمل می کند. یک قسمتی از پروتکل SMB صریحا به دسترسی به File System رسیدگی می کند (به طوری که کلاینت ها درخواست هایی را برای File Server ارسال می کنند)، اما قسمت های دیگر پروتکل SMB به IPC اختصاص دارند. IPC Share یا همان $IPC یک Share شبکه ای روی کامپیوترهای ویندوزی می باشد. از این Share مجازی به منظور سهولت ارتباط بین پردازش ها و کامپیوترها از روی پروتکل SMB (اغلب برای رد و بدل کردن اطلاعات بین کامپیوترهایی که احراز هویت شده اند) استفاده می شود.

سازندگان و توسعه دهندگان نرم افزاری پروتکل SMB را برای استفاده شبکه محلی (Local Subnet) بهینه کرده اند، اما کاربران پروتکل SMB را برای دسترسی به شبکه های مختلف درون اینترنت نیز به کار گرفته اند (Exploit های مربوط به اشتراک فایل و پرینتر در محیط ویندوز معمولا روی این کاربرد متمرکز میشوند) سرور های SMB، Files System و دیگر منابع خود را در دسترس کلاینت های شبکه قرار می دهند. کامپیوتر های کلاینت ممکن است نیاز به دسترسی به File System ها و پرینتر های به اشتراک گذاشته شده روی سرور داشته باشند،

و در این کاربرد مقدماتی و اولیه، SMB به عنوان مشهور ترین و پر کاربردترین شناخته شده است. به هر حال، جنبه سرورگونه SMB بدون بسته پروتکل های مبتنی بر دامین های NT (که حداقل کار آنها، فراهم کردن احراز هویت تحت دامین های بر پایه NT میباشد) چندان کاربردی ندارد. تقریبا تمامی سرور های SMB از احراز هویت دامین های NT برای تائید سطح دسترسی کاربر به منابع استفاده میکنند.

2- Samba

یک نرم افزار رایگان با هسته پروتکل SMB/CIFS است که اولین بار توسط Andrew Tridgell ایجاد گردید. از نسخه 3 و پس از آن، SAMBA سرویس های فایل و پرینت را برای کلاینت ویندوز فراهم کرده و میتواند با سرور دامین مبتنی بر Windows NT 4.0، به عنوان دامین کنترلر اصلی (PDC) یا به عنوان عضو دامین (Domain Member)، ادغام شود. نسخه Samba4 می تواند به عنوان دامین کنترلر اکتیو دایرکتوری و یا عضوی از دامین روی Functional Level های دامین و فارست وینذوز 2008 (Windows 2008 domain & forest Functional Level) عمل نماید.

مشکلات اجرایی

1- مشکلات NetBIOS

استفاده از پروتکل SMB اغلب هماهنگی نزدیکی با افزایش قابل توجه ترافیک برادکست (Broadcast Traffic) روی شبکه داشته است. با این حال SMB خود از Broadcast استفاده نمی کند (مشکلات Broadcast مربوط به SMB، غالبا ناشی از سرویس NetBIOS Service Location Protocol می باشند). به صورت پیش فرض، یک سرور مبتنی بر Windows NT 4.0 از NetBIOS برای تبلیغ و پیدا کردن سرویس ها استفاده می کرد. NetBIOS از طریق برادکست کردن سرویس های موجود روی یک کامپیوتر مشخص در دوره زمانی های معین، کار میکند. در حالی که این ساختار برای شبکه های کوچک به عنوان پیش فرض قابل قبول است، با بزرگ تر شدن شبکه بالا رفتن ترافیک برادکست مشکل ساز خواهد بود.

پیاده سازی ساختار تحلیل اسم (Name Resolution) به شکل WINS یا DNS این مشکل را برطرف میکند. WINS یک پیاده سازی اختصاصی روی شبکه های ویندوز NT 4.0 بود که مشکلات و پیچیدگی های خود را در طراحی و نگه داری شبکه های مایکروسافتی به همراه داشت.پس از عرضه Windows 2000، استفاده از WINS توسط مایکروسافت برای تحلیل اسم، بد و نابجا دانسته شده است (با توجه به ساختار زنجیره ای Dynamic DNS که اکنون به عنوان پروتکل تحلیل اسم پیش فرض برای تمامی سیستم عامل های ویندوز مورد استفاده قرار میگیرد).

DNS برای تحلیل اسم های NetBIOS،توسط کلاینت DNS آنها را بسط میدهد (معمولا با اضافه کردن پسوند DNS مرتبط با آن کانکشن (Connection Specific DNS Suffix) به درخاست های جستجوی DNS این کار را انجام میدهد).WINS همچنان میتواند به عنوان پروتکل تحلیل اسم ثانویه و جانشین، برای سازگاری با محیط های ویندوزها و نرم افزارهای قدیمی، مورد استفاده قرار بگیرد. به علاوه، سرورهای DNS مایکروسافتی میتوانند درخواست های WINS که از ویندوزهای قدیمی تر از Windows 2000 که از DNS پشتیبانی نمیکنند، دریافت میکنند را به سرورهای WINS بفرستند.

2- مشکلات اجرایی WAN

طراحان شبکه پی برده اند که تاخیر شبکه (Latency)، تاثیر زیادی روی کارایی پروتکل SMB 1.0 دارد، به طوری در شبکه با تاخیر بالا، پروتکل SMB ضعیف تر از پروتکل های دیگری مانند FTP عمل میکند. برای مثال یک ارتباط VPN روی اینترنت، اغلب تاخیر شبکه ای (Latency) به وجود می آورد. مایکروسافت علت این امر را در ساختار نسخه 1 این پروتکل دانسته که به گفته مایکروسافت، برای شبکه های محلی کوچک طراحی شده است. راه حل های ارائه شده برای این مشکل شامل استفاده از نسخه 2 این پروتکل، فایل های آفلاین (Offline Files)، تغییر مقیاس پنجره TCP (TCP Window Scaling)، و دستگاه های شتاب دهنده WAN از سازندگان سخت افزار که میتوانند SMB 1.0 و SMB 2.0 را بهینه کنند.

امنیت در SMB

روش اول: SMB Signing

در Windows NT 4.0 با سرویس پک 3 و بعد از آن، قابلیت استفاده از سیستم رمزنگاری (Cryptography) برای امضا کردن دیجیتالی (Sign) ارتباط های SMB ارائه گردید. رسمی ترین اصطلاح استفاده شده برای این سیستم، SMB Signing می باشد، گرچه اصطلاحات دیگری مانند SMB Security Signatures، SMB Sequence Numbers، و SMB Message Signing نیز به این سیستم اطلاق میشود.SMB Signing را میتوان به طور جداگانه برای ارتباط های ورودی (که توسط سرویس LanManServer کنترل میشود) یا برای ارتباط های خروجی (که توسط سرویس LanManWorkstation کنترل میشود) اعمال کرد.بهترین راه اعمال کردن SMB Signing از طریق Group Policy میباشد، گرجه میتوان از طریق Registry نیز آن را اعمال کرد.

به صورت پیش فرض، SMB Signing روی Domain Controller ها در حالت فعال و Enabled قرار دارد. اما این تنظیم . روی کلاینت های SMB 1.0 در حالت غیر مورد نیاز (Not Required) و روی سرور های SMB 1.0 در حالت غیر فعال (Disabled) قرار دارد. بخش تنظیمات در SMB 2 ساده تر شدند. گزینه های "Enabled" و "Disabled" دیگر وجود ندارند و شما فقط مشخص میکنید که SMB Signing مورد نیاز و یا غیر مورد نیاز (Required or Not Required) است. باز هم تنظیم پیش فرض برای Domain Controller ها، مورد نیاز (Required) است. برای دیگر سرورها و کلاینت های SMB 2، پیش فرض روی تنظیم غیر مورد نیاز (Not Required) میباشد.

1- اعمال تغییرات از طریق Group Policy

اگر این کار را به صورت Local انجام میدهید، در قسمت Run عبارت gpedit.msc را تایپ کرده و Enter را فشار دهید. همچنین میتوان از دستور میانبر secpol.msc در قسمت Run نیز استفاده کرد.در غیر این صورت روی دامین کنترلر به Group Policy رفته و به شاخه زیر بروید:

Computer Configuration | Windows Settings | Security Settings | Local Policies | Security Options

در قسمت سمت راست صفحه، بخش تنظیمات "Microsoft Network Client" را پیدا کنید. Policy های زیر را در این بخش مشاهده میکنید:

•	Digitally sign communications (always)
•	Digitally sign communications (if server agrees)
•	Send unencrypted password to third-party SMB servers
وب سایت توسینسو

شما همچنین Policy های مشابهی در بخش تنظیمات "Microsoft Network Server" پیدا خواهید کرد.سیستم عامل ویندوز شامل هر 2 بخش سرور SMB و کلاینت SMB میباشد، و این 2 بخش به صورت مجزا تنظیم میشوند. بنابراین یک کامپیوتر میتواند تنظیم Required روی SMB Signing را زمانی که به عنوان سرور SMB و نه به عنوان کلاینت SMB عمل میکند (و بالعکس)، داشته باشد.مشاهده میکنید که تنظیم Digitally Sign Communications (if the server agrees) در قسمت Microsoft Windows Client روی حالت Enabled قرار دارد، در حالی که 2 تنظیم دیگر روی حالت Disabled قرار دارند.

اگر Policy مربوط به Digitally Sign Communications (Always) را روی حالت Enabled قرار دهید، آنگاه کلاینت فقط SMB Packet Signing را میپذیرد و از ارتباط با سروری که از SMB Signing پشتیبانی نکند، امتناع میکند.زمانی که سرور SMB غیر مایکروسافتی در شبکه دارید که از Password های کدگذاری شده (Encrypted Password) در هنگام احراز هویت (Authentication) پشتیبانی نمیکند، آنگاه میتوانید از تنظیم Send unencrypted password to third-party SMB server استفاده کنید که کلاینت های ویندوزی SMB شما را قادر به ارتباط با سرور مذکور میسازد. با کمی دقت مشاهده میکنید که این Policy در قسمت Windows Network Server وجود ندارد. بدون شک ارسال Password ها در حالت کدگذاری نشده ، خطر امنیتی بزرگی را معرفی میکند. بهتر آن است که این Policy را در حالت Disabled قرار دهید، مگر آنکه واقعا به آن نیاز دارید.

2- اعمال تغییرات از طریق Registry

برای کلاینت SMB به قسمت زیر بروید:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanWorkStation

برای سرور SMB به قسمت زیر بروید:

HKEYLOCALMACHINE\System\CurrentControlSet\Services\LanmanServer
وب سایت توسینسو

حالا یک کلید به ارزش DWORD با نام " RequireSecuritySignature" ایجاد کرده و مقدار آن را به 1 تغییر دهید.

روش دوم : بستن Administrative Share ها و جلوگیری از Null Session Enumeration

نحوه بستن Administrative Share ها به علاوه توضیحات دیگر را در مقاله قبلی ارائه دادم. اما برای جلوگیری از Null Session Enumeration (به ارتباطی که با IPC$، بدون نام و بدون فراهم کردن نام کاربری و گذرواژه انجام شده باشد، Null Session گفته میشود)، میتوان از طریق Registry اقدام کرد. در Registry به شاخه زیر بروید:

وب سایت توسینسو
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa

اکنون یک کلید به ارزش DWORD با نام " RestrictAnonymous" اجاد کرده و مقدار آن را به 1 تغییر دهید. در صورتی که این کلید از قبل وجود داشت، فقط مقدار آن را به 1 تغییر دهید.

روش سوم : Disable کردن NetBIOS over TCP/IP

از آنجایی که Null Session ها از مشکل امنیتی NetBIOS استفاده می کنند، برای امنیت بیشتر میتوان NetBIOS over TCP/IP را غیر فعال کرد. (در صورتی که از سیستم عامل ها و یا نرم افزارهای قدیمی تری که نیاز به NetBIOS دارند، استفاده نمیکنید) توجه نمایید که این کار باعث میشود که کامپیوترهای ویندوزی نتوانند با سیستم عامل های قدیمی تر، از طریق ترافیک SMB ارتباط برقرار کنند.برای این منظور مراحل زیر را انجام دهید:

به قسمت Network an Dial-up Connection بروید. روی Local Area Connection، راست کلیک کرده و گزینه Properties را انتخاب نمایید. روی Internet Protocol (TCPIP) v4 کلیک کرده و گزینه Properties را انتخاب نمایید. روی گزینه Advanced کلیک کنید. به قسمت WINS رفته و در نهایت گزینه Disable NetBIOS over TCPIP را انتخاب کنید. همچنین میتوان تنظیمات فوق را روی DHCP انجام داد تا به همه کلاینت ها به طور یکجا اعمال شوند.

وب سایت توسینسو

روش چهارم : استفاده از Firewall و بستن پورت های مربوط به NetBIOS over TCP/IP

یکی از بهترین راه های امن کردن SMB، استفاده از Firewall برای جلوگیری از Null Session Enumeration و بستن پورت های NetBIOS over TCPIP میباشد. پورت های زیر مربوط به NetBIOS over TCPIP میباشند:

netbios-ns	137/tcp				# NETBIOS Name Service
netbios-ns	137/udp
netbios-dgm	138/tcp				# NETBIOS Datagram Service
netbios-dgm	138/udp
netbios-ssn	139/tcp				# NETBIOS session service
netbios-ssn	139/udp

روش پنجم: SMB Encryption

مایکروسافت تعدادی پیشرفت امنیتی در SMB 3.0 روی Windows 8 و Windows Server 2012 را معرفی کرد. یک الگوریتم جدید برای SMB Signing استفاده میشود. SMB 3.0 در ویندوز 8 و سرور 2012 امکان کدگذاری کردن ترافیک SMB در حال انتقال، با هزینه ای به مراتب پایین تر از راه حل های کدگذاری ترافیک در حال انتقال مانند IPSec، را دارد. کدگذاری شدن ترافیک در حال انتقال از تلاش های هک مانند استراق سمع (Eavesdropping) جلوگیری میکند. در Windows Server 2012، شما میتوانید SMB Encryption را برای Share هایی که میخواهید، به شیوه زیر انجام دهید:

وب سایت توسینسو
  1. Server Manager را باز کرده و به قسمت File and Storage Services بروید.
  2. روی Shares در سمت چپ کلیک کنید.
  3. در بخش وسط، آن Share که میخواهید SMB Encryption روی آن اعمال شود را انتخاب کنید و روی آن راست کلیک کنید.
  4. از پنجره ظاهر شده، Properties را انتخاب نمایید.
  5. در پنجره Share Properties، گزینه Settings را انتخاب نموده و سپس گزینه Encrypt Data Access را انتخاب نمایید.
  6. روی Ok کلیک نمایید.
وب سایت توسینسو

روش دیگر برای فعال کردن SMB Encryption روی یک Share، استفاده از PowerShell میباشد. برای این منظور، عبارت زیر را تایپ کنید:

Set-SmbShare –Name <sharename> -EncryptData $true

شما همچنین میتوانید از PowerShell برای فعال کردن SMB Encryption روی همه Share ها روی سرور از عبارت زیر استفاده کنید:

Set-SmbServerConfiguration –EncryptData $true

اگر SMB Encryption را برای تمامی Share های روی سرور فعال کنید، Checkbox کنار Encrypt Data Access کنار Share ها به صورت انتخاب شده و خاکستری (Grayed Out) خواهد بود که این Share ها به صورت مجزا قابل تنظیم نخواهند بود.اگر SMB Encryption را برای Share به خصوصی فعال کنید، سیستم عامل های کلاینتی که از SMB 3.0 پشتیبانی نمیکنند، قادر به دسترسی به Share مذکور نخواهند بود. مگر اینکه شما دسترسی کدگذاری نشده (Unencrypted Access) را به آن کامپیوتر به خصوص اجازه دهید. برای این کار، عبارت زیر را در PowerShell تایپ نمایید:

Set-SmbServerConfiguration –RejectUnencryptedAccess $false

روش ششم : مذاکره گویشی یا Dialect Negotiation

نسخه های گوناگون پروتکل SMB با گویش ها (Dialect) های مختلفی صحبت میکنند. زمانی که یک ارتباط SMB به وجود می آید، کلاینت و سرور با هم مذاکره میکنند تا بالاترین سطح گویش که هر 2 از آن پشتیبانی میکنند را انتخاب کنند. این بدین گونه انجام میشود که کلاینت یک پیام negprot به همراه لیستی از گویش هایی که پشتیبانی میکند را به سرور میفرستد. سرور به کلاینت پاسخ میدهد که کلاینت متوجه شود از چه گویشی استفاده کند.یک پیشرفت امنیتی در ویندوز 8 و ویندوز سرور 2012، تلاش های نفوذی برای پایین آوردن سطح گویش را شناسایی میکند. اگر چنین تلاشی شناسایی شود، ویندوز ارتباط SMB را قطع کرده و این اتفاق را گزارش (Log) میکند.

روش هفتم: غیر فعال کردن SMB 1.0

برای بالا بردن امنیت میتوان SMB 1.0 را غیرفعال کرد.این کار را زمانی انجام دهید که کامپیوتر Windows XP و پایین تر که نیاز به ارتباط با سرور SMB دارند، یا دستگاه های جانبی که از طریق SMB 1.0 ارتباط برقرار میکنند، در شبکه خود ندارید. برای این منظور، عبارت زیر را در PowerShell تایپ کنید:

Set-SmbServerConfiguration –EnableSMB1Protocol $false

در این مقاله تلاش کردم که راه های اصلی و حیاتی برای بالا بردن امنیت SMB را ارائه کنم. برای مطالعه در مورد $IPC و مطالب مرتبط با Pipeline و Null Session Enumeration، لطفا به مقاله قبلی در لینک زیر مراجعه فرمایید:


نظرات