본문 바로가기
미디어위키

Extension Lockdown

by 다움위키 2023. 12. 28.

Lockdown 확장은 특정 이름 공간(namespaces) 및 특수 지면(special pages)에 대한 접근을 주어진 사용자 그룹 집합으로 제한하는 방법을 구현합니다. 이것은 미디어위키에서 기본인 $wgGroupPermissions$wgNamespaceProtection 설정에 의해 제공되는 보안 모델보다 세분화된 보안 모델을 제공합니다.

기본적으로 미디어위키에 의해 사용되는 보안 모델에 대한 다음 페이지는 아래 지침을 이해하기 위해서 도움이 될 수 있습니다:

Installation

미디어위키 확장 내려받기 지면에서 해당 판을 내려받아서 정해진 위치로 이동시킵니다.

미디어위키 설정 LocalSettings.php 파일에 다음을 추가합니다:

wfLoadExtension( 'Lockdown' );

필요하면 설정하십시오.

Special:Version에 접근해서 확장이 정상적으로 설치가 되었는지 확인을 합니다.

issues로 인해 (역시 this topic를 참조), 이 확장은 MediaWiki 1.27.x에서 1.30.x까지 예상대로 작동하지 않는 것 같습니다. 그러나 이러한 문제는 MediaWiki 1.31 이상에서 해결되었습니다!

Example

Lockdown을 사용하여 Special:Export에 대한 접근을 방지하고 프로젝트 이름 공간의 편집을 로그인한 사용자 (등록된 사용자)로 제한하려면 다음을 사용할 수 있습니다:

$wgSpecialPageLockdown['Export'] = [ 'user' ];
$wgNamespacePermissionLockdown[NS_PROJECT]['edit'] = [ 'user' ];

설명과 추가 예제는 아래를 참조하십시오.

Configuration

Lockdown 확장은 단지 제한만 가능하며, 허가를 조절할 수는 없습니다. 미디어위키에서 제한한 접근 권한을 Lockdown 확장을 사용해서 허가할 수는 결코 없습니다.

$wgSpecialPageLockdown

$wgSpecialPageLockdown는 사용자 그룹에 따라 특수 지면에 대한 접근 제한을 구현해 줍니다. 예를 들어, 로그인한 사용자들에게만 Special:Export를 접근할 수 있도록 제한하기 위해서는 미디어위키 설정에 다음을 추가해 줍니다:

$wgSpecialPageLockdown['Export'] = array('user');

일부 특수 페이지에는 "기본적으로" 특정 권한이 필요합니다. 예를 들어, 페이지를 이동하는 데 사용할 수 있는 Special:MovePage에는 "move" 권한이 필요합니다 (기본적으로 로그인한 사용자에게만 부여됨). 이 제한은 Lockdown 확장을 사용하여 덮어쓸 수 없습니다.

어떤 특수 지면 이름은 위키에 보이는 것처럼 문자를 사용해서는 안됩니다. 예를 들어, Special:RecentChanges 는 내부적으로는 Recentchanges로 사용되기 때문에, 접근 제한이 다음과 같이 설정해야 합니다:

$wgSpecialPageLockdown['Recentchanges'] = array('user');

특수 지면 이름에 대한 전체 목록은 languages/message/MessageEn.php 파일의 $specialPageAliases 배열에 있습니다.

$wgActionLockdown

$wgActionLockdown을 사용하면 사용자 그룹이 접근할 수 있는 각 action을 지정할 수 있습니다. 예를 들어, 기록 페이지의 사용을 로그인한 사용자로 제한하기 위해서는, LocalSettings.php에서 다음을 사용하십시오:

$wgActionLockdown['history'] = array('user');

일부 동작은 이 방법으로 잠글 수 없다는 것에 주목하십시오. 특히, ajax 동작에는 작동하지 않습니다.

$wgNamespacePermissionLockdown

$wgNamespacePermissionLockdown은 이름 공간에 대한 권한을 가진 사용자 그룹을 제한합니다. 예를 들어, 프로젝트 이름 공간에 대한 쓰기 권한을 sysop 그룹의 구성원에게만 부여하려면 다음을 사용하십시오:

$wgNamespacePermissionLockdown[NS_PROJECT]['edit'] = array('sysop');

이름 공간 또는 권한(둘 다 동시에 사용할 수 없음)에 대한 와일드 카드가 지원됩니다. 보다 구체적인 정의가 우선합니다:

$wgNamespacePermissionLockdown[NS_PROJECT]['*'] = array('sysop');
$wgNamespacePermissionLockdown[NS_PROJECT]['read'] = array('*');

$wgNamespacePermissionLockdown['*']['move'] = array('autoconfirmed');

처음 두 행은 프로젝트 이름 공간의 모든 권한을 sysop 그룹의 구성원으로 제한하지만, 다른 사람에게 읽기를 허용합니다. 세 번째 행은 모든 이름 공간의 페이지 이동을 자동 확인 그룹의 구성원으로 제한합니다.

주목할 것은 이렇게 하면, 빌드-인 $wgGroupPermissions 설정에서 허용되지 않은 사용 권한을 *부여*할 수 없다는 점입니다. 다음은 일반 사용자가 메인 이름 공간에서 순회 편집을 허용하지 *않는다*는 점입니다:

$wgNamespacePermissionLo}ckdown[NS_MAIN]['patrol'] = array('user');

대신에, 먼저 $wgGroupPermissionsfirst에서 이 권한을 부여하고, 그런 다음 $NamespacePermissionLockdown을 사용하여 제한해야 합니다:

$wgGroupPermissions['user']['patrol'] = true;

$wgNamespacePermissionLockdown['*']['patrol'] = array('sysop');
$wgNamespacePermissionLockdown[NS_MAIN]['patrol'] = array('user');

주목할 것은 이름 공간에 대한 읽기 접근을 제한할 때 사용자가 다른 이름 공간에 대한 읽기 접근 권한을 갖고 있는 경우에는 제한 사항을 쉽게 피할 수 있습니다. 즉, 읽기 방지된 페이지를 템플릿으로 포함하여 볼 수 있습니다. 이것을 피하려면 이름 공간의 ID를 $wgNonincludableNamespaces에 추가하여 이름 공간의 페이지를 템플릿으로 사용하지 못하게 해야 합니다(이 기능은 MediaWiki 1.10, 개정판 19934에 도입되었으며, 그리고 또한 이전 버전에 대해서 확장으로 사용할 수도 있음):

$wgNamespacePermissionLockdown[NS_PROJECT]['read'] = array('user');
$wgNonincludableNamespaces[] = NS_PROJECT;

물론 $wgExtraNamespaces를 사용하여 정의된 사용자 정의 이름 공간과 함께 Lockdown을 사용할 수도 있습니다:

#define custom namespaces
$wgExtraNamespaces[100] = 'Private';
$wgExtraNamespaces[101] = 'Private_talk';

#restrict "read" permission to logged in users
$wgNamespacePermissionLockdown[100]['read'] = array('user');
$wgNamespacePermissionLockdown[101]['read'] = array('user');

#prevent inclusion of pages from that namespace
$wgNonincludableNamespaces[] = 100;
$wgNonincludableNamespaces[] = 101;

주목할 것은 사용자 정의 이름 공간은 항상 쌍으로 정의되어야 하며, 적절한 이름 공간(짝수 ID 포함) 및 연관된 토론 이름 공간(홀수 ID 포함)으로 정의해야 한다는 점입니다.

만약 상수를 사용하여 이름 공간을 참조하려면, 이를 정의해야 합니다:

#define constants for your custom namespaces, for a more readable configuration
define('NS_PRIVATE', 100);
define('NS_PRIVATE_TALK', 101);

#define custom namespaces
$wgExtraNamespaces[NS_PRIVATE] = 'Private';
$wgExtraNamespaces[NS_PRIVATE_TALK] = 'Private_talk';

#restrict "read" permission to logged in users
$wgNamespacePermissionLockdown[NS_PRIVATE]['read'] = array('user');
$wgNamespacePermissionLockdown[NS_PRIVATE_TALK]['read'] = array('user');

#prevent inclusion of pages from that namespace
$wgNonincludableNamespaces[] = NS_PRIVATE;
$wgNonincludableNamespaces[] = NS_PRIVATE_TALK;

array_fill()을 사용하여 한 번에 여러 이름 공간을 제한할 수도 있습니다, 예를 들어, 만약 이름 공간 0에서 2009까지를 sysops만 편집하도록 제한하려면, 다음을 추가하십시오:

$wgNamespacePermissionLockdown = array_fill( 0, 2010, array( 'edit' => array( 'sysop' ) ) );