FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。该协议是Internet文件传输的基础,它由一系列规格说明文档所定义,目的是让用户能把一个主机上的文件复制到另一个主机上,同时也允许用户与远程主机建立连接,以访问存储在远程主机上的文件,然后把文件从远程主机传到本地计算机,或从本地计算机传到远程主机。
FTP的主要作用就是让用户连接上一个可存储计算机文件的服务器,在服务器上用户可以进行文件的上传、下载、查看、更名、删除等操作,就像在本地计算机上操作一样方便。通常,连接FTP服务器需使用FTP客户端软件,用户通过FTP客户端程序向FTP服务器发出命令来请求服务,FTP服务器作出响应,并返回请求的结果。
需要注意的是,FTP的传输效率非常高,因此在网络上传输大的文件时,一般都采用该协议。但是,FTP并不提供一般文件系统的访问、修改等权限,它只负责完成文件的传输。
控制连接:TCP 21,用于发送FTP命令信息
数据连接:TCP 20,用于上传、下载数据
主动模式:服务端从 20 端口主动向客户端发起连接
被动模式:服务端在指定范围内某个端口被动等待客户端连接
文本模式:ASCII 模式,以文本序列传输数据
二进制模式:Binary 模式,以二进制序列传输数据
匿名用户:anonymous 或 ftp
本地用户:帐号名称、密码等信息保存在 passwd、shadow 文件中
虚拟用户:使用独立的帐号/密码数据文件
[root@bogon ~]# yum -y install vsftpd
安装好以后默认就启用了匿名用户,但是权限是只能查看和下载,如果想要让匿名用户拥有上传文件,创建目录或者移动等其他权限则需要配置。
- # 在anonymous_enable=YES下添加
- anon_umask=022
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
-
- # anon_umask:设置匿名用户上传文件时的umask值,umask决定了新文件和目录的默认权限
- # 022意味着新文件或目录的权限将被设置为755(目录)或644(文件)减去umask值
- anon_umask=022
-
- # anon_upload_enable:允许匿名用户上传文件
- # yes表示启用,no表示禁用
- anon_upload_enable=yes
-
- # anon_mkdir_write_enable:允许匿名用户创建目录
- # yes表示启用,no表示禁用
- anon_mkdir_write_enable=yes
-
- # anon_other_write_enable:允许匿名用户进行其他写操作(如重命名和删除)
- # 请注意,这个选项通常是不安全的,因为它允许匿名用户删除或修改服务器上的任何文件
- # yes表示启用,no表示禁用
- anon_other_write_enable=yes
- [root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
- anonymous_enable=YES
- anon_umask=022
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
- local_enable=YES
- write_enable=YES
- local_umask=022
- dirmessage_enable=YES
- xferlog_enable=YES
- connect_from_port_20=YES
- xferlog_std_format=YES
- listen=NO
- listen_ipv6=YES
- pam_service_name=vsftpd
- userlist_enable=YES
- tcp_wrappers=YES
- [root@bogon ~]# chown ftp /var/ftp/pub
- [root@bogon ~]# systemctl restart vsftpd
使用匿名用户登录的时候可以使用ftp用户或者anonymous用户登录,密码直接按回车即可
- [root@bogon ~]# date > time.txt
- [root@bogon ~]# ftp 192.168.207.131
- Connected to 192.168.207.131 (192.168.207.131).
- 220 (vsFTPd 3.0.2)
- Name (192.168.207.131:root): ftp
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> cd pub
- 250 Directory successfully changed.
- ftp> put time.txt
- local: time.txt remote: time.txt
- 227 Entering Passive Mode (192,168,207,131,66,247).
- 150 Ok to send data.
- 226 Transfer complete.
- 29 bytes sent in 5.9e-05 secs (491.53 Kbytes/sec)
- ftp> ls
- 227 Entering Passive Mode (192,168,207,131,241,119).
- 150 Here comes the directory listing.
- -rw-r--r-- 1 14 50 29 Jun 13 03:16 time.txt
- 226 Directory send OK.
- ftp> get time.txt
- local: time.txt remote: time.txt
- 227 Entering Passive Mode (192,168,207,131,37,42).
- 150 Opening BINARY mode data connection for time.txt (29 bytes).
- 226 Transfer complete.
- 29 bytes received in 0.000224 secs (129.46 Kbytes/sec)
-
- # 在local_enable=YES下添加
- chroot_local_user=yes
- allow_writeable_chroot=yes
-
- # chroot_local_user:如果启用(yes),则本地用户(非匿名用户)登录后将被chroot到其主目录。
- # 这意味着用户将只能访问其主目录及其子目录,不能访问系统上的其他目录。
- # 这是一个增强安全性的措施,可以防止用户访问系统文件或执行恶意代码。
- chroot_local_user=yes
-
- # allow_writeable_chroot:在某些情况下,如果用户的家目录是可写的(即用户可以在其中创建或修改文件),
- # 那么在启用chroot后可能会导致vsftpd无法启动或用户无法登录。
- # 启用allow_writeable_chroot(yes)允许vsftpd在这种情况下继续运行,即使chroot目录是可写的。
- # 然而,请注意,这可能会稍微降低安全性,因为恶意用户可能会尝试利用可写的chroot目录来执行攻击。
- # 在大多数情况下,如果你的chroot目录不需要是可写的,最好保持这个选项为no。
- allow_writeable_chroot=yes
- [root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
- anonymous_enable=YES
- anon_umask=022
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
- local_enable=YES
- chroot_local_user=yes
- allow_writeable_chroot=yes
- write_enable=YES
- local_umask=022
- dirmessage_enable=YES
- xferlog_enable=YES
- connect_from_port_20=YES
- xferlog_std_format=YES
- listen=NO
- listen_ipv6=YES
- pam_service_name=vsftpd
- userlist_enable=YES
- tcp_wrappers=YES
[root@bogon ~]# systemctl restart vsftpd
- [root@bogon ~]# useradd zhangsan
- [root@bogon ~]# echo '123' | passwd --stdin zhangsan
- Changing password for user zhangsan.
- passwd: all authentication tokens updated successfully.
- [root@bogon ~]# ftp 192.168.207.131
- Connected to 192.168.207.131 (192.168.207.131).
- 220 (vsFTPd 3.0.2)
- Name (192.168.207.131:root): zhangsan
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> ls
- 227 Entering Passive Mode (192,168,207,131,161,43).
- 150 Here comes the directory listing.
- 226 Directory send OK.
- ftp> put time.txt
- local: time.txt remote: time.txt
- 227 Entering Passive Mode (192,168,207,131,148,58).
- 150 Ok to send data.
- 226 Transfer complete.
- 29 bytes sent in 7.6e-05 secs (381.58 Kbytes/sec)
- ftp> get time.txt
- local: time.txt remote: time.txt
- 227 Entering Passive Mode (192,168,207,131,200,167).
- 150 Opening BINARY mode data connection for time.txt (29 bytes).
- 226 Transfer complete.
- 29 bytes received in 0.00024 secs (120.83 Kbytes/sec)
- ftp>
/etc/vsftpd/user_list 和 /etc/vsftpd/ftpusers 是 vsftpd FTP 服务器使用的两个重要文件,用于控制用户访问权限。这两个文件的具体作用如下:
/etc/vsftpd/ftpusers:
这个文件包含了一个用户列表,列表中的用户将被拒绝通过 FTP 访问服务器。
默认情况下,这个文件通常包含如 root, bin, daemon, adm, lp, sync, shutdown, halt, mail, news, uucp, operator, games, gopher, ftp, nobody, www-data, backup, list, irc 和 gnats 等系统或服务用户。
这些用户由于具有特殊的系统权限或用于特定的服务,因此不应通过 FTP 访问服务器,以避免安全风险。
/etc/vsftpd/user_list:
这个文件的作用取决于 vsftpd 配置文件中的 userlist_deny 和 userlist_enable 设置。
当 userlist_enable=YES 时,vsftpd 会检查这个文件。
如果 userlist_deny=YES(默认值),则 user_list 文件中的用户将被拒绝访问 FTP 服务器。这类似于 ftpusers 文件,但通常用于定义额外的用户限制。
如果 userlist_deny=NO,则只有列在 user_list 文件中的用户才被允许访问 FTP 服务器,其他所有用户都将被拒绝。这可以用于创建一个只允许特定用户访问的白名单。
总结:
为了服务器的安全,管理员应定期检查并更新这两个文件,确保只有合适的用户能够访问 FTP 服务。
编写虚拟用户账号文件,一行是账号一行是密码,如下账号是lisi密码是123,账号是wanguw密码是123
- [root@bogon ~]# cat /etc/vsftpd/vusers.list
- lisi
- 123
- wangwu
- 123
账号密码文件加密
- [root@bogon ~]# cd /etc/vsftpd/
- [root@bogon vsftpd]# db_load -T -t hash -f vusers.list vusers.db
- [root@bogon vsftpd]# chmod 600 /etc/vsftpd/vusers.*
- [root@bogon vsftpd]# useradd -d /var/ftproot -s /sbin/nologin myftp
- [root@bogon vsftpd]# chmod 755 /var/ftproot
- [root@bogon vsftpd]# cat /etc/pam.d/vsftpd.vu
- auth required pam_userdb.so db=/etc/vsftpd/vusers
- account required pam_userdb.so db=/etc/vsftpd/vusers
- # 注释pam_service_name=vsftpd,在这一行下面添加
- pam_service_name=vsftpd.vu
- guest_enable=yes
- guest_username=myftp
- [root@bogon vsftpd]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
- anonymous_enable=YES
- anon_umask=022
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
- local_enable=YES
- chroot_local_user=yes
- allow_writeable_chroot=yes
- write_enable=YES
- local_umask=022
- dirmessage_enable=YES
- xferlog_enable=YES
- connect_from_port_20=YES
- xferlog_std_format=YES
- listen=NO
- listen_ipv6=YES
- pam_service_name=vsftpd.vu
- guest_enable=yes
- guest_username=myftp
- userlist_enable=YES
- tcp_wrappers=YES
[root@bogon vsftpd]# systemctl restart vsftpd
- [root@bogon ~]# ftp 192.168.207.131
- Connected to 192.168.207.131 (192.168.207.131).
- 220 (vsFTPd 3.0.2)
- Name (192.168.207.131:root): lisi
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp> quit
- 221 Goodbye.
- [root@bogon ~]# ftp 192.168.207.131
- Connected to 192.168.207.131 (192.168.207.131).
- 220 (vsFTPd 3.0.2)
- Name (192.168.207.131:root): wangwu
- 331 Please specify the password.
- Password:
- 230 Login successful.
- Remote system type is UNIX.
- Using binary mode to transfer files.
- ftp>
此时所有的虚拟账号都拥有相同的权限,我们可以通过修改配置文件设置每个用户的权限
- # 主配置文件添加user_config_dir
- [root@localhost ~]# vi /etc/vsftpd/vsftpd.conf
- user_config_dir=/etc/vsftpd/vusers_dir
-
- # /etc/vsftpd/vusers_dir目录没有就创建出来
- # cd /etc/vsftpd/vusers_dir 切换目录
- [root@localhost vusers_dir]# vi lisi
- anon_upload_enable=yes
- anon_mkdir_write_enable=yes
- anon_other_write_enable=yes
-
- [root@localhost vusers_dir]# touch wangwu
-
- # 每个用户的权限就不一样了,重启服务就可以验证了
- [root@localhost vusers_dir]# systemctl restart vsftpd
-