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 를 참조하십시오.