前言

在CentOS 7.6系统中,默认情况下,FTP用户只能在其主目录内进行文件上传和下载操作,这在某些情况下可能会限制用户的工作效率和灵活性。为了解决这一问题,我们可以利用ACL(Access Control List,访问控制列表)这一强大的权限管理机制,实现对FTP用户在主目录之外其他目录的文件上传操作进行精确控制。

本文将详细介绍在 CentOS 7.6 系统中配置 ACL 的步骤,以允许 FTP 用户在特定目录之外上传文件。我们将解释 ACL 的原理,并演示如何使用 setfacl 命令为目录设置 ACL 规则,以实现对文件上传的灵活管理。通过本文,您将学会更好地理解 ACL 的应用和配置方法,提升 FTP 服务的安全性和灵活性。

什么是 ACL?

ACL(Access Control List)是一种用于管理文件和目录访问权限的机制。它允许管理员为文件或目录指定特定的用户或用户组,并定义它们对文件或目录的访问权限。与传统的 Unix 权限模型(例如 rwx)不同,ACL 允许更细粒度的控制,例如允许一个用户组中的特定成员访问文件,或者允许某个用户读取文件但不允许写入等。

问题提出

今天在云服务器上安装部署了 Calibre-Web 应用,想打造自己的网上书库,先使用 Calibre 在Windows整理好书库,用 FileZilla 软件将书库的数据库文件 metadata.db 拖到CentOS 7.6的 /opt/1panel/apps/calibre-web/calibre-web/data/books 文件夹时一直报如下的错误。

/opt/1panel/apps/calibre-web/calibre-web/data/books/metadata.db:open for write:permission denied

问题诊断:文件系统权限问题,导致无法写入特定路径;

解决方案

在网上一番查询,找到了三种解决方案,下面一一列举。

我的 FTP用户名:ahui,FTP用户主目录:/home/ahui, 我想给 optopt 子文件夹全部开启读写权限。

方法 1:修改全局写权限

您可以暂时修改 /opt 目录的权限,允许所有用户写入,但这增加了被恶意利用的风险。

bashsudo chmod -R 777 /opt

这会将 /opt 目录及其子目录的权限设置为全用户可读写执行,极不推荐在生产环境长期使用此设置,因为它会极大增加安全风险。

方法 2:设置ACL权限⭐⭐⭐

使用访问控制列表(ACL)为用户 ahui 提供特定目录的额外权限,而无需更改其他用户的权限。可以按照以下步骤进行操作:

  1. 安装ACL工具 (如果尚未安装,可以使用以下命令安装):

    sudo yum install acl
    
  2. 为FTP用户添加ACL权限:为了给FTP用户"ahui"添加ACL权限,您可以使用以下命令:

    sudo setfacl -R -m u:ahui:rwx /opt
    

​ 这将为用户"ahui"授予对/opt目录及其所有子目录和文件的读写执行权限。

  1. 确保新创建的文件和目录继承ACL权限:为了确保新创建的文件和目录继承ACL权限,您可以使用 -d 参数来设置默认ACL。使用以下命令:

    sudo setfacl -R -d -m u:ahui:rwx /opt
    

​ 这将确保新创建的文件和目录将继承/opt目录的ACL权限。

方法 3:更改FTP服务配置

修改FTP服务器 vsftpd 的配置,使其运行在高权限模式下,例如运行为root用户。

write_enable=YES
local_umask=022
chroot_local_user=NO
allow_writeable_chroot=YES

方案选择

以上方法,特别是修改全局权限和运行FTP服务为root,都会带来相应的安全风险。推荐使用ACL设置,因为它提供了最精细的权限控制,而不会过多地暴露系统资源。

至此,FTP用户"ahui"应该能够对/opt目录及其内容具有读写执行权限,并且新创建的文件和目录也会继承这些权限。重新通过 FTP 服务将数据库文件 metadata.db 拖到服务器指定目录即可。

Calibre-Web

补充命令

在 CentOS 7.6 上使用 ACL(Access Control List)来设置文件和目录权限的一般步骤如下,并附上相应的命令:

安装 ACL 软件包(如果尚未安装):

sudo yum install acl

确认文件系统支持 ACL: 确保文件系统已启用 ACL 功能。您可以通过检查 /etc/fstab 文件来确认。示例:

cat /etc/fstab | grep acl

设置文件 ACL: 使用 setfacl 命令设置文件的 ACL。例如,为文件 example.txt 添加一个用户权限条目:

setfacl -m u:username:permissions example.txt

设置目录 ACL: 对于目录,ACL 设置略有不同。例如,为目录 example_dir 添加一个用户权限条目:

setfacl -m u:username:permissions example_dir

查看 ACL 规则: 使用 getfacl 命令查看文件或目录的 ACL 规则。示例:

getfacl example.txt

删除 ACL 规则(如果需要): 使用 setfacl 命令删除 ACL 规则。示例:

setfacl -x u:username example.txt

通过以上步骤,您可以在 CentOS 7.6 上使用 ACL 来设置文件和目录权限。