چطور vsftpd را در Linux Ubuntu 16.04 (یا 18.04) روی پوشه یک کاربر تنظیم کنیم؟

مقدمهاف تی پی مخفف File Transfer Protocol است و یکی از پروتکل های شبکه برای انتقال فایل بین کلاینت و سرور. البته الان راه های سریع تر، امن تر و راحت تری هم برای جابجایی فایل هست. کاربرای عادی اینترنت ترجیح می دن از https استفاده کنند و کاربرای حرفه ای که می خوان با کامندلاین کار کنند هم ترجیح می دن از SFTP استفاده کنند. اما چیزی که این جا آموزش داده می شه، روش استفاده از پروتکل FTP با پکیج vsftpd (که یعنی Very Secure FTP demo) با استفاده از SSL/TLS برای یک کاربر نیمه حرفه ایه. طبیعتن اگه حق انتخاب دارید، بهتره پروتکل ها و روش های بهتری رو امتحان کنید اما اگه به هر دلیل باید از FTP استفاده کنید،‌ vsftpd گزینه ی مناسبیه. خوبیش اینه که امن و کاراست و برای خیلی از مشکلات امنیتی، راهکارهای خوبی داره. علاوه بر این یکی از پکیج های پیش فرض خیلی از توزیع های لینوکسه.این مطلب تقریبن ترجمه ای از مقاله ی DigitalOcean است (و با نسخه ی 18.04 هم تطبیق داده شده است). با توجه به تواضع ذاتیم، اگه چیزی که می خونید خوب بود، مال خوبی مقاله ی اصلیه و اگه چیزی بد بود، به خاطر اضافات منه.یک تصویر بی ربط برای زیباسازی پیش نمایش مقاله- منبع: freepikپیش نیازهایک سرور اوبونتوی ۱۶٫۰۴ با یک کاربر غیر روت که دسترسی sudo داشته باشه.خودم از ابر آروان، سرور گرفتم و از کیفیت، گزارش گیری و پشتیبانیش راضی بودم. البته سرور من اول اوبونتوی ۱۸٫۰۴ بود که اصلن وارد نمی شد و مجبور شدم به ۱۶٫۰۴ عوضش کنم. پس توصیه می کنم اگه می خواید از ابر آروان ۱۸٫۰۴ بگیرید، قبلش ازشون بپرسید و مطمئن بشید که درست کار می کنه.قدم اول:‌ نصب vsftpdخب طبیعتن اولین کار اینه که پکیج های موجود روی سرورمون رو آپدیت کنیم و vsftpd رو نصب کنیم:sudo apt update sudo apt install vsftpdوقتی نصب تموم شد، فایل تنظیمات vsftpd رو کپی می کنیم تا فایل اصلی تنظیمات به عنوان بکاپ باقی بمونه:sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.origفایل تنظیمات vsftpd مثل فایل های تنظیمات سایر پکیج ها توی etc ذخیره می شه. ما فایل اصلی رو با نام vsftpd.conf.orig نگه می داریم که اگه بعدن مشکلی پیش اومد بتونیم راحت به تنظیمات اولیه (تنظیمات کارخانه!) برگردیم.قدم دوم:‌ باز کردن فایروالحالا نوبت بررسی فایروال سروره. ما می خوایم مطمئن بشیم که فایروال اجازه اجرای FTP رو بهمون می ده.sudo ufw statusاگه فایروالتون غیرفعاله (Status: inactive) فعالش کنید و ادامه بدید. اما قبلش باید حداقل به ssh اجازه ی عبور از فایروال رو بدید که ارتباط فعلی تون دچار مشکل نشه (حواستون باشه که در صورت فعال کردن این بخش، همه ی ارتباط های دیگه ی سرورتون به جز ارتباط ssh قطع می شه. از جمله دسترسی مرورگرها به دامنه هایی که روی سرورتون تنظیم کردید. پس تنظیمات ادامه ی کار رو جدی بگیرید):sudo ufw allow ssh sudo ufw enableبعد از این هم باید متناسب با کاری که از سرور می خواید، اجازه ی عبور سایر پورتها از فایروال رو صادر کنید. نکته این که ابر آروان خودش هم یه بخش فایروال داره که می تونید از اون هم استفاده کنید.اما اگه فایروال فعاله، احتمالن خروجی شما چیزی شبیه اینه:Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)در خروجی بالا، فقط ssh مجوز عبور از فایروال رو داره. کاری که ما باید بکنیم اینه که به پورت ۲۰ و ۲۱ برای اف تی پی، ۹۹۰ برای TLS و بازه ی ۴۰۰۰۰ تا ۵۰۰۰۰ برای تنظیماتی که در قدم چهارم می بینیم، اجازه عبور از فایروال بدیم: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)قدم سوم:‌ آماده کردن پوشه کاربرما می خوایم به یک کاربر خاص، دسترسی اف تی پی به یک پوشه ی خاص رو بدیم. شما می تونید کاربر جدیدی نسازید و به کاربر فعلی تون اون دسترسی رو بدید اما برای منظم تر پیش رفتن کار و همچنین امنیت بیشتر، بهتره کاربر رو هم بسازید.sudo adduser amirقاعدتن به جای amir می تونید از اسم دلخواه خودتون استفاده کنید. در ادامه برای کاربر تازه تاسیستون گذرواژه تنظیم کنید و اگه حال کردید اطلاعاتش رو هم بدید. یا این که بی خیال اطلاعاتش بشید و قضیه رو با اینترهای مکرر پیش ببرید.خب حالا که کاربر جدید رو ساختیم، وقتشه که دسترسیش رو محدود کنیم به یک پوشه ی خاص تا کار ایمنتر پیش بره. این کار در vsftpd با chroot انجام می شه. در حالت پیش فرض با فعال بودن chroot کاربر فقط به پوشه ی home خودش دسترسی داره. اما با این کار، دیگه اون پوشه قابل نوشتن نیست. ما می خوایم کاربر تازه مون فقط با استفاده از FTP فایل بذاره و برداره اما علی الحساب نمی خوایم کاربر فعلی مون هم دسترسیش محدود بشه. پس به جای این که دسترسی نوشتن پوشه home رو برداریم،‌ یه پوشه ftp می سازیم که به عنوان chroot عمل کنه و یه پوشه ی files توی پوشه ی جدیدمون می سازیم که نهایتن کاربر جدید با همون پوشه کار کنه.sudo mkdir /home/amir/ftp sudo chown nobody:nogroup /home/amir/ftp sudo chmod a-w /home/amir/ftpدر دستورات بالا، خط اول پوشه جدید رو می سازه، خط دوم مالکیت فایل رو حذف می کنه و خط سوم می گه دسترسی همه (a) رو در حالت نوشتن (w) حذف کن (−). [توضیحات بیشتر درباره chmod]حالا بررسی می کنیم که کارا درست پیش رفته باشه:sudo ls -la /home/amir/ftpدر دستور بالا می گیم همه ی (a) فایل های پوشه ftp رو مفصل (l) نشون بده. خروجی چیزی شبیه این می شه:total 8 4 dr-xr-xr-x 2 nobody nogroup 4096 May 30 21:29 . 4 drwxr-xr-x 3 amir amir 4096 May 30 21:29 ..حالا یه پوشه ی files می سازیم که کاربر جدید فایل هاش رو توی اون بتونه آپلود کنه و مالکیت پوشه رو هم می دیم به همین کاربر:sudo mkdir /home/amir/ftp/files sudo chown amir:amir /home/amir/ftp/filesدوباره بررسی کنیم که دسترسی ها درست باشه:sudo ls -la /home/amir/ftpو خروجی شبیه این می شه:total 12 dr-xr-xr-x 3 nobody nogroup 4096 May 30 21:29 . drwxr-xr-x 3 sammy sammy 4096 May 30 21:28 .. drwxr-xr-x 2 sammy sammy 4096 May 30 21:31 filesدر نهایت هم یه فایل تست اضافه می کنیم که بعدن بتونیم راحت تست کنیم:echo &quotvsftpd test file&quot | sudo tee /home/sammy/ftp/files/test.txtدستور بالا می گه رشته ی vsftpd test file رو توی فایل test.txt بنویس. حالا وقتشه که دسترسی اف تی پی رو تنظیم کنیم.قدم چهارم:‌ تنظیم دسترسی FTPما می خوایم به یک کاربر خاص دسترسی اف تی پی بدیم. پس باید فایل تنظیمات vsftpd رو باز کنیم و تنظیمات لازم رو انجام بدیم:sudo nano /etc/vsftpd.confمی دونید که nano یکی از ویرایشگرهای (ادیتور) ممکنه و اگه راحت ترید می تونید با vi یا هر ادیتور دیگه ای که نصب دارید، فایل رو باز کنید. وقتی فایل رو باز می کنید چنین چیزهایی می بینید:# Allow anonymous FTP? (Disabled by default). anonymous_enable=NO # # Uncomment this to allow local users to log in. local_enable=YES . . .این موارد باید در این فایل تغییر کنه (موارد پررنگ اوناییه که پیش فرض نیستند و باید تغییر کنند):۱- کاربر باید بتونه فایل آپلود کنه پس باید اجازه نوشتن بدیم:write_enable=YESحالا در ادامه ی تنظیمات قدم سوم، دسترسی کاربر رو به پوشه home خودش محدود می کنیم. همون طور که گفتیم این کار در vsftpd با chroot انجام می شه (ممکنه این خط با علامت # در اولش، کامنت شده باشه. کافیه اون علامت رو پاک کنیم):chroot_local_user=YESحالا به vsftpd می گیم که برای هر کاربر اف تی پی، دسترسی به کدوم پوشه رو آزاد بگذار.user_sub_token=$USER local_root=/home/$USER/ftpاین دو خط می گن که برای هر کاربری که خواست به اف تی پی دسترسی پیدا کنه، فقط امکان دسترسی به پوشه home اون کاربر و از اون جا هم پوشه ftp رو فراهم کن [توضیحات بیشتر درباره این تنظیمات vsftpd]تغییر بعدی اینه که بگیم کدوم پورت های پسیو اف تی پی استفاده بشه تا هم محدود باشه و هم به تعداد کافی وجود داشته باشه. اگه یادتون باشه توی قدم دوم به فایروال گفتیم اجازه عبور به پورت های بازه ی ۴۰۰۰۰ تا ۵۰۰۰۰ رو بده [جزئیات تفاوت اکتیو و پسیو در اف تی پی رو این جا ببینید]:pasv_min_port=40000 pasv_max_port=50000ما می خوایم فقط کاربرای خاصی به اف تی پی دسترسی داشته باشند و این مسئله رو مورد به مورد مشخص کنیم. یعنی هر کاربری که ساخته شد،‌ نتونه راحت با اف تی پی (حتا توی پوشه ی خودش) فایل جابجا کنه. پس به vsftpd می گیم که فقط به کاربرای فهرستی که بهت می دیم، اجازه بده:userlist_enable=YES userlist_file=/etc/vsftpd.userlist userlist_deny=NOخط اول می گه دسترسی به فهرستی از کاربران فعال باشه. خط دوم محل این فهرست رو مشخص می کنه و خط سوم می گه این فهرست، فهرست کاربران مجازه. اگه بخوایم یه فهرست از کاربرای غیرمجاز درست کنیم (کاربرایی که حق دسترسی به اف تی پی رو ندارند) برعکس عمل می کنیم و اسم اون کاربرا رو توی فایل فهرست می نویسیم و مقدار userlist_deny در خط آخر رو هم به YES تغییر می دیم.خب تغییرات ما در فایل vsftpd.conf تموم شد و می تونیم ذخیره کنیم و از فایل خارج بشیم.حالا فهرست کاربرای مجاز برای کار با اف تی پی رو (که فعلن فقط amir است) توی فایل فهرست می نویسیم:echo &quotamir&quot | sudo tee -a /etc/vsftpd.userlistبرای این که مطمئن بشیم فهرستمون درسته، خیلی سریع به فایل نگاه می کنیم:cat /etc/vsftpd.userlistخروجی این دستور باید amir باشه.حالا vsftpd رو ریستارت می کنیم تا تنظیماتمون اعمال بشه:sudo systemctl restart vsftpdقدم بعدی اینه که دسترسی رو تست کنیم و ازش مطمئن بشیم.قدم پنجم: تست دسترسی FTPتا این جا تنظیم کردیم که فقط کاربری به نام amir بتونه به اف تی پی (اونم محدود به پوشه ای در پوشه ی home خودش!) دسترسی داشته باشه. حالا بیاید این قضیه رو تست کنیم.تست اول: کاربرای ناشناس نباید بتونن به اف تی پی وصل بشندسترسی ناشناس (anonymous) مال وقتیه که شما یه بخشی توی سایتتون بذارید که کاربرای دیگه بدون داشتن نام کاربری بتونن به اف تی پی وصل بشن و فایل های لازمشون رو دانلود کنند [توضیح دقیقتر در این جا]. توی کامپیوتر خودتون (لوکال)، یه کاربر به اسم anonymous بسازید و سعی کنید با آدرس زیر به اف تی پی سرورتون وصل بشه (طبیعتن باید به جای [YOUR_IP_ADDRESS] آی پی سرور رو بنویسید).ftp -p [YOUR_IP_ADDRESS]که خروجیش باید بشه:Connected to [YOUR_IP_ADDRESS]. 220 (vsFTPd 3.0.3) Name ([YOUR_IP_ADDRESS]:default): anonymous 530 Permission denied. ftp: Login failed. ftp>از ftp خارج می شیم:ftp> byeتست دوم:‌ کاربرایی غیر از amir نباید بتونن به اف تی پی وصل بشنحالا سعی می کنیم (باز هم از کامپیوتر خودمون) با کاربر sudo به اف تی پی وصل بشیم. جلوی این کاربر هم (قبل از این که به وارد کردن گذرواژه برسه) گرفته بشه (دستورات و خروجی ها مشابه تست قبلند).تست سوم:‌ کاربر amir باید بتونه به اف تی پی وصل بشه، بخونه و بنویسهحالا بررسی می کنیم که amir بتونه وصل بشه (با همون دستور قبلی ftp). یک کاربر به اسم amir توی کامپیوتر خودمون می سازیم و همون دستور رو اجرا می کنیم. خروجی باید مشابه زیر باشه:Connected to [YOUR_IP_ADDRESS]. 220 (vsFTPd 3.0.3) Name ([YOUR_IP_ADDRESS]:default): amir 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>حالا دستورات زیر رو اجرا می کنیم تا ببینم می تونیم فایل تستی رو که قبلن در سرور ساخته بودیم روی کامپیوتر خودمون دانلود کنیم:ftp> cd files ftp> 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>حالا آپلود فایل رو آزمایش می کنیم: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)از اف تی پی خارج می شیم و می ریم برای امن سازی:ftp> byeقدم ششم: امن سازی جابجایی فایلاف تی پی فایل ها رو هنگام جابجایی بین لوکال و سرور، رمزگذاری (انکریپت) نمی کنه. برای همین ما TTL/SSL رو برای رمزگذاری فایل ها در جابجایی فعال می کنیم. ما از 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]:IR State or Province Name (full name) [Some-State]:Tehran Locality Name (eg, city) []:Tehran Organization Name (eg, company) [Internet Widgits Pty Ltd]:AmirCompany Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: your_IP_address Email Address []:اطلاعات بیشتر درباره ی openssl و کلیدهای خصوصی رو این جا بخونید.حالا دوباره می ریم سراغ فایل تنظیمات vsftpd:sudo nano /etc/vsftpd.confفایل گواهینامه و کلید خصوصی تنظیم شده دراین فایل رو کامنت کنید (با گذاشتن علامت هشتگ در ابتدای خط) و فایل های جدید رو جایگزینش کنید:# 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 رو فعال می کنیم:ssl_enable=YESحالا جلوی اتصال ناشناس ssl رو می گیریم و هم برای انتقال و هم اتصال به اف تی پی، استفاده از پروتکل امن رو اجباری می کنیم:allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YESدر مرحله بعد استفاده از الگوریتم های قدیمی تر (و ضعیف تر) رو غیرفعال می کنیم و از الگوریتم TLS v2 استفاده می کنیم [توضیح بیشتر]:ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NOدر آخر هم برای محکم کاری دو تا کار دیگه می کنیم. یکی این که قابلیت ssl require رو برای این که توی دردسر نیفتیم و درخواست های اف تی پی مون به دلیل امن سازی مدام از کار نیفته، غیرفعال می کنیم و دوم این که طول رشته کلید رو ۱۲۸ بیت یا بالاتر انتخاب می کنیم (HIGH):require_ssl_reuse=NO ssl_ciphers=HIGHخب دیگه تموم شد. الان بخش آخر فایل vsftpd.conf باید چیزی شبیه زیر باشه:# This option specifies the location of the RSA certificate to use for SSL # encrypted connections. #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_enable=YES allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH و می تونیم فایل vsftpd.conf رو ذخیره کنیم و ببندیم.برای اعمال تنظیمات، vsftpd رو ریستارت می کنیم:sudo systemctl restart vsftpdحالا اگه بخوایم به شکل عادی به اف تی پی سرورمون وصل بشیم (با همون کاربر amir روی کامپیوتر خودمون) باید با خطا روبرو بشیم:ftp -p 203.0.113.0 Connected to 203.0.113.0. 220 (vsFTPd 3.0.3) Name (203.0.113.0:default): amir 530 Non-anonymous sessions must use encryption. ftp: Login failed. 421 Service not available, remote server has closed connection ftp>توی قدمبعدی می خوایم مطمئن بشیم که می تونیم با استفاده از TLS به اف تی پی وصل بشیم.قدم هفتم:‌ تست TLS با FileZillaنرم افزار FileZilla برای انتقال اف تی پی گزینه ی خوبیه. Site Manager رو باز کنید. توی پنجره جدید روی New Site بزنید. یه گزینه به اسم New Site زیر My Sites ظاهر می شه. می تونید همین حالا اسمش رو عوض کنید یا بذارید برای بعد. این تنظیمات رو هم در پنجره جدید وارد کنید:Host: آدرس آی پی سرورتونEncryption: Require explicit FTP over TLSUser: amirLogon Type: Ask for passwordمی بینید که کار خاصی نکردیم. گفتیم به این سرور با استفاده از پروتکل امن وصل شو و هر بار هم گذرواژه رو بپرس. حالا اگه روی Connect بزنیم گذرواژه رو ازمون می پرسه و برای اولین بار اطلاعات گواهی ssl رو هم نشونمون می ده. حالا دیگه می تونیم بین سرور و کامپیوتر خودمون راحت فایل جابجا کنیم. سمت راست سروره و سمت چپ کامپیوتر خودمون.قدم هشتم: غیرفعال سازی دسترسی ترمینال (Shell): اختیاریاگه به هر دلیلی نتونستید از TLS استفاده کنید یه روش دیگه هم برای امن سازی وجود داره و اون هم این که دسترسی های غیر اف تی پی رو از کاربر مورد نظر بگیرید. برای این کار یک پوسته (شل) جدید در سرور تعریف می کنیم. توی پوشه ی bin یک فایل به اسم ftponly می سازیم:sudo nano /bin/ftponlyتوی فایل پیامی رو که بعد از تلاش کاربر برای اتصال اف تی پی به سرور باید بهش نشون داده بشه می نویسیم:#!/bin/sh echo &quotThis account is limited to FTP access only.&quotفایل رو ذخیره می کنیم و می بندیم و بعد قابل اجرا می کنیم:sudo chmod a+x /bin/ftponlyفایل پوسته های معتبر رو باز می کنیم:sudo nano /etc/shellsنشانی فایل خودمون رو به انتهای این فایل اضافه می کنیم:/bin/ftponlyفایل رو ذخیره می کنیم و می بندیم و بعد پوسته کاربر اف تی پی رو آپدیت می کنیم:sudo usermod amir -s /bin/ftponlyحالا به عنوان کاربر اف تی پی به سرور وصل می شیم و پیام زیر رو می بینیم:This account is limited to FTP access only. Connection to [YOUR_IP_ADDRESS] closed.این یعنی کاربر دسترسی ssh به سرور نداره و فقط می تونه با ftp به سرور وصل بشه.