Linux使用笔记:配置FTP服务器(vsftp)

编程入门 行业动态 更新时间:2024-10-12 22:26:37

文章目录

  • 0. VSFTP 简介
  • 1. 安装准备
  • 2. 匿名用户验证
    • 2.1. 修改配置文件
    • 2.2. 登陆
  • 3. 本地用户验证
    • 3.1. 配置文件
    • 3.2. 目录管理(可选)
    • 3.3. 用户管理
    • 3.4. 权限配置
    • 3.5. 登陆
    • 3.6. 用户配置文件(可选)
  • 4. 虚拟用户验证
    • 4.1. 建立用户
    • 4.2. 加密
    • 4.3. 添加pam.d文件
    • 4.4. 配置文件
    • 4.5. 个性化配置
    • 4.6. 登陆
  • 5. 本地用户和虚拟用户共存
    • 5.1. 原因分析
    • 5.2. 配置

0. VSFTP 简介


FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet 上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!

VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP, 从名称定义上基本可以看出,这是为了解决 ftp 传输安全性问题的。

  1. VSFTP 特点
    vsftp 程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性。
    任何需要执行较高权限的指令都需要配置许可。
    ftp 所需要使用的绝大多数命令都被整合到了 vsftp 中,基本不需要系统额外提供命令。
    拥有 chroot 功能,可以改变用户的根目录,限制用户只能在自己的家目录。

  2. VSFTP 连接类型
    控制连接(持续连接) → TCP 21(命令信道) → 用户收发FTP命令
    数据连接(按需连接) → TCP 20(数据信道) → 用于上传下载数据

  3. VSFTP 工作模式

    • 主动模式
      客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
      当需要传送数据时,客户端在命令链路上用 port 命令告诉服务器:”我打开了 xxxx 端口,你过来连接我”;
      于是服务器从 20 端口向客户端的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。

    • 被动模式
      客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
      当需要传送数据时,服务器在命令链路上用 pasv 命令告诉客户端:”我打开了 xxxx 端口,你过来连接我”;
      于是客户端向服务器的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。

    • 优缺点
      主动模式很容易受到防火墙的限制,因为大多数客户端都是在 NAT 环境中上网的,因此服务器无法向客户端的 xxx 端口发起连接;
      被动模式则不会受到防火墙的限制,因为这就是一个普通的 NAT 操作,这是完全允许的,并且被动模式的安全性相对来说更高一些。

  4. VSFTP 传输模式

    • ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
    • Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等,Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用 。
    • 切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。
  5. VSFTP 相关软件名

    服务端软件名:vsftpd
    客户端软件名:ftp
    服务名:vsftpd
    端口号:20、21、指定范围内随机端口

    相关目录:

    # vsftp配置文件
    /etc/vsftpd/vsftpd.conf
    
    # PAM认证文件
    /etc/pam.d/vsftpd
    
    # 匿名用户默认目录
    /var/ftp
    
    # 匿名用户的下载目录
    /var/ftp/pub
    
    # 不能访问 ftp server 的用户列表
    /etc/vsftpd/ftpusers
    
    # 允许访问 ftp server 的用户列表
    /etc/vsftpd/user_list
    
    # ftp 的上传下载日志
    /var/log/xferlog
    
  6. VSFTP 登陆方式:在 vsftpd 服务器中支持匿名用户本地用户,和虚拟用户3类用户账号,用途及区别如下:

    1. 匿名用户验证:是名为anonymous或ftp的用户,匿名FTP用户登录后将FTP服务器中的/var/ftp作为FTP根目录。
    2. 本地用户验证: 是 Linux 系统用户账号,使用本地用户账号登录FTP服务器后,登录目录为本地用户的宿主目录。
    3. 虚拟用户验证:为了保证FTP服务器的安全性,由vsftpd服务器提供的非系统用户账号。虚拟用户FTP登录后将把指定的目录作为FTP根目录。虚拟用户与本地用户具有类似的功能,由于虚拟用户相对安全,因此正逐步替代本地用户账号的使用。

1. 安装准备


# 安装|卸载 vsftpd
yum install -y vsftpd
yum remove vsftpd

# 检查|启动|停止|重启
systemctl status vsftpd
systemctl start vsftpd
systemctl stop vsftpd
systemctl restart vsftpd

# 设置开机自启动
systemctl enable vsftpd.service

# 让防火墙开启 FTP 服务
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload

# SE状态
sestatus

# 临时关闭SE
getenforce
setenforce 0

# 永久设置SE权限
getsebool -a | grep ftp 
setsebool -P ftpd_full_access on

# 备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak

2. 匿名用户验证


用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统,配置文件中配置上传权限,对该目录具有写权限。)

2.1. 修改配置文件

# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 运行匿名用户模式
anonymous_enable=YES
local_enable=YES

# 基础设定
write_enable=YES
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

# 上传
anon_upload_enable=YES
# 权限掩码,匿名上传的文件权限为755、644
anon_umask=022
# 建立文件夹
anon_mkdir_write_enable=YES
# 删除
anon_other_write_enable=YES
# 用户目录
anon_root=/var/ftp/

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199

2.2. 登陆

非常重要的点

  1. 默认目录的权限不能上传下载,想要获得上传下载权限,需要在根下面新建子目录并赋权。
  2. 根目录,默认anon_root=/var/ftp,所属必需为root,读写权限755
  3. 如果需要自定义根目录,必需符合条件2,通常情况下,使用root直接创建目录就OK
# 新建子目录
mkdir -p /var/ftp/upload

# 修改权限
chown -R ftp /var/ftp/upload/
chmod -R 755 /var/ftp/upload/

# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.210.201/

3. 本地用户验证


用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)

3.1. 配置文件

重难点:

  1. 锁定主目录和设定主目录最好配套使用。
  2. 推荐使用被动访问模式。
  3. 本地用户掩码为local_umask,虚拟用户掩码为anon_umsak,一定注意区分。
  4. vsftpd从2.3.5版本开始,增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报500 OOPS: vsftpd: refusing to run with writable root inside chroot()错误。解决方式不止一种,其中通过配置allow_writeable_chroot=YES的方式最省事、也最正规。
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 运行匿名用户模式
anonymous_enable=NO
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

# 锁定主目录
chroot_local_user=YES
# 设定登陆主目录
local_root=/home
# 允许用户对于主目录具有读写权限
allow_writeable_chroot=YES

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199

3.2. 目录管理(可选)

重难点

  1. 自定义根目录,所属必须为root,权限为755,一般情况下,root用户创建的目录就符合要求。
  2. 子目录,所属必须为对应建立的用户,权限为700,这样保证自身对于文件夹有所有权限,但是其他用户无法进入。
  3. 如果在新建用户的时候指定其用户主目录为子目录,则可以跳过子目录创建阶段
mkdir /home/FTP
chown -R root:root /home/FTP
chmod -R 755 /home/FTP

# 新增子目录(可选)
mkdir -p /home/FTP/admin_files
chown -R admin:admin /home/FTP/admin_files
chmod -R 700 /home/FTP/admin_files

3.3. 用户管理

重难点

  1. 如果新建用户不指定用户主目录,则需要返回3.2. 目录管理创建对应主目录和权限。
  2. 用户推荐nologin模式,这样可以放置用户登陆系统。
  3. 使用nologin模式后,还需允许nologin用户登陆FTP
# 新建用户
useradd -s /sbin/nologin -d /home/FTP/admin admin
passwd admin

# 禁止用户登陆(可跳过)
usermod -s /sbin/nologin admin

# 更改用户配置(可跳过)
usermod -s /bin/bash admin
usermod -d /home/FTP/admin admin

# 允许 nologin 用户登陆FTP
sed -i '$a /sbin/nologin' /etc/shells 
cat /etc/shells
[root@ftp home]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
/sbin/nologin

3.4. 权限配置

使用ll命令可以方便的查看系统文件目录的权限

[root@centos_7 home]# ll
总用量 0

drwx------. 3 nandi nandi 78 7月  16 09:10 nandi
-rwxrw-r--. 1 root  root   0 7月  16 09:45 readme
drwx------. 3 test  test  78 7月  16 09:09 test

上面的信息解读:

  1. readme为例,可以看到其所属用户为root(第一个表示用户),所属用户组为root(第二个表示组)
  2. -rw-r--r--,一共10个字符,可以分为四段来解读:字符长度为1-3-3-3
  3. 第一段:d 表示nanditest是目录,- 表示 readme 是文件
  4. 第二段:rwx,对于二进制码111,十进制为7,表示所属用户对于该文件(夹)具有读rw执行x的权限。
  5. 第三段:rw-,对于二进制码110,十进制为6,表示所属用户对于该文件(夹)具有读rw的权限。
  6. 第四段:r--,对于二进制码100,十进制为4,表示所属用户对于该文件(夹)具有读r的权限。

掌握规则以后,我们要改变权限也简单了

试验:
目的:将readme权限更改为:700
分析:700对应二进制111000000,对应权限为rwx------,由于他本身是文件,所以第一个符号是-,完整的权限为-rwx------
代码:

[root@centos_7 home]# chmod -R 700 readme 
[root@centos_7 home]# ll
总用量 0
drwx------. 3 nandi nandi 78 7月  16 09:10 nandi
-rwx------. 1 root  root   0 7月  16 09:45 readme
drwx------. 3 test  test  78 7月  16 09:09 test

3.5. 登陆

# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.210.201/

3.6. 用户配置文件(可选)

上一步完成以后,就已经成功完成FTP服务器的搭建,但是由于所有本地用户共用一个配置文件,导致很多配置不能根据不同用户的需求来灵活配置。比如,我们想针对不同用户建立不同的根目录,这时用户配置文件就能起到作用:

启用用户配置目录
/etc/vsftpd/vsftpd.conf里面添加语句

# 启用用户配置目录
user_config_dir=/etc/vsftpd/user_conf

建立用户配置目录

# 建立用户配置目录
mkdir -p /etc/vsftpd/user_conf

建立用户配置文件

vim /etc/vsftpd/user_conf/test
# 设定登陆主目录
local_root=/home/test

如此反复,注意用户配置文件名和用户名要一样,重启服务以后,不同用户登陆就会进入到各自的根目录当中。

4. 虚拟用户验证


创建虚拟用户用来代替本地用户,减少本地用户曝光率
使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
能够设置严格的权限

4.1. 建立用户

系统映射用户(可选)

虚拟用户为映射到这个用户,以该用户的身份登陆服务器

一般情况下,可以直接使用系统默认的ftp用户,当然也可以自己定义映射用户,映射用户不用修改密码

useradd -s /sbin/nologin vftpuser

虚拟用户

vim /etc/vsftpd/vusers
test
123
test1
123
test2
123
test3
123

对应的主目录
这里一定要把文件所有权改为映射用户。

mkdir /home/test1
mkdir /home/test2
mkdir /home/test3
chown -R ftp:ftp /home/test*

4.2. 加密

安装数据库(必备)

yum install db4 db4_utils

加密

db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db

4.3. 添加pam.d文件

重点:

  1. 修改pam.d文件以后,本地用户就无法登陆FTP服务器了,因为本地用户使用的验证文件发生了改变。
  2. 想要保证本地用户和虚拟用户可以同时登陆FTP,请查看5. 本地用户和虚拟用户共存
vim /etc/pam.d/vusers.db
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers

4.4. 配置文件

# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
# 启用虚拟用户
anonymous_enable=NO
local_enable=YES
guest_enable=YES

# 映射账户
guest_username=ftp
pam_service_name=vusers.db
anon_umask=022

# 基础设定
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES

# 锁定主目录、允许主目录拥有写权限
chroot_local_user=YES
allow_writeable_chroot=YES

# 上传权限
anon_upload_enable=YES
# 建立文件夹权限
anon_mkdir_write_enable=YES
# 删除权限
anon_other_write_enable=YES

# 添加账户配置目录
user_config_dir=/etc/vsftpd/user_conf

# 被动
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199

4.5. 个性化配置

配置文件夹(可跳过)

mkdir /etc/vsftpd/user_conf

配置个性化用户

vim /etc/vsftpd/user_conf/test
# 个性化根目录
local_root=/home/ftpfile/000002000000002
# 不可创建目录
anon_mkdir_write_enable=NO
# 不可编辑文件
anon_other_write_enable=NO
# 不可上传文件
anon_upload_enable=NO

4.6. 登陆

# 重启服务
systemctl restart vsftpd

# 查询服务器IP
ip addr

# 登陆
ftp://192.168.210.201/

5. 本地用户和虚拟用户共存

5.1. 原因分析

  • Required:
    堆栈中的所有 Required 模块必须看作一个成功的结果。如果一个或多个 Required 模块失败,则实现堆栈中的所有 Required 模块,但是将返回第一个错误。也就意味着,required需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后,继续向下面的配置条目进行验证,验证是否是本地用户时结果发现不是,又因为,验证本地用户的control_flag(见上网址中解释)也为required,所以这时候,就会返回错误,也即验证不成功。所以我们不能同时设置虚拟用户和本地用户的control_flag为required。

  • Sufficient:
    如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient 模块失败,则忽略堆栈中的所有其余模块并返回成功。我们可以把虚拟用户的验证配置放在最前面,且把control_flag设为sufficient。这样的话,如果遇到是虚拟用户,那么可以通过验证,如果是本地用户,忽略掉sufficient的两条配置规则,只要满足required就行,所以也能通过验证。

5.2. 配置

vim /etc/pam.d/vusers.db
#%PAM-1.0
auth       sufficient   pam_userdb.so   db=/etc/vsftpd/vusers
account    sufficient   pam_userdb.so   db=/etc/vsftpd/vusers
session    optional     pam_keyinit.so  force revoke
auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
auth       required     pam_shells.so
auth       include      password-auth
account    include      password-auth
session    required     pam_loginuid.so
session    include      password-auth

更多推荐

Linux使用笔记:配置FTP服务器(vsftp)

本文发布于:2023-06-13 16:55:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1385415.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:服务器   笔记   Linux   vsftp   FTP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!