PythonのPathLibを使ってファイル管理

PythonはAI開発に便利なプログラミング言語だが、ライブラリが充実しているので色んな用途にも便利だ。
今回、Webサーバーのデイレクトリやファイルを管理するためのプログラムをPythonで書いてみた。

JoomlaやWordpressなどのCMSでWebサイトを管理するためにセキュリテイ上重要なことはドキュメント・ファイルに実行権限を与えないことだ。
これはその他のソフトや、ダイレクトにHTMLで書くWebサイト管理にも当てはまるだろう。
Joomlaのフォルダーとファイルのパーミッション設定
php,  javascript, pythonなどのインタープリター言語は、本体のプログラムがスクリプトファイルを読み込んで実行するので、ファイルの実行権限は不要(当たり前か)。
ホームページのDOCUMENT_ROOT下の権限設定は、Ubuntu系のapache2の場合は以下の設定ファイルで確認できる。
/etc/apache2/envvars

# Since there is no sane way to get the parsed apache2 config in scripts, some
# settings are defined via environment variables and then used in apache2ctl,
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

DOCUMENT_ROOT下のユーザーとグループは再帰的にwww-dataに設定する

sudo chown -R www-data /var/www/html
sudo chgrp -R www-data /var/www/html

次にパーミッション設定は全てのDOCUMENT_ROOT下の階層で再帰的に
デイレクトリ:755
ファイル:644

これで全てのファイルの実行権限はなくなるので、あとは他人に見られて困るような重要なファイルには、更に厳しくパーミッションを設定する。
手動で全てのファイルを設定するのは手間なので、ここでPythonプログラム登場。

sudo python3 python_chmod.py


で実行。

python_chmod.py

# Copyright 2020 jweb.asia
# coding: UTF-8

from pathlib import Path
import glob

DOCUMENT_ROOT = '/var/www/html'
#DOCUMENT_ROOT = '.'

for rpath in glob.iglob(DOCUMENT_ROOT + '/**/*', recursive=True): # 再帰的に全ての階層のファイルとデイレクトリを取得
     path=Path(rpath)    # pathオブジェクト生成
     try:
         if(path.is_file()):
            print('file.name:', path.name)  # PurePath.name属性でパスのファイル名を取得
            path.chmod(0o644)            # ファイルの権限設定
         elif(path.is_dir()):
            print('dir.name:', path.name)  # PurePath.name属性でパスのデイレクトリを取得 
            path.chmod(0o755)            # デイレクトリの権限設定
     except PermissionError:
       print('アクセス権限がありません')
       pass

 

コメント powered by CComment