#keywords MoniWikiTip, ACL /!\ since MoniWiki 1.1.2 [[모니위키]]의 SecurityPlugin의 한가지 [[TableOfContents]] == 미리 정의된 그룹 @group == * @ALL: 모든 사용자 (priority: 1) * @User: 등록 사용자 (priority: 2) == 사용자 정의 그룹 @Group 그리고 @Group의 priority == {{{ ##@그룹이름 사용자리스트 [priority] @Guest Anonymous # priority를 지정하지 않으면 기본값 2 @Kiwirian foobar,kiwi,hello123 20 # @Kiwirain 그룹의 priority를 잡는다. }}} /!\ Anonymous 사용자는 @Guest로 지정되어 있으며, @Guest는 미리 정의된 그룹이 아닙니다. == ACL 타입 == * `allow` : 허용 * `deny` : 제한 * `protect`: 비밀번호 제한이 가능한 몇몇 POST액션에 대해 (모든 액션이 관리비번으로 제한가능하지는 않습니다) * 일부 POST액션은 관리자 비밀번호로 제한을 걸어둘 수 있는 액션은 protect 가능한 액션입니다. protect 액션은 ''제한된 allow''이며, 일부 POST액션만 지원합니다. 예) do_post_savepage()는 post 액션이며, 일반 do_goto()같은 액션과는 달리 관리자 비밀번호로 액션을 제한을 할 수 있습니다. 지정 방법은 {{{*}}}는 모든 액션을 가리키며, 페이지 이름은 regex가 가능합니다. {{{ # 페이지이름 @그룹/특정사용자 allow/deny 액션리스트 FoobarPage @ALL allow * FoobarPage babo deny edit,diff,info HelpOn.* @ALL deny edit,savepage }}} === 간단한 적용의 일부 === {{{ @Guest Anonymous // @Guest 사용자 그룹 정의 * @ALL deny * // 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny) * @ALL allow ticket // 모든 페이지를 모든 사용자에게 ticket 액션을 허락(allow) * @ALL allow read,userform,rss_rc,aclinfo,fortune,deletepage,fixmoin,ticket // 여러 줄로 나눠쓰기 가능 * @User allow * // 모든 페이지(*)를 일반 가입 사용자에게(@User) 허락(*) WikiSandBox @Guest allow edit,info,diff // WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow) WikiSandBox Foobar deny edit // 사용자 Foobar는 WikiSandbox 편집 못하게 함 }}} === 완전한 적용의 예 === /!\ ''//''로 시작되는 줄은 설명줄입니다. {{{ # acl.default.php # // 파일은 php이지만 형식은 php가 아닌 일반 텍스트다. # Please don't modify the lines above # # A sample Access Control Lists file for Moniwiki # @Guest Anonymous // @Guest 사용자 그룹 정의 * @ALL deny * // 모든 페이지(*)를 모든 사용자(@ALL)에서 모든 액션(*)을 거부(deny) * @ALL allow ticket // 모든 페이지(*)를 모든 사용자(@ALL)에게 ticket 액션을 허락(allow) ticket은 가입 폼에 나오는 로봇가입방지 captcha * @User allow * // 모든 페이지(*)를 일반 가입 사용자에게(@User) 허락(*) # some pages are allowed to edit WikiSandBox @Guest allow edit,info,diff // WikiSandBox 페이지를 @Guest 그룹에 edit,info,diff 액션을 허용(allow) # some POST actions support protected mode using admin password * @ALL protect deletefile,deletepage,rename,rcspurge,rcs,chmod,backup,restore // 모든 페이지(*)에 대해 모든 사용자의(@ALL) detetefile,deltetepage 등등의 protect 가능한 액션을 protect # some actions allowed to @ALL * @ALL allow read,userform,rss_rc,aclinfo,fortune,deletepage,fixmoin,ticket # some pages have restrict permission MoniWiki @ALL deny edit,uploadfile,diff // MoniWiki 페이지를 @ALL 모든 사용자에게 edit,upload,diff등의 일부 액션을 거부 }}} == ACL이 성립되는 과정 == === 마지막 ACL 항목이 적용된다 === explicit하게 지정할 경우 최종 ACL 항목이 적용된다. * {{{allow read}}} + {{{deny read}}} = {{{deny read}}} * {{{deny read}}} + {{{allow read}}} = {{{allow read}}} ---- wildcard를 쓴 경우도 역시 최종 ACL 항목이 적용된다. * {{{allow *}}} + {{{deny *}}} = {{{deny *}}} 모든 액션을 거부 * {{{deny *}}} + {{{allow *}}} = {{{allow *}}} 모든 액션을 승인 === explicit하게 지정해야 한다 === wildcard를 쓴 것 보다 explicit하게 지정된 것이 먼저 적용된다. (순서에 상관 없다) * {{{deny *}}} + {{{allow edit,info}}} = edit와 info 액션만 가능: '''explicit하게 지정된''' 액션만 허락 * {{{allow *}}} + {{{deny info,diff}}} = info/diff 이외의 액션이 모두 허용: '''explicit하게 지정된''' 액션만 거부 * {{{deny info,diff}}} + {{{allow *}}} = 위의 경우와 같다. explicit하게 지정된 액션인 info, diff만 거부 /!\ {{{deny *}}} + {{{allow read}}}는 아파치의 {{{Order allow,deny}}}와 같다. 즉, explicit하게 지정된 allow에 대해 먼저 검사하여 액션이 read일때만 허락하고 나머지 액션은 deny. {{{deny edit}}} + {{{allow *}}}은 그 반대로 {{{Order deny,allow}}}가 된다. === 예 === 모든 페이지에 대해서 읽기만 가능하게, ProtectedPage에 대해서는 읽기도 거부 {{{ * @ALL deny * * @ALL allow read ProtectedPage @ALL deny read }}} ProtectedPage는 {{{deny *}}} + {{{allow read}}} + {{{deny read}}} = {{{deny *}}}이 된다. ---- /!\ 주의: 모든 경우, explicit하게 지정될 경우에 효력이 발생한다. {{{ * @ALL deny * * @ALL allow read ProtectedPage @ALL deny * }}} ProtectedPage는 {{{deny *}}} + {{{allow read}}} + {{{deny *}}}이 된다: explicit하게 허락된 read가 허용된다. 마지막 줄 {{{ProtectedPage @ALL deny *}}}는 무시되게 되는 것이다. == priority가 다른 경우 ACL의 성립 과정 == 앞절의 설명은 priority가 같은 경우에 대한 일반적인 설명이었다. 그룹의 priority를 두었을 때는 어떻게 적용될까? === 예제 1 === {{{ @ALL deny * @User allow * }}} 이 경우 @User의 priority가 높으므로 {{{allow *}}}이 적용된다. === 예제 2 === {{{ @ALL deny * @User allow read }}} @User에서 read가 허용. 나머지는 {{{@ALL deny *}}}에 의해 거부된다. === 예제 3 === {{{ * @ALL deny * * @ALL allow read,ticket,info,diff,titleindex,bookmark,pagelist ProtectedPage @All deny read,ticket,info,diff,titleindex,bookmark,pagelist }}} * 모든 사용자(@ALL)에게 allow를 제외한 모든 액션 거부. * ProtectedPage는 edit,savepage를 제외하고 모두 불허 * 이 경우, allow를 explicit하게 한 모든 액션에 대해 explicit하게 deny를 걸어주어야 된다. {{{deny *}}} 라고만 하면 안된다. {{{ * @ALL deny * * @ALL allow show,ticket,titleindex,bookmark,pagelist * @User allow edit,savepage ProtectedPage @User deny * # 이것만으로는 의도대로 작동 안한다. # 다음을 explicit하게 명시해야 의도대로 작동한다. ProtectedPage @User deny edit,savepage }}} * 일반 등록 사용자(@User)는 edit,savepage 허락. * ProtectedPage는 모두 불허 * 이 경우 등록 사용자에 대해 {{{@User deny *}}} + {{{@User allow edit,savepage}}}이므로 edit,savepage만 허용된다. * {{{allow edit,savepage}}}라고 explicit하게 정의된 것을 다시 취소시켜야 의도대로 작동하는 것이다. 따라서 {{{ProtectedPage @User deny edit,savepage}}}라고 써 주어야 한다. === 연습 === 1) 그룹 priority가 같은 항목끼리 합쳐지고, 2) 그룹 priority가 높은 항목이 우선적으로 적용된다. {{{ ####### @ALL 그룹의 priority는 1이다. @Guest Anonymous # @ALL을 제외한 모든 그룹의 priority는 그 값이 지정되지 않으면 2 이다. @Group1 peter,john 20 # priority = 20 @Group2 simon,soo # default group priorty = 2 * @ALL allow * # group priority = 1 * @ALL deny backup,restore * @Guest deny * # group priority = 2 * @Group1 deny * # User defined @Group1 group * @Group1 allow read,info,diff * @Group2 deny info,diff }}} * peter와 john: {{{allow read,info,diff}}} + {{{deny *}}} = read,info,diff만 허용 * Anonymous (@Guest): {{{deny *}}}: 모두 거부 (@Guest그룹의 priority가 높으므로 @ALL에 대해 허용된 것과 무관하게 거부된다) * 다른 모든 사용자(@ALL): {{{deny backup,resotre}}} + {{{allow *}}} ('''Order Deny,Allow''') * @Group1 : {{{allow read,info,diff}}} + {{{deny *}}} ('''Order Allow,Deny''') * @Group2 : {{{deny info,diff}}} + {{{@ALL deny backup,restore}}} + {{{allow *}}}: priority가 같은 항목이 합쳐진다. /!\ 각 ACL 항목의 같은 priority를 가지는 모든 항목이 합해져서 적용됩니다. config.php에 {{{$acl_debug=1}}} 옵션을 넣으면, 어떤 식으로 적용될지를 보여줍니다. ---- '''위 내용과 통합 필요''' #keywords MoniWikiTip #title 모니위키 권한 설정 (ACL) ACL을 활성화하면 위키 속도가 묘하게 느려지는 것 같다. 고로, 위키는 그냥 오픈상태에서 사용하는 게 편하다. [[TableOfContents]] == 권한 설정과 ACL == [위키위키]의 기본적인 정신은 누구나 페이지를 편집하고 공유할 수 있다는 것이지만, 개인용이나 특정 집단(동아리나 스터디 그룹 등)이 사용하려면 '''"권한을 제한"'''하는 것이 필요하다. {{| '''예 1''' : 가입과 열람 자체를 막아 관리자 이외에는 접근 불가능하게 함 '''예 2''' : 위키 자체는 열어두고, 일부 팀원들에게만 권한을 부여 '''예 3''' : 특정 페이지는 관리자만 열람/수정할 수 있도록 권한 부여|}} 위와 같은 권한 설정을 위해 [모니위키]에서는 ACL 플러그인을 v1.1.2 부터 제공하고 있다. ACL을 사용하는 방법은 MoniWikiACL을 참고하면 되지만, 좀 많이 헷갈린다. 그런 사람들(본인 포함)을 위해서 ACL 사용 방법과 현재 이 위키에 적용하고 있는 설정을 예시로 내보이려 한다. == ACL 활성화하기 == config.php 파일 안에 다음의 구문을 추가해서, ACL을 활성화 한다. {{{ $control_read=1; //읽기 제한 on $no_register=0; //1: 회원 가입 금지, 0: 회원 가입 가능 $security_class="acl"; //acl plugin 활성화 }}} == ACL rule 만들기 == ACL이 활성화 되었다면, 누구에게 어떤 페이지를 어떻게 할 수 있는 권한 규칙을 만들어야 한다. config 폴더 안에 acl.default.php.sample라는 규칙 샘플 파일이 있는데, .sample 부분을 삭제해서 acl.default.php로 이름을 변경하면 ACL에서 규칙을 사용하게 된다. 규칙은 그룹 설정과 권한 설정의 두가지로 구분된다. === 그룹 설정 === 아래 문법에서 '_'는 tab 문자를 대신한다. {{|그룹 설정 문법 : "@그룹명_그룹원_그룹_우선순위" |}} acl.default.php안에서 #은 주석을 의미한다. {{{ @Wikimaster icehit3 20 # Group priority = 20 @User # 위키 가입자들이 자동으로 User에 속하게 된다. @All # 위키를 방문한 모든 사람들이 포함된 그룹 }}} === 권한 설정 === {{|권한 설정 문법 : "페이지명_사용자,그룹명_allow or deny_권한명"|}} == 예제 : 비로그인 사용자 편집 금지, 일부 페이지 접근 금지 == '''규칙''' * 위키 관리자(@WikiMasters)는 모든 기능 사용 가능 * 위키 관리자만의 사적인 페이지 운용 * 비로그인 사용자(Anonymous)는 페이지 생성 및 편집 불가 {{{ @WikiMasters icehit3,파초 * Anonymous deny edit,diff,info,raw,restore,backup ssun @ALL deny * ssun @ALL allow userform,randompage ssun @WikiMasters allow * }}} ---- See also : [MoniWiki:MoniWikiACL] [[Navigation(모니위키)]]