Many pages make a thick book.
En~MoniWiki › SecurityPlugin
최초 위키위키가 탄생했을 때는 모든 사용자가 동등한 권한을 가지며 특별히 사용자의 권한을 제한하거나 하지 않았습니다. 그러나 위키위키가 점점 대중화되고 진화를 거듭하여 최신 위키엔진은 대부분 사용자 권한을 제한하고 관리자의 권한을 강화하는 방법을 제공하게 되었습니다.

모니위키는 SecurityPlugin을 통해서 관리자와 사용자의 권한에 제한을 걸 수 있습니다.

모니위키는 SecurityPlugin을 별도로 분리하여, 사용자의 입맛에 맞는 모듈을 만들거나 세밀한 제어를 할 수 있게 하였습니다.
  1. 사용자별 권한 설정 가능한 모듈
  2. 액션별로 각 사용자 권한 설정 가능
  3. 액션별로 비밀번호 프로텍트를 걸 수 있다.

/!\ 버전 1.1.2부터는 특별히 ACL SecurityPlugin을 제공합니다. Please see MoniWikiACL

비밀번호

모니위키에서는 관리자 비밀번호라는 것이 있습니다. 웹상에서 비밀번호는 안전하지 않기는 하지만, 간단한 비번을 제공하여 등록된 관리자에 한해서 보호된 POST 액션(Protected POST actions)에 대해서 비밀번호를 물어보게 됩니다.

예를 들어, TwinPages:DeletePage 혹은 DeleteFile같은 액션에 대해서 관리 비밀번호를 물어보게끔 설정할 수 있습니다.

또한 이러한 Protected 액션을 비밀번호를 물어보지 않게 설정할 수도 있습니다. 예를 들어 TwinPages:DeletePage의 경우 비밀번호를 설정하지 않게끔 하는 community.php 보안 플러그인을 쓰실 수도 있습니다. TwinPages:DeletePage의 경우는 이러한 경우를 대비해서 또 다른 안전장치가 되어있는데, 페이지를 지우더라도 페이지의 히스토리가 지워지지는 않기 때문에 다시 복구하실 수 있습니다.

Security Plugins

내장 Security 모듈

  • 기본적으로 내장된 모듈로서, 공개된 인 위키를 가정으로 한 Security 모듈
  • 기본적으로 모든 액션을 쓸 수 있게 하되, 몇몇 액션은 비밀번호로 프로텍트
    • 비밀번호가 필요한 액션: 페이지 지우기, RCS 히스토리 지우기, 업로드 지우기, 페이지 이름 바꾸기 등등

needtologin 모듈

  • 위키의 기본 액션 read를 제외한 몇몇 action에 제한을 가한다.
  • 사용자로 등록하여야 TwinPages:EditText할 수 있도록 함. WikiSandbox는 고칠 수 있음

mustlogin 모듈

  • 기본 액션(show/read)을 제외한 모든 액션은 로그인을 해야 가능하게 한다.
  • 사용자로 등록하여야 TwinPages:EditText할 수 있도록 함. WikiSandbox등등 몇몇 페이지는 고칠 수 있음

desktop 모듈

  • 비밀번호 없이 모든 액션이 가능

wikimaster 모듈

  • wikimaster로 등록된 사용자는 지우기할 때 관리자 비밀번호를 물어보지 않는다.
$wikimasters를 설정할 수 있다. Please see TwinPages:WikiMaster

설정하기

config.php에서 다음의 줄을 찾아서 수정하거나 없으면 새롭게 줄을 첨가합니다.
$security_class='needtologin';

나만의 SecurityPlugin 만들기

예를 들어 plugin/security/needtologin.php에 다음을 추가하면, 로그인하지 않으면 업로드 할 수 없다.
  function may_uploadfile($action,$options) {
    if (!$options['page']) return 0; // 잘못된 시도.
    if ($options['id']=='Anonymous') { // id가 Anonymous이면 로그인 하라고 메시지를 뿌린다.
      $options['err']=sprintf(_("You are not allowed to %s this page"),$action);
      $options['err'].="\n"._("Please Login or make your ID on this Wiki ;)");
      return 0;
    }
    return 1;
  }

주의사항

관리자 비밀번호를 올바르게 세팅하지 않으면 아래의 문제점이 발생할 수 있습니다.
  • $security_class를 needtologin으로 설정해서 테스트 중인데 로긴 안해도 파일업로드/삭제가 됩니다. -- BL
    현재 파일 업로드는 제한이 걸려있지 않습니다. 그러므로 파일 업로드가 되겠고, 삭제는 안될텐데요 ? 비밀번호는 걸어두셨나요 ? 업로드가 안되게끔 고쳐서 적용했고, 고친 부분은 바로 위의 수정을 참고하세요. --WkPark
    monisetup.php의 암호라면 걸어두었는데 또다른 암호가 있나요? -- BL

MoniWikiDev에서 테스트해보시기 바랍니다. 잠시 needtologin으로 전환했습니다. --WkPark
monisetup.php 업데이트 할때 실수했군요. update할때마다 old passwd에 암호넣고 업데이트를 했으니... config.php에 암호에 crypt된 문자열이 있어서 암호설정에 문제가 없는줄 알았는데 암호없는 것도 문자열이 있군요... -_- -- BL
ㅎㅎ 그럴 것 같았습니다. 그런 식으로 하면 암호를 해제할 수 있거든요. 암호를 설정하지 않았을 때와, 암호가 빈 문자열일 때 warning을 뿌리게 해야겠군요. --WkPark


Q & A

Q : 업로드 제한은 가능하다는걸 알겠는데
혹시 파일 다운로드를 지정된 사람들만 가능하게 제한 할 수 있는 방법은 없을까요?

A :CVS에서 가능합니다.

Q: MoniWiki를 혼자만을 위한 기억 저장소로 이용하고 싶습니다. 전체 페이지 또는 일부 페이지를 로그인 없이 내용도 볼수 없도록 했으면 좋겠는데 방법이 없을까요? 모듈수정으로 가능하다면 방법 소개 부탁드립니다.

A: 완전히 비공개라면 .htaccess를 이용한 일반적인 auth를 설정하는 방법을 통해 가능할 것입니다. MoniWikiSecurityPlugin은 read를 제외한 모든 action을 제어합니다. read마져 제어가능하게 하려면 1.1.2버전부터는 $control_read=1이란 옵션을 config.php에 넣으셔야 합니다. 그러나, 이것은 위키의 기본적인 정신에 위배될 수 있다는 사실을 놓치시지 마시기 바랍니다. --WkPark

Q: 그런데, 간혹 아주 개인적인 페이지를 만들일이 생기더군요. 일하다가 문득 떠오른 약속,개인적인 계획, 남이 보면 좀 시시콜콜한 내용들이 생기더군요. 사람사는게 정신없다보니 늘 기억을 못하니... 일하다가도 문득 떠오르는것을 잽싸게 위키에 기록하죠... 근데, 이것마저 남에게 노출되면... 거 아시죠...? 발가벗고 서있는 느낌요... 아마도 이런걸 요구하는 분들은 위키를 적극적으로 많이 이용하려다보니... 그런것 같습니다. 저 또한 다른 페이지는 다 공유되어도 공개되지 말아야 할 페이지는 있었으면 좋겠다는 생각이 문득 들더군요... --NCFP
의한표 던집니다. 특정 페이지만 로그인해야 볼 수 있거나 어드민만 볼 수 있는 기능은 없나요? 어떤 위키들은 가능하던데요.

저도 의한표 던지겠습니다. 자기소개서를 위키로 관리하려는데...공개하고 싶지 않거든요.

A: 모니위키는 기본적을 read/show 액션에 대해서는 제한을 두지 않았습니다. 그러나, show/read액션마져 제한을 두시려면 다음과 같이 고치시면 됩니다. 1.1.2버전부터 지원하는 $control_read=1;로 두시거나 그 이전 버전의 모니위키를 사용하신다면, wiki.php 끝에 보시면 read 관련 제어를 주석 처리한 부분이 있습니다. 이 부분 주석을 제거 해 주시고 SecurityPlugin을 적절히 수정하여 사용하시기 바랍니다.
<?php
...
    
# display this page

    # increase counter
    
$DBInfo->counter->incCounter($pagename,$options);

    if (!
$action$options['pi']=1# protect a recursivly called #redirect

#    if (!$DBInfo->security->is_allowed('read',&$options)) {
#      do_invalid($formatter,$options);
#      return;
#    }


...
?>


다시한번 말씀드리자면, 1.1.2버전 이후에는 $control_read=1을 config.php에 넣어주시면 ACL등으로 읽기 가능 여부를 조절하실 수 있습니다. --WkPark

Q 위에서 ...
저같은 컴맹을 위하여 SecurityPlugin을 구체적으로 어떻게 수정하면 되는지 알려주셨으면 합니다. 자료가 어느정도 축적된 다음에 사이트를 공개할 계획입니다. 모니위키 데스크탑 버전을 설치해 봤는데, 자료입력량이 많아지면 페이지 생성이 안되는군요. 부탁드립니다.

A: 저도 같은 이유로 여기서 글을 보고 시도해 보았습니다.
일단 로그인 하지 않으면 read action을 처리 하지 않게 하는 것은 가능 했습니다. 윗분 말씀 처럼 다음과 같이 변경해 주었습니다. wiki.php파일 입니다.

<?php
...
    
# display this page

    # increase counter
    
$DBInfo->counter->incCounter($pagename,$options);

    if (!
$action$options['pi']=1# protect a recursivly called #redirect

    
if (!$DBInfo->security->is_allowed('read',&$options)) {
      
do_invalid($formatter,$options);
      return;
    }
...
?>

다음은 저의 경우는 config.php에

$security_class='needtologin';

부분을 추가 하였기 때문에 다음의 may_read를 ./plugin/security/needtologin.php에 추가해 주는 수정 했습니다..

  function may_read($action,&$options)
  {
    if (!$options['page']) return 0;
    if ($options['id']=='Anonymous') {
      $options['err']=sprintf(_("You are not allowed to '%s' on this page"),$action);
      $options['err'].="\n"._("Please Login or make your ID on this Wiki ;)");
      return 0;
    }
    return 1;
  }

  • 간단히 설명 드리면 may_read함수를 만들어서 처리 해주고 싶은대로 처리해 주면 되는 것이지요..

  • 추가) 이 방법을 사용했을 경우 추가적인 문제가 발생합니다. 페이지 별로 권한을 줄수 없기 때문에 UserPreferences에도 접근을 할 수 없군요. 로그인을 할 수 없습니다.

  • 추가) 마찬가지로 may_read함수를 수정함으로서 일부 페이지만 상관 없이 보여 줄순 있었습니다. 원하는 페이지를 if로 검사해서 return 1; 으로 돌려 주면 됩니다.
    그 말씀은 may_read에 별도의 페이지목록, 유저목록, 그룹목록 등의 ACL을 참조하도록 하고, ACL 관리 기능을 어떠한 방식으로든 넣으면 원하는 페이지/사용자별로 읽기/쓰기에 대한 제한이 가능하겠군요. 물론 구현이 쉽지는 않겠지요. 이에 대해서 읽기에 대한 제한은 위키 정신에 위배된다. 라고 말하실 분이 분명 계시겠지만, 세상에 자신에 대한 모든 정보(자기 주민번호, 통장 비밀번호, 신용카드 번호, 출신학교, 이력 등등)을 모두 노출하고 사람은 없을 것이라고 보고, 위키를 쓰는 용도에 따라서 위키에도 공개하고 싶지 않은 정보가 얼마든지 올라올 수 있겠지요. 위키 사상을 떠나서 일단 사용자한테 위키는 인터넷을 통하여 공동 저작을 할 수 있는 도구라고 생각하구요. 위키 정신 또한 중요하지만 도구가 사용자에게 지나치게 특정 사상을 강요하는 모습은 그리 좋다고 생각되지 않네요. 기본적으로 갖추어야 할 기능은 갖추되, 사용자를 믿고 위키 정신을 논해야 맞을 것 같습니다. -- 아무개

    잘 하셨네요 :) 1.1.2부터는 $control_read=1옵션으로 읽기도 콘트롤 가능하며, ACL security plugin을 이용하면 특정 사용자만 읽을 수 있도록 페이지별 퍼미션을 조정 가능합니다. --WkPark

Q: 페이지별로 Security 설정을 다르게 할 방법은 없는건가요? 일부 페이지만 잠그고 싶은데..

A: 간단한 매크로를 만들어 사용하셔도 괜찮습니다. 우선 다음과 같은 MyPage›1.php 파일을 작성하여, 모니위키설치디렉토리/plugin/ 밑에 놓습니다.

<?php
function macro_MyPage() {
  
    global $user;
    $passwd = crypt("자신의로그인계정암호",  $user->info['password']);

    if($passwd != $user->info['password'] || $user->id != '자신의로그인계정아이디') {
        printf("<script>window.location='http://모니위키URL/wiki.php/UserPreferences'</script>");
    exit;
}
}
?>

그리고 자기만 봐야할 페이지에 다음과 같은 매크로를 달아놓으세요.

[[MyPage]]

해당 매크로가 달려있는 페이지를 다른 사람들이 보려고 하면 UserPreferences 페이지로 튕겨나가게 됩니다. --[http]키슈


1.1.2부터는 ACL security 플러그인을 사용하며 페이지별로 특정 사용자만 읽게 하거나, 특정 사용자만 못 읽게 할 수도 있습니다. --WkPark

A2: 다음의 방법은 어떨까요. 각 페이지에 #private이라는 instruction을 넣음으로써 개인적인 페이지로 설정하는 방법입니다. 대충 말하자면 #private이라는 instruction이 있는 페이지는 read_private이라는 permission이 있어야 볼 수 있도록 하는 방식입니다.

wiki.php에서 대충 다음 부분을 찾아서 고칩니다. (#inserted부터 #end of inserted까지를 삽입합니다.)

    $formatter->pi=$formatter->get_instructions($dum);
    if ($DBInfo->body_attr)
      $options['attr']=$DBInfo->body_attr;
    
    # inserted by Lbird. supporting private pages
    if ($formatter->pi['#private'] and !$DBInfo->security->is_allowed('read_private',$options)) {
        do_invalid($formatter,$options);
        return;
    }
    # end of inserted code by Lbird.

    $formatter->send_header("",$options);

    $formatter->send_title("","",$options);

컥, return을 빼먹어서 추가합니다.

역시 wiki.php에서 다음 부분도 찾아서 고칩니다. (#private 하나를 추가합니다.)
  function get_instructions(&$body) {
    global $DBInfo;
    # '#private' inserted by Lbird
    $pikeys=array('#redirect','#action','#title','#keywords','#noindex',
      '#filter','#postfilter','#twinpages','#notwins','#nocomment',
      '#language','#camelcase','#nocamelcase',
      '#singlebracket','#nosinglebracket','#private');
    $pi=array();

#private 이라는 instruction이 들어가 있는 페이지들만 영향을 받습니다. acl.default.php 파일에서
*       @ALL            deny    *
*       @ALL            allow   read,ticket,savepage
*       @User           allow   *
와 같이 되어 있는 경우라면 로그인한 사용자들은 read_private이 있고, guest는 없습니다. read permission만 있으니까 #private이 붙어 있지 않은 페이지들만 읽을 수 있습니다. 더 세세한 설정을 위해서는 특정 그룹을 지정해서 그 그룹에만 read_private 퍼미션을 줄 수도 있을 겁니다.

사족: 위키에 read 퍼미션을 제한한다는 게 위키정신에는 맞지 않는다고 개발자께서 생각하시는데 굳이 저런 걸 하려고 해서 참 죄송하군요. :) -- Lbird

위키정신에 맞지 않는것과 사용자의 요구는 별도로 생각해야겠죠. 1.1.2부터는 $control_read를 옵션으로 넣어서 read도 콘트롤 가능하게 하였습니다. --WkPark

Q : mustlogin 플러그인을 사용했을때
페이지 삭제같은 액션을 할때 사용하는 비밀번호는 무엇의 비밀번호인가요? $wikimaster는 작동을 안하는것 같던데...

A: 비밀번호는, 모니위키 처음 설치할 때에 나오는 관리자 비번입니다.

Q : 계정들을 좀 관리 하고 싶은데
어느 화일에 계정들이 들어있나요? 많은 사람들이 쓰다 보니 쓸모없는 계정도 생겨나던데..

A : data/user/wu-* 파일들입니다. 수동으로 지우실 수 있으며, 1.1.3 CVS버전부터는 사용자를 지우는 방법을 제공합니다. 이 경우 사용자 계정 정보가 실제로 지워지는 대신에 del-wu-* 처럼 이름이 바뀝니다.

Q : 신규가입을 제한하고 싶습니다. 우선 급한대로 ~/data/user 디렉토리의 권한을 조정하여 원하는 대로 만들어 놓기는 했지만 각종 에러가 발생하고 레이아웃이 깨지는 등 문제가 많습니다. 다른 방법은 없나요?

A : config.php에 $no_register=1을 넣습니다.
----
Sister Sites Index
 
captcha
Username:
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-07-06 16:08:33
Processing time 0.0277 sec