목차
보안
일반적인 (웹)어플리케이션들에 대한 일반적인 정보를 보려면 보안에 관한 논의페이지를 보기 바랍니다.
보안 경고
DokuWiki에 대한 보안 문제에 관한 알림 메시지를 받고 싶다면 freshmeat.net의 DokuWiki 프로젝트에 구독 신청을 하기 바랍니다.(email 구독신청을 확실하게 허용합니다.)
모든 보안 이슈들은 bugtracking system에서 확인할 수 있습니다.
보안 구멍 공개
만일 DokuWiki에서 보안문제를 발견한다면, 먼저 개인적으로 DokuWiki 유지보수하는 사람들에게 연락을 주기 바랍니다.
- 주 개발자: Andi의 연락가능한 자세한 창구들을 여기에서 확인할 수 있습니다.
- 다른 사람들 누구?
다른 방법으로 버그 리포팅에 알리는 것을 고려할지도 모르지만, 그 곳은 공개적인 장소입니다.
DokuWiki의 보안 설정
DokuWiki 환경설정할 때, 다음 config옵션들은 특별한 주의가 필요합니다.
fmode / dmode
(이 옵션들은 파일/디렉토리 생성 권한에 대해 설정합니다.) 되도록 제한하는 쪽으로 설정해야 합니다.
여기에 간단한 설명 추가
디버깅 정보 출력 금지
(필수 요구 사항입니다. - 공개적으로 보여주기에는 잠재적으로 너무 위험한 정보들이 노출됩니다.)
Dokuwiki config
디렉토리에서, 다음 행을 conf/local.php
파일에 추가합니다.(파일이 없으면 새로 만듭니다.)
$conf['allowdebug'] = 0;
외부 파일 복사 금지
위키 페이지에 연결된 외부 그림 같은 파일들은 lib/exe/fetch.php
스크립트를 통해 DokuWiki가 동작하는 웹서버로 복사됩니다. 목적은 일관된 성능을 제공하고 외부 그림들의 크기를 변경하기 위해서 입니다.
외부 소스들로 부터 가져오는 파일들의 크기를 제한하고 싶다면 $conf['fetchsize']
옵션을 사용하기 바랍니다. 값을 0
으로 설정한다면 외부 소스들을 캐쉬하는 것을 효율적으로 금지합니다.
로그인할 때 강제로 HTTPS 사용하기
mod_rewrite를 사용하여 강제로 HTTPS를 사용하여 로그인하도록 할 수 있습니다. 따라서 텍스트 패스워드가 노출되는 것을 막게 됩니다.
다음 행들을 apache.conf에 추가:
RewriteEngine On RewriteCond %{HTTPS} !=on RewriteCond %{QUERY_STRING} do=login RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R,QSA,L]
서버 이름이 SSL 인증의 호스트 이름과 일치하는 곳에서, ${HTTP_HOST}
를 ${SERVER_NAME}
로 바꾸고 싶을지도 모릅니다.
- Travis Sidelinger travis [at] ilive4code [dot] net - 2006Oct01
로그아웃할 때도 로그인 페이지가 도움이 될 수 있습니다, 따라서 약간의 개선을 위해do=login
을do=log(in|out)
으로 바꿀 수 있습니다.
— Gerard Neil 2007-01-27 04:01
설치 디렉토리에 보안을 적용
다음 단계들이 옵션으로 표시돼 있어도 필수 요구 사항에 가깝습니다. 이 것은 적용할 가치가 충분합니다.
document root1) 바깥으로 가능한 (확실히 있어야만 하는 스크립트들만 제외하고) 모든 것을 이동하도록 하는 것이 목적입니다.
전형적인 UNIX /이 홈 디렉토리가 /home/yourname
이고 document root 디렉토리가 /home/yourname/www
인 호스트 계정을 공유하고 있을 때, 먼저
document root 디렉토리 바깥에 /home/yourname/dokuwiki
디렉토리를 생성합니다. 그 후, 아래 단계들에서 설명하듯이 그 디렉토리 아래에 DokuWiki를 구성하는 부분들을 위치시킵니다.
./bin 디렉토리
(요구 사항 - .htaccess
에 의해 비록 보호되고 있어도 공개적으로 계속 이 디렉토리를 남겨 놓을 이유가 없습니다.)
bin
을 document root 바깥으로 옮기거나 간단히 삭제합니다. 이 디렉토리는 노출된 채 남겨놓으면 안되는 명령 라인에서만 사용될 목적의 스크립트들을 가지고 있습니다.
만일 shell로 접근하거나 이 스크립트를 사용할 이유가 없다면(예, 사용 목적도 보통 모릅니다.), 간단히 역시 디렉토리를 삭제할 수 있습니다. - 삭제해도 문제될 여지는 없습니다.(DokuWiki동작의 필수 요소가 아닙니다.)
./data 디렉토리
(옵션 사항 - .htaccess
에 의해 비록 보호되고 있어도 언제나 안전한 해법은 아닙니다.)
data
, media
, attic
를 document root 바깥으로 이동시킵니다.
옮기는 가장 쉬운 방법은:
data
디렉토리(와 모든 내용물들)를 document root 바깥으로 이동시킵니다.- savedir 설정을 이동된
data
디렉토리 위치를 가르키도록 수정합니다.
예를 들어, 만일 data
디렉토리가 /home/yourname/data
로 옮겨졌다면, 다음 행을 conf/local.php
파일에 추가합니다:
$conf['savedir'] = '/home/yourname/data';
media
와 attic
디렉토리들은 data
디렉토리 안쪽에 있으므로 위 변경만으로도 이 디렉토리에 대한 보호를 설정하는 효과가 있습니다.
./conf 디렉토리
(옵션 사항 - .htaccess
파일로 디렉토리가 보호되고 있어도 언제나 안전한 해법이 아닙니다.)
config 디렉토리를 document root 바깥으로 옮깁니다. 그런데 현재 DokuWiki 버전에서는 config 디렉토리에 접근하기 위해 약간의 설정이 필요합니다. (이것은 현재 DokuWiki 버전에서 달성하기는 약간 어렵습니다.) 지금 가장 쉽게 정확히 접근할 수 있는 방법은 새 config 디렉토리 위치에서 정의된 디렉토리 위치를 가르키는 상수를 정의한 간단한 PHP 스크립트를 불러들일 수 있도록 PHP의 auto-prepend-file ini 설정을 사용하는 것입니다.
전형적으로 공유되는 호스트에서, 단지 아래 코드만 포함하고 있는 /home/yourname/dokuwiki/prepend.php
같은 파일을 생성합니다:
<?php define('DOKU_CONF','/home/yourname/dokuwiki/conf/');
(PHP 종료 명령은 고의적으로 남겨 놓았습니다. - ?>를 끝에 추가하지 말아야합니다.) (MS 윈도우즈의 경우 '/home/yourname/dokuwiki/conf/' 부분이 'c:\home\yourname\dokuwiki\conf\' 과 같이 대치될 수 있으나 마지막의 \' 이 “'“을 문법적 의미 없는 문자로 인식하게 하여 'c:\home\yourname\dokuwiki\conf\\' 과 같이 해 주어야 합니다.
conf
디렉토리를 /home/yourname/dokuwiki/
로 아래 /home/yourname/dokuwiki/conf
디렉토리로 이동합니다.
이제 document root에 있는 .htaccess
파일에 다음 코드를 추가합니다.(예. /home/yourname/www/.htaccess
):
php_value auto_prepend_file "/home/yourname/dokuwiki/prepend.php"
이 코드는 PHP가 다른 스크립트를 실행하기 전에 prepend.php
를 실행하도록 알려줍니다.
상수 정의를 통해, Dokuwiki의 inc/init.php
스크립트에 의해 나중에 설정되는 것을 덮어 씌웁니다.
: 위에 conf를 보호하는 방법이 제 경우에는 웹사이트 접속이 안되버리더군요.
http://www.dokuwiki.org/:security 사이트에서 사용하는 방법을 이용하였습니다.
conf를 document_root의 바깥으로 이동시키는 것 까지는 동일합니다. 다만 아래 내용을 prepend.php 파일로 생성하는게 아니라 inc 폴더 밑에 preload.php 파일로 생성합니다.
<?php define('DOKU_CONF','/home/yourname/dokuwiki/conf/');
그리고 inc 폴더의 경우는 document_root 밖으로 이동한 후에 /home/yourname/dokuwiki/ 폴더 밑에 폴더 링크를 만들었습니다.
The ./inc directory
(선택 사항 - .htaccess
파일로 디렉토리가 보호되고 있어도 항상 안전한 해법은 아닙니다.)
이론적으로 어떤 위험할 이유는 없을지라도 굳이 이 코드를 공개적으로 노출키킬 이유도 없습니다. - 미안해하는 것보다 안전한게 낫습니다. 이 단계는 서버에 대한 쉘 접근이 꽤 많이 요구되는 것을 알아야 됩니다. - 위 다른 단계들 중 대부분은 단지 FTP 클라이언트만 사용해도 됩니다.
config
디렉토리를 document root 바깥으로 이미 이동했다면,
단순히 추가적인 행이 다음과 같도록 prepend.php
파일을 수정하기 바랍니다;
<?php define('DOKU_CONF','/home/yourname/dokuwiki/conf/'); define('DOKU_INC','/home/yourname/dokuwiki/');
inc 디렉토리를 /home/yourname/dokuwiki
아래 /home/yourname/dokuwiki/inc
로 이동합니다. lib
디렉토리 역시 이동한 후 lib
디렉토리에 대한 심볼릭 링크를 document root아래에 만듭니다. 예를 들어:
$ mv /home/yourname/www/lib /home/yourname/dokuwiki $ ln -s /home/yourname/dokuwiki/lib /home/yourname/www/lib
윈도 환경에서는 어떤 명령어를 실행해야 하나요?
실행 후 DOKU_INC
가 정확히 해결될 수 있도록 허용하기 위해 lib
디렉토리에 대한 심볼릭 링크를 document root 디렉토리 아래에 만들게 됩니다.
일반적인 PHP 설정
설명된 내용은 wiki:config:php에 포함될 것이며, 이 곳에는 링크만 남겨 놓을 예정입니다.
다음은 일반적인 “괜찮은 훈련”이 될 것입니다. Apache 보안의 3장은 일반적인 PHP 잠금에 대해 설명한 좋은 읽을 거리입니다. 에기에서 무료로 볼 수 있는 PDF 문서형태로 구할 수 있습니다. 완전히 제어할 수있는 서버에서 DokuWiki/PHP를 동작하게 하려면, chroot jail를 고려할 수도 있습니다. 구축 방법에 대한 다양한 문서들이 온라인 흩어져 있지만, 가장 완벽하게 정확하게 효율적인 구축 방법에 대해 설명한 문서는 아마 Apache + Chroot + FastCGI + PHP FAQ입니다.
You should be able to set them by editing your main .htaccess file at /home/yourname/www/.htaccess
에 있는 주 .htaccess 파일을 수정해서 구축할 수 있을 것입니다.
개인적인 Error Logging
(선택 사항 - 이 방법은 괜찮은 생각입니다. - 더 자세한 내용을 크래커들에 줄 지도 모릅니다.)
dokuwiki 기본 디렉토리(예를 들어 /home/yourname/dokuwiki/.htaccess
)에 다음 내용을 추가합니다.
home/yourname/www/.htaccess
에 .htaccess
가 있고, /home/yourname/dokuwiki
에는 없습니다, 만일 정확히 /home/yourname/dokuwiki/
에서 위 설정을 그대로 적용하면, conf, lib, inc 디렉토리들과 prepend.php 파일, home/yourname/www/
에 있는 파일들 말고는 아무 것도 없습니다. 도와주세요.
어떤 .htaccess? /dokuwiki와 ./data 디렉토리 밑에 하나씩 있습니다.
또, .htaccess 파일 수정에 대한 좀 더 자세한 설명이 있었으면 좋겠습니다: Windows는 FileZilla가 .htaccess를 다운로드하도록 해주기는 해도 유효한 윈도우즈 파일 이름으로 인식하지 못합니다. 저는 파일 이름 앞의 dot(.)을 삭제한 htaccess로 이름을 바꾸고 나서, 다시 서버로 업로드 한 후 원래 이름으로 복구했습니다.
제가 한 작업 내용은 아래에 있습니다.
이 작업 후에 서버에서 내부 에러가 발생했고, 아직도 어떤 것이 잘못됐는지 확인 중입니다. 심지어 .htaccess파일을 정확하게 수정했는지도 모르겠습니다…
# Disable display of public PHP error messages php_flag display_errors "off" # Log all PHP errors to this file php_flag error_log "/home/yourname/dokuwiki/data/errors.log" #FIXME I see no data directory in "/home/yourname/dokuwiki/" so i'm wondering if in the steps above u forgot to mention #that i'm suppose to copy all the files in "/home/yourname/www/" to "/home/yourname/dokuwiki/". I'm saying this because #in the FIX ME above i also said that there is no .htaccess in "/home/yourname/dokuwiki/" but it's one in #"/home/yourname/www/". (The "/home/yourname/www/" is the directory where we decompress the dokuwiki.tgz file). # Don't keep reporting the same error again and again (keep log file smaller) php_flag ignore_repeated_errors On # Dokuwiki generates a lot of notices... best prevent reporting them # in .htaccess files E_ALL, E_NOTICE have no effect, you must use the # values from http://w.php.net/manual/en/function.error-reporting.php # E_ALL & ~E_NOTCE => 2047 - 8 => 2039 php_flag error_reporting 2039
log 파일의 크기를 먼저 확인해 봐야합니다. 시간이 지날 수록 log 파일이 너무 커지게 된다면 삭제해야 합니다. PHP가 로그 파일에 기록할 수 있는 충분한 권한이 부여되어 있는지도 확인할 필요가 있습니다.
(설치 안내서의 changes.log
를 참고하기 바랍니다.)
safe_mode와 open_basedir 옵션 설정
Linux/Unix와 Apache에서 dokuwiki를 운용하기 위한 명령, Centos 4.4에서 테스트됐습니다.
PHP에서 보안관련하여 매우 중요한 두가지 옵션들이 있습니다: 2)
- safe_mode: PHP에서 시스템 명령 실행을 제한합니다. (PHP3, PHP4, PHP5에서 동작)
- open_basedir: PHP 스크립트가 단지 디렉토리 내에서 파일을 열 수 있도록 제한
다음 행들을 httpd.conf에 추가하거나 /wiki/.hataccess파일에 추가 될 수도 있습니다:
# dokuwiki is installed in : /var/www/html/wiki/ # your php pear packages are in : /usr/share/pear/ # php is installed in : /usr/lib/php4/ # use a new tmp directory in : /var/www/html/wiki/tmp/ <Directory /var/www/html/wiki> php_admin_flag safe_mode On php_admin_value safe_mode_exec_dir "/usr/lib/php4" php_admin_value safe_mode_include_dir "/usr/share/pear/" php_admin_value open_basedir "/var/www/html/wiki/:/var/www/wiki/:/usr/share/pear/" php_admin_value upload_tmp_dir "/var/www/html/wiki/tmp/" </Directory>
그 후, 위키의 모든 접근 권한을 다음처럼 설정해야합니다:
# chown apache.apache -R /var/www/html/wiki/
위의 작업을 telnet을 사용하면 어떻게 해야하나요? 현재 호스팅 제공업체는 command 라인을 제공하지 않습니다… 무엇보다, 이 페이지에서 제가 이해한 것이라고는 .bin 디렉토리를 삭제하고 ./data디렉토리를 이동한다는 것뿐입니다. 어쨌든, 저는 이 전 ./data를 FileZilla를 통해서는 삭제할 수 없었습니다; 디렉토리가 비워지지 않았습니다라는 메시지만 보여줘서 하위 디렉토리로 이동해서 모든 파일들을 삭제했습니다, 삭제하려는 모든 시도는 PWD 명령들만 잔뜩 쓰게 했습니다. 확실하게 파일들을 삭제할 수 있는 방법이 없습니다. 이 페이지의 나머지 내용은 저에게는 적용되지 않거나 불분명해 보입니다. 초보자를 염두에 둔 설명이 필요합니다. 우리들 대부분은 초보입니다.
웹서버가 아파치이고 사용자 권한으로 아파치가 실행되고 있다는 가정 아래에서 설명한 내용입니다. safe_mode가 .php파일들의 소유자인 사용자로서 PHP 스크립트를 실행하기 때문입니다.
플러그인의 보안 경고
Dokuwiki는 사용자들이 개발한 많은 플러그인들이 있습니다. 이 플러그인들은 DokuWiki 배포와 별개로 특별한 방법을 이용하여 배포되며, 똑같은 관심을 받지도 않습니다./ 주 DokuWiki 기본 코드들을 검토해 본다면, 몇가지 팁과 알아챌 수 있는 것들이 있습니다;
- 가능하면, 설치하기 전에 플러그인 소스 코드를 직접 검토합니다.
- 의심이 든다면, 메일링 리스트로 문의합니다.
- 플러그인들은 document root아래에서 노출되는 Dokuwiki
lib
디렉토리 아래에 설치됩니다. 플러그인이 포함하고 있는 코드를 아주 신중하게 검토해야 합니다. 적절하게 .htaccess 파일을 사용해 잠글 수 있습니다. - 플러그인들은 DokuWiki 프로젝트와 관계없는 개발자들에 의해 만들어질 수 있습니다. - 악의적인 의도를 가지고 있을 수도 있으며 서버를 손상시킬 수 있는 소스 코드를 품고 있을 수도 있습니다. 신뢰하는 사람을 주의하라~~~~
왜 다른 상수들처럼 – 내가 알기로는, 플러그인들은 note 플러그인에서 아이콘들 처럼 자신들의 디렉토리의 파일들에 링크되어 있습니다. / Viktor
DOKU_PLUGIN
를 prepend.php
안에 정의할 수 없나요? 그리고 역시 document root바깥에 두어야 하나요?
질문: Mozilla의 https://addons.mozilla.org처럼 DokuWiki에서도 가능합니까? ?
모질라 사이트는 모질라 제품(예. Firefox, Thunderbird)에 대한 모두 검토된 플러그인들만 가지고 있습니다.
단지 안정적이고 보안이 검증된 플러그인들만 등록이 됩니다. 사용자들은 플러그인을 모질라 사이트를 통해 설치할 때, 상대적으로 불투명한 써드-파티 사이트보다 안전할 수 있습니다.
DokuWiki가 커질수록, 플러그인 취약성에 대한 보호가 더 중요해지고 있습니다.
– charlieMOGUL 07-12-2006 10:00 GMT +01:00
번역
english version: dokuwiki-2006-11-06.
Add your email here if you created translated or modified whole or part of this page.
- jk Lee - real mail domain is gmail, not zoo.com for spam filtering 2007-2-9 created