بذارید بهش فکر کنم
چطور 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 هم تطبیق داده شده است). با توجه به تواضع ذاتیم، اگه چیزی که می خونید خوب بود، مال خوبی مقاله ی اصلیه و اگه چیزی بد بود، به خاطر اضافات منه.
پیش نیازها
یک سرور اوبونتوی ۱۶٫۰۴ با یک کاربر غیر روت که دسترسی 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 "vsftpd test file" | 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 "amir" | 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 TLS
- User: amir
- Logon Type: Ask for password
می بینید که کار خاصی نکردیم. گفتیم به این سرور با استفاده از پروتکل امن وصل شو و هر بار هم گذرواژه رو بپرس. حالا اگه روی Connect بزنیم گذرواژه رو ازمون می پرسه و برای اولین بار اطلاعات گواهی ssl رو هم نشونمون می ده. حالا دیگه می تونیم بین سرور و کامپیوتر خودمون راحت فایل جابجا کنیم. سمت راست سروره و سمت چپ کامپیوتر خودمون.
قدم هشتم: غیرفعال سازی دسترسی ترمینال (Shell): اختیاری
اگه به هر دلیلی نتونستید از TLS استفاده کنید یه روش دیگه هم برای امن سازی وجود داره و اون هم این که دسترسی های غیر اف تی پی رو از کاربر مورد نظر بگیرید. برای این کار یک پوسته (شل) جدید در سرور تعریف می کنیم. توی پوشه ی bin یک فایل به اسم ftponly می سازیم:
sudo nano /bin/ftponly
توی فایل پیامی رو که بعد از تلاش کاربر برای اتصال اف تی پی به سرور باید بهش نشون داده بشه می نویسیم:
#!/bin/sh
echo "This account is limited to FTP access only."
فایل رو ذخیره می کنیم و می بندیم و بعد قابل اجرا می کنیم:
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 به سرور وصل بشه.
مطلبی دیگر از این انتشارات
برنامه نویسی ربات سرخطی بورس
مطلبی دیگر از این انتشارات
دانشگاه به چه دردی میخوره ؟
مطلبی دیگر از این انتشارات
Hoisting funstions vs hoisting classes