패키지 정책

소개

패키지 정책을 사용하면 계정 수준에서 Anaconda의 서드 파티 Python 패키지에 대한 허용 목록과 차단 목록을 설정할 수 있습니다. 이를 통해 보다 엄격한 감사 및 보안 요구 사항을 충족할 수 있으며 환경에서 사용 가능하거나 차단되는 패키지를 더욱 세밀하게 제어할 수 있습니다.

Snowpark Python을 사용하여 Anaconda에서 서드 파티 패키지를 가져오는 방법에 대한 자세한 내용은 서드 파티 패키지 사용하기 섹션을 참조하십시오.

Python UDF, UDTF 또는 저장 프로시저를 생성하면 Python 환경을 생성할 때 허용 목록과 차단 목록을 고려하게 됩니다. 허용 목록과 차단 목록은 Python 환경을 생성하는 데 필요한 모든 패키지에 적용됩니다. 지정된 패키지로 환경을 생성할 수 없으면 쿼리가 실패합니다.

Python UDF, UDTF 또는 저장 프로시저를 실행하면 Snowflake가 허용 목록과 차단 목록을 확인하고 모든 패키지가 패키지 정책에 따라 허용되도록 합니다. 그렇지 않으면 쿼리가 실패합니다.

제한 사항

  • 패키지 정책은 Anaconda 약관을 수락한 경우에만 적용됩니다.

  • 패키지 정책은 기본 제공 함수에는 적용되지 않으며 네이티브 앱에도 적용되지 않습니다.

패키지 정책 구현 및 사용하기

패키지 정책 오브젝트를 생성하려면 다음 권한이 있어야 합니다.

  • 패키지 정책을 만들려는 데이터베이스와 스키마에 대한 USAGE 권한.

  • 패키지 정책을 만들려는 스키마에 대한 CREATE PACKAGES POLICY 권한.

패키지 정책 오브젝트가 생성된 후 이를 계정에 적용하려면 다음 권한이 있어야 합니다.

  • 패키지 정책 오브젝트에 대한 OWNERSHIP 권한.

  • 계정에 대한 APPLY PACKAGES POLICY 권한

패키지 정책을 구현하려면 다음 단계를 따르십시오.

1단계: 패키지 정책 관리자 사용자 지정 역할 만들기

사용자가 패키지 정책을 만들고 관리할 수 있는 사용자 지정 역할을 만듭니다. 이 항목 전체에서 예시로 드는 사용자 지정 역할에 알맞은 이름을 지정할 수도 있겠지만, 여기서는 policy_admin 이라고 합니다.

사용자 지정 역할이 이미 있는 경우 다음 단계로 계속 진행하십시오.

그렇지 않으면, policy_admin 사용자 지정 역할을 만드십시오.

use role useradmin;

create role policy_admin;
Copy

2단계: policy_admin 사용자 지정 역할에 권한 부여

policy_admin 사용자 지정 역할에 아직 다음 권한이 없는 경우, 아래에 나타낸 것처럼 권한을 부여합니다.

  • 패키지 정책이 포함될 데이터베이스와 스키마에 대한 USAGE 권한.

  • 패키지 정책이 포함될 스키마에 대한 CREATE PACKAGES POLICY 권한.

  • 계정에 대한 APPLY PACKAGES POLICY 권한

use role securityadmin;

grant usage on database yourdb to role policy_admin;

grant usage, create packages policy on schema yourdb.yourschema to role policy_admin;

grant apply packages policy on account to role policy_admin;
Copy

3단계: 새 패키지 정책 만들기

policy_admin 사용자 지정 역할을 사용하여 언어, 허용 목록, 차단 목록이 지정된 새 패키지 정책을 만듭니다. ALLOWLIST, BLOCKLIST, ADDITIONAL_CREATION_BLOCKLIST, COMMENT는 선택적 매개 변수입니다. 기본적으로, 허용 목록 값은 ('*') 이고 차단 목록 값은 () 입니다.

허용 목록과 차단 목록에서 모두 패키지가 지정된 경우 차단 목록이 우선합니다. Python 런타임 버전을 허용 목록에 명시적으로 추가해야 하며 모든 패키지와 상위 패키지의 기본 종속 항목도 허용 목록에 명시적으로 추가해야 합니다.

허용 목록 또는 차단 목록에서 ==, <=, >=, < 또는 > 와 같은 버전 지정자를 사용하여 특정 패키지 버전이나 버전 범위를 지정할 수 있습니다. 예: numpy>=1.2.3. numpy 1.2의 마이크로 버전을 의미하는 numpy==1.2.* 와 같은 와일드카드를 사용할 수 있습니다.

참고

현재, 허용 목록 또는 차단 목록에서는 패키지당 하나의 범위 연산자만 지정할 수 있습니다. 여러 범위 연산자를 지정할 수는 없습니다(예: pkg>1.0, <1.5). 이런 이유로, 패키지 버전의 간격을 허용하도록 정책을 구성하려면 허용 목록에 범위의 한쪽을 설정하고 차단 목록에 범위의 다른 쪽을 설정하십시오. 예를 들어 1.0보다는 크고 1.5보다는 작은 패키지 버전을 허용하려면 허용 목록을 pkg>1.0 으로 설정하고 차단 목록을 pkg>1.5 로 설정하십시오.

USE ROLE policy_admin;

CREATE PACKAGES POLICY yourdb.yourschema.packages_policy_prod_1
  LANGUAGE PYTHON
  ALLOWLIST = ('numpy', 'pandas==1.2.3', ...)
  BLOCKLIST = ('numpy==1.2.3', 'bad_package', ...)
  ADDITIONAL_CREATION_BLOCKLIST = ('bad_package2', 'bad_package3', ...)
  COMMENT = 'Packages policy for the prod_1 environment'
;
Copy

여기서

yourdb.yourschema.packages_policy_prod_1

패키지 정책의 정규화된 이름입니다.

LANGUAGE PYTHON

이 패키지 정책이 적용될 언어입니다.

ALLOWLIST = ('numpy', 'pandas==1.2.3', ...)

이 패키지 정책의 허용 목록입니다. 패키지 사양이 포함된 쉼표로 구분된 문자열입니다.

BLOCKLIST = ('numpy==1.2.3', 'bad_package', ...)

이 패키지 정책의 차단 목록입니다. 패키지 사양이 포함된 쉼표로 구분된 문자열입니다.

ADDITIONAL_CREATION_BLOCKLIST = ('bad_package2', 'bad_package3', ...)

생성 시간에 차단된 패키지 사양 목록을 지정합니다. 이 매개 변수를 설정 해제하려면 빈 목록을 지정합니다. ADDITIONAL_CREATION_BLOCKLIST 가 설정된 경우 생성 시간에 기본 BLOCKLIST에 추가됩니다. 임시 UDF 및 익명 저장 프로시저의 경우 생성 및 실행 시간에 모두 ADDITIONAL_CREATION_BLOCKLISTBLOCKLIST 에 추가됩니다.

COMMENT = 'Packages policy for the prod_1 environment'

패키지 정책의 목적을 지정하는 주석입니다.

위의 예에서, 생성 시간 동안 적용되는 차단 목록은 ADDITIONAL_CREATION_BLOCKLISTBLOCKLIST 를 더한 것이므로, 차단된 패키지는 numpy==1.2.3, bad_package, bad_package2, bad_package3 이 됩니다. 실행에 적용되는 차단 목록은 numpy==1.2.3bad_package 가 됩니다. 임시 UDF 및 익명 저장 프로시저의 경우 numpy==1.2.3, bad_package, bad_package2, bad_package3 이 포함된 차단 목록이 생성 시간과 실행 시간에 모두 적용됩니다.

Python 패키지의 종속성 목록을 가져오려면 SHOW_PYTHON_PACKAGES_DEPENDENCIES 함수를 사용하십시오. 첫 번째 매개 변수는 사용 중인 Python 런타임 버전이고 두 번째 매개 변수는 종속성을 표시할 패키지의 목록입니다. 예를 들어, numpy 패키지의 종속성을 표시하려면 이 명령을 사용하십시오.

USE ROLE ACCOUNTADMIN;

select SNOWFLAKE.SNOWPARK.SHOW_PYTHON_PACKAGES_DEPENDENCIES('3.8', ['numpy']);
Copy

결과는 종속성 및 해당 버전의 목록입니다.

['_libgcc_mutex==0.1', '_openmp_mutex==5.1', 'blas==1.0', 'ca-certificates==2023.05.30', 'intel-openmp==2021.4.0',
'ld_impl_linux-64==2.38', 'ld_impl_linux-aarch64==2.38', 'libffi==3.4.4', 'libgcc-ng==11.2.0', 'libgfortran-ng==11.2.0',
'libgfortran5==11.2.0', 'libgomp==11.2.0', 'libopenblas==0.3.21', 'libstdcxx-ng==11.2.0', 'mkl-service==2.4.0',
'mkl==2021.4.0', 'mkl_fft==1.3.1', 'mkl_random==1.2.2', 'ncurses==6.4', 'numpy-base==1.24.3', 'numpy==1.24.3',
'openssl==3.0.10', 'python==3.8.16', 'readline==8.2', 'six==1.16.0', 'sqlite==3.41.2', 'tk==8.6.12', 'xz==5.4.2', 'zlib==1.2.13']

Snowpark 환경 내에서 Python 3.8의 종속성을 표시하려면 패키지를 지정하지 않은 상태로 함수를 호출하십시오.

select SNOWFLAKE.SNOWPARK.SHOW_PYTHON_PACKAGES_DEPENDENCIES('3.8', []);
Copy

함수가 사용 중인 패키지를 알고 싶으면 DESCRIBE FUNCTION 을 사용하여 인쇄할 수 있습니다. 이는 패키지의 모든 종속성을 식별하는 다른 방법입니다. 이를 수행하려면 함수를 생성하고 패키지 사양에서 최상위 패키지를 제공하십시오. 다음으로, DESCRIBE FUNCTION을 사용하여 모든 패키지와 해당 종속성 목록을 가져오십시오. 이 목록을 복사하여 패키지 허용 목록에 붙여넣을 수 있습니다. 패키지 정책을 일시적으로 설정 해제해야 하며, 그렇지 않으면 일부 패키지가 차단될 수 있습니다. 다음 예에서는 ‘snowflake-snowpark-python’ 패키지에 대한 종속성을 찾는 방법을 보여줍니다.

create or replace function my_udf()
returns string
language python
packages=('snowflake-snowpark-python')
runtime_version=3.10
handler='echo'
as $$
def echo():
  return 'hi'
$$;

describe function my_udf();
Copy

사용 가능한 모든 패키지와 버전을 표시하려면 INFORMATION_SCHEMA.PACKAGES 뷰를 쿼리하십시오.

select * from information_schema.packages;
Copy

현재 사용 중인 패키지 세트를 보려면 이 SQL 문을 사용하면 됩니다.

-- at the database level

CREATE OR REPLACE VIEW USED_ANACONDA_PACKAGES
ASSELECT FUNCTION_NAME, VALUE PACKAGE_NAME
FROM (SELECT FUNCTION_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM INFORMATION_SCHEMA.FUNCTIONS
WHERE FUNCTION_LANGUAGE='PYTHON') USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES);

-- at the account level

CREATE OR REPLACE VIEW ACCOUNT_USED_ANACONDA_PACKAGES
ASSELECT  FUNCTION_CATALOG, FUNCTION_SCHEMA, FUNCTION_NAME, VALUE PACKAGE_NAME
FROM (SELECT FUNCTION_CATALOG, FUNCTION_SCHEMA, FUNCTION_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM SNOWFLAKE.ACCOUNT_USAGE.FUNCTIONS
WHERE FUNCTION_LANGUAGE='PYTHON') USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES);
Copy

4단계: 계정에 패키지 정책 설정

policy_admin 사용자 지정 역할을 사용하여 ALTER ACCOUNT 명령으로 계정에 대한 정책을 설정합니다.

use role policy_admin;

alter account set packages policy yourdb.yourschema.packages_policy_prod_1;
Copy

참고

계정에 대해 이미 설정된 패키지 정책을 바꾸려면 먼저 패키지 정책을 설정 해제한 다음, 계정에 대한 새 패키지 정책을 설정하십시오. 또는 패키지 정책을 설정 해제하지 않고도 FORCE를 사용하여 패키지 정책을 설정할 수 있습니다. 예:

alter account set packages policy yourdb.yourschema.packages_policy_prod_2 force;
Copy

계정에서 활성화된 정책을 확인하려면 이 SQL 문을 사용하면 됩니다.

select * from table(information_schema.policy_references(ref_entity_domain=>'ACCOUNT', ref_entity_name=>'<your_account_name>'))
Copy

이 쿼리의 결과에는 이름이 POLICY_STATUS 인 열이 표시됩니다.

나중에 계정에서 패키지 정책을 설정 해제하려면 이 SQL 문을 사용하십시오.

alter account unset packages policy;
Copy

DDL 명령 실행에 필요한 권한

다음 테이블은 패키지 정책 DDL 작업과 필요한 권한 사이의 관계를 요약하여 제공합니다.

작업

필요한 권한

패키지 정책 생성

스키마에 대한 CREATE PACKAGES POLICY 권한을 보유한 역할.

패키지 정책 변경

패키지 정책에 대한 OWNERSHIP 권한이 있는 역할.

패키지 정책 삭제

패키지 정책에 대한 OWNERSHIP 권한이 있는 역할.

패키지 정책 설명

패키지 정책에 대한 OWNERSHIP 또는 USAGE 권한이 있는 역할.

패키지 정책 표시

패키지 정책에 대한 OWNERSHIP 또는 USAGE 권한이 있는 역할.

패키지 정책 설정 및 설정 해제

계정에 대한 APPLY PACKAGES POLICY 권한과 패키지 정책에 대한 OWNERSHIP 권한이 있는 역할.

패키지 정책 DDL

Snowflake는 패키지 정책 오브젝트를 관리하기 위해 다음 DDL 명령을 제공합니다.

패키지 정책 가시성

계정에 설정된 패키지 정책에 대한 액세스 권한이 없는 사용자라도 그 내용은 볼 수 있습니다.

사용자는 패키지 정책에 USAGE 권한을 추가하여 패키지 정책의 내용을 볼 수 있는 자를 한정하고 관리할 수 있습니다. 계정 관리자 또는 패키지 정책 소유자는 패키지 정책을 사용해야 하는 역할에 이 권한을 부여할 수 있습니다.

CURRENT_PACKAGES_POLICY Information Schema 뷰에는 현재 계정에서 각 Snowpark 패키지 정책에 대한 행이 표시됩니다.

select * from information_schema.current_packages_policy;
Copy
+------+----------+-----------+-----------+-------------------------------+---------+
| NAME | LANGUAGE | ALLOWLIST | BLOCKLIST | ADDITIONAL_CREATION_BLOCKLIST | COMMENT |
+------+----------+-----------+-----------+-------------------------------+---------+
| P1   | PYTHON   | ['*']     | []        | [NULL]                        | [NULL]  |
+------+----------+-----------+-----------+-------------------------------+---------+

함수에 대해 데이터베이스 수준에서 사용되는 Anaconda 패키지를 보려면 이 SQL 문을 사용하십시오.

USE DATABASE mydb;

CREATE OR REPLACE VIEW USED_ANACONDA_PACKAGES
AS
SELECT FUNCTION_NAME, VALUE PACKAGE_NAME
FROM (SELECT FUNCTION_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM INFORMATION_SCHEMA.FUNCTIONS
WHERE FUNCTION_LANGUAGE='PYTHON') USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES);
Copy

함수에 대해 계정 수준에서 사용되는 Anaconda 패키지를 보려면 이 SQL 문을 사용하십시오.

USE DATABASE mydb;

CREATE OR REPLACE VIEW ACCOUNT_USED_ANACONDA_PACKAGES
AS
SELECT  FUNCTION_CATALOG, FUNCTION_SCHEMA, FUNCTION_NAME, VALUE PACKAGE_NAME
FROM (SELECT FUNCTION_CATALOG, FUNCTION_SCHEMA, FUNCTION_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM SNOWFLAKE.ACCOUNT_USAGE.FUNCTIONS
WHERE FUNCTION_LANGUAGE='PYTHON') USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES);
Copy

계정에 설치된 모든 Anaconda 패키지를 보려면 이 SQL 문을 사용하십시오.

USE DATABASE mydb;

CREATE OR REPLACE VIEW ACCOUNT_USED_ANACONDA_PACKAGES
AS
SELECT 'FUNCTION' TYPE, FUNCTION_CATALOG DATABASE, FUNCTION_SCHEMA SCHEMA, FUNCTION_NAME NAME, VALUE::STRING PACKAGE_NAME
FROM (SELECT FUNCTION_CATALOG, FUNCTION_SCHEMA, FUNCTION_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM SNOWFLAKE.ACCOUNT_USAGE.FUNCTIONS
WHERE FUNCTION_LANGUAGE='PYTHON' AND PACKAGES IS NOT NULL) USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES)
UNION
(SELECT 'PROCEDURE' TYPE, PROCEDURE_CATALOG DATABASE, PROCEDURE_SCHEMA SCHEMA, PROCEDURE_NAME, VALUE::STRING PACKAGE_NAME
FROM (SELECT PROCEDURE_CATALOG, PROCEDURE_SCHEMA,PROCEDURE_NAME,PARSE_JSON(PACKAGES)
PACKAGES FROM SNOWFLAKE.ACCOUNT_USAGE.PROCEDURES
WHERE PROCEDURE_LANGUAGE='PYTHON' AND PACKAGES IS NOT NULL) USED_PACKAGES,LATERAL FLATTEN(USED_PACKAGES.PACKAGES));
Copy

복제 및 패키지 정책

패키지 정책이 포함된 데이터베이스가 복제된 경우 패키지 정책은 원본 계정에서 대상 계정으로 복제됩니다. 자세한 내용은 허상 참조 및 패키지 정책 섹션을 참조하십시오.