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で見えなくなっています。

 

 

以上です。

 

 

所感

 

踏み台にならないように気を付けます。

 

About: ken


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください