试图写一个只读数据库 – 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数据库的应用程序没有写权限时,就会发生这种情况。
这可以通过三种方式来解决:
- 用chown(例如:
chown username db.sqlite3
)授予db.sqlite3
文件及其父目录的所有权(从而也写访问chown username db.sqlite3
) - 以root用户身份运行web服务器(通常是gunicorn)(在运行
gunicorn
或djangorunserver
之前运行命令sudo -i
) - 允许通过运行命令对所有用户进行读写访问
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'>
把用户名和密码..就是这样。