• Linux部署FTP服务


    什么是FTP服务

            FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。该协议是Internet文件传输的基础,它由一系列规格说明文档所定义,目的是让用户能把一个主机上的文件复制到另一个主机上,同时也允许用户与远程主机建立连接,以访问存储在远程主机上的文件,然后把文件从远程主机传到本地计算机,或从本地计算机传到远程主机。

            FTP的主要作用就是让用户连接上一个可存储计算机文件的服务器,在服务器上用户可以进行文件的上传、下载、查看、更名、删除等操作,就像在本地计算机上操作一样方便。通常,连接FTP服务器需使用FTP客户端软件,用户通过FTP客户端程序向FTP服务器发出命令来请求服务,FTP服务器作出响应,并返回请求的结果。

            需要注意的是,FTP的传输效率非常高,因此在网络上传输大的文件时,一般都采用该协议。但是,FTP并不提供一般文件系统的访问、修改等权限,它只负责完成文件的传输。

    FTP端口号

    控制连接:TCP 21,用于发送FTP命令信息

    数据连接:TCP 20,用于上传、下载数据

    FTP的模式

    主动模式:服务端从 20 端口主动向客户端发起连接

    被动模式:服务端在指定范围内某个端口被动等待客户端连接

    FTP的传输模式

    文本模式:ASCII 模式,以文本序列传输数据

    二进制模式:Binary 模式,以二进制序列传输数据

    FTP的用户类型

    匿名用户:anonymous 或 ftp

    本地用户:帐号名称、密码等信息保存在 passwd、shadow 文件中

    虚拟用户:使用独立的帐号/密码数据文件

    安装FTP

    [root@bogon ~]# yum -y install vsftpd

    匿名用户

            安装好以后默认就启用了匿名用户,但是权限是只能查看和下载,如果想要让匿名用户拥有上传文件,创建目录或者移动等其他权限则需要配置。

    修改配置文件

    1. # 在anonymous_enable=YES下添加
    2. anon_umask=022
    3. anon_upload_enable=yes
    4. anon_mkdir_write_enable=yes
    5. anon_other_write_enable=yes
    6. # anon_umask:设置匿名用户上传文件时的umask值,umask决定了新文件和目录的默认权限
    7. # 022意味着新文件或目录的权限将被设置为755(目录)或644(文件)减去umask值
    8. anon_umask=022
    9. # anon_upload_enable:允许匿名用户上传文件
    10. # yes表示启用,no表示禁用
    11. anon_upload_enable=yes
    12. # anon_mkdir_write_enable:允许匿名用户创建目录
    13. # yes表示启用,no表示禁用
    14. anon_mkdir_write_enable=yes
    15. # anon_other_write_enable:允许匿名用户进行其他写操作(如重命名和删除)
    16. # 请注意,这个选项通常是不安全的,因为它允许匿名用户删除或修改服务器上的任何文件
    17. # yes表示启用,no表示禁用
    18. anon_other_write_enable=yes
    1. [root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
    2. anonymous_enable=YES
    3. anon_umask=022
    4. anon_upload_enable=yes
    5. anon_mkdir_write_enable=yes
    6. anon_other_write_enable=yes
    7. local_enable=YES
    8. write_enable=YES
    9. local_umask=022
    10. dirmessage_enable=YES
    11. xferlog_enable=YES
    12. connect_from_port_20=YES
    13. xferlog_std_format=YES
    14. listen=NO
    15. listen_ipv6=YES
    16. pam_service_name=vsftpd
    17. userlist_enable=YES
    18. tcp_wrappers=YES

    重启服务

    1. [root@bogon ~]# chown ftp /var/ftp/pub
    2. [root@bogon ~]# systemctl restart vsftpd

    客户端测试

            使用匿名用户登录的时候可以使用ftp用户或者anonymous用户登录,密码直接按回车即可

    1. [root@bogon ~]# date > time.txt
    2. [root@bogon ~]# ftp 192.168.207.131
    3. Connected to 192.168.207.131 (192.168.207.131).
    4. 220 (vsFTPd 3.0.2)
    5. Name (192.168.207.131:root): ftp
    6. 331 Please specify the password.
    7. Password:
    8. 230 Login successful.
    9. Remote system type is UNIX.
    10. Using binary mode to transfer files.
    11. ftp> cd pub
    12. 250 Directory successfully changed.
    13. ftp> put time.txt
    14. local: time.txt remote: time.txt
    15. 227 Entering Passive Mode (192,168,207,131,66,247).
    16. 150 Ok to send data.
    17. 226 Transfer complete.
    18. 29 bytes sent in 5.9e-05 secs (491.53 Kbytes/sec)
    19. ftp> ls
    20. 227 Entering Passive Mode (192,168,207,131,241,119).
    21. 150 Here comes the directory listing.
    22. -rw-r--r-- 1 14 50 29 Jun 13 03:16 time.txt
    23. 226 Directory send OK.
    24. ftp> get time.txt
    25. local: time.txt remote: time.txt
    26. 227 Entering Passive Mode (192,168,207,131,37,42).
    27. 150 Opening BINARY mode data connection for time.txt (29 bytes).
    28. 226 Transfer complete.
    29. 29 bytes received in 0.000224 secs (129.46 Kbytes/sec)

    本地用户

    修改配置文件

    1. # 在local_enable=YES下添加
    2. chroot_local_user=yes
    3. allow_writeable_chroot=yes
    4. # chroot_local_user:如果启用(yes),则本地用户(非匿名用户)登录后将被chroot到其主目录。
    5. # 这意味着用户将只能访问其主目录及其子目录,不能访问系统上的其他目录。
    6. # 这是一个增强安全性的措施,可以防止用户访问系统文件或执行恶意代码。
    7. chroot_local_user=yes
    8. # allow_writeable_chroot:在某些情况下,如果用户的家目录是可写的(即用户可以在其中创建或修改文件),
    9. # 那么在启用chroot后可能会导致vsftpd无法启动或用户无法登录。
    10. # 启用allow_writeable_chroot(yes)允许vsftpd在这种情况下继续运行,即使chroot目录是可写的。
    11. # 然而,请注意,这可能会稍微降低安全性,因为恶意用户可能会尝试利用可写的chroot目录来执行攻击。
    12. # 在大多数情况下,如果你的chroot目录不需要是可写的,最好保持这个选项为no。
    13. allow_writeable_chroot=yes
    1. [root@bogon ~]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
    2. anonymous_enable=YES
    3. anon_umask=022
    4. anon_upload_enable=yes
    5. anon_mkdir_write_enable=yes
    6. anon_other_write_enable=yes
    7. local_enable=YES
    8. chroot_local_user=yes
    9. allow_writeable_chroot=yes
    10. write_enable=YES
    11. local_umask=022
    12. dirmessage_enable=YES
    13. xferlog_enable=YES
    14. connect_from_port_20=YES
    15. xferlog_std_format=YES
    16. listen=NO
    17. listen_ipv6=YES
    18. pam_service_name=vsftpd
    19. userlist_enable=YES
    20. tcp_wrappers=YES

    重启服务

    [root@bogon ~]# systemctl restart vsftpd

    创建用户

    1. [root@bogon ~]# useradd zhangsan
    2. [root@bogon ~]# echo '123' | passwd --stdin zhangsan
    3. Changing password for user zhangsan.
    4. passwd: all authentication tokens updated successfully.

    客户端测试

    1. [root@bogon ~]# ftp 192.168.207.131
    2. Connected to 192.168.207.131 (192.168.207.131).
    3. 220 (vsFTPd 3.0.2)
    4. Name (192.168.207.131:root): zhangsan
    5. 331 Please specify the password.
    6. Password:
    7. 230 Login successful.
    8. Remote system type is UNIX.
    9. Using binary mode to transfer files.
    10. ftp> ls
    11. 227 Entering Passive Mode (192,168,207,131,161,43).
    12. 150 Here comes the directory listing.
    13. 226 Directory send OK.
    14. ftp> put time.txt
    15. local: time.txt remote: time.txt
    16. 227 Entering Passive Mode (192,168,207,131,148,58).
    17. 150 Ok to send data.
    18. 226 Transfer complete.
    19. 29 bytes sent in 7.6e-05 secs (381.58 Kbytes/sec)
    20. ftp> get time.txt
    21. local: time.txt remote: time.txt
    22. 227 Entering Passive Mode (192,168,207,131,200,167).
    23. 150 Opening BINARY mode data connection for time.txt (29 bytes).
    24. 226 Transfer complete.
    25. 29 bytes received in 0.00024 secs (120.83 Kbytes/sec)
    26. 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 服务器,其他所有用户都将被拒绝。这可以用于创建一个只允许特定用户访问的白名单。
    总结:

    • ftpusers 是一个固定的黑名单,列在其中的用户无论如何都不能通过 FTP 访问服务器。
    • user_list 可以作为黑名单(默认)或白名单(当 userlist_deny=NO 时),具体取决于 vsftpd 的配置。

            为了服务器的安全,管理员应定期检查并更新这两个文件,确保只有合适的用户能够访问 FTP 服务。

    虚拟用户

    准备账号密码文件

            编写虚拟用户账号文件,一行是账号一行是密码,如下账号是lisi密码是123,账号是wanguw密码是123

    1. [root@bogon ~]# cat /etc/vsftpd/vusers.list
    2. lisi
    3. 123
    4. wangwu
    5. 123

    账号密码文件加密

    1. [root@bogon ~]# cd /etc/vsftpd/
    2. [root@bogon vsftpd]# db_load -T -t hash -f vusers.list vusers.db
    3. [root@bogon vsftpd]# chmod 600 /etc/vsftpd/vusers.*

    添加虚拟用户的映射账号

    1. [root@bogon vsftpd]# useradd -d /var/ftproot -s /sbin/nologin myftp
    2. [root@bogon vsftpd]# chmod 755 /var/ftproot

    编写PAM文件

    1. [root@bogon vsftpd]# cat /etc/pam.d/vsftpd.vu
    2. auth required pam_userdb.so db=/etc/vsftpd/vusers
    3. account required pam_userdb.so db=/etc/vsftpd/vusers

    修改vsftpd配置文件

    1. # 注释pam_service_name=vsftpd,在这一行下面添加
    2. pam_service_name=vsftpd.vu
    3. guest_enable=yes
    4. guest_username=myftp
    1. [root@bogon vsftpd]# grep -v '^#' /etc/vsftpd/vsftpd.conf | grep -v '^$'
    2. anonymous_enable=YES
    3. anon_umask=022
    4. anon_upload_enable=yes
    5. anon_mkdir_write_enable=yes
    6. anon_other_write_enable=yes
    7. local_enable=YES
    8. chroot_local_user=yes
    9. allow_writeable_chroot=yes
    10. write_enable=YES
    11. local_umask=022
    12. dirmessage_enable=YES
    13. xferlog_enable=YES
    14. connect_from_port_20=YES
    15. xferlog_std_format=YES
    16. listen=NO
    17. listen_ipv6=YES
    18. pam_service_name=vsftpd.vu
    19. guest_enable=yes
    20. guest_username=myftp
    21. userlist_enable=YES
    22. tcp_wrappers=YES

    重启服务

    [root@bogon vsftpd]# systemctl restart vsftpd
    

    客户端测试

    1. [root@bogon ~]# ftp 192.168.207.131
    2. Connected to 192.168.207.131 (192.168.207.131).
    3. 220 (vsFTPd 3.0.2)
    4. Name (192.168.207.131:root): lisi
    5. 331 Please specify the password.
    6. Password:
    7. 230 Login successful.
    8. Remote system type is UNIX.
    9. Using binary mode to transfer files.
    10. ftp> quit
    11. 221 Goodbye.
    12. [root@bogon ~]# ftp 192.168.207.131
    13. Connected to 192.168.207.131 (192.168.207.131).
    14. 220 (vsFTPd 3.0.2)
    15. Name (192.168.207.131:root): wangwu
    16. 331 Please specify the password.
    17. Password:
    18. 230 Login successful.
    19. Remote system type is UNIX.
    20. Using binary mode to transfer files.
    21. ftp>

    配置虚拟账号的权限

    此时所有的虚拟账号都拥有相同的权限,我们可以通过修改配置文件设置每个用户的权限

    1. # 主配置文件添加user_config_dir
    2. [root@localhost ~]# vi /etc/vsftpd/vsftpd.conf
    3. user_config_dir=/etc/vsftpd/vusers_dir
    4. # /etc/vsftpd/vusers_dir目录没有就创建出来
    5. # cd /etc/vsftpd/vusers_dir 切换目录
    6. [root@localhost vusers_dir]# vi lisi
    7. anon_upload_enable=yes
    8. anon_mkdir_write_enable=yes
    9. anon_other_write_enable=yes
    10. [root@localhost vusers_dir]# touch wangwu
    11. # 每个用户的权限就不一样了,重启服务就可以验证了
    12. [root@localhost vusers_dir]# systemctl restart vsftpd

  • 相关阅读:
    java 入门-使用eclipse、javaFX、SceneBuilder进行图形界面开发
    【SQL教程|01】SQL简介——什么是SQL
    UEFI之DXE阶段
    CPP 核心编程8-模板
    fastapi_No.21_安全性_目录权限认证
    计算机毕业设计springboot计算机类专业工程认证资料管理系统+e65c9源码+系统+程序+lw文档+部署
    市场上低代码产品纷繁复杂,企业该如何选择?
    curl命令介绍
    [图文教程]如何不买苹果电脑来体验类Unix的感觉呢?Linux装机初体验,manjaro笔记本电脑,爆改Windows笔记本
    【Unity入门计划】基本概念(7)-Input Manager&Input类
  • 原文地址:https://blog.csdn.net/qq_33906471/article/details/139648812