Apache/Linux - 以 root 身份部署网站?
Apache/Linux - Deploying website - as root?
我想在真实服务器上测试我的网站,我现在准备部署它。我想知道安全问题,我应该将文件(通过 sftp)作为 root 上传到 /var/www/site/public_html,还是应该创建一个 user 用于上传,并为该用户设置目录权限?
谢谢
虽然你在这里接受了一个答案,但是提供的信息是非常错误的。
我很感激你已经知道我要在这里说的一些事情,但由于你接受了一个非常具有误导性的答案,所以你的理解存在一些差距。也不是每个阅读本文的人都拥有与您相同的知识。
是的,您应该小心使用 root 帐户,只在必须的地方使用它。仅按预期用途使用它。
您需要的是让网络服务器可以读取文件。在正确配置的设备上,网络服务器不会 运行 作为 root。如果你要 运行
ps auxw | grep httpd
或
ps auxw | grep nginx
您会看到至少 2 个进程 运行ning。实际上,其中一个可能会以 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,那么您的安全性很差,应该修复)。我们称此帐户为 auser。一旦您在系统上拥有 shell,那么您应该能够通过 'su' 或 'sudo' 成为 root。您还可以使用此帐户通过 sftp 和 scp 传输文件(因为您知道 ftp 是错误的并且已确保您的 ftp 服务器上没有 运行ning主持人)。
但是这个普通用户帐户没有权限写入包含内容的目录(通常是 /var/www/html)。因此,设置权限的第一步是将此文件的所有权更改为 auser - 只有 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 等预编译语言需要)。在某些模型中,活动内容 运行s 作为与网络服务器不同的用户存在,但非常罕见,不适用于您的情况。
但是大多数 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 中查找 sftp 服务器定义并附加 '-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账户用于设置普通登录账户控制文件的初始权限。
网络服务器用户应该只有足够的权限来提供内容(只读)。
使用普通用户帐户管理文件。
我想在真实服务器上测试我的网站,我现在准备部署它。我想知道安全问题,我应该将文件(通过 sftp)作为 root 上传到 /var/www/site/public_html,还是应该创建一个 user 用于上传,并为该用户设置目录权限?
谢谢
虽然你在这里接受了一个答案,但是提供的信息是非常错误的。
我很感激你已经知道我要在这里说的一些事情,但由于你接受了一个非常具有误导性的答案,所以你的理解存在一些差距。也不是每个阅读本文的人都拥有与您相同的知识。
是的,您应该小心使用 root 帐户,只在必须的地方使用它。仅按预期用途使用它。
您需要的是让网络服务器可以读取文件。在正确配置的设备上,网络服务器不会 运行 作为 root。如果你要 运行
ps auxw | grep httpd
或
ps auxw | grep nginx
您会看到至少 2 个进程 运行ning。实际上,其中一个可能会以 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,那么您的安全性很差,应该修复)。我们称此帐户为 auser。一旦您在系统上拥有 shell,那么您应该能够通过 'su' 或 'sudo' 成为 root。您还可以使用此帐户通过 sftp 和 scp 传输文件(因为您知道 ftp 是错误的并且已确保您的 ftp 服务器上没有 运行ning主持人)。
但是这个普通用户帐户没有权限写入包含内容的目录(通常是 /var/www/html)。因此,设置权限的第一步是将此文件的所有权更改为 auser - 只有 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 等预编译语言需要)。在某些模型中,活动内容 运行s 作为与网络服务器不同的用户存在,但非常罕见,不适用于您的情况。
但是大多数 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 中查找 sftp 服务器定义并附加 '-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账户用于设置普通登录账户控制文件的初始权限。
网络服务器用户应该只有足够的权限来提供内容(只读)。
使用普通用户帐户管理文件。