在Linode上运行Ubuntu 10.04,RVM,Rails 3,Apache与乘客模块,carrierwave和mini-magick
我得到:
Rails Error: Unable to access log file. Please ensure that /srv/www/mysite.com/testapp/log/production.log exists and is chmod 0666. The log level has been raised to WARN and the output directed to STDERR until the problem is fixed.
和Errno::EACCES (Permission denied /srv/www/mysite.com/testapp/public/uploads/tmp/20110517-1707-2938-6455):
我跑chmod -R root:root /srv/www/mysite.com/testapp
然后:chmod -R www-data:www-data /srv/www/mysite.com/testapp
& chmod -R www-data:www-data /srv/www/mysite.com/testapp/public/uploads
由于唯一应该可写的 2 个目录是日志文件和上传目录,我试图保护其余目录。 是否有任何其他文件夹/文件需要可写?
网站的权限有点奇怪:一方面,内容需要被网络服务器读取,FastCGI
或Passenger
或任何执行(在本例中为 Ruby)代码的内容。另一方面,如果网络服务器用户拥有这些文件,那么被黑客入侵的网络服务器或(更有可能:)您的代码可以修改作为您网站的可执行文件和静态文件。这种情况发生得太频繁了。
如果网站的内容归其他用户所有,不能由网络服务器软件写入,则网站不能被攻击者覆盖。(当然,您有几个打开的数据库连接套接字;所有数据库支持的数据都可能被攻击者破坏。此外,您允许上传的任何目录都可能被攻击者损坏。但目标是尽可能合理地减少软件的特权。
所以,综上所述,关于您的具体问题; 您的 Web 服务器软件以 www-data
运行,您的日志文件和上传目录由www-data
拥有是有意义的:
mkdir -p /srv/www/mysite.com/testapp/log/ # might not exist yet
chown -R pcasa:pcasa /srv/www/mysite.com/ # or some other user
chmod 755 /srv/www/mysite.com
chmod 755 /srv/www/mysite.com/testapp/
# populate the app directory with your files, if you haven't done so already
chown -R www-data:www-data /srv/www/mysite.com/testapp/log
chmod 755 /srv/www/mysite.com/testapp/log # see notes
chmod 644 /srv/www/mysite.com/testapp/log/* # see notes
我假设系统上的所有用户都可以读取日志。这可能不是真的。如果您不希望所有系统用户都读取日志文件,请使用 700
代替 755
,并使用 600
代替644
。
接下来,对于您的uploads
目录:
mkdir -p /srv/www/mysite.com/testapp/public/uploads/tmp # might not exist yet
chown -R www-data:www-data /srv/www/mysite.com/testapp/public/uploads
chmod 755 /srv/www/mysite.com/testapp/public/uploads
chmod 755 /srv/www/mysite.com/testapp/public/uploads/tmp
同样,我假设系统上的所有用户都可以看到所有上传的内容。如果您只是希望 Web 服务器软件能够读取文件,请使用 700
代替755
。
这些是应该有效的简单准则;如果您希望仅使拥有网站的用户和运行网站的用户共享网站软件和内容,则可能会变得更加复杂,方法是使用补充组运行 Web 服务器(有关详细信息,请参见newgrp(1)
和group(5)
手册页)并为文件提供相同的组所有者, 并使用组权限位(中间八进制数:750
vs 700
)。这已经足够复杂了,除非你有充分的理由,否则可能不值得走这条路。(绝对值得在某个地方的开发机器上做一次,这样你对它足够熟悉,以便将来可以使用它:)。