UDF 및 프로시저의 보안 모범 사례¶
이 항목에서는 보안 사용자 정의 함수(UDF) 및 프로시저를 작성하는 모범 사례를 설명합니다.
이 항목의 내용:
UDF 처리기의 모범 사례¶
함수 또는 메서드(및 호출하는 모든 라이브러리 함수 또는 메서드)는 순수 함수로 작동해야 하며, 수신한 데이터에 대해서만 작동하고 해당 데이터를 기반으로 값을 반환해야 하며, 이 과정에서 부작용 없이 작동해야 합니다. 코드는 적절한 양의 메모리와 프로세서 시간을 사용하는 것 외에는 기본 시스템의 상태에 영향을 미치려고 해서는 안 됩니다.
프로시저 및 UDF 처리기의 모범 사례¶
처리기 코드는 제한된 엔진 내에서 실행됩니다. 코드 또는 사용하는 라이브러리 메서드의 코드는 다음을 포함하여 금지된 시스템 호출을 사용해서는 안 됩니다.
프로세스 제어. 예를 들어, 프로세스를 포크할 수 없습니다. (단, 여러 스레드는 사용할 수 있습니다.)
처리기가 실행 중인 파일 시스템에 대한 액세스.
다음 예외를 제외하고 처리기는 파일을 읽거나 쓰지 않아야 합니다.
처리기는 IMPORTS 절에 지정된 스테이징된 파일을 읽을 수 있습니다. 자세한 내용은 CREATE FUNCTION 또는 CREATE PROCEDURE 섹션을 참조하십시오.
처리기는 로그 파일과 같은 파일을
/tmp
디렉터리에 쓸 수 있습니다.각 쿼리는 고유한
/tmp
가 저장되는 자체 메모리 지원 파일 시스템을 가져오므로 서로 다른 쿼리에는 파일 이름 충돌이 있을 수 없습니다.그러나 단일 쿼리가 둘 이상의 UDF를 호출하고 이러한 UDF가 동일 파일 이름에 쓰려고 하면 쿼리 내 충돌이 발생할 수 있습니다.
참고
또한 Python UDF는 별개의 작업자 프로세스에서 병렬로 실행될 수 있으므로 /tmp 디렉터리에 쓸 때 주의해야 합니다.
파일 쓰기에 대한 자세한 내용은 파일 쓰기 섹션을 참조하십시오. 예를 보려면 스테이징된 파일의 압축 풀기 를 참조하십시오.
네트워크 액세스.
처리기를 사용하여 소켓을 만들 수는 없지만 외부 네트워크의 리소스에 액세스 할 수 있습니다.
참고
Snowflake JDBC 드라이버의 코드를 사용하여 데이터베이스에 액세스할 수 없습니다. UDF 자체는 Snowflake의 클라이언트 역할을 할 수 없습니다.
Java 또는 Scala로 작성된 처리기의 경우¶
JNI(Java 네이티브 인터페이스) 사용은 지원되지 않습니다. Snowflake는 (Java 바이트 코드와는 대조적으로) 네이티브 코드가 포함된 라이브러리를 로딩하는 것을 금지합니다.
정부 리전 내에서 사용 시, Java UDF는 연방 정보 처리 표준(140-2)(FIPS 140-2) 요구 사항을 충족하는 것으로 검증된 암호화 알고리즘을 지원합니다. Java용 BouncyCastle 암호화 API의 FIPS 승인 모드에서 허용되는 암호화 알고리즘만 사용할 수 있습니다. FIPS 140-2에 대한 자세한 내용은 FIPS 140-2 를 참조하십시오.