Product SiteDocumentation Site

11.4. مخدم الملفات NFS

NFS ‏(Network File System) هو بروتوكول يسمح بالوصول البعيد لنظم الملفات عبر الشبكة. تستطيع جميع نظم يونكس العمل مع هذا البروتوكول؛ لكن إذا دخلت نظم ويندوز على الصورة فلا بدَّ من استخدام Samba بدلاً منه.
NFS أداة مفيدة جداً، لكن يجب عدم نسيان عيوبه أبداً، خصوصاً في المجالات الأمنية: حيث تنتقل جميع البيانات عبر الشبكة دون تشفير (أي تستطيع برامج التقاط الرزم sniffers اعتراضها)؛ كما يعتمد المخدم على عنوان IP للعميل عند فرض قيود الوصول (وهذا يمكن تزويره)؛ وأخيراً، عندما يمنح العميل صلاحية الوصول لمشاركة NFS إعدادها سيء، سيتمكن العميل من استخدام حساب الجذر الخاص به للوصول لجميع الملفات على المشاركة (حتى الملفات التي تنتمي للمستخدمين الآخرين) بما أن المخدم يثق باسم المستخدم الذي يتلقاه من العميل (هذا قصور تاريخي في البروتوكول).

11.4.1. تأمين NFS

بما أن NFS يثق بالمعلومات التي يستقبلها من الشبكة، فلا بد أن نضمن أن الأجهزة التي يسمح لها باستخدامه وحدها فقط تستطيع الاتصال بمخدمات RPC المتنوعة التي نحتاجها. يجب أن يمنع الجدار الناري أيضاً تزوير عناوين IP ‏(IP spoofing) بحيث لا يسمح لأي جهاز خارجي أن ينتحل شخصية جهاز داخلي، ويجب حصر الوصول إلى المنافذ المناسبة بالأجهزة التي يسمح لها بالوصول لمشاركات NFS.
قد يحتاج مخدم NFC لخدمات RPC أخرى ليعمل بشكل مثالي، منها rpc.mountd، وrpc.statd وlockd. لكن هذه الخدمات تستخدم منافذ عشوائية (يعينها portmapper) افتراضياً، وهذا يجعل ترشيح حركة الشبكة التي تستهدف هذه الخدمات أصعب. لقد عثر مديرو النظم في شركة فلكوت على حل للالتفاف حول هذه المشكلة، كما سنشرح فيما يلي.
الخدمتان المذكورتان أولاً أعلاه تقدمهما برامج من ساحة المستخدم، يشغلها السكربتان /etc/init.d/nfs-kernel-server و/etc/init.d/nfs-common على الترتيب. وهما يقدمان خيارات إعداد لتثبيت المنافذ؛ الملفان اللذان يجب تعديلها حتى تُستخدَم هذه الخيارات دوماً هما /etc/default/nfs-kernel-server و/etc/default/nfs-common.

مثال 11.22. الملف /etc/default/nfs-kernel-server

# Number of servers to start up
RPCNFSDCOUNT=8

# Runtime priority of server (see nice(1))
RPCNFSDPRIORITY=0

# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information, 
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 2048"

# Do you want to start the svcgssd daemon? It is only required for Kerberos
# exports. Valid alternatives are "yes" and "no"; the default is "no".
NEED_SVCGSSD=

# Options for rpc.svcgssd.
RPCSVCGSSDOPTS=

مثال 11.23. الملف /etc/default/nfs-common

# If you do not set values for the NEED_ options, they will be attempted
# autodetected; this should be sufficient for most people. Valid alternatives
# for the NEED_ options are "yes" and "no".

# Do you want to start the statd daemon? It is not needed for NFSv4.
NEED_STATD=

# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 2046 --outgoing-port 2047"

# Do you want to start the idmapd daemon? It is only needed for NFSv4.
NEED_IDMAPD=

# Do you want to start the gssd daemon? It is required for Kerberos mounts.
NEED_GSSD=
بعد إجراء هذه التغييرات وإعادة تشغيل الخدمات، سيستخدم rpc.mountd المنفذ 2048؛ أما rpc.statd فينصت للمنفذ 2046 ويستخدم المنفذ 2047 للاتصالات الصادرة.
يتولى خيط نواة (عملية خفيفة، kernel thread) الخدمة lockd؛ هذه الميزة مبنية كوحدة في نَوَى دبيان. تملك الوحدة خيارين يسمحان باختيار المنفذ نفسه دوماً، nlm_udpport وnlm_tcpport. حتى تُستخدَم هذه الخيارات آلياً، يجب إضافة ملف بالاسم /etc/modprobe.d/lockd يشبه التالي:

مثال 11.24. الملف /etc/modprobe.d/lockd

options lockd nlm_udpport=2045 nlm_tcpport=2045
بعد ضبط هذه البارمترات، يصبح التحكم بالوصول لخدمة NFS من الجدار الناري بطريقة دقيقة أسهل عبر ترشيح الوصول للمنفذ 111 والمنافذ من 2045 حتى 2049 (على UDP أو TCP معاً).

11.4.2. مخدم NFS

مخدم NFS جزء من النواة لينكس؛ وهو مبني كوحدة في النَوَى التي تقدمها دبيان. إذا كان هناك رغبة بتشغيل مخدم NFS تلقائياً عند الإقلاع، يجب تثبيت الحزمة nfs-kernel-server؛ فهي تحوي سكربتات بدء التشغيل المناسبة.
يسرد ملف إعداد مخدم NFS، ‏/etc/exports،المجلدات التي سيوفرها على الشبكة (المجلدات المُصدّرة exported). بالنسبة لكل مشاركة NFS، تمنح صلاحيات الوصول فقط للأجهزة المذكورة بجوارها. يمكن التحكم بالوصول بدقة أكبر باستخدام بضعة خيارات. صيغة الملف بسيطة جداً:
/directory/to/share machine1(option1,option2,...) machine2(...) ...
يمكن التعرف على الأجهزة باسم DNS أو بعنوان IP الخاص بها. كما يمكن تحديد مجموعات من الأجهزة باستخدام صيغة مثل *.falcot.com أو مجال من عناوين IP مثل 192.168.0.0/255.255.255.0 أو 192.168.0.0/24.
تُصدّر المجلدات في وضع القراءة فقط افتراضياً (أو باستخدام الخيار ro). يمنح الخيار rw صلاحيات القراءة والكتابة. يتصل عملاء NFS نموذجياً من منفذ مخصص للمستخدم الجذر (أي أنه أقل من 1024)؛ يمكن رفع هذا القيد باستخدام الخيار insecure (الخيار secure ضمني، لكن يمكن كتابته صراحة للتوضيح إذا اقتضت الحاجة).
افتراضياً، يجيب المخدم فقط على طلبات NFS بعد إتمام العملية على القرص (الخيار sync)؛ لكن يمكن تعطيل هذا بالخيار async. تزيد عمليات الكتابة غير المتزامنة الأداء قليلاً، لكنها تخفض الموثوقية بسبب احتمال خسارة البيانات إذا انهار المخدم في الفترة ما بين إرسال تأكيد الكتابة وبين إنهاء الكتابة الفعلية على القرص. بما أن القيمة الافتراضية تغيرت مؤخراً (مقارنة بالقيمة التاريخية في NFS)، يُفضّل استخدام خيار صريح.
يعتبر المخدم جميع الطلبات التي تبدو أنها واردة من المستخدم الجذر على أنها ترد من المستخدم nobody، وذلك في سبيل عدم منح صلاحيات الجذر على نظام الملفات لأي عميل NFS. هذا السلوك يوافق الخيار root_squash، وهو مُفعّل افتراضياً. أما الخيار no_root_squash، الذي يُعطّل هذا السلوك، فهو خطر ويجب استخدامه فقط في البيئات المسيطر عليها. يسمح الخياران anonuid=uid وanongid=gid بتحديد مستخدم زائف آخر لاستخدامه بدلاً من UID/GID 65534 (التي توافق المستخدم nobody والمجموعة nogroup).
هناك خيارات أخرى متاحة؛ وهي موثّقة في صفحة الدليل exports(5)‎.

11.4.3. عميل NFS

كما في نظم الملفات الأخرى، يجب ربط (mount) مشاركات NFS في شجرة ملفات النظام لمدجها معها. بما أن نظام الملفات هذا له خصوصياته، فقد أضيفت بعض التعديلات على صيغة الأمر mount والملف /etc/fstab.

مثال 11.25. الربط اليدوي باستخدام الأمر mount

# mount -t nfs -o rw,nosuid arrakis.internal.falcot.com:/srv/shared /shared

مثال 11.26. مدخلة NFS في الملف /etc/fstab

arrakis.internal.falcot.com:/srv/shared /shared nfs rw,nosuid 0 0
تعمل المدخلة المبينة أعلاه على ربط مجلد NFS ‏/srv/shared/ من المخدم arrakis مع المجلد المحلي /shared/ عند إقلاع النظام. صلاحيات الكتابة والقراءة مطلوبة (ولذلك استخدم الخيار rw). أما الخيار nosuid فهو للحماية حيث يزيل بتات setuid أو setgid من البرامج المخزّنة على المشاركة. إذا كان القصد من مشاركة NFS تخزين المستندات فقط، فهناك خيار آخر ننصح به هو noexec، الذي يمنع تنفيذ البرامج المُخزَّنة على المشاركة.
تشرح صفحة الدليل nfs(5)‎ ‎جميع الخيارات بشيء من التفصيل.