بروتوكول نقل الملفات FTP (اختصار للعبارة File Transfer Protocol) هو بروتوكول شبكي كان شائعًا جدًا فيما قد سلف لنقل الملفات بين الخادوم والعميل، لكن استبدلته الطرائق الأكثر أمانًا وسرعةً لنقل الملفات، فكثيرٌ من مستخدمي الإنترنت يتوقعون تنزيل الملفات مباشرةً من متصفح الويب عبر بروتوكول http (أو https)، أما مستخدمي سطر الأوامر فيستعملون بروتوكولات أكثر أمانًا مثل scp
أو sFTP.
لكن ما يزال بروتوكول FTP مستخدمًا في التطبيقات القديمة أو للحالات التي لها متطلبات خاصة، فلو كنتَ تستطيع اختيار ما هو البروتوكول الذي ستستخدمه، فأنصحك بالنظر في بقية الخيارات الحديثة؛ لكن إذا كنت تحتاج إلى استخدام FTP فخادوم vsftpd هو خيارٌ ممتازٌ إذ إنَّ أداءه ممتاز وآمن ومستقر، ويوفِّر قدرًا كبيرًا من الحماية ضد كثيرٍ من المشاكل الأمنية الموجودة في خودايم FTP الأخرى، إضافةً إلى أنه الخادوم الافتراضي لخدمة FTP للعديد من توزيعات لينكس.
سنتعلم في هذا الدرس كيفية ضبط خادوم vsftpd للسماح للمستخدمين برفع ملفاتهم إلى مجلد المنزل الخاص بهم باستخدام بروتوكول FTP مع تأمين معلومات الدخول عبر تشفير SSL/TLS.
المتطلبات المسبقة
-
خادوم أوبنتو 16.04 مع وصول إلى مستخدم يملك امتيازات الجذر عبر الأمر
sudo
: إذ سنُطبِّق الأوامر المذكورة في هذا الدرس عبر مستخدمٍ ليس جذرًا لكنه يمتلك امتيازات الجذر عبر الأمرsudo
. يمكنك إنشاء مستخدم له امتيازات الجذر باستخدام الأمرsudo
باتباع درس «الإعداد الابتدائي لخادوم أوبنتو 14.04](https://academy.hsoub.com/devops/servers/الإعداد-الابتدائي-لخادوم-أوبنتو-1404-r4/)».
يمكننا أن نبدأ بتطبيق هذا الدرس بعد أن يكون الخادوم جاهزًا.
الخطوة الأولى: تثبيت vsftpd
سنبدأ بتحديث فهرس الحزم في خادومنا ثم تثبيت خادوم vsftpd:
sudo apt-get update sudo apt-get install vsftpd
عند إكمال التثبيت، فسننسخ ملف الضبط الافتراضي لنأخذ نسخةً احتياطيةً منه، ولنعدِّل الضبط كما نشاء.
sudo cp /etc/vsftpd.conf{,.orig}
بعد أن أخذنا نسخةً احتياطيةً من ملف الضبط، فحان الوقت الآن لإعداد الجدار الناري.
الخطوة الثانية: فتح المنافذ الضرورية في الجدار الناري
سنتحقق أولًا من حالة الجدار الناري لنرى إن كان مفعلًا أم لا، فإذا كان مفعلًا فعلينا السماح باتصالات FTP عبره لكي لا نواجه مشاكل عندما نجرِّب الخادوم.
sudo ufw status
نجد من الناتج الآتي أنَّ خدمة SSH مسموحٌ لها فقط:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
لاحظ أنَّ الناتج قد يكون مختلفًا عندك، فقد لا توجد أيّة قواعد لجدارك الناري أو لديك قواعد إضافية.
ولمّا كان الجدار الناري لا يسمح إلا لاتصالات SSH فعلينا إضافة قواعد للسماح لاتصالات FTP، وسنحتاج إلى فتح المنفذين 20 و 21 لخدمة FTP، والمنفذ 990 لنستعمله لاحقًا عندما نضبط تشفير TLS، والمنافذ من 40000 إلى 50000 كمنافذ غير المباشرة (passive ports) التي نخطط لضبطها لاحقًا في ملف الضبط:
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 40000:50000/tcp
sudo ufw status
يجب أن تبدو قواعد الجدار الناري كما يلي:
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
990/tcp ALLOW Anywhere
20/tcp ALLOW Anywhere
21/tcp ALLOW Anywhere
40000:50000/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
20/tcp (v6) ALLOW Anywhere (v6)
21/tcp (v6) ALLOW Anywhere (v6)
990/tcp (v6) ALLOW Anywhere (v6)
40000:50000/tcp (v6) ALLOW Anywhere (v6)
يمكننا الانتقال إلى الخطوة التالية بعد تثبيتنا لخادوم vsftpd وفتح المنافذ الضرورية.
الخطوة الثالثة: تهيئة مجلد المنزل للمستخدم
سنُنشِئ في هذا الدرس مستخدمًا جديدًا، لكن قد يكون لديك مستخدم موجود في نظامك ويحتاج إلى وصول FTP، وسنحرص على الحفاظ على وصول المستخدم إلى بياناته، لكن مع ذلك أنصحك بإنشاء مستخدم جديد إلى أن تضبط الخادوم وتجرّبه.
سنُنشِئ بدايةً مستخدمًا جديدًا للتجربة:
sudo adduser sammy
أسنِد كلمة المرور إلى الحساب عند طلبها، ويمكنك تجاهل بقية الأسئلة بالضغط على زر Enter.
تكون خدمة FTP أكثر أمانًا إذا كان المستخدمون محدودين بمجلدٍ معيّن، ويمكن لخادوم vsftpd فعل ذلك باستخدام chroot
، فعند تفعيل chroot
للمستخدمين المحليين، فلن يسمح لهم بالوصول إلى شيءٍ خارج مجلد المنزل الخاص بهم افتراضيًا، لكن خادوم vsftpd يحاول تأمين المجلد بعدم السماح بالكتابة عليه من قبل المستخدم (عبر سطر الأوامر)، ولا بأس بذلك للمستخدمين الجدد الذين يجب أن يتصلوا عبر FTP فقط، لكن إذا كان لدينا مستخدم موجود مسبقًا ويجب أن يستطيع الكتابة إلى مجلد المنزل الخاص به عبر سطر الأوامر فهذا لن يكون مناسبًا أبدًا.
وبدلًا من إزالة إذن الكتابة من مجلد المنزل، فسنُنشِئ مجلد ftp
لكي يكون chroot
وسنُنشِئ داخله مجلد files
يمكن الكتابة عليه ليحتوي على الملفات.
لنُنشِئ مجلد ftp
ونضبط ملكيته ونحذف إذن الكتابة منه بالأوامر الآتية:
sudo mkdir /home/sammy/ftp
sudo chown nobody:nogroup /home/sammy/ftp
sudo chmod a-w /home/sammy/ftp
لنتأكد من الأذونات:
sudo ls -la /home/sammy/ftp
الناتج:
total 8
4 dr-xr-xr-x 2 nobody nogroup 4096 Aug 24 21:29 .
4 drwxr-xr-x 3 sammy sammy 4096 Aug 24 21:29 ..
لنُنشِئ الآن المجلد الذي يحتوي على الملفات التي ستُرفَع ونضبط ملكيته إلى المستخدم:
sudo mkdir /home/sammy/ftp/files
sudo chown sammy:sammy /home/sammy/ftp/files
لنتحقق أيضًا من أذونات المجلد files
:
sudo ls -la /home/sammy/ftp
الناتج:
total 12
dr-xr-xr-x 3 nobody nogroup 4096 Aug 26 14:01 .
drwxr-xr-x 3 sammy sammy 4096 Aug 26 13:59 ..
drwxr-xr-x 2 sammy sammy 4096 Aug 26 14:01 files
وفي النهاية، لنضف ملفًا باسم test.txt
لكي نستخدمه عند التجربة لاحقًا:
echo "vsftpd test file" | sudo tee /home/sammy/ftp/files/test.txt
بعد أن أصبح مجلد ftp
آمنًا، وأعطينا المستخدم الأذونات اللازمة على مجلد files
، فيمكننا الاهتمام الآن بموضوع الضبط.
الخطوة الرابعة: ضبط وصول FTP
خطتنا هي السماح للمستخدم الذي يملك وصولًا محليًا إلى سطر الأوامر بالاتصال عبر FTP، وهنالك خيارا ضبط رئيسيان مضبوطان في ملف vsftpd.conf
. لنبدأ أولًا بفتح ملف الضبط للتأكد أنَّ التعليمات المذكورة فيه تُطابِق ما يلي:
sudo nano /etc/vsftpd.conf
محتوى الملف:
. . .
# Allow anonymous FTP? (Disabled by default).
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
local_enable=YES
. . .
علينا الآن تغيير بعض القيم في الملف، ولكي نسمح للمستخدم برفع الملفات فسنزيل رمز التعليق قبل التعليمة write_enable
لكي يصبح السطر كما يلي:
. . .
write_enable=YES
. . .
سنُزيل رمز التعليق قبل التعليمة chroot_local_user
لمنع المستخدم الذي يتصل عبر FTP من الوصول إلى أيّة ملفات خارج المجلد المضبوط:
. . .
chroot_local_user=YES
. . .
علينا إضافة التعليمة user_sub_token
لكي نستطيع وضع اسم المستخدم في مسار local_root
، وهذا لكي يعمل الضبط دون مشاكل لهذا المستخدم ولأي مستخدم آخر قد نضيفه مستقبلًا:
user_sub_token=$USER
local_root=/home/$USER/ftp
سنُحدِّد مجال المنافذ المستخدم لاتصالات FTP غير المباشرة (passive FTP) لكي نحرص على توافر اتصالات كافية:
pasv_min_port=40000
pasv_max_port=50000
تذكر أننا فتحنا هذه المنافذ سابقًا في الجدار الناري، أي لو استخدمتَ مجالًا مختلفًا عمّا سبق فاحرص على تحديث ضبط الجدار الناري بما يتوافق مع ذلك.
ولأننا نخطط للسماح بوصول إلى FTP لمستخدمين معينين، فسنعدِّل في الضبط لكي نسمح بالوصول إلى قائمة معيّنة من المستخدمين:
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist
userlist_deny=NO
التعليمة userlist_deny
تُحدِّد ما الذي يجب فعله مع المستخدمين المذكورين في القائمة، فلو ضُبِطَت إلى YES
فسيمنعون من الوصول إلى FTP، وإذا كانت NO
فلن يسمح بالوصول إلى FTP إلا للمستخدمين المذكورين في القائمة. بعد أن تنتهي من إضافة الأسطر السابق فاحفظ الملف واخرج من المحرر النصي.
علينا الآن إنشاء ملف القائمة وإضافة اسم المستخدم إليه، يمكننا استخدام الخيار -a
الخاص بالأمر tee
لإسناد السطر إلى نهاية الملف:
echo "sammy" | sudo tee -a /etc/vsftpd.userlist
لنتأكد من محتوى الملف:
cat /etc/vsftpd.userlist
الناتج:
sammy
أعد تشغيل الخادوم لتطبيق التغييرات التي أجريناها في ملف الضبط:
sudo systemctl restart vsftpd
نحن جاهزون الآن للتجربة.
الخطوة الخامسة: تجربة الوصول إلى FTP
ضبطنا الخادوم للسماح للمستخدم sammy
فقط بالوصول إلى FTP، لنتأكد من صحة ذلك.
يجب ألّا يُسمَح للاتصال من المستخدمين المجهولين (anonymous users)، إذ عطلنا ذلك في الضبط، وسنجرِّب ذلك بمحاولة الاتصال بشكل مجهول، فإذا كان ضبطنا صحيحٌ فيجب ألّا يسمح لنا بالوصول إلى الخادوم:
ftp -p 203.0.113.0
الناتج:
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): anonymous
530 Permission denied.
ftp: Login failed.
Ftp>
أغلِق الاتصال:
bye
يجب ألّا يتمكن أيّ مستخدمٍ عدا sammy
من الاتصال: وسنتحقق من ذلك عبر وضع اسم المستخدم الذي يملك امتيازات الجذر، ويجب ألّا يُسمَح له أيضًا قبل أن يُطلَب منه إدخال كلمة المرور:
ftp -p 203.0.113.0
الناتج:
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sudo_user
530 Permission denied.
ftp: Login failed.
Ftp>
أغلِق الاتصال:
bye
يجب أن يتمكن المستخدم sammy
من الاتصال، ومن قراءة وكتابة الملفات، لذا لنجرِّب ذلك:
ftp -p 203.0.113.0
الناتج:
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
331 Please specify the password.
Password: your_user's_password
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
Ftp>
سندخل إلى المجلد files
، ثم سنستعمل الأمر get
لنقل ملف التجربة الذي أنشأناه سابقًا إلى جهازنا المحلي:
cd files
get test.txt
الناتج:
227 Entering Passive Mode (203,0,113,0,169,12).
150 Opening BINARY mode data connection for test.txt (16 bytes).
226 Transfer complete.
16 bytes received in 0.0101 seconds (1588 bytes/s)
ftp>
سنحاول الآن إعادة رفع الملف باسمٍ جديد للتأكد من إمكانية الكتابة على المجلد:
put test.txt upload.txt
الناتج:
227 Entering Passive Mode (203,0,113,0,164,71).
150 Ok to send data.
226 Transfer complete.
16 bytes sent in 0.000894 seconds (17897 bytes/s)
أغلِق الاتصال:
bye
بعد أن تأكدنا أنَّ الخادوم يعمل كما ضبطناه، فيمكننا إتباع إجراءات إضافية لتأمين الخادوم.
الخطوة السادسة: جعل عمليات النقل آمنة
لما كان بروتوكول FTP لا يشفِّر أيّة بيانات عند نقلها، بما في ذلك معلومات المستخدم، فعلينا تفعيل تشفير SSL/TLS لتأمين تلك البيانات، وأوّل خطوة هي إنشاء شهادات SSL لاستخدامها مع vsftpd.
سنستخدم openssl
لإنشاء شهادة جديدة، ونستخدم الخيار -days
لجعلها صالحةً لمدة سنة، وسنضيف –في الأمر نفسه– مفتاح 2048-bit RSA خاص، ثم بإسناد القيمة ذاتها إلى الخيارين -keyout
و -out
فستكون الشهادة والمفتاح الخاص في الملف نفسه.
هذا هو الأمر الذي سنُطبِّقه:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
سيُطلَب منّا توفير معلومات عن الشهادة التي سنُنشِئها، ضع المعلومات الخاصة بك عند الإجابة عن الأسئلة:
Generating a 2048 bit RSA private key
............................................................................+++
...........+++
writing new private key to '/etc/ssl/private/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:NY
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hsoub
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
بعد أن أنشأنا الشهادات، فعلينا الآن تعديل ضبط vsftpd
مجددًا:
sudo nano /etc/vsftpd.conf
ستجد قرب نهاية الملف سطرين يبدآن بالسابقة rsa_
، أضف قبلهما رمز التعليق ليصبحا كما يلي:
# rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
أضف السطرين الآتيين بعدهما، اللذان يشيران إلى الشهادة والمفتاح الخاص اللذين أنشأناهما سابقًا:
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
علينا الآن جعل استخدام SSL إجباريًا، مما يمنع العملاء غير القادرين على التعامل مع تشفير TLS من الاتصال بخادومنا، وهذا ضروري للحرص على تشفير جميع المعلومات المنقولة لكن قد يجبر المستخدم على تغيير عميل الاتصال.
عدِّل قيمة التعليمة ssl_enable
إلى YES
:
ssl_enable=YES
أضف بعد ذلك الأسطر الآتية لمنع الاتصالات المجهولة عبر SSL، ولإجبار استخدام SSL لتسجيل الدخول ولنقل البيانات:
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
علينا ضبط الخادوم استخدام TLS بدلًا من SSL عبر إضافة الأسطر الآتية:
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
علينا بعد ذلك إضافة تعليمتين إضافيتين، الأولى تسمح بعدم استخدام SSL عند إعادة استخدام الجلسة (session reuse) لأنها لا تعمل مع أغلبية عملاء FTP، وسنطلب استخدام حزم عالية التشفير، وهذا يعني أنَّ طول المفتاح أكبر أو يساوي 128 بت:
require_ssl_reuse=NO
ssl_ciphers=HIGH
بعد أن تنتهي من التعديلات السابقة، فاحفظ الملف وأغلق المحرر.
علينا الآن إعادة تشغيل الخادوم لتأخذ التعديلات مجراها:
sudo systemctl restart vsftpd
لم نعد نتمكن الآن من استخدام عميل FTP غير الآمن الذي يعمل من سطر الأوامر، فلو جربناه فسنشاهد الناتج الآتي:
ftp -p 203.0.113.0
Connected to 203.0.113.0.
220 (vsFTPd 3.0.3)
Name (203.0.113.0:default): sammy
530 Non-anonymous sessions must use encryption.
ftp: Login failed.
421 Service not available, remote server has closed connection
ftp>
سنتحقق من الاتصال في الخطوة القادمة باستخدام عميل يدعم تشفير TLS.
الخطوة السابعة: تجربة الاتصال عبر TLS باستخدام FileZilla
أغلبية عملاء FTP الحديثين يدعمون تشفير TLS، وسنشرح كيفية الاتصال عبر عميل FileZilla لأنه يعمل على جميع أنظمة التشغيل؛ راجع توثيق عميلك المفضل لتعرف كيف يمكن الاتصال عبر TLS فيه.
عندما تفتح برنامج FileZilla فسنجد أيقونة Site Manager تحت قائمة File مباشرةً، أي أنَّها أوّل أيقونة في الشريط العلوي. اضغط عليها:
ستُفتَح نافذة جديدة، اضغط فيها على زر «New Site» في الركن السفلي الأيسر:
ستجد ظهور «New site» تحت أيقونة «My Sites»، يمكنك تسمية الموقع الآن أو إعادة تسميته لاحقًا بالضغط على زر «Rename».
عليك أن تملأ حقل «Host» بعنوان IP أو اسم نطاق الموقع، وعليك أن تختار «Require explicit FTP over TLS» في قائمة «Encryption»
أما لخيار «Logon Type» فاختر «Ask for password»، ثم أدخِل اسم المستخدم في حقل «User»:
اضغط على زر «Connect» في أسفل النافذة، وستُسأل عن كلمة مرور المستخدم:
اضغط على «OK» لتتصل، يجب أن يكون اتصالك مع الخادوم مشفرًا بتشفير TLS/SSL.
بعد أن تقبل الشهادة، فانقر نقرًا مزدوجًا على مجلد files
واسحب الملف upload.txt
وأفلته في القسم اليساري من البرنامج لكي تبدأ بتنزيله:
بعد ذلك، يمكنك أن تنقر بالزر الأيمن على الملف المحلي وتعيد تسميته إلى upload-tls.txt
وتسحبه مجددًا إلى الخادوم لكي ترفعه عليه.
لقد تمكنا من تنزيل الملفات ورفعها بأمان مع تفعيل تشفير SSL/TLS.
الخطوة الثامنة: تعديل الوصول إلى سطر الأوامر (خطوة اختيارية)
إن لم تتمكن من استخدام تشفير TLS بسبب محدوديات العميل، فيمكنك تأمين الخادوم قليلًا بمنع مستخدم FTP من تسجيل الدخول إلى سطر الأوامر، إحدى الطرائق البسيطة لفعل ذلك هي إنشاء صدفة (shell) خاصة.
أكرِّر أنَّ الخطوة السابقة لا توفِّر أيّ تشفير، وإنما الغرض منها هو تقليل الوصول إلى حسابات المستخدمين المسموح لهم بالاتصال عبر FTP فقط.
علينا أولًا إنشاء ملف باسم ftponly
في مجلد /bin
:
sudo nano /bin/ftponly
سنضيف الآن رسالةً تخبر المستخدم أنَّه ليس قادرًا على تسجيل الدخول، أضف ما يلي يلي إلى الملف:
#!/bin/sh
echo "This account is limited to FTP access only."
عدِّل الأذونات لجعل الملف قابلًا للتنفيذ:
sudo chmod a+x /bin/ftponly
افتح الملف الذي يضم قائمةً بالصدفات (shells) الصالحة للاستخدام في النظام:
sudo nano /etc/shells
وأضف في نهاية الملف:
. . .
/bin/ftponly
عدِّل الصدفة الافتراضية للمستخدم عبر الآمر الآتي:
sudo usermod sammy -s /bin/ftponly
جرِّب الآن تسجيل الدخول بحساب المستخدم sammy:
ssh sammy@203.0.113.0
ستجد رسالةً شبيهةً بالرسالة الآتية:
This account is limited to FTP access only.
Connection to 203.0.113.0 closed.
هذا يؤكد أنَّ المستخدم غير قادر على تسجيل الدخول إلى الخادوم عبر الأمر ssh، ويُسمَح له بالوصول إلى FTP فقط.
الخلاصة
لقد شرحنا في هذا الدرس كيفية ضبط خادوم FTP للمستخدمين الذين يملكون حسابًا محليًا على النظام، أما إذا أردتَ استخدام مصدر خارجي للاستيثاق، فيمكنك إلقاء نظرة على دعم خادوم vsftpd للمستخدمين الوهميين (virtual users). هنالك خياراتٌ واسعة لدعم استخدام PAM مما يجعلك قادرًا على إدارة المستخدمين في نظام استيثاق مختلف مثل LDAP أو Kerberos.
ترجمة –وبتصرّف– للمقال How To Set Up vsftpd for a User’s Directory on Ubuntu 16.04لصاحبته Melissa Anderson
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.