Alma Linux 9/Rocky Linux 9 、apacheサーバーで、sqlite3のDBファイルのネットワークで使うためのコツ(一応、玄人向けです。) [FUKUTAKA編]
※この見解は、あくまでApacheサーバーの構築(SELinux と firewalld の設定含む)と
Python3での WSGIプログラミング(テンプレートエンジンのDjango や Flaskなどもでもかまいません)ができるのが前提です。
一から書いていくと、ものすごく長くなりますので、大まかなことを書いていきます。
ご了承ください。
あと、分かりにくかったら、ごめんなさい。
通常のWSGIプログラミングでは、SELECT くらいしかコードが動きませんが、
この設定方法を使えば、INSERT や UPDATE などもできます。
私の見解では、このSQLite3ファイルの接続のコツには2つの方法があります。
○共通設定: sqlite3 データベースファイルを /var/www/html の中に置くこと。
(/var/www/htmlの中にディレクトリを置き、その中にDBファイルを作るのも可)
① sqlite3のDBファイルを 「その他のユーザ」のファイル権限を rw にする方法
(オーナー名をrootユーザ、グループ名をrootユーザ でも可)
なお、この方法は、セキュリティ上良くないと私は思います
または
② sqlite3のDBファイルをファイル権限の 「オーナー」名を apache ユーザにすること
(オーナーのファイルタイプ 「rw」、グループとその他のユーザのファイルタイプ 「r」 で可)
この2つのうちで、
②を私は推奨(あくまでも個人的な見解です。)
①は、apache オーナー以外でもデータの書き換えができてしまいます。
なので、
②の解説をします。
apache サーバーのWebページを閲覧するときは、アクセスするためのapacheサーバのオーナーが標準で apache になります。
(Ubuntu系なら WWW-DATA が、標準でオーナー名になるみたいです。)
なので、apache にするわけなのですが、
やり方としては、まずは、
/var/www/html内にディレクトリを作って、
(/var/www/html/ディレクトリ名)
その中にSQLite3 の DBファイルを移す。
そして、SQLite3のDBファイルと
このディレクトリのオーナー名をapache、グループ名をroot に変更して
ディレクトリのパーミッションを 700 に変更し、
SQLite3のDBファイルのパーミッションは、
そのまま または、600でよろしいかと思います。
こうすることで、rootユーザとapacheオーナー(ブラウザ)からでしか、
ディレクトリの中に入れませんし、
DBファイルもroot ユーザとapacheオーナー(ブラウザ)からしかアクセスできません。
(これは、結局ディレクトリに入る段階で、
rootユーザーまたはapacheオーナーでしか入れないから、
DBファイルはそのまま、または、600で良いかと思います。)
通常は、「その他のユーザ」のファイル権限で読込ですが、中に入れたり見れたりします。
つまり、その他のユーザからはディレクトリには入れないし、エラーがでます。
ちなみに、/var/www/html の直の下に配置すると、その他のユーザ権限から入れて、確認等ができてしまいますので、
あくまでも更にディレクトリを奥に作るのが良いかと私は考えました。
ちなみに、オーナーapache(WWW-DATA)は、ログイン画面からアクセスしようとしてもできません。
これが、ある種のセキュリティ方法です。
では、sqlite3 でSQL構文を使うには、どうしたらよいかですが、
# sqlite3 DBファイル名(Pathは指定してください)
でできますし、root権限で使いたくないならsqlite3 で、SQLite3のDBファイルを書き換える前に、
ディレクトリとDBファイル名のオーナー名、グループ名を自分の端末のユーザ名に書き換えて、パーミッションをデータ修正しやすいものにしておけば良いかと思います。
終わったら、また、設定する(設定するの忘れる人多いかもなので必ず設定しましょう)。
あとは、WSGIプログラミングで、UPDATE や INSERT で コードを書くだけです。
ちなみにWSGIプログラミングのpython3なら
dbname = "/var/www/html/{ディレクトリ名}/{SQLite3のDBファイル名}.db"
conn = sqlite3.connect(dbname)
で、アクセスできます。
さらに言いますと、
/var/www/htmlの中に入られたことを考えて、
この中のディレクトリの中に
さらにディレクトリを作って、
オーナー名(apache)とグループ名(root)とパーミッション(700)を設定をし、その中にDBファイルを入れて処理します。
(/var/www/html/ディレクトリ1/ディレクトリ2/dbファイル名.db
のように)
こうすると端末操作で、/var/www/htmlの中に入られたとしても、
最初のディレクトリ1は名前がわかっても、
ディレクトリ2から下は、2つ目はroot でないとアクセスできないので、名前さえ確認ができないかと
なので、絶対に root パスワードは、もれがないように秘密にしたほうが良いですよ。
って、感じです。あくまでも主観的な見解なので、ご了承ください。
ところで、普通のファイルも同じ方法で、Webからアクセスできるの気づきました?