FTP (پروتکل انتقال فایل) یک ابزار استاندارد قدیمی و جامعی است که برای انتقال فایل ها بین سرور و مشتری در شبکه مورد استفاده قرار می گیرد، خصوصا زمانی که هیچ تاییدیه یا مجوزی برای کاربران ناشناس برای وصل شدن به سرور اجباری نباشد. باید بدانیم که FTP به طورپیش فرض امن نیست چرا که مدارک کاربر و اطلاعات را بدون کدگذاری انتقال می دهد.
در این راهنما مراحل نصب، پیکربندی و امنیت یک سرور FTP را در CentOS/RHEL 7 و Fedora توضیح می دهیم. ( VSFTPD مخفف دیمن FTP بسیار ایمن می باشد.)
به یاد داشته باشید که تمام مطالب این راهنما با روت قابل اجرا خواهد بود، اگر با سروری کار می کنید که حساب کاربری آن روت نشده از دستور sudo برای دستیابی به روت استفاده کنید.
مرحله 1: نصب سرور FTP
1. نصب vsftpd بسیار ساده است، فقط کافی است دستور زیر را اجرا کنید.
# yum install vsftpd
2. پس از تکمیل نصب در ابتدا سرویس اجرا نخواهد شد، بنابراین باید آن را موقتا به صورت دستی انجام دهیم تا هر وقت سیستم بوت شد بتواند به طور اتوماتیک آن را اجرا کند.
# systemctl start vsftpd
# systemctl enable vsftpd
3. سپس تا اینکه سرویس های FTP اجازه دسترسی را از سرویس های خارجی دریافت کنند می بایست پورت 21 را باز کنیم که لیست دیمن های FTP آن به شرح زیر است:
# firewall-cmd –zone=public –permanent –add-port=21/tcp
# firewall-cmd –zone=public –permanent –add-service= ftp
# firewall-cmd –reload
مرحله 2: پیکربندی سرور FTP
4. حالا به سراغ چندین پیکربندی برای setup و امنیت سرور FTP می رویم. اجازه دهید که با گرفتن یک backup از فایل اصلی /etc/vsftpd/vsftpd.conf شروع کنیم :
# cp /etc/vsftpd/vsftpd.conf /etc/vsftp.conf.orig
سپس فایل بالا را باز کرده و گزینه های زیر را با مقادیر مربوط به خود وارد نمایید:
anonymous_enable=NO #disable anonymous login
local_enable=YES #permit local logins
write _enable=YES #enable FTP commands which change the filesystem
local_umask=022 #value of umask for file creation for local users
dirmessage_enable=YES #enable showing of messages when users first enter a new directory
xferlog-enable=YES #a log file will be maintained detailing uploads and downloads
connect_from_port_20=YES #use port 20 (ftp-data) on the server machine for PORT style conections
xferlog_std_format=YES #keep standard log file format
listen=NO #prevent vsftpd from running in standablle mode
listen_ipv6=YES #vsftpd will listen on an IPv6 socket instead of an IPv4 one
pam_service_name=vsftpd #name of the PAM service vsftpd will use
userlist_enable=YES #enable vsftpd to load a list of usernames
tcp_wrappers=YES #turn on tcp wrappers
5. حالا FTP را برای مجوز دسترسی دادن/ندادن به کاربران به این صورت /etc/vsftpd.userlist پیکربندی کنید.
به طور پیش فرض به کاربرانی که در لیست userlist_file=/etc/vsftpd.userlist قرار گرفته اند، اگر گزینه userlist_deny به صورت YES باشد اجازه ورود داده نمی شود مگر اینکه userlist_enable=YES باشد.
اگرچه userlist_deny=NO تنظیمات را عوض می کند ولی این به آن معناست که تنها کاربرانی که به طور واضح در لیست userlist_file=/etc/vsftpd.userlist قرار دارند اجازه ورود خواهند داشت.
Userlist_enable=YES #vsftpd will load a list of usernames, from the filename given by userlist_file
Userlist_file=/etc/vsftpd.userlist #stores usernames.
Userlist_deny=NO
تنها این نیست، زمانی که کاربران وارد سرور FTP می شوند در یک چروت جیل جا می گیرند که یک root directory است که در FTP تنها به عنوان home directory عمل خواهد کرد.
سپس نگاهی می اندازیم به دو سناریوی ممکن که چگونه کاربران FTP chroot را به کاربران Home (روت محلی) تغییر دهیم که آن را به صورت زیر توضیح داده ایم:
6. حالا این دو گزینه زیر را اضافه می کنیم تا کاربران FTP به Home directory محدود شوند.
chroot_local_user=YES
allow_writeable-chroot=YES
Chroot_local_user=YES یعنی کاربران پس از ورود با تنظیمات پیش فرض وارد یک چروت جیل خواهند شد.
و همچنین به عنوان پیش فرض، vsftpd به دلایل امنیتی اجازه نمی دهد که چروت جیل قابل نوشتن شود. اگرچه با استفاده از گزینه allow_writeable_chroot=YES می توانیم این تنظیم را باطل کنیم.
فایل ها را save کرده و آن را ببندید.
مرحله 3:ایمن کردن سرور FTP به وسیله SELinux
7. اکنون بولی SELinux زیر را انجام می دهیم تا به FTP اجازه خواندن فایل ها را در یک home directory کاربر بدهد. توجه داشته باشید که این در ابتدا با دستور زیر انجام شده بود:
# setsebool –p ftp_home_dir on
با این وجود، همانطور که گزارش زیر به آن پرداخته، دستور ftp_home_dir به طور پیش فرض غیر قابل اجراست.
https://bugzilla.redhat.com/show_bug.cgi?id=1097775
حالا از دستور semanage برای اجرای فرمان SELinux استفاده می کنیم تا به FTP اجازه خواندن/نوشتنhome directory کاربر را بدهد.
# semanage Boolean –m ftpd_full_access –on
در اینجا باید vsftpd را restart کنیم تا تمام تغییراتی را تا به حال انجام دادیم اعمال شود:
# systemctl restart vsftpd
مرحله 4: تست کردن سرور FTP
8. حالا سرور FTP را با ساختن
یک کاربر FTP با دستورuseradd command آزمایش خواهیم کرد.
#useradd –m –c “Ravi Savie, CEO” -s /bin/bash ravi
#passwd ravi
پس از آن باید کاربر ravi را با دستور echo command به فایل /etc/vsftpd.userlist اضافه کنیم:
# echo “ravi” l tee -a /etc/vsftpd.userlist
# cat /etc/vsftpd.userlist
9. حالا وقت آن است که تست کنیم تا بفهمیم تنظیماتی که اعمال کردیم به درستی کار می کند. بگذارید با تست افراد ناشناس شروع کنیم. با نگاه کردن به اسکرین شات پایین می فهمیم که افراد ناشناس اجازه ورود ندارند:
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10)
220 welcome to TecMint.com FTP service.
Name (192.168.56.10) : anonymous
530 permission denied.
Login failed.
ftp>
10. همچنین بگذارید تست کنیم اگر یک کاربر در لیست فایل /etc/vsftpd. Userlist نباشد اجازه ورود خواهد داشت؟ همانطور که در اسکرین شات زیر مشخص است جواب منفی است:
#ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 welcome to TecMint.com FTP service.
Name (192.168.56.10 : root) : aaronkilik
530 permission denied.
Login failed.
ftp>
11. حالا آخرین تست را انجام می دهیم، اگر یک کاربر در لیست فایل /etc/vsftpd.userlist قرار داشته باشد، قطعا پس از وارد شدن در home directory خودش قرار می گیرد:
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 welcome to TecMint.com FTP service.
Name (192.168.56.10: root) : ravi
331 please specify the password.
Password:
230 login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 1s
توجه: استفاده از allow_writale_chroot=YES پیامدهای امنیتی مطمئنی دارد، خصوصا اگر کاربران اجازه آپلود و یا shell access داشته باشند.
تنها زمانی این گزینه رو فعال کنید که دقیقا بدانید می خواهید چه کاری انجام دهید. این خیلی مهم است که توجه داشته باشید این پیامدهای امنیتی صرفا برای vsftpd نیست بلکه برای تمام دیمن های FTP قابل اجراست و باعث می شود کاربران محلی به چروت جیل بروند.
بنابراین در قسمت بعد به یک روش ایمن تری برای تنظیم root directory محلی غیر قابل نوشتن خواهیم پرداخت.
مرحله 5: پیکربندی شکل های مختلف FTP برای home directiory
12. فایل پیکربندی vsftpd را دوباره باز کرده و گزینه زیر را بنویسید:
#allow_writeable_chroot=YES
سپس برای کاربر (ravi، احتمالا نام کاربر شما متفاوت است) یک root directory محلی دیگر بسازید و مجوزهای نوشتن را برای تمام کاربران آن پاک کنید:
# mkdir /home/ravi/ftp
# chown nobody:nobody /home/ravi/ftp
#chmod a-w /home/ravi/ftp
13. سپس یک directory در زیر root محلی، جایی که کاربر فایل هایش را ذخیره خواهد کرد بسازید:
# mkdir /home/ravi/ftp/files
# chown ravi:ravi /home/ ravi/ftp/files
# chmod 0700 /home/ravi/ftp/files
سپس گزینه های زیر را در فایل پیکربندی vsftpd با مقادیر مشخص شده اضافه یا تغییر دهید:
User_sub_token=$user #inserts the username in the local root directory
Local_root=/home/$user/ftp #defines any users local root directory
فایل را save کرده و ببندید. یکبار دیگر با این تنظیمات جدید، سرویس را restart می کنیم:
# systemctl restart vsftpd
14. حالا دوباره تست می کنیم تا ببینیم کاربران محلی root directory در FTP که در home directory ساختیم وجود دارند.
# ftp 192.168.56.10
Connected to 192.168.56.10 (192.168.56.10).
220 welcome to TecMint.com FTP service.
Name (192.168.56.10 : root) : ravi
331 please specify the password.
Password: 230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 1s
تمام شد! در این مقاله طریقه نصب و پیکربندی یک سرورFTP درCentOS 7 را توضیح دادیم، با استفاده از بخش نظراتی که در قسمت پایین قرار دارد برای ما بنویسید که این راهنما توانسته اطلاعات مفیدی در رابطه با این موضوع مورد توجه شما قرار بدهد یا خیر.