디비 접속 정보 암호화 하기
보안 강화을 위해, 디비 접속 정보 등이 담긴 설정 파일을 암호화하는 방법을 소개해드립니다.
물론 실제 동작시엔 실행단이나 메모리에서 해당 정보를 파악할 수 있어 완벽한 보안 기법은 아니지만, 하나의 보안 관문을 추가하는 정도라 생각하시면 됩니다.
테스트 환경
김정균님이 제작하신 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
참고
- 김정균님의 screwim – http://phpschool.com/link/tipntech/81220