AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 124800
Accepted
Xeoncross
Xeoncross
Asked: 2010-03-22 17:21:39 +0800 CST2010-03-22 17:21:39 +0800 CST 2010-03-22 17:21:39 +0800 CST

如何为 WWW 文件夹设置 linux 权限?

  • 772

更新摘要

/var/www 目录归其所有,root:root这意味着没有人可以使用它,而且它完全没用。由于我们都想要一个实际工作的 Web 服务器(并且没有人应该以“root”身份登录),所以我们需要解决这个问题。

只有两个实体需要访问。

  1. PHP/Perl/Ruby/Python都需要访问文件夹和文件,因为它们创建了许多文件夹和文件(即/uploads/)。这些脚本语言应该在 nginx 或 apache 下运行(或者甚至是一些其他的东西,比如 PHP 的 FastCGI)。

  2. 开发商

他们如何获得访问权?我知道以前有人在某个地方做过这件事。然而,有数十亿个网站,您会认为会有更多关于这个主题的信息。


我知道 777 是所有者/组/其他的完全读/写/执行权限。因此,这似乎不需要正确,因为它为随机用户提供了完全权限。

需要使用哪些权限,/var/www以便:

  1. 源代码控制,如 git 或 svn
  2. 像“网站”这样的组中的用户(甚至添加到“www-data”)
  3. 像 apache 或 lighthttpd 这样的服务器
  4. 和 PHP/Perl/Ruby

都可以在那里读取、创建和运行文件(和目录)吗?

如果我是正确的,Ruby 和 PHP 脚本不会直接“执行”——而是传递给解释器。所以不需要对/var/www...中的文件执行权限?因此,似乎正确的许可chmod -R 1660是

  1. 这四个实体可共享的所有文件
  2. 所有文件都错误地不可执行
  3. 完全阻止目录中的其他所有人
  4. 将所有未来文件的权限模式设置为“粘性”

这个对吗?

更新 1:我刚刚意识到文件和目录可能需要不同的权限 - 我在谈论上面的文件,所以我不确定目录权限需要是什么。

更新 2:文件夹结构发生了/var/www巨大变化,因为上述四个实体之一总是添加(有时删除)文件夹和子文件夹很多层级。他们还创建和删除其他 3 个实体可能需要读/写访问权限的文件。因此,权限需要对文件和目录都做上面的四件事。由于它们都不应该需要执行权限(请参阅上面有关 ruby​​/php 的问题),我认为rw-rw-r--权限将是所需要的并且完全安全,因为这四个实体由受信任的人员(请参阅#2)和所有其他用户运行系统只有读取权限。

更新 3:这适用于个人开发机器和私人公司服务器。没有像共享主机这样的随机“网络客户”。

更新 4: slicehost 的 这篇文章似乎最能解释为 www 文件夹设置权限所需的内容。但是,我不确定使用 PHP 或 svn/git 运行的用户或组 apache/nginx 以及如何更改它们。

更新 5:我(我认为)终于找到了一种让这一切正常工作的方法(答案如下)。但是,我不知道这是否是正确且安全的方法。因此,我开始了赏金。拥有保护和​​管理 www 目录的最佳方法的人获胜。

linux permissions chmod
  • 7 7 个回答
  • 142445 Views

7 个回答

  • Voted
  1. Best Answer
    Xeoncross
    2010-03-26T13:27:07+08:002010-03-26T13:27:07+08:00

    经过更多的研究,似乎另一种(可能更好的方法)来回答这个问题,就是像这样设置 www 文件夹。

    1. sudo usermod -a -G developer user1(将每个用户添加到开发者组)
    2. sudo chgrp -R developer /var/www/site.com/以便开发人员可以在那里工作
    3. sudo chmod -R 2774 /var/www/site.com/这样只有开发人员可以创建/编辑文件(其他/世界可以读取)
    4. sudo chgrp -R www-data /var/www/site.com/uploads以便 www-data (apache/nginx) 可以创建上传。

    由于git以任何用户调用它的身份运行,因此只要用户在“开发者”组中,他们就应该能够创建文件夹、编辑 PHP 文件和管理 git 存储库。

    注意:在步骤(3)中:2774中的“2”表示为目录“设置组ID”。这会导致在其中创建的新文件和子目录继承父目录的组 ID(而不是用户的主要组)参考:http ://en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories

    • 52
  2. Nic
    2010-03-22T18:52:40+08:002010-03-22T18:52:40+08:00

    我不确定它是否“正确”,但这是我在服务器上所做的:

    • /var/www 包含每个网站的文件夹。
    • 每个网站都有一个指定的所有者,该所有者被设置为网站目录下所有文件和文件夹的所有者。
    • 维护该网站的所有用户都被放入该网站的一个组中。
    • 该组被设置为目录中所有文件和文件夹的组所有者。
    • 任何需要由网络服务器(即 PHP)写入的文件或文件夹都将其所有者更改为 www-data,即运行 apache 的用户。

    请记住,您应该在目录上启用执行位,以便您可以列出内容。

    • 8
  3. Xeoncross
    2010-03-24T19:15:06+08:002010-03-24T19:15:06+08:00

    在进行更多研究之后,似乎 git/svn TOOLS不是问题,因为它们以任何用户使用它们的身份运行。(但是,git/svn 守护进程是另一回事!)我用 git 创建/克隆的所有东西都有我的权限,并且列出了/usr/bin适合本文的 git 工具。

    Git权限解决了。

    用户权限似乎可以通过将所有需要访问 www 目录的用户添加到www-data运行 apache(和 nginx)的组中来解决。

    所以这个问题的一个答案似乎是这样的:

    默认情况下/var/www归所有root:root,没有人可以在那里添加或更改文件。

    1)更改组所有者

    首先,我们需要将 www 目录组更改为“www-data”而不是“root”组拥有

    sudo chgrp -R www-data /var/www
    

    2) 将用户添加到 www-data

    然后我们需要将当前用户(和其他任何人)添加到 www-data 组

    sudo usermod -a -G www-data demousername
    

    3) CHMOD www 目录

    更改权限,以便只有所有者(root)和组“www-data”中的所有用户可以 rwx(读/写/执行)文件和目录(其他人甚至都不能访问它)。

    sudo chmod -R 2770 /var/www
    

    现在,任何具有访问权限的用户(即在“www-data”组中)创建的所有文件和目录都可以被 apache 和 php 读取/写入。

    这个对吗?PHP/Ruby 创建的文件怎么样 - www-data 用户可以访问它们吗?

    • 7
  4. Phil P
    2010-03-22T19:37:47+08:002010-03-22T19:37:47+08:00

    粘性不是权限继承。目录的粘性意味着只有文件的所有者或目录所有者才能重命名或删除目录中的该文件,尽管权限另有说明。因此 /tmp/ 上的 1777。

    在经典的 Unix 中,没有基于文件系统的权限继承,只有当前进程的 umask。在 *BSD 或目录上设置了 setgid 的 Linux 上,新建文件的组字段将设置为与父目录的组字段相同。除此之外,您需要查看 ACL,在目录上使用“默认”ACL,它确实让您拥有继承的权限。

    您应该首先定义: * 哪些用户可以访问系统 * 您的威胁模型是什么

    例如,如果您正在与多个客户进行网络托管,并且您不希望他们看到彼此的文件,那么您可以为所有这些用户使用一个公共组“webcusts”,目录模式为 0705。然后文件由网络服务器进程(不在“webcusts”中)将看到其他权限并被允许;客户不能看到彼此的文件,用户可以弄乱自己的文件。但是,这确实意味着在您允许 CGI 或 PHP 的那一刻,您必须确保进程以特定用户身份运行(无论如何,对于一台主机上的多用户来说,这是一种很好的做法,为了问责制)。否则,客户可能会通过 CGI 来弄乱彼此的文件。

    但是,如果网站的运行时用户与网站所有者相同,那么在脚本中存在安全漏洞的情况下,您确实会遇到无法保护内容免受滥用者侵害的问题。这就是专用主机获胜的地方,这样您就可以拥有一个不同于静态内容所有者的运行时用户,而不必太担心与其他用户的交互。

    • 6
  5. Tie-fighter
    2010-03-27T02:44:33+08:002010-03-27T02:44:33+08:00

    我确实相信最好的方法是使用 Posix ACL。它们使用起来很舒服,并提供您需要的所有功能。

    http://en.wikipedia.org/wiki/Access_control_list#Filesystem_ACLs

    • 2
  6. Jonny
    2012-09-25T10:08:29+08:002012-09-25T10:08:29+08:00

    文件的所有者应该是创建它的人,而组应该是 www-data。目录/文件的模式通常是 755/644。而对于目录和文件,组需要写访问权限,mod 是 775/664。假设 paddy 是开发者。总而言之,这使得:

    chown -R paddy:www-data /var/www/websiteindevelopment
    chmod -R 755 /var/www/websiteindevelopment
    chmod -R 775 /var/www/websiteindevelopment/directorywritablebygroup
    find /var/www/websiteindevelopment -type f -perm 755 -print -exec chmod 644 {} \;  
    find /var/www/websiteindevelopment -type f -perm 775 -print -exec chmod 664 {} \;
    
    • 1
  7. MikeyE
    2016-12-09T21:38:37+08:002016-12-09T21:38:37+08:00

    添加到@Xeoncross 的答案中,我认为最好分别配置文件和目录的权限。

    sudo find /var/www -type d -exec chmod 775 {} \;  # Change permissions of directories to rwxrwxr-x
    sudo find /var/www -type f -exec chmod 664 {} \;  # Change file permissions to rw-rw-r--
    

    这将允许开发人员在 /var/www 中创建和修改目录。这似乎很重要,因为开发人员可能需要创建其他目录或删除不再需要的目录。

    它还将允许开发人员创建和修改代码文件(读取 HTML、PHP 文件等)。但是,仍然只允许其他所有人进行只读访问。

    • 0

相关问题

  • 多操作系统环境的首选电子邮件客户端

  • 你最喜欢的 Linux 发行版是什么?[关闭]

  • 更改 PHP 的默认配置设置?

  • 保护新的 Ubuntu 服务器 [关闭]

  • (软)Ubuntu 7.10 上的 RAID 6,我应该迁移到 8.10 吗?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve