【问题标题】:Apache/Linux - Deploying website - as root?Apache/Linux - 以 root 身份部署网站?
【发布时间】:2021-04-16 22:56:21
【问题描述】:

我想在真实服务器上测试我的网站,我现在要部署它。我想知道安全问题,我应该以 root 身份将文件(通过 sftp)上传到 /var/www/site/public_html,还是应该为上传,并设置该用户的目录权限?

谢谢

【问题讨论】:

  • apache安装没有创建站点根目录吗?
  • 我正在使用虚拟主机
  • 这没有回答唐的问题。

标签: linux apache web-deployment


【解决方案1】:

虽然您在这里接受了答案,但提供的信息非常错误。

感谢您已经知道我要在这里说的一些事情,但是由于您接受了一个非常具有误导性的答案,因此您的理解存在一些差距。此外,并非所有阅读本文的人都可能拥有与您相同的知识。

是的,您应该小心使用 root 帐户,并且只在必要时使用它。仅按预期使用。

您需要的是让网络服务器可以读取这些文件。在正确配置的设备上,网络服务器不会以 root 身份运行。如果你要跑步

ps auxw | grep httpd

ps auxw | grep nginx

您会看到至少有 2 个进程正在运行。实际上,其中一个可能会以 root 身份拥有。那是因为 root 用户可以在低于 1024 的端口号上启动一个监听套接字。这是一个安全的事情。但是在启动了套接字之后,这个网络服务器实例会启动另一个自身的实例(作为非特权用户运行)来实际处理请求。

在我面前的盒子上,我看到了......

root     20784  0.0  0.0 125116  1552 ?        Ss   00:43   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 20785  0.0  0.0 125476  3252 ?        S    00:43   0:00 nginx: worker process
www-data 20786  0.0  0.0 125476  3252 ?        S    00:43   0:00 nginx: worker process
www-data 20787  0.0  0.0 125476  3252 ?        S    00:43   0:00 nginx: worker process
www-data 20788  0.0  0.0 125476  3252 ?        S    00:43   0:00 nginx: worker process
root     22579  0.0  0.0  14224   968 pts/1    SN+  00:43   0:00 grep --color=auto nginx

所以您的内容文件需要 www-data 用户可读。

此帐户的权限比您描述的其他帐户还要少。您无法使用此用户名登录。它与 root 帐户相反,是系统或服务帐户。

那么您如何确保您拥有正确的权限?您应该在用于登录的目标上拥有一个常规帐户(如果您可以使用 root 帐户 ssh 或 scp/sftp,那么您的安全性很差,应该修复)。我们称这个帐户为用户。一旦您在系统上安装了 shell,那么您应该能够通过“su”或“sudo”成为 root。您也可以使用此帐户通过 sftp 和 scp 传输文件(因为您知道 ftp 不好,并确保您的主机上没有运行 ftp 服务器)。

但是这个普通用户帐户没有权限写入包含内容的目录(通常是 /var/www/html)。因此,您设置权限的第一步是将此文件的所有权更改为用户 - 只有 root 可以这样做。所以...

sudo chown -R auser /var/www/html

现在 /var/www/html 应该看起来像这样......

drwxr-xr-x 14 auser root 4096 Apr  5 19:52 /var/www/html

查看第一个字母字符串,d 表示它是一个目录,rwx 是拥有用户的权限(读写和执行 - 但执行对于目录来说意味着有点奇怪 - 如果用户应该拥有对目录的任何访问权限都需要执行权限)。第一个 r-x 表示该组已读取和执行但未写入。第二个 r-x 表示系统上的每个其他帐户(包括 www-data)都对该目录具有读取和执行权限。

PHP、Python 和 Perl 的常用配置是这些以网络服务器用户 (www-data) 身份运行。它们不需要设置可执行权限位,因为它们不是二进制文件(对于 C 和 Go 等预编译语言来说是必需的)。存在一些模型,其中活动内容以不同于网络服务器的用户身份运行,但非常罕见,不适用于您的情况。

但大多数 Linux 系统上的默认配置是将文件创建为 ?rwx???--- (其中 '?' 表示我们不感兴趣的东西。即“所有其他用户”(或只是“其他”简称)没有获得任何权限。并且 www-data 无法读取您的文件或 cd 到您的目录中。您可以确保运行....

chmod -R go+r /var/www/html
find /var/www/html -type d -exec chmod go+x {} \;

要解决这个问题,但只需修改 sshd 的配置以适当地设置权限会更容易。通常,您应该在 /etc/ssh/sshd_config 中查找 sftpserver 定义并附加“-u 002”:

Subsystem sftp /usr/lib/openssh/sftp-server -u 002

随后所有传输的文件将是 -rw?rw?r-- 并且目录将是 drwxrwxr-x

是的,您可以以 root 身份传输文件/让文件归 root 所有,这不会危及主机的安全性。但是允许 root 通过 ssh 进行连接确实会损害安全性。这就是为什么您的 sshd 要求您明确允许这样做以允许边缘情况 - 您的 sshd_config 应该包含...

PermitRootLogin No

当您需要允许多个用户管理文件时,事情会变得稍微复杂一些。但我们现在不需要介绍。

你会在互联网上看到chmod 0777 的提及,它赋予每个人所有权限 - 永远永远这样做。允许您有选择地共享访问权限。

所以....

root 帐户用于设置普通登录帐户的初始权限以控制文件。

网络服务器用户应该只有足够的权限来提供内容(只读)。

使用普通用户帐户管理文件。

【讨论】:

  • 刻在石头上! :)
猜你喜欢
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2021-07-21
  • 2011-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多