尝试编写只读数据库 - Django w / SELinux错误

时间:2014-01-10 20:55:53

标签: django sqlite selinux

我有一个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 ]$

9 个答案:

答案 0 :(得分:57)

您必须为存储sqlite数据库的目录添加写入权限。因此,运行chmod 664 /srv/mysite会有所帮助。

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

chown www-data:www-data /srv/mysite
chown www-data:www-data /srv/mysite/DATABASE.sqlite

答案 1 :(得分:7)

此问题是由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 post,其中解释说:

  

默认情况下,此布尔值处于关闭状态,将其打开将允许所有httpd   可执行文件,可以完全访问标有http文件的所有内容   上下文。离开它可以确保一个httpd服务不能   干扰他人。

因此启用httpd_unified可以绕过阻止同一服务器上多个httpd实例的默认行为 - 所有这些实例都以用户apache运行 - 弄乱彼此的内容。

在我的情况下,我只运行一个httpd,因此我可以打开httpd_unified。如果你不能这样做,我想一些更精细的标签是必要的。

答案 2 :(得分:4)

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

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

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

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

    也不建议使用第二个选项。但是,如果您确定您的应用程序不容易受到代码注入攻击,那么您可以继续使用它。

答案 3 :(得分:2)

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

第一次复制粘贴

sudo su

如果有,请激活虚拟环境。

source myvenv/bin/activate

最后运行您的django服务器。

python3 manage.py runserver

希望,这会对您有所帮助。

答案 4 :(得分:1)

我遇到了类似的问题。要检查SELinux是否存在问题,可以使用

检查其运行状态
sestatus

并暂时禁用

setenforce 0

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

答案 5 :(得分:0)

您可以更改 acl ,而无需更改文件/目录的所有权和权限。

使用以下命令:

setfacl -m u:www-data:rwx /home/user/website
setfacl -m u:www-data:rw /home/user/website/db.sqlite3

答案 6 :(得分:0)

我遇到了这个问题,我通过在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(和%20others%20可以%20仅执行%20。

答案 7 :(得分:0)

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

django

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

答案 8 :(得分:-8)

这是我的解决方案:

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'>输入用户名和密码..那就是它。