Apache、Django、Django CMSおよびmod_wsgiがインストールされているCentOSサーバーがあります。 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
OK
> 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 ]$
Sqliteデータベースが保存されているディレクトリに書き込み権限を追加する必要があります。したがって、chmod 664 /srv/mysite
を実行すると役立ちます。
これはセキュリティ上のリスクであるため、データベースの所有者を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-list post に出会いました。
このブール値はデフォルトでオフになっています。オンにすると、すべてのhttpd実行可能ファイルが、httpファイルコンテキストでラベル付けされたすべてのコンテンツにフルアクセスできるようになります。無効にすると、あるhttpdサービスが別のhttpdサービスに干渉することがなくなります。
したがって、httpd_unified
をオンにすると、同じサーバー上で複数のhttpd
インスタンス(すべてユーザーApache
として実行されている)が互いに干渉するのを防ぐデフォルトの動作を回避できます。
私の場合、実行しているhttpd
は1つだけなので、httpd_unified
をオンにすることは問題ありませんでした。これができない場合、さらに細かいラベル付けが必要だと思います。
つまり、sqliteデータベースに書き込むアプリケーションに書き込み権限がない場合に発生します。
これは3つの方法で解決できます。
db.sqlite3
ファイルとその親ディレクトリの所有権を付与する(それにより書き込みアクセスも)chownを使用してユーザーに付与する(例:chown username db.sqlite3
)gunicorn
またはDjango runserver
を実行する前にコマンドSudo -i
を実行します)chmod 777 db.sqlite3
(危険なオプション)を実行して、すべてのユーザーに読み取りおよび書き込みアクセスを許可しますローカルマシンでWebサーバーを実行している場合、またはデータベースのデータがまったく重要でない場合を除き、3番目のオプションを選択しないでください。
2番目のオプションも推奨されません。しかし、アプリケーションがコードインジェクション攻撃に対して脆弱でないと確信している場合は、それを試すことができます。
私は同様の問題に遭遇しました。 SELinuxに問題があるかどうかを確認するには、次のコマンドで実行ステータスを確認できます。
sestatus
一時的に無効にします
setenforce 0
これにより、少なくとも問題を絞り込むことができます。
ファイル/ディレクトリの所有権とアクセス権を変更せずに、acl sを変更できます。
次のコマンドを使用します。
setfacl -m u:www-data:rwx /home/user/website
setfacl -m u:www-data:rw /home/user/website/db.sqlite3