60

我有一个 CentOS 服务器,上面有 Apache、Django、Django CMS 和 mod_wsgi。我的 Django 项目文件存储在该/srv目录中,出于安全原因,我打开了 SELinux。

我已经成功地将 Django-CMS 集成到 Django 中,当我访问本地 IP 时,我看到了我的页面。但是,当我尝试访问 /admin(我可以开始使用 CMS 功能的地方)时,我得到DatabaseError at /admin/ attempt to write a readonly database.

好的。

因此,由于我的.sqlite项目文件夹中有一个文件,因此我在其上运行了一个ls -l返回的文件:

-rw-r--r--.  1 root root 133120 Jan 5 11:53   DATABASE.sqlite

好的,所以我想也许 Apache 由于某些权限原因而无法读取该文件,所以在对 Stackoverflow 上的类似问题进行了大量研究之后,我运行了:

> chmod 664 DATABASE.sqlite
> chown apache /srv/mysite
> chown apache /srv/mysite/DATABASE.sqlite

现在,ls -l输出显示:

-rw-rw-r--.  1 apache root 133120 Jan 5 11:53  DATABASE.sqlite

不幸的是,在我的 Django 应用程序上尝试访问 /admin 时,我仍然遇到同样的错误。任何帮助将不胜感激!可能与 SELinux 权限有关,但我不知道从哪里开始诊断正在发生的权限问题。

编辑:

我跑了

> chown apache:apache /srv/mysite
> chown apache:apache /srv/mysite/DATABASE.sqlite

并且快速ls -l显示mysite目录和.sqlite文件的所有者现在是apache. 但是,我在尝试访问该/admin页面时仍然遇到错误。我chmod将目录编辑/srv/mysite到 757 并DATABASE.sqlite归档到 756,因为这是我能做的最好的事情来获得工作权限。有人告诉我这是一个安全风险,但我似乎无法弄清楚如何给予它更少的权限并通过unable to read/open database file错误获得通过。是因为 SELinux 吗?

仅供参考,我在 CentOS 和 sudo 中的常规用户帐户下操作,每当我需要提升时:

[noblerare@localhost ]$
4

9 回答 9

92

您必须向存储 sqlite 数据库的目录添加写入权限。所以跑步chmod 664 /srv/mysite应该有帮助。

这是一个安全风险,因此更好的解决方案是将数据库的所有者更改为www-data

chown www-data:www-data /srv/mysite
chown www-data:www-data /srv/mysite/DATABASE.sqlite
于 2014-01-10T22:07:38.697 回答
13

简而言之,当写入 sqlite 数据库的应用程序没有写入权限时,就会发生这种情况。

这可以通过三种方式解决:

  1. 使用 chown 向用户授予db.sqlite3文件及其父目录的所有权(因此也具有写访问权限)(例如chown username db.sqlite3:)
  2. 以 root 用户身份运行网络服务器(通常是 gunicorn)(在运行或 djangosudo -i之前运行命令)gunicornrunserver
  3. 通过运行命令允许对所有用户进行读写访问chmod 777 db.sqlite3(危险选项)

永远不要选择第三个选项,除非您在本地机器上运行网络服务器,或者数据库中的数据对您来说根本不重要。

第二个选项也不推荐。但是,如果您确定您的应用程序不受代码注入攻击的影响,您可以这样做。

于 2017-09-14T15:04:28.217 回答
8

这个问题是由 SELinux 引起的。在像你一样设置文件所有权之后,我遇到了这个问题。该audit2why(1)工具可用于从日志中诊断 SELinux 拒绝:

(django)[f22-4:www/django/demo] ftweedal% sudo audit2why -a
type=AVC msg=audit(1437490152.208:407): avc:  denied  { write }
      for  pid=20330 comm="httpd" name="db.sqlite3" dev="dm-1" ino=52036
      scontext=system_u:system_r:httpd_t:s0
      tcontext=unconfined_u:object_r:httpd_sys_content_t:s0
      tclass=file permissive=0
    Was caused by:
    The boolean httpd_unified was set incorrectly. 
    Description:
    Allow httpd to unified

    Allow access by executing:
    # setsebool -P httpd_unified 1

果然,运行sudo setsebool -P httpd_unified 1解决了这个问题。

调查httpd_unified它的用途时,我发现了一个fedora-selinux-list 帖子,其中解释了:

这个布尔值默认是关闭的,打开它会允许所有的 httpd 可执行文件完全访问所有带有 http 文件上下文标签的内容。将其关闭可确保一个 httpd 服务不会干扰另一个。

因此,打开httpd_unified可以让您规避默认行为,即防止httpd同一服务器上的多个实例 - 所有实例都以用户身份运行apache- 弄乱彼此的东西。

就我而言,我只运行一个httpd,所以我可以打开httpd_unified。如果你不能这样做,我想需要一些更细粒度的标签。

于 2015-07-21T15:07:41.447 回答
4

我遇到了这个问题,我通过在 mysite 文件夹中创建一个目录来保存我的 db.sqlite3 文件来解决它。所以我做到了/home/user/src/mysite/database/db.sqlite3。在我的 django 设置文件中,我更改了我的

 DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': "/home/user/src/mysite/database/db.sqlite3" ,
}}

我这样做是为了让 Django 知道我将数据库存储在基本目录的子目录中,在我的例子中是 mysite。现在您需要授予 apache 能够读写数据库的权限。

chown user:www-data database/db.sqlite3
chown user:www-data database 
chmod 755 database
 chmod 755 database/db.sqlite3

这解决了我的问题。这是不同权限的列表。您可以选择适合您的,但避免使用 777 和 666

-rw------- (600) -- 只有用户有读写权限。

-rw-r--r-- (644) -- 只有用户有读写权限;该组和其他人只能阅读。

-rwx------ (700) -- 只有用户有读、写和执行权限。

-rwxr-xr-x (755) -- 用户有读、写和执行权限;该组和其他人只能读取和执行。

-rwx--x--x (711) -- 用户有读、写和执行权限;该组和其他人只能执行。

-rw-rw-rw- (666) -- 每个人都可以读取和写入文件。馊主意。

-rwxrwxrwx (777) -- 每个人都可以读、写和执行。另一个坏主意。

以下是目录的几个常见设置:

drwx-------- (700) -- 只有用户可以在这个目录中读、写。

drwxr-xr-x (755) -- 每个人都可以读取目录,但其内容只能由用户更改。

这是一篇文章的链接 [了解更多][1]

[1]:http://ftp.kh.edu.tw/Linux/Redhat/en_6.2/doc/gsg/s1-navigating-chmodnum.htm#:~:text=%2Drwxr%2Dxr%2Dx%20( ,和%20其他%20可以%20只%20执行。

于 2020-12-05T23:48:49.990 回答
3

我遇到了同样的问题,但在 Ubuntu Server 上。所以我所做的只是在为 django 激活虚拟环境之前更改为超级用户,然后我运行 django 服务器。它对我来说很好。

第一次复制粘贴

sudo su

然后激活虚拟环境,如果有的话。

source myvenv/bin/activate

最后运行你的 django 服务器。

python3 manage.py runserver

希望对你有帮助。

于 2020-04-21T08:19:45.977 回答
1

我遇到了类似的问题。要检查 SELinux 是否是问题所在,可以使用以下命令检查其运行状态

sestatus

并暂时禁用它

setenforce 0

这至少可以帮助缩小问题的范围。

于 2014-11-15T22:00:47.650 回答
0

您可以在不触及文件/目录的所有权和权限的情况下更改acl 。

使用以下命令:

setfacl -m u:www-data:rwx /home/user/website
setfacl -m u:www-data:rw /home/user/website/db.sqlite3
于 2019-02-21T14:46:44.290 回答
0

您可以将数据库文件的所有者及其文件夹更改为django

chown django:django /home/django/mysite
chown django:django /home/django/mysite/my_db.sqlite3

这项工作适用于 DigitalOcean 的 1-Click Django Droplet

于 2021-02-24T11:19:16.660 回答
-12

这是我的解决方案:

root@fiq:/home/django/django_project# chmod 777 db.sqlite3
root@fiq:/home/django/django_project# cd ..
root@fiq:/home/django# chmod 777 *

<'your_website/admin'>输入用户名和密码..就是这样。

于 2016-05-31T19:23:04.353 回答