nob*_*are 45 sqlite django 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
Run Code Online (Sandbox Code Playgroud)
好吧,所以我想可能由于某些权限原因Apache可能无法读取该文件所以在对Stackoverflow上的类似问题进行了大量研究后,我跑了:
> chmod 664 DATABASE.sqlite
> chown apache /srv/mysite
> chown apache /srv/mysite/DATABASE.sqlite
Run Code Online (Sandbox Code Playgroud)
现在,ls -l
输出显示:
-rw-rw-r--. 1 apache root 133120 Jan 5 11:53 DATABASE.sqlite
Run Code Online (Sandbox Code Playgroud)
不幸的是,在我的Django应用程序上尝试访问/ admin时,我仍然遇到同样的错误.任何帮助将不胜感激!可能与SELinux权限有关,但我不知道从哪里开始诊断正在进行的权限问题.
编辑:
我跑了
> chown apache:apache /srv/mysite
> chown apache:apache /srv/mysite/DATABASE.sqlite
Run Code Online (Sandbox Code Playgroud)
并快速ls -l
显示mysite
目录和.sqlite
文件的所有者现在apache
.但是,在尝试访问该/admin
页面时仍然会出错.我chmod
将/srv/mysite
目录编辑为757并将DATABASE.sqlite
文件归档到756,因为这是我能够做的最好的工作来获得权限.我被告知这是一个安全风险,但我似乎无法弄清楚如何减少权限并通过unable to read/open database file
错误传递.是因为SELinux吗?
仅供参考,我需要在CentOS和sudo的常规用户帐户下操作,只要我需要提升:
[noblerare@localhost ]$
Run Code Online (Sandbox Code Playgroud)
nie*_*kas 62
您必须向存储sqlite数据库的目录添加写入权限.所以跑步chmod 664 /srv/mysite
应该有帮助.
这是一个安全风险,因此更好的解决方案是将数据库的所有者更改为www-data
:
chown www-data:www-data /srv/mysite
chown www-data:www-data /srv/mysite/DATABASE.sqlite
Run Code Online (Sandbox Code Playgroud)
此问题是由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
Run Code Online (Sandbox Code Playgroud)
果然,跑步sudo setsebool -P httpd_unified 1
解决了这个问题.
看看是什么httpd_unified
,我遇到了一个fedora-selinux列表帖子,其中解释说:
默认情况下,此布尔值处于关闭状态,将其打开将允许所有httpd可执行文件完全访问标有http文件上下文的所有内容.将其关闭可确保一个httpd服务不会干扰另一个httpd服务.
因此,启用httpd_unified
可以绕过阻止httpd
同一服务器上的多个实例的默认行为- 所有操作都以用户身份运行apache
- 弄乱彼此的内容.
在我的情况下,我只运行一个httpd
,所以我可以打开httpd_unified
.如果你不能这样做,我想一些更精细的标签是需要的.
简而言之,当写入sqlite数据库的应用程序没有写许可权时,就会发生这种情况。
这可以通过三种方式解决:
db.sqlite3
使用chown(例如:)向用户授予文件及其父目录的所有权(从而也具有写访问权chown username db.sqlite3
)sudo -i
在运行gunicorn
或django 之前运行命令runserver
)chmod 777 db.sqlite3
(危险选项)除非您在本地计算机上运行Web服务器,或者数据库中的数据对您而言根本不重要,否则请不要选择第三个选项。
不建议第二种选择。但是,如果您确定自己的应用程序不容易受到代码注入攻击的影响,则可以这样做。
小智 5
我遇到了同样的问题,但是是在 Ubuntu Server 上。所以我所做的就是在激活 django 虚拟环境之前更改为超级用户,然后运行 django 服务器。这对我来说效果很好。
首先复制粘贴
sudo su
然后激活虚拟环境(如果有的话)。
source myvenv/bin/activate
最后运行你的 django 服务器。
python3 manage.py runserver
希望对你有帮助。
我遇到了这个问题,我通过在 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" ,
}}
Run Code Online (Sandbox Code Playgroud)
我这样做是为了让 Django 知道我将数据库存储在基本目录的子目录中,在我的例子中是 mysite。现在您需要授予apache 能够读写数据库的权限。
chown user:www-data database/db.sqlite3
chown user:www-data database
chmod 755 database
chmod 755 database/db.sqlite3
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题。以下是不同权限的列表。您可以选择适合您的一款,但避免使用 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) -- 每个人都可以读取该目录,但其内容只能由用户更改。
以下是一篇文章的链接,可了解更多信息:Fun with Numbers in chmod