试图写一个只读数据库 – Django W / SELinux错误

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

我设法成功地将Django-CMS集成到Django中,当我访问本地IP时,我看到了我的页面。 但是,当我尝试访问/pipe理员(我可以开始使用CMSfunction),我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,因为这是我可以做的最好的权限来解决。 我被告知,这是一个安全风险,但我似乎无法弄清楚如何减less权限,并通过unable to read/open database file错误通过。 是因为SELinux吗?

仅供参考,我在CentOS中以正常用户帐户运行,每当我需要提升时,

 [noblerare@localhost ]$ 

您必须将写入权限添加到存储sqlite数据库的目录中。 所以运行chmod 664 /srv/mysite应该有所帮助。

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

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

这个问题是由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列表中的post ,解释:

这个布尔值在默认情况下是closures的,打开它将允许所有httpd可执行文件完全访问所有标记有http文件上下文的内容。 离开它确保一个httpd服务不能干扰另一个。

因此,启用httpd_unified可以避免在同一台服务器上阻止多个httpd实例的默认行为 – 所有这些都以用户apache身份运行 – 与其他人的东西搞混了。

在我的情况下,我只运行一个httpd ,所以我打开httpd_unified 。 如果你不能做到这一点,我想一些更细粒度的标签是需要的。

我遇到了类似的问题。 要检查SELinux是否有问题,可以用它来检查它的运行状态

 sestatus 

并暂时禁用它

 setenforce 0 

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

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

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

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

除非你在本地机器上运行networking服务器或者数据库中的数据对你来说并不重要

这里我的解决scheme

 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'>把用户名和密码..就是这样。