【问题标题】:Symfony2 Capifony deploy setfacl Operation not permitted on cache directorySymfony2 Capifony 部署 setfacl 缓存目录上不允许操作
【发布时间】:2014-04-13 09:25:33
【问题描述】:

我正在使用 Capifony 多阶段部署将我的 Symfony2 Web 应用程序部署到 Apache Web 服务器上、Ubuntu 机器上、托管在 AWS 上。

我有用户设置

set :user,        "ubuntu"

以及像这样设置缓存的可写目录

set :writable_dirs,     ["app/cache"]
set :webserver_user,    "www-data"
set :use_set_permissions, true
set :permission_method, :acl

除了运行时,一切都部署良好

executing "setfacl -R -m u:ubuntu:rwx -m u:www-data:rwx /var/www/releases/20140310012814/app/cache"

我收到多个 Operation not allowed 错误,例如

setfacl: /var/www/releases/20140310012814/app/cache/prod/classes.php: Operation not permitted

似乎用户,大概是“www-data”,无法对“ubuntu”创建的文件设置权限。但是,我已经从 /var/www/current 目录在服务器上运行了以下内容,但我不完全确定它们做了什么:

sudo setfacl -R -m u:www-data:rwX -m u:`whoami`:rwX app/cache
sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache

这是一些acl信息

getfacl app/cache

# file: app/cache
# owner: ubuntu
# group: ubuntu
user::rwx
user:www-data:rwx
user:ubuntu:rwx
group::rwx
mask::rwx
other::rwx
default:user::rwx
default:user:www-data:rwx
default:user:ubuntu:rwx
default:group::rwx
default:mask::rwx
default:other::rwx

我看过一个类似的问题here 我应该运行类似的东西吗?如:

sudo sh -c 'setfacl -R -m u:ubuntu:rwX -m u:www-data:rwX /var/www/current/app/cache'

谢谢

【问题讨论】:

    标签: symfony ubuntu permissions acl capifony


    【解决方案1】:

    您已在当前目录上运行 sudo setfacl,但您在单个发布文件夹中收到错误。反正 www-data 应该是缓存文件夹的正确拥有者,到底是那个目录的主用户!

    在我们的部署脚本中,我们使用这个:

    set :permission_method,   :acl
    set :writable_dirs,       ["app/cache"]
    set :webserver_user,      "www-data"
    set :use_set_permissions, false
    set :use_sudo,            false
    

    我认为这是正确的解决方案。

    【讨论】:

      【解决方案2】:

      Capifony 有一个食谱条目,解释如何automatically set proper permissions。基本上你需要的是这样的:

      set :writable_dirs,       ["app/cache", "app/logs"]
      set :webserver_user,      "www-data"
      set :permission_method,   :acl
      set :use_set_permissions, true
      

      :use_sudo 不必是 true,只要 :writable_dirs:user 所有。

      问题

      setfacl: /var/www/releases/20140310012814/app/cache/prod/classes.php: 不允许操作

      此消息表明,当任务运行时缓存目录不为空(setfacl 操作该目录中的prod/classes.php),该目录:user (@ 987654330@ 是不允许的)。

      文件不属于:user这一事实是很正常的,因为网络服务器会创建大量缓存文件,这使得它们属于:webserver_user

      这里奇怪的是缓存目录不是空的。通常一个新版本应该有一个空的缓存目录。造成这种情况的一个常见原因是缓存目录是共享的,这意味着您已将其添加到:shared_children。如果是这样,请删除它。缓存目录不应共享。

      如果不是这样,则尝试找出运行setfacl 任务时缓存目录不为空的原因。也许其他任务很快就会运行。

      可写共享子项

      如果您确实希望共享目录对网络服务器是可写的,该怎么办?这其实很常见,想想应该共享的mediauploads 目录。

      权限应该设置在实际的共享目录上,而不是发布目录中的符号链接。只要:writable_dirs 中的完全相同的短语也在:shared_children 中,Capifony 就会为您解决这个问题。

      # this will work:
      set :shared_children, ["web/uploads"]
      set :writable_dirs,   ["web/uploads"]
      
      # this will also work:
      set :web_path,        "web"                    # is default
      set :shared_children, [web_path + "/uploads"]
      set :writable_dirs,   ["web/uploads"]
      
      # this will not:
      set :web_path,        "web"                    # is default
      set :shared_children, [web_path + "/uploads"]
      set :writable_dirs,   ["web/uploads/"]         # trailing /
      

      请检查错误中提到的目录是否是实际的共享目录(不是符号链接)。

      共享目录的所有者必须是运行setfacl 命令的用户。换句话说,它必须是:user。如果您更改了 :user 的值,或者过去启用了 :use_sudo,这可能会导致问题。请检查目录(在:writable_dirs 中设置)是否确实归:user 所有。

      Capifony 将检查权限是否已设置。如果是这样,它不会再尝试这样做。这是通过以下命令完成的:

      getfacl --absolute-names --tabular #{dir} | grep #{webserver_user}.*rwx | wc -l"
      

      尝试手动运行此命令(将#{dir}#{webserver_user} 替换为实际值)以查看结果。如果它没有产生任何结果,则 Capifony 假定尚未设置权限,并将尝试这样做。

      在这种情况下,请使用getfacl 手动检查权限。如果确实不正确,请使用“root 的力量”手动设置它们(同样,替换 #{user}#{webserver_user}#{dir}):

      sudo setfacl -R -m u:#{user}:rwX -m u:#{webserver_user}:rwX #{dir}
      sudo setfacl -dR -m u:#{user}:rwx -m u:#{webserver_user}:rwx #{dir}
      

      然后再次运行 Capifony。如果一切顺利,这次应该会成功!

      【讨论】:

      • 如果问题发生在应该共享的媒体目录上怎么办(这是我的情况,也是我添加此赏金的原因)。另外,如果:user 是具有目录写权限的www-data 组的成员,为什么不允许setfacl? +1 以获得详细答案
      • 如果我没记错的话,这是setfacl 的限制:只有文件的所有者(和root)才能更改其权限。因此,仅对该用户可写是不够的(否则会引入安全风险)。
      • 关于媒体文件夹:我上次查看 Capifony 已经有一段时间了,所以我将深入研究一下。理论上你只需要设置一次权限(在创建共享目录时),并且需要在实际的共享目录上完成,而不是符号链接。
      • 如果发现当文件有可执行标志时,setfacl 是可能的……但这是另一个安全风险。无论如何,我认为“设置一次方法是正确的”,因为文件夹中的文件已经有了正确的权限,这要归功于setfacl -D 命令。赏金。
      • 确实,-d 标志(顺便说一句小写)将确保在指定目录中创建的任何文件/目录都将获得指定的权限。
      猜你喜欢
      • 2013-01-21
      • 2012-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2018-05-22
      相关资源
      最近更新 更多