CoreServerのCGI(Python)でDB接続情報を環境変数から取得|postgreSQL / dotenv
CoreServerのCGI(Python)でDB接続情報を環境変数から取得|postgreSQL / dotenv
セキュリティは気になるため、CGIスクリプト(index.cgi)にPostgreSQLのDB接続情報をべた書きを避けたいところ。
そこで環境変数からの取得するように変更を検討しました。
はじめpip install して新しいパッケージをインストールしたくなかったので、
環境変数に指定して取得しよう色々と試行錯誤したのですが、うまくいかなかったため、
あきらめてdotenvをいれたらすぐに解決しました。
はじめに試したのは、以下の3つをです。
試したこと1:単純にSHELLスクリプトを用意してindex.cgi内で実行
os.system(‘./env.sh’) してから os.environ.get(‘DBHOST’)する。
ファイルの中身
-bash-4.2$ cat env.sh
#! /bin/bash
export DBHOST="localhost"
export DBPORT="5432"
export DBNAME="*****************"
export DBUSER="*****************"
export DBPASS="*****************"
→なぜか取れない。os.systemは別プロセスで起動されてしまう?
試したこと2:sourceコマンドで自プレセスに展開
ならばsourceで自プロセスに展開しよう、と以下に変更
os.system(‘source ./env.sh’)してから os.environ.get(‘DBHOST’)する。
→なぜか取れない。
試したこと3:ファイルをOpenして読み込み
おとなしくファイルからとってくるかとopenを実行するも
fopen(‘env.ini’)
→ファイルすら読めない。
むしゃくしゃして「/bin/chmod 777 env.ini」してもダメだった。
おとなしく pip install python-dotenv
出来ればCoreServerにデフォルトでインストールされているパッケージで対応したかったけど
あきらめてました。
ただ、dotevnをインストールするにもエラーがでて対応が必要でした。
以下の記事にメモしてます。
CoreServerでpip install時に Permission deniedが発生→解決
-bash-4.2$ python3 -m pip install python-dotenv --user
上記を実行すれば、インストールできました。
最終的なCGIの構成と各ファイルの内容
最終的には、ドメイン直下のCGIスクリプト置き場は以下のファイル構成となりました。
.env ←追加
.htaccess
bottle.py
index.cgi ←修正
また、新たに追加した.envのファイル内容と、index.cgiは下記の通りです。
.env
-bash-4.2$ cat .env
DBHOST=localhost
DBPORT=5432
DBNAME=***************
DBUSER=***************
DBPASS=***************
index.cgi
-bash-4.2$ cat index.cgi
#!/usr/local/bin/python3
import os
from os.path import join, dirname
from bottle import route, run
import psycopg2
from psycopg2.extras import DictCursor
from dotenv import load_dotenv
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
DBHOST = os.getenv("DBHOST")
DBPORT= os.getenv("DBPORT")
DBNAME= os.getenv("DBNAME")
DBUSER = os.getenv("DBUSER")
DBPASS = os.getenv("DBPASS")
@route('/')
def index():
return "Hello, World!"
@route('/<template_id>')
def getTemplate(template_id):
conn = psycopg2.connect(
host = DBHOST,
port = DBPORT,
database= DBNAME,
user= DBUSER,
password= DBPASS,)
cur = conn.cursor(cursor_factory=DictCursor)
cur.execute("SELECT * FROM **************.template_master where template_master.template_id = %s",(template_id,))
result = cur.fetchone()
conn.commit()
cur.close()
conn.close()
return result['template_data']
#return template_id
if __name__=='__main__':
run(host='0.0.0.0', port=80, server="cgi")
アクセス権限の確認と設定
新たに追加した.envファイルのアクセス権を確認します。
-bash-4.2$ ls -la
total 86
drwx---r-x 3 7 Jan 16 00:19 .
drwx---r-x 23 23 Jan 14 21:19 ..
-rwxr-xr-x 1 107 Jan 15 22:10 .env
-rw-r--r-- 1 115 Jan 14 21:44 .htaccess
drwxr-xr-x 2 3 Jan 14 21:57 __pycache__
-rw-r--r-- 1 170346 Jan 14 21:40 bottle.py
-rwx---r-x 1 1168 Jan 15 23:52 index.cgi
なるほど「755」ですね。明らかにヤバい感じの権限です。
ファイルを見に行ってみると。。。
ああ!! 見えてはいけないものが。。。
はい、では、アクセス権限を設定します。
-bash-4.2$ /bin/chmod 600 .env
-bash-4.2$ ls -la
total 86
drwx---r-x 3 7 Jan 16 00:19 .
drwx---r-x 23 23 Jan 14 21:19 ..
-rw------- 1 107 Jan 15 22:10 .env
-rw-r--r-- 1 115 Jan 14 21:44 .htaccess
drwxr-xr-x 2 3 Jan 14 21:57 __pycache__
-rw-r--r-- 1 170346 Jan 14 21:40 bottle.py
-rwx---r-x 1 1168 Jan 15 23:52 index.cgi
この状態で、さっきと同様にアクセスすると、403で見えなくなっています。
以上です。
所感
踏み台にならないように気を付けます。