보안 플러그인 라이브러리 개발에 대한 제한사항
플러그인 라이브러리 개발 방법에 영향을 주는 특정 제한사항이 있습니다.
다음 목록에서는 플러그인 라이브러리 개발을 위한 제한사항에 대해 간략히 설명합니다.
- C-링크
- 플러그인 라이브러리는 C 링크에 링크되어야 합니다. 프로토타입을 제공하는 헤더 파일, 플러그인을 구현하는 데 필요한 데이터 구조, 오류 코드 정의는 C/C++에만 제공됩니다. Db2® 가 로드 시 분석할 함수는 플러그인 라이브러리가 C++로 컴파일되는 경우 extern "C" 로 선언되어야 합니다.
- .NET 공용 언어 런타임이 지원되지 않음
- 플러그인 라이브러리에 대한 소스 코드를
컴파일 및 링크에 .NET 공용 언어 런타임(CLR)이 지원되지 않습니다.주의: Db2 11.5.9릴리스에서는 Microsoft .Net CLR (Common Language Runtime) 루틴에 대한 지원이 더 이상 사용되지 않으며 나중에 제거될 수 있습니다. .NET CLR에 대한 종속성이 있는 루틴을 현재 실행 중인 경우, 지원되는 언어로 루틴 로직을 다시 작성한 후 루틴을 다시 작성하십시오.
- 신호 핸들러
- 플러그인 라이브러리가 DB2 신호 핸들러를 방해하기 때문에 신호 핸들러를 설치하거나 신호 마스크를 변경하지 않아야 합니다. DB2 신호 핸들러를 방해하면 플러그인 코드 자체의 트랩을 포함하여 오류를 보고하고 복구하는 DB2의 기능에 심각한 방해가 될 수 있습니다. 플러그인 라이브러리에서도 DB2에 사용된 오류 처리에 방해가 될 수 있으므로 C++ 예외도 발생하지 않아야 합니다.
- 스레드 안전
- 플러그인 라이브러리는 스레드가 방지되고 다시 들어갈 수 있어야 합니다. 플러그인 초기화 함수는 다시 들어갈 필요가 없는 유일한 API입니다. 플러그인 초기화 기능은 다른 프로세스에서 여러 번 호출될 수 있습니다. 이 경우, 플러그인에서 사용된 모든 자원이 정리되고 플러그인 자체가 다시 초기화됩니다.
- 종료 핸들러 및 표준 C 라이브러리 및 운영 체제 호출 겹쳐쓰기
- 플러그인 라이브러리는 표준 C 라이브러리 또는 운영 체제 호출을 겹쳐쓰지
않아야 합니다. 또한 플러그인 라이브러리는 종료 핸들러 또는
pthread_atfork핸들러를 설치하지 않아야 합니다. 프로그램을 종료하기 전에는 종료 핸들러를 언로드할 수 없으므로 이 핸들러를 사용하지 않는 것이 좋습니다. - 라이브러리 종속 항목
- Linux® 또는 UNIX에서 플러그인 라이브러리를 로드하는 프로세스는
setuid또는setgid일 수 있습니다. 이는 종속 라이브러리를 찾기 위해$LD_LIBRARY_PATH, $SHLIB_PATH또는$LIBPATH환경 변수에 의존할 수 없음을 의미합니다. 따라서 다음 상황과 같은 다른 방법을 통해 종속 라이브러리에 액세스할 수 없는 경우, 플러그인 라이브러리는 추가 라이브러리를 사용하면 안 됩니다./lib또는/usr/lib에 배치하여- 상주하는 디렉토리가 OS 전체로 지정(예:
Linux의
ld.so.conf파일에) - 플러그인 라이브러리 자체의
RPATH에 지정하여
- 기호 충돌
- 가능하면 플러그인 라이브러리를 컴파일하여 기호 충돌 가능성을
줄이는 사용 가능한 옵션(예: 바인드되지 않은 외부 기호 참조를
줄이는 옵션)과 링크해야 합니다. 예를 들어, HP및 Linux 에서 "-Bsymbolic" 링커 옵션을 사용하면 기호 충돌과 관련된 문제점을 방지하는 데 도움이 될 수 있습니다. 그러나 AIX®에 작성된 플러그인의 경우
"-brtl"링커 옵션을 명시적 또는 내재적으로 사용하지 마십시오. - 32비트 및 64비트 애플리케이션
- 32비트 애플리케이션은 32비트 플러그인을 사용해야 하며 64비트 애플리케이션은 64비트 플러그인을 사용해야 합니다. 자세한 정보는 32비트 및 62비트 고려사항에 대한 주제를 참조하십시오.
- 테스트 문자열
- 입력 텍스트 문자열이 널(null) 종료된다고 보장되지 않으며 출력 문자열은 널(null) 종료될 필요가 없습니다. 대신, 모든 입력 문자열에 정수 길이가 지정되고 리턴될 길이에 정수의 포인터가 지정됩니다.
- 권한 부여 ID 매개변수 전달
- DB2가 플러그인에 전달하는 권한 부여 ID(권한 ID) 매개변수(입력 권한 ID 매개변수)에 채워진 공백이 제거된 상태의 대문자 권한 ID가 포함됩니다. 플러그인이 DB2에 리턴하는 권한 ID 매개변수(출력 권한 ID 매개변수)는 특수 처리가 필요하지 않지만, DB2가 내부 DB2 표준에 따라 권한 ID를 대문자로 포함시키고 공백으로 채웁니다.
- 매개변수에 대한 크기 한계
- 플러그인 API는 매개변수의 길이 한계로 다음을 사용합니다.
특정 플러그인을 구현할 때 권한 부여 ID, 사용자 ID 및 암호에 대해 보다 작은 최대 길이가 요구될 수 있습니다. 특히, DB2 데이터베이스 시스템에 제공되는 운영 체제 인증 플러그인은 운영 체제 한계가 이전에 설명한 한계보다 작은 경우 운영 체제에서 강제 설정된 최대 사용자, 그룹 및 네임스페이스 길이 한계로 제한됩니다.#define DB2SEC_MAX_AUTHID_LENGTH 255 #define DB2SEC_MAX_USERID_LENGTH 255 #define DB2SEC_MAX_USERNAMESPACE_LENGTH 255 #define DB2SEC_MAX_PASSWORD_LENGTH 255 #define DB2SEC_MAX_DBNAME_LENGTH 128 - AIX 의 보안 플러그인 라이브러리 확장
- AIX 시스템에서 보안 플러그인 라이브러리의 파일 이름 확장자는 .a 또는 .so입니다. 플러그인 라이브러리를 로드하는 데 사용되는 메커니즘은 사용되는
확장자에 따라 다릅니다.
- 확장자가 .a인 파일 이름이 있는 플러그인 라이브러리는
공유 오브젝트 구성원이 포함된 아카이브로 간주됩니다. 이러한 구성원의 이름은
shr.o(32비트) 또는 shr64.o(64비트)로 지정해야 합니다. 단일 아카이브는 32비트와
64비트 멤버를 모두 포함할 수 있으므로 두 유형의 플랫폼에 배치할 수
있습니다.예를 들어, 32비트 아카이브 스타일 플러그인 라이브러리를 빌드하려면 다음과 같이 구성하십시오.
xlc_r -qmkshrobj -o shr.o MyPlugin.c -bE:MyPlugin.exp ar rv MyPlugin.a shr.o - 확장자가 .so인 파일 이름이 있는 플러그인 라이브러리는
동적으로 로드할 수 있는 공유 오브젝트로 간주됩니다. 이러한 오브젝트는
빌드 시 사용된 컴파일러 및 링커 옵션에 따라 32비트 또는
64비트입니다. 예를 들어, 32비트 플러그인 라이브러리를 빌드하려면 다음과 같이 구성하십시오.
xlc_r -qmkshrobj -o MyPlugin.so MyPlugin.c -bE:MyPlugin.exp
- 확장자가 .a인 파일 이름이 있는 플러그인 라이브러리는
공유 오브젝트 구성원이 포함된 아카이브로 간주됩니다. 이러한 구성원의 이름은
shr.o(32비트) 또는 shr64.o(64비트)로 지정해야 합니다. 단일 아카이브는 32비트와
64비트 멤버를 모두 포함할 수 있으므로 두 유형의 플랫폼에 배치할 수
있습니다.
- 포크
- 파일 디스크립터 및 소켓이 하위 프로세스에서 중복되기 때문에 플러그인 라이브러리는 분기되면 안됩니다. 이 경우 정지 및 올바르지 않은 동작을 유발할 수 있습니다. 특히 해당 파일에 열린 파일 디스크립터가 있을 때 하위가 분기되면 거짓 파일 잠금 충돌이 발생할 수 있습니다. 세마포어 같은 많은 다른 자원에 포크가 상속될 수 있습니다.