20.6 Stored Programs 및 Views 액세스 제어
저장 프로그램과 뷰는 사용하기 전에 정의 된 참조 될 때 그 권한을 결정하는 보안 컨텍스트에서 실행합니다. 이러한 권한은 DEFINER
속성과 존재하는 경우는 SQL SECURITY
특성으로 제어됩니다.
모든 저장 프로그램 (프로 시저, 함수, 트리거 및 이벤트)와보기는 MySQL 계정을 지명하는 DEFINER
속성을 포함 할 수 있습니다. DEFINER
속성을 저장 프로그램 또는 뷰 정의에서 생략하면 기본 계정은 개체를 만드는 사용자입니다.
또한, 스토어드 루틴 (프로 시저 및 함수)와보기는 값이 DEFINER
또는 INVOKER
인 SQL SECURITY
특성이 개체가 정의 측의 컨텍스트에서 실행하거나 호출자의 컨텍스트에서 실행 여부를 지정할 수 있습니다 . SQL SECURITY
특성을 생략하면 기본값은 정의 측의 컨텍스트입니다.
트리거와 이벤트는 SQL SECURITY
특성이없이 항상 정의 측의 컨텍스트에서 실행합니다. 서버가 필요에 따라 자동으로 이러한 개체를 호출하므로, 호출 사용자는 존재하지 않습니다.
정의 측과 호출자의 보안 컨텍스트는 다음과 같이 다릅니다.
정의 측의 보안 컨텍스트에서 실행되는 저장 프로그램이나 뷰
DEFINER
특성에 지명 된 계정의 권한으로 실행합니다. 이러한 권한은 호출 사용자의 권한과는 완전히 다를 수 있습니다. 호출자는 개체를 참조하는 데 적절한 권한 (예를 들어 저장 프로 시저를 호출하는EXECUTE
또는 뷰에서 선택하는SELECT
)가 필요하지만 객체가 실행 호출자의 권한은 무시됩니다 ,DEFINER
계정 권한 만이 중요합니다. 이 계정의 권한이 낮은 경우 개체가 수행 할 수있는 작업은 그에 따라 제한됩니다.DEFINER
계정에 높은 권한이 부여 된 경우 (root
계정) 호출 사용자에 관계없이 개체는 강력한 작업을 수행 할 수 있습니다.호출자의 보안 컨텍스트에서 실행되는 스토어드 루틴 또는 뷰는 호출자가 권한이있는 작업 만 수행 할 수 있습니다.
DEFINER
속성을 지정할 수 있지만 호출자의 컨텍스트에서 실행되는 개체에 영향을주지 않습니다.
다음 저장 프로 시저를 검토하십시오.
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p1() SQL SECURITY DEFINER BEGIN UPDATE t1 SET counter = counter + 1; END;
p1
대한 EXECUTE
권한을 갖는 모든 사용자도 CALL
문을 사용하여이를 호출 할 수 있습니다. 그러나 p1
실행하는 경우에는 DEFINER
의 보안 컨텍스트에서 실행하기 때문에 DEFINER
특성에 지명 된 계정 인 'admin'@'localhost'
의 권한으로 실행합니다. 이 계정은 p1
의 EXECUTE
권한 외에, 테이블 t1
의 UPDATE
권한이 필요합니다. 그렇지 않으면, 프로 시저가 실패합니다.
이어 다음 저장 프로 시저를 검토하십시오. 이것은 p1
과 동일하지만, 그 SQL SECURITY
특성이 INVOKER
인 점이 다릅니다.
CREATE DEFINER = 'admin'@'localhost' PROCEDURE p2() SQL SECURITY INVOKER BEGIN UPDATE t1 SET counter = counter + 1; END;
p2
는 p1
와 달리 INVOKER
의 보안 컨텍스트에서 실행합니다. DEFINER
속성은 무관하며, p2
는 호출 사용자의 권한으로 실행합니다. 호출자에게 p2
대한 EXECUTE
권한 또는 테이블 t1
에 대한 UPDATE
권한이 부족한 경우, p2
는 실패합니다.
MySQL은 다음 규칙을 사용하여 사용자가 객체의 DEFINER
속성에서 지정할 수있는 계정을 제어합니다.
SUPER
권한이있는 경우에 한해, 자신의 계정 이외의DEFINER
값을 지정할 수 있습니다.SUPER
권한이없는 경우에만 정당한 사용자 값은 말 그대로 지정하거나CURRENT_USER
를 사용하여 지정한 자신의 계정입니다. 정의들을 다른 계정으로 설정할 수 없습니다.
저장 프로그램 및보기 작성 및 사용의 가능한 위험을 최소화하기 위해 다음 지침을 따르십시오.
가능한 경우, 스토어드 루틴 또는 뷰에 대해 개체 정의
SQL SECURITY INVOKER
를 사용하여 객체가 수행하는 작업에 적합한 권한을 가진 사용자 만이 사용할 수 있도록합니다.SUPER
권한을 가진 계정을 사용하는 동안 정의 측의 컨텍스트 저장 프로그램 또는 뷰를 만들려면 객체가 수행하는 작업에 필요한 권한만을 소유하고있는 계정을 지명하는 명시적인DEFINER
속성을 지정합니다. 높은 권한을 가진DEFINER
계정은 반드시 필요한 경우에만 지정하십시오.관리자는
SUPER
권한을 사용자에게 부여해야 높은 권한을 가진DEFINER
계정을 사용자가 지정할 수 없도록 할 수 있습니다.정의 측 컨텍스트의 개체를 만들 때 호출 사용자에게 권한이없는 데이터에 정의 측이 액세스 할 수 있습니다. 권한이없는 사용자에게 특정 권한을 부여해야 이러한 개체에 대한 참조를 방지 할 수 있습니다.
저장 프로 시저 또는 저장 함수에 대한
EXECUTE
권한이없는 사용자가이를 참조 할 수 없습니다.뷰에 대한 적절한 권한 (보기에서 선택하는
SELECT
뷰에 삽입하는INSERT
등)을 가지고 있지 않은 사용자는 뷰를 참조 할 수 없습니다.
그러나 트리거에 대한 이러한 제어는 존재하지 않습니다. 사용자가 직접 트리거를 참조하는 것은 아니기 때문입니다. 트리거는 항상
DEFINER
컨텍스트에서 실행 특별한 권한이없는 사용자가 일반 테이블 액세스를 포함하여 트리거가 연결된 테이블에 액세스 할 수 있으면 활성화됩니다.DEFINER
계정에 높은 권한이 부여 된 경우 트리거는 신중을 요하는 작업이나 위험한 작업을 수행 할 수 있습니다. 트리거 작성에 필요한SUPER
및TRIGGER
권한이 만든 사용자 계정에서 삭제 된 경우에도이를 계속 적용됩니다. 관리자는이 권한의 조합을 사용자에게 인정하는 경우 특히주의해야합니다.