screwim 로 디비 접속 정보 암호화 하기

디비 접속 정보 암호화 하기

보안 강화을 위해, 디비 접속 정보 등이 담긴 설정 파일을 암호화하는 방법을 소개해드립니다.

물론 실제 동작시엔 실행단이나 메모리에서 해당 정보를 파악할 수 있어 완벽한 보안 기법은 아니지만, 하나의 보안 관문을 추가하는 정도라 생각하시면 됩니다.

테스트 환경

김정균님이 제작하신 screwim 확장 모듈을 사용해, 개발 서버에서 설정 파일을 암호화하여 운영 서버에 적용하는 과정을 살펴보겠습니다.

CentOS 6/7 + PHP 7.0 (remi repo) 환경을 기준으로 테스트하였으며, php79 stack을 사용중이신 분들은 PHP 7.0 이 설치된 상태에서 따라 해보시면 됩니다.


1. 개발/빌드 서버에서 PHP 소스 암호화 하기

PHP 확장 모듈 컴파일을 위한 패키지 설치

yum install gcc zlib-devel php70-php-devel

zlib-devel: screwim 확장 모듈에서 zlib 사용
php70-php-devel: phpize, php-config

screwim 확장 모듈 설치

cd /usr/local/src/ \
&& git clone https://github.com/OOPS-ORG-PHP/mod_screwim.git \
&& cd mod_screwim/ \
&& /opt/remi/php70/root/usr/bin/phpize \
&& ./configure --with-php-config=/opt/remi/php70/root/usr/bin/php-config \
&& make install \
&& echo 'extension=screwim.so' > /etc/opt/remi/php70/php.d/90-screwim.ini \
&& php -m|grep screwim

screwim

screwim 커맨드 라인 툴 설치

cd /usr/local/src/mod_screwim/tools/ \
&& ./autogen.sh \
&& ./configure \
&& make install \
&& /usr/local/bin/screwim -v

HEADER LENGTH : 14

KEY BYTE : 0d3f533dbc16b46a133e

KEY STRING : 16141, 15699, 5820, 27316, 15891

PHP 소스 파일 암호화

echo '<?php $db_password="BiMilIYa"; ' > db_config.php \
&& /usr/local/bin/screwim db_config.php
# 원본 소스와 암호화된 소스 비교
# hexdump -C db_config.php
00000000  3c 3f 70 68 70 20 24 64  62 5f 70 61 73 73 77 6f  |<?php $db_passwo|
00000010  72 64 3d 22 42 69 4d 69  6c 49 59 61 22 3b 20 0a  |rd="BiMilIYa"; .|
00000020

# hexdump -C db_config.php.screw
00000000  09 53 43 52 45 57 49 4d  20 44 41 54 41 09 8a ed  |.SCREWIM DATA...|
00000010  f8 f2 83 3a c4 1b 13 e5  bb 66 64 0b 80 dc c2 84  |...:.....fd.....|
00000020  6c e6 43 b9 39 89 58 3f  20 ba cf e0 a6 5e 1d a3  |l.C.9.X? ....^..|
00000030  ae f2 58 b7 49 fa                                 |..X.I.|
00000036

2. 운영 서버에 암호화된 설정 파일 올리기

개발/빌드 서버와 동일하게 screwim 확장 모듈 설치 과정 필요. (커맨드 라인 툴은 생략 가능)

차이점) make install 실행 이전에 config.h파일의 ‘암호화 시드 키’를 개발/빌드 서버와 동일하게 일치시켜 주어야 함.

# grep SCREWIM_ENC_DATA config.h
#define SCREWIM_ENC_DATA 16141, 15699, 5820, 27316, 15891

운영 서버에선 확장 모듈 설치 완료후, ./clean.sh실행하여 ‘암호화 시드 키’가 포함된 소스 삭제.

(or 동일한 OS/PHP 버전 환경에서 미리 컴파일된 screwim.so 파일만 복사하는 것 권장.)

암호화된 소스의 include 테스트

  • 개발/빌드 서버에서 db_config.php.screw파일만 복사해옵니다. 물론 암호화되지 않은 db_config.php 파일은 운영 서버에 넣으면 안되고요.

  • index_test.php 파일을 만들어 암호화된 소스가 정상 동작하는지 테스트

echo '<?php
ini_set ("screwim.enable", true);
require_once("db_config.php.screw");
ini_set ("screwim.enable", false);

var_dump($db_password);

//require_once("another_source.php");
' > index_test.php \
&& php -d 'display_errors=on' index_test.php

string(8) “BiMilIYa”

운영 서버에서 암호화된 파일이 잘 실행되네요!

오늘은 가능 여부만 파악해봤고요. 실제 운영에 도입하기 위한 안정성이나 부하 테스트 등은 향후 별도로 진행해보겠습니다.


  • 참고) 암호화 시드 키가 일치하지 않을 경우의 에러 메시지

Fatal error: require_once(): ScrewIm decode error. A preset dictionary is required. The adler field shall be set to the Adler-32 checksum of the dictionary chosen by the compressor. In this case, you should suspect that ScrewIm’s encode key is not correct. in /usr/local/src/mod_screwim/tools/index_test.php on line 3


참고