FTP یا File Transfer Protocol، پروتکلی برای انتقال فایل از یک ماشین به ماشین دیگر. ابزار های زیادی مانند wu-ftpd و … برای پیاده سازی ftp در توزیع های لینوکسی وجود دارد اما پر استفاده ترین نرم افزار پیاده سازی ftp در توزیع لینوکسی بسته نرم افزاری vsftpd که مخفف Very Secure File Transfer Protocol Daemon است. در کل ftp یکی از بیشترین سرویس هایی است که دارای امنیت کم و مورد حمله برای دسترسی به سرور از طریق آن است. اگر ftp روی اینترنت با امنیت پایین باشد هر کسی می تواند با دسترسی به ftp و نوشتن (کپی) یک فایل مخرب روی آن و دانلود آن توسط افرادی روی سرور باعث تخریب سرور شوند. عاقلانه و ساده ترین کار این است که هر کسی اجازه write روی سرور ftp را نداشته باشد یا حداقل روی تمامی دایرکتوری ها نداشته باشد و اگر نیاز به رد و بدل فایل ها بین کارمندان باشد باید فقط روی همان دایرکتوری بازهم برای افراد مشخصی فقط دسترسی write وجود داشته باشد. ftp روی پورت 21 بصورت پیش فرض به در خواست ها گوش می دهد، تغییر این پورت به عددی دیگر، یکی دیگر از کارهای ایمن ساختن سرویس ftp است. بطور خلاصه می توان ایمن سازی ftp در لینوکس (هر توزیع لینوکسی) را بصورت زیر پیاده سازی کرد:
- غیر فعال کردن پارامتر anonymous_enable
- عدم اجازه نوشتن توسط هر کاربری
- محدود کردن دسترسی ماشین ها (Host ها) توسط فایل های hosts.deny یا hosts.allow
- کنترل سرویس توسط xinetd برای کنترل بیشتر روی سرویس ftp مانند تعیین ساعت و اینکه کدام ماشین ها می توانند سرویس را استفاده کنند.
- بررسی فایل هایی که روی سرور ftp توسط افراد دیگری کپی (نوشته) می شوند، در صورتی که اجازه نوشتن به افرادی داده شده باشد.
ftp بر روی دو جفت پورت TCP فعالیت می کند. اولین اتصال TCP بروی پورت 21 که ftp control channel گفته می شود،مسئول اجرای دستور ها را دارد. دومین اتصال TCP برروی پورت 20 که ftp data channel گفته می شود، مسئولیت انتقال داده ها را دارد. ftp ها از دیدگاه شبکه بندی، به دو صورت Active ftp و Passive ftp هستند. در Active ftp، سرور برروی پورت 20 شروع به انتقال داده ها به سمت کلاینت می کند. و در Passive ftp کلاینت ایجاد یک درخواست به سرور را آغاز می کند.
نصب سرویس ftp در توزیع های مبتنی بر RedHat :
در ماشین های کلاینت دستور زیر را اجرا کنید. ftp یک ابزار متنی است که برای اتصال به سرور استفاده می شود. gftp یک ابزار گرافیکی برای اتصال به سرور استفاده می شود. البته می توانید بدون اینها و با استفاده از مرورگر اینترنتی مانند فایرفاکس یا از مرورگر سیستم فایل مانند ناتیلوس در گنوم استفاده کنید.
yum install ftp gftp
در ماشین سرور ftp دستور زیر را اجرا کنید.
yum -y install vsftpd
فایل اصلی پیکربندی vsftpd در دایرکتوری etc/vsftpd/ به نام vsftpd.conf وجود دارد که شامل پارامتر های اصلی تنظیم vsftpd است. خط هایی که با # شروع شوند بعنوان Comment در نظر گرفته می شوند. البته برخی از پارامتر ها نیز ابتدایشان # دارند که یعنی پارانتر غیر فعال است. برای فعال کردن پارامتر ها باید علامت # را از ابتدایشان حذف کرد.راهنمای vsftpd در مسیر زیر قراد دارد که با رفتن به مسیر زیر می توانید نمونه فایل های تنظیم مانند تنظیم xinetd را بخوانید. بالای هر پارامتر فایل توضیحی از کاربرد آن پارامتر داده شده است که از مهمترین آنها :
- anonymous_enable : یعنی هر کاربری می تواند به ftp دسترسی داشته باشد. معمولن در سرور های ftp روی اینترنت برای دانلود فایل ها از این گزینه استفاده می شود که امنیت را پایین می آورد. اگر مقدارش YES باشد یعنی همه می توانند به ftp دسترسی داشته باشند. بطور پیش فرض بعد از ورود کاربر anonymous، این کاربر به مسیر var/ftp/pub/ منتقل می شود و می تواند به فایل های درون آن دسترسی داشته باشد. اگر NO باشد باید نام کاربری و پسوردی را وارد کند.
- anon_root : تعیین کننده دایرکتوری که کاربر anonymous بصورت پیش فرض وارد آن می شوند.این پارامتر بصورت پیش فرض وجود ندارد و باید آنرا در صورت تغییر دایرکتوری پیش فرض تغییر دهید. بطور مثال در صورت تغییر از var/ftp/pub/ به var/ftp/ :
anon_root=/var/ftp
- listen : اگر YES باشد کنترل فرایند ftp بصورت Standalone است و اگر NO باشد کنترل توسط xinetd خواهد بود. وقتی مقدار YES باشد سرویس بصورت background اجرا و توسط فرایند init کنترل خواهد شد. ولی در صورتی که مقدارش NO باشد این فرایند توسط xinetd کنترل می شود و اگر مقدار پارامتر disable در فایل مربوط به vsftpd در دایرکتوری xinetd.d برابر no باشد یعنی اینکه سرویس vsftpd غیر فعال است و اگر yes باشد یعنی سرویس فعال است.
- local_enable : به کاربران محلی اگر YES باشد اجازه دسترسی می دهد. بهتر است NO باشد زیرا ازتباط در vsftpd یا هر ftp دیگری بصورت Clear Text است و کاربر سوی می تواند اطلاعات را بدزد. البته می توان برای امن کردن ارتباط بین سیستم ها از Certificate ها توسط ابزار openssl استفاده کرد.
- write_enable : اجازه نوشتن (کپی فایل و دایرکتوری توسط دیگر کاربران روی ftp رای می دهد.). بهتر است NO باشد چونکه ممکن است فایلی که روی ftp نوشته می شود مخرب باشد و با کپی کردن دیگران از روی ftp روی سیستمشان، دچار مشکل شوند.
- anon_umask : مجوز های پیش فرض ایجاد فایل و دایرکتوری را برای کاربر anonymous تعیین می کند.
- local_umask : مجوز های پیش فرض ایجاد فایل و دایرکتوری را برای کاربران محلی تعیین می کند. که این گزینه تحت تاثیر local_enable است که باید مقدارش YES باشد.
- anon_upload_enable : اگر مقدارش YES باشد اجازه آپلود را به کاربر anonymous می دهد. این پارامتر در صورتی که پارامتر write_enable مقدارش YES باشد قایل استفاده است.
- anon_mkdir_write_enable : در صورتی که مقدارش YES باشد کاربر anonymous اجازه ایجاد دایرکتوری را دارد.
- dirmessage_enable : پیامی که به یک کاربر راه دور در حین ورود به یک دایرکتوری مشخص نشان داده می شود.
- xferlog_enable : اگر YES باشد، رویداد های Upload/Download روی فایل log برنامه vsftpd ثبت می شود.
- connect_from_port_20 : مطمئن از اینکه پورت ارتباطی، پورت شماره 20 خواهد بود. پورت 20 یا ftp-data زمانی که دستور هایی مانند get/put را سمت کلاینت اجرا م کنیم برای ارتباط با سرور استفاده می شود.
- listen_port : پورت پیش فرض 21 است که برای امنیت بیشتر می توانید پورت را تغییر دهید.
listen_port=21
- listen_address : با این پارامتر اگر چندین کارت شبکه روی ftp server دشاته باشیم یکی از آنها را برای استفاده توسط کلاینت ها و پاسخی دهی به در خواست ها تعیین می کنیم. البته اگر درخواست ها زیاد می توان بطور مثال از سه کارت شبکه دو کارت را اختصاص داد. اگر این پارامتر مقدار دهی نشود تمامی کارت های شبکه استفاده می شوند.بطور مثال
listen_address=192.168.1.103
- xferlog_file : مسیر فایل log را تعیین می کند. مقدار پیش فرض آن :
xferlog_file=/var/log/vsftpd.log
تنظیم vsftpd بصورت Anonymous :
برای اشتراک و انتقال فایل در شبکه محلی یا بر روی اینترنت بطوری که کاربران بدون نیاز به وارد کردن نام کاربر و پسورد، مجاز به استفاده از ftp باشند. در این سناریو هر کاربری می تواند از ftp server فایل دانلود کند ولی حق نوشتن،آپلود کردن و ایجاد دایرکتوری را بر روی سرور ندارد. محلی که کاربر anonymous در سرور ftp وصل می شود، دایرکتوری var/ftp/pub/ است. همچنین مقدار پارامتر listen برابر YES باشد تا سرویس بصورت Standalone کنترل شود. مقدار پارامتر های anonymous_enable و local_enable بصورت زیر تنظیم شوند.
local_enable=NO
anonymous_enable=YES
و برای عدم نوشتن توسط دیگران (anonymous) پارامتر write_enable را NO کنید.
write_enable=NO
و تنظیم پارامتر xferlog_enable به YES
xferlog_enable=YES
تعیین پورت پیش فرض و آدرسی که سرور روی آن در خواست های ارسالی را جواب می دهد.
listen_address=192.168.0.100
listen_port=21
پس از تغییرات بالا اگر برای بار اول است که سرویس را تنظیم می کنید باید آنرا با دستور های زیر فعال یا start کنید.
chkconfig vsftpd on
etc/init.d/vsftpd start/
و یا اینکه اگر سرویس را از قبل فعال کرده بودید و این تنظیمات را انجام دادید با دستور زیر آنرا restart کیند.
etc/init.d/vsftpd restart/
تنظیم فایر وال : برای دریافت بسته های ftp باید فایروال را تنظیم کنیم. برای این کار در توزیع های مبتنی بر RedHat دستور زیر را در تمامی ماشین ها (سرور-کلاینت) اجرا کنید و مطابق شکل زیر FTP را انتخاب و سپس روی Apply کلیک کنید و در نهایت در پیام داده شده برای restart کردن iptables روی Yes کلیک کنید.
system-config-firewall
دسترسی به ftp :
از ماشین های کلاینت در مرورگر اینترنتی یا از یک مرورگر سیستم فایل مانند Natilus در گنوم آدرس را بصورت زیر بنویسید. در صورتی که آدرس تعیین شده در listen_address آدرس 192.168.1.103 باشد باید خط زیر را وارد کنید.
ftp://192.168.1.103
در صورتی که آدرسی به غیر از 192.168.1.103 که روی ماشین سرور قرار دارد ولی در پارامتر listen_address قرار ندارد خطای زیر نشان داده می شود.
در صورتی که به درستی آدرس را وارد کرده باشید و مشکل از فایر وال نداشته باشید وارد دایرکتوری pub در زیر دایرکتوری var/ftp/ می شوید. اگر از محیط گرافیکی مانند ناتیلوس استفاده می کنید دایرکتوری var/ftp/pub/ در دستکتاپ سیستم شما mount خواهد شد. برای قطع و Unmount کردن آن روی آیکون راست کلیک و سپس Unmount را کلیک کنید.
برای کپی فایل ها نیز در محیط مانند ناتیلوس روی فایل کلیک راست و سپس Copy را بزنید و آنرا در جایی از ماشین خود Paste کنید یا اینکه در محیطی مانند فایرفاکس روی فایل کلیک تا در دایرکتوری Downloads دانلود و ذخیره شود. دایرکتوری gvfs محلی روی ماشین شماست که دایرکتوری var/ftp/pub/ در آن mount شده است.
cd ~/.gvfs
ls -l
هم چنین اگر دستور mount را اجرا کنید دایرکتوری mount شده را می توانید ببنید.
mount
تنظیم دسترسی فقط خواندنی برای کاربران
در این حالت نمی خواهیم از ویژگی Anonymous استفاده کنیم، بلکه یک سری از کاربران مورد اطمینان دسترسی فقط خواندنی به ftp را دارند. پس در ابتدا باید کاربران Anonymous را غیر فعال کنیم.
anonymous_enable=NO
OR
anonymous_enable=NO#
دومین خط بالا، یعنی خط anonymous_enable را کامنت (غیر فعال) کردیم. ویژگی local_enable را باید فعال کنیم. برای اینکار اگر این ویژگی کامنت شده است باید # را از ابتدای خط آن برداشته و مقدار YES را بدهیم.
local_enable=YES
توجه داشته باشید که vsftpd هر باز زمان start شدن فایل etc/vsftpd/vsftpd.conf/ را می خواند، پس اگز از قبل تنظیماتی را انجام داده اید، باید با اولین خط زیر دستور را restart کنید (بعد هر اعمال تغییر vsftpd را restart کنید) و اگر برای اولین بار است که تغییرات را اعمال می کنید، باید با دومین خط زیر آنرا start کنید.
etc/init.d/vsftpd restart/
etc/init.d/vsftpd start/
یک گروه و دایرکتوری مورد نظر را با دستور های زیر ایجاد کنید. از این پس دایرکتوری زیر محل پیش فرض ftp خواهد بود.
groupadd ftp-users
mkdir /home/ftp-docs
مجوز های لازم جهت دسترسی اعضای گروه ftp-users را بصورت زیر اهدا کنید.
chmod 750 /home/ftp-docs
chown root:gtp-users /home/ftp-docs
کاربران مورد نظر را با دستور های زیر ایجاد کنید. در هریک از دستور های زیر دایرکتوری کاربر home/ftp-docs/ و گروه اصلی آن ftp-users خواهد بود.
useradd -g ftp-users -d /home/ftp-docs user1
useradd -g ftp-users -d /home/ftp-docs user2
useradd -g ftp-users -d /home/ftp-docs user3
و پسوردشان را تنظیم کنید.
passwd user1
passwd user2
passwd user3
و در نهایت مجوز Read-Only را به فایل ها بدهید.
*/ chown root:ftp-users /home/ftp-docs
*/chmod 740 /home/ftp-docs
همچنین اگر می خواهید که کاربران بطور مطلق قابلیت write نداشته باشند، باید ویژگی write_enable را نیز NO کنید.
write_enable=NO
فایل etc/vsftpd/ftpusers/
از این فایل برای امنیت بیشتر استفاده می شود. می توانید دسترسی برخی از کاربران به FTP را با افزودن نام آنها محدود کنید. زمانی که vsftpd را نصب کردید، خود vsftpd تعدادی از کاربران که دسترسی به ftp را نخواهند داشت به این فایل اضافه می کند. در هر خط آن نام یک کاربر قرار خواهد گرفت.
vi /etc/vsftpd/ftpusers
OUTPUT
Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
news
uucp
operator
games
nobody