04. PHP

파이썬/Django를 위한 우분투이지만 휴대폰본인인증 또는 결제를 위해서는 특정 디렉토리에 제한하여 PHP를 실행시킬 수도 있습니다.

본인인증 팝업을 띄우고 실행하는 과정은 PHP로 동작하고 완료 후에 콜백 URL로 Django쪽 페이지를 호출하는 방법으로 구현 가능합니다.

설치

$ sudo apt-get install php-fpm php-pgsql

단순히 본인인증 팝업창을 띄워서 PostgreSQL 데이터베이스에 인증 정보를 저장하기 위한 최소한의 패키지 설치입니다.

16.04는 7.0 버전을 설치하고 18.04는 7.2 버전을 설치합니다. 버전이 같지 않으면 본인인증 모듈의 PHP 라이브러리가 동작하지 않으므로 잘 확인해야 합니다. 17.

PHP 허용 하위 디렉토리 설정

/var/www/com.example.www/php 디렉토리 안에서만 PHP 파일을 실행하고 싶다.

아래와 같이 /php 하위 디렉토리 위치를 정의하고 그 안에서 PHP 실행 가능하도록 잡아준다.

        location /php/ {
            root /var/www/com.example.www;
            index index.php;
            location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            }
        }

location에서 이미 /php 디렉토리를 잡아줬기 때문에 root 설정에서 굳이 /var/www/com.example.www/php 디렉토리를 잡아줄 필요가 없다.

당연히 /var/www/com.example.www/php 디렉토리 안에 파일이 존재해야 404 에러가 발생하지 않는다.

보안

Linux: 25 PHP Security Best Practices For Sys Admins

/etc/php/7.0/fpm/php.ini 파일 수정

시스템 정보 및 에러 노출 안함 (기본값)

 expose_php = Off
 display_errors=Off

PHP 스크립트를 찾을 수 없을 때 굳이 실행할 파일 안 찾음

cgi.fix_pathinfo=0

파일 업로드 금지

휴대폰본인인증, 결제 처리를 위해 모든 취약점 공격의 시작점이 되는 파일 업로드는 불필요하다.

file_uploads = Off

파일 열기 금지

allow_url_fopen=Off
allow_url_include=Off

POST 데이터 크기 제한

휴대폰 본인인증, 결제를 위해 POST 데이터는 크지 않다.

post_max_size = 1K

보안에 위험한 함수 사용 안 함

다음 함수는 주로 웹쉘 설치에 사용되므로 보안상 허용하지 않는다.

disable_functions = ,exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source,phpinfo,fopen_with_path,dbmopen,dbase_open,putenv,move_uploaded_file,chdir,mkdir,rmdir,chmod,rename,filepro,filepro_rowcount,filepro_retrieve,posix_mkfifo,

PHP 재시작

아파치와 달리 NGINX가 아니라 PHP를 재시작해야 변경사항이 반영된다.

$ sudo service php7.0-fpm restart

백도어 검색

# grep -iR 'c99' /var/www/
# grep -iR 'r57' /var/www/
# find /var/www/ -name \*.php -type f -print0 | xargs -0 grep c99
# grep -RPn "(passthru|shell_exec|system|base64_decode|fopen|fclose|eval)" /var/www/

KCB ok-names 서비스 예시

모듈 설치

phpinfo(); 페이지로 확인한 extension_dir 디렉토리 경로(예시: /usr/lib/php/20170911) 안에 다운로드 한 php_okname70nts.so 파일을 집어넣는다.

그리고 php.ini 파일을 열어서 복사한 파일 이름으로 다음 줄을 추가한다.

extension=php_okname70nts.so

phpinfo(); 페이지에서 okname 항목에 okname support 설정이 enabled 되어 있으면 올바로 설치된 것이다. 스레드 안전 모듈 파일 php_okname70ts.so로 동작하면 이를 사용해도 된다.

2018년 현재 우분투 18.04에서 PHP 7.2 버전이 설치되는데 okname 모듈은 7.0, 7.1까지만 지원하므로 PHP 7.0을 설치하는 우분투 16.04 버전을 사용해야 합니다.

예시 프로그램 실행

최종 수정일시: 2019-02-08 14:02


blog comments powered by Disqus