PostgreSQLバックアップ暗号化方法


本稿の暗号化方式はpg_を利用しているdumpはファイルをバックアップした後opensslを直接利用してファイル暗号化を行う.
1、生産鍵:各種パラメータを利用して公私鍵を確立する.ここでは入力パラメータを鍵生成の一部として利用し、その他は手動で追加することができる.スクリプトは以下の通りである.
[sure@localhost bin]$ cat createpem.sh
#!/bin/bash

data="$1"

openssl req -x509 -nodes -days 1000000 -newkey rsa:4096 -keyout backup_key.pem \
 -subj "/C=US/ST=Illinois/L=Chicago/O=IT/CN="${data} -out backup_key.pem.pub
ここのbackup_key.pemと
backup_key.pem.pubは会社の鍵で、名前は変更できます.
2、暗号化スクリプト:パラメータを直接pg_に渡すdump、そして暗号化を行い、最初のパラメータが「encrypt」の場合、暗号化を行い、そうでなければpg_dump自体のパラメータを実行します.スクリプトは次のとおりです.
[sure@localhost bin]$ cat pg_dump.sh
#!/bin/bash

isencrypt=$1
database=$2
output=$3
pubpath=$4

basepath=$(cd `dirname $0`; pwd)

if [ ! ${pubpath} ]
	then
		pubpath="${basepath}/backup_key.pem.pub"
fi

if [ ${isencrypt} == "encrypt" ]
	then
	${basepath}/pg_dump ${database} | openssl smime -encrypt -aes256 -binary -outform DEM -out ${output} ${pubpath}
else
	${basepath}/pg_dump $@
fi
ここでは公開鍵を用いて暗号化され、最初のパラメータは「encyrpt」であり、暗号化の有無のフラグとする.
2番目のパラメータはpg_dump本来のオプションですが、複数のパラメータであれば「」で引き起こす必要があります.3番目のパラメータは出力ファイル名です.4番目のパラメータは公開鍵です.ここでは、ユーザーが公開鍵を暗号化するように指定できます.入力しない場合、デフォルトは現在のディレクトリの下の公開鍵です.暗号化しないと元と一致します.
3、復号スクリプト:まず暗号化ファイルを復号してから、復元することができます.スクリプトは次のとおりです.
[sure@localhost bin]$ cat dencrypt_backup
#!/bin/bash

input=$1
output=$2
pripath=$3

basepath=$(cd `dirname $0`; pwd)

if [ ! ${pripath=} ]
	then
		pripath="${basepath}/backup_key.pem"
fi

openssl smime -decrypt -in ${input} -binary \
  -inform DEM -inkey ${pripath} -out ${output}
パラメータとして出力ファイル名が入力され、秘密鍵は3番目のパラメータであり、入力しないと現在のディレクトリの下の鍵ファイルがデフォルトで使用されます.
以上が今回のPostgreSQLバックアップ暗号化で使用されたスクリプトです.以下は完全な使用手順です.
[sure@localhost bin]$ ./createpem.sh highgo
Generating a 4096 bit RSA private key
...................................................................................................................++
.........................................................++
writing new private key to 'backup_key.pem'
-----
[sure@localhost bin]$ ll backup_key.pem*
-rw-rw-r--. 1 sure sure 3272 Mar 25 09:30 backup_key.pem
-rw-rw-r--. 1 sure sure 1952 Mar 25 09:30 backup_key.pem.pub

[sure@localhost bin]$ ./pg_dump.sh -U syssso highgo > bak1.sql
Password: 
[sure@localhost bin]$ ./pg_dump.sh encrypt "-U syssso highgo" bak2.sql.encrypt /opt/db/20150423/bin/backup_key.pem.pub 
Password: 
[sure@localhost bin]$ ll bak*
-rw-rw-r--. 1 sure sure  604 Mar 25 09:31 bak1.sql
-rw-rw-r--. 1 sure sure 1321 Mar 25 09:32 bak2.sql.encrypt
[sure@localhost bin]$ ./dencrypt_backup bak2.sql.encrypt bak2.sql
[sure@localhost bin]$ ls bak2*
bak2.sql  bak2.sql.encrypt
[sure@localhost bin]$