J'ai un serveur CentOS sur lequel j'ai Apache, Django, Django CMS et mod_wsgi. Mes fichiers Django sont stockés dans le répertoire /srv
répertoire et j’ai activé SELinux pour des raisons de sécurité.
J'ai réussi à intégrer Django-CMS dans Django et lorsque je visite l'adresse IP locale, je vois mes pages. Cependant, lorsque j'essaie de visiter/admin (où je peux commencer à utiliser de la fonctionnalité CMS), je reçois DatabaseError at /admin/ attempt to write a readonly database
.
D'accord.
Donc, puisque j'ai un fichier .sqlite
Dans mon dossier de projet, j'ai exécuté un ls -l
Dessus, qui a retourné:
-rw-r--r--. 1 root root 133120 Jan 5 11:53 DATABASE.sqlite
D'accord, j'ai donc pensé qu'Apache ne pouvait peut-être pas lire ce fichier pour des raisons d'autorisations. Après de nombreuses recherches sur des problèmes similaires sur Stackoverflow, j'ai lancé:
> chmod 664 DATABASE.sqlite
> chown Apache /srv/mysite
> chown Apache /srv/mysite/DATABASE.sqlite
Maintenant, la sortie ls -l
Lit:
-rw-rw-r--. 1 Apache root 133120 Jan 5 11:53 DATABASE.sqlite
Malheureusement, j'obtiens toujours la même erreur lorsque j'essaie d'accéder à/admin sur mon Django. Toute aide serait grandement appréciée! Probablement quelque chose à voir avec les autorisations SELinux mais je ne sais pas par où commencer. pour diagnostiquer quel problème d'autorisations se produit.
EDIT:
Iran
> chown Apache:apache /srv/mysite
> chown Apache:apache /srv/mysite/DATABASE.sqlite
et un rapide ls -l
révèle que le propriétaire du répertoire mysite
et du fichier .sqlite
est maintenant Apache
. Cependant, des erreurs persistent lorsque j'essaie de visiter la page /admin
. J'ai chmod
ed le répertoire /srv/mysite
À 757 et le fichier DATABASE.sqlite
À 756 car c'est le mieux que je puisse faire pour obtenir les autorisations nécessaires. On m'a dit qu'il s'agissait d'un risque pour la sécurité, mais je n'arrive pas à comprendre comment lui donner moins d'autorisations et obtenir des erreurs unable to read/open database file
. Est-ce à cause de SELinux?
Pour votre information, je suis sous un compte utilisateur régulier dans CentOS et Sudo chaque fois que je dois élever:
[noblerare@localhost ]$
Vous devez ajouter des droits en écriture sur le répertoire dans lequel votre base de données sqlite est stockée. Donc, courir chmod 664 /srv/mysite
devrait aider.
Ceci est un risque pour la sécurité, donc la meilleure solution consiste à changer le propriétaire de votre base de données en www-data
:
chown www-data:www-data /srv/mysite
chown www-data:www-data /srv/mysite/DATABASE.sqlite
Ce problème est causé par SELinux. Après avoir défini la propriété du fichier comme vous l'avez fait, j'ai résolu ce problème. L'outil audit2why(1)
peut être utilisé pour diagnostiquer les refus de SELinux à partir du journal:
(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
Effectivement, en cours d'exécution Sudo setsebool -P httpd_unified 1
résolu le problème.
Regarder dans quoi httpd_unified
est pour, je suis tombé sur un message de Fedora-selinux-list qui explique:
Ce booléen étant désactivé par défaut, son activation permettra à tous les exécutables httpd d'avoir un accès complet à tout le contenu étiqueté avec un contexte de fichier http. En le désactivant, un service httpd ne peut en interférer avec un autre.
Donc, allumer httpd_unified
vous permet de contourner le comportement par défaut qui empêche plusieurs instances httpd
sur le même serveur - s'exécutant toutes en tant qu'utilisateur Apache
- de se mêler des affaires des autres.
Dans mon cas, je n’utilise qu’un httpd
, donc c’était bien pour moi d’allumer httpd_unified
. Si vous ne pouvez pas faire cela, je suppose qu’un étiquetage plus fin est nécessaire.
En bref, cela se produit lorsque l’application qui écrit dans la base de données sqlite n’est pas autorisée en écriture.
Cela peut être résolu de trois manières:
db.sqlite3
fichier et son répertoire parent (donnant ainsi également un accès en écriture) à l’utilisateur utilisant chown (exemple: chown username db.sqlite3
)Sudo -i
avant de lancer gunicorn
ou Django runserver
)chmod 777 db.sqlite3
_ (Option dangereuse)Ne choisissez jamais la troisième option, sauf si vous exécutez le serveur Web sur une machine locale ou que les données de la base de données ne sont pas du tout importantes pour vous.
La deuxième option n'est également pas recommandée. Mais vous pouvez y aller, si vous êtes sûr que votre application n'est pas vulnérable aux attaques par injection de code.
J'ai rencontré un problème similaire. Pour vérifier si SELinux est le problème, on peut vérifier son état de fonctionnement avec
sestatus
et le désactiver temporairement avec
setenforce 0
Cela pourrait au moins aider à réduire le problème.
Vous pouvez modifier acl s sans toucher à la propriété et aux autorisations du fichier/répertoire.
Utilisez les commandes suivantes:
setfacl -m u:www-data:rwx /home/user/website
setfacl -m u:www-data:rw /home/user/website/db.sqlite3