Streamlit in Snowflake 에 대한 보안 개요

이 항목에서는 Snowflake 계정에서 Streamlit in Snowflake 를 관리하는 시스템 관리자를 위한 보안 개요를 제공합니다. 보안 모델을 이해하고 적절한 제어를 구현하면 관리자가 민감한 데이터와 리소스에 대한 거버넌스를 유지하는 동안 개발자가 안전한 애플리케이션을 구축할 수 있습니다.

보안 모델

Streamlit in Snowflake 는 인증, 역할 기반 액세스 제어, 네트워크 정책, 데이터 거버넌스 기능을 포함하는 Snowflake의 포괄적인 보안 모델을 따릅니다. 앱은 기존 보안 인프라와 통합되는 일급 Snowflake 오브젝트입니다.

소유자 권한 실행

기본적으로, Streamlit 앱은 저장 프로시저와 유사하게 소유자 권한으로 실행됩니다. 이로 인해 다음과 같은 결과가 발생합니다.

  • 앱은 뷰어가 아닌 앱 소유자의 권한을 사용하여 쿼리를 실행합니다.

  • 앱 소유자의 역할에 따라 앱이 액세스할 수 있는 데이터와 작업이 결정됩니다.

  • 뷰어는 기본 테이블이나 뷰에 직접 액세스할 필요 없이 앱과 상호 작용할 수 있습니다.

이 모델을 사용하면 서비스 계정 토큰이 필요하지 않으며 Snowflake의 인증 및 액세스 제어 기능과 원활하게 통합됩니다. 자세한 내용은 소유자 권리 및 Streamlit in Snowflake 앱 이해하기 섹션을 참조하십시오.

공동 책임 모델

보안 책임은 Snowflake, 계정 관리자, 앱 개발자 간에 공유됩니다.

  • Snowflake는 보안 플랫폼, 인증, 암호화 및 보안 기능을 제공합니다.

  • 관리자는 계정 수준 보안 정책을 구성하고, 역할과 권한을 관리하며, 앱 사용을 감사합니다.

  • 앱 개발자는 보안 코드를 작성하고, 시크릿을 올바르게 처리하며, 보안 모범 사례를 따릅니다.

Snowflake의 보안 모델에 대한 자세한 내용은 `Snowflake의 공동 책임 모델<https://www.snowflake.com/en/resources/report/snowflake-shared-responsibility-model/>`_을 참조하세요.

콘텐츠 보안 정책

모든 Streamlit 앱은 로드할 수 있는 리소스를 제한하는 `콘텐츠 보안 정책<https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP>`_(CSP) 내에서 실행됩니다. 이 정책은 사이트 간 스크립팅(XSS) 및 기타 코드 삽입 공격에 대해 심층적인 방어를 제공합니다. 현재 CSP는 구성할 수 없습니다.

CSP는 다음 외부 리소스를 차단합니다.

  • 외부 도메인에서 코드(스크립트, 스타일, 글꼴) 로드하기

  • 외부 도메인의 iframe에 앱 임베딩하기

CSP는 다음과 같은 외부 리소스를 허용합니다.

  • HTTPS 소스의 이미지 및 미디어: 앱은 외부 호스팅 서비스 및 이미지를 반환하는 APIs를 포함하여 모든 HTTPS URL에서 이미지와 미디어 파일을 로드할 수 있습니다. 이를 위해서는 외부 액세스 통합이 필요하지 않습니다.

  • 데이터 URIs 및 blob URLs: 앱은 이미지 및 미디어에 대해 포함된 데이터(데이터 URIs) 및 동적으로 생성된 콘텐츠(blob URLs)를 사용할 수 있습니다. 이는 차트, 다이어그램 또는 사용자 업로드 콘텐츠 표시와 같은 기능을 지원합니다.

  • Mapbox 및 Carto 리소스: Mapbox 및 Carto의 제한된 리소스 하위 세트는 매핑 시각화를 지원하도록 허용됩니다.

참고

  • 종속성을 관리하기 위해 conda를 사용하는 Warehouse Runtime의 경우, Mapbox를 사용하려면 Anaconda 약관에 동의해야 합니다. 자세한 내용은 Anaconda의 서드 파티 패키지 사용하기 섹션을 참조하십시오.

  • 외부 도메인에서의 이미지 또는 미디어 로드는 Streamlit in Snowflake 에서는 지원되지만, Snowflake Native App Framework 에서는 지원되지 않습니다.

  • CSP는 eval() 와 같이 일반적으로 안전하지 않은 것으로 간주되는 프런트엔드 호출도 차단합니다.

이 제한적인 정책은 외부 스크립트를 사용하는 대부분의 서드 파티 JavaScript 라이브러리 및 사용자 지정 구성 요소가 Streamlit 앱에서 작동하지 않음을 의미합니다. CSP 제한 사항에 대한 자세한 내용은 Streamlit in Snowflake 에서 외부 리소스를 로드할 때의 제한 사항 섹션을 참조하세요.

필수 보안 설정

다음 보안 구성은 안전하고 원활하게 작동하는 Streamlit in Snowflake 환경에 필수적입니다.

네트워크 액세스 구성

앱이 Snowflake와 통신할 수 있도록 네트워크 액세스를 구성합니다.

모든 배포의 경우:

  • ``*.snowflake.app``을 네트워크 허용 목록에 추가하여 Streamlit 앱과 Snowflake 간의 통신을 활성화합니다.

  • 네트워크 구성에서 WebSockets가 차단되지 않는지 확인합니다.

자세한 내용은 You can’t load the Streamlit app 섹션을 참조하십시오.

비공개 연결의 경우:

조직에 비공개 연결이 필요한 경우 Snowflake 액세스 및 Streamlit 앱 액세스 모두를 위해 AWS PrivateLink, Azure Private Link 또는 Google Cloud Private Service Connect를 구성합니다. 자세한 내용은 Private connectivity for Streamlit in Snowflake 섹션을 참조하십시오.

역할 기반 액세스 제어

Streamlit 앱을 관리하기 위한 역할 계층 구조를 설정합니다.

권장되는 역할 구조:

  • 작성자 역할: 앱이 배포될 스키마에 대한 CREATE STREAMLIT 권한이 있는 역할입니다.

  • 뷰어 역할: 최종 사용자를 위한 앱에 대한 USAGE 권한이 있는 역할입니다.

다음 예제에서는 Streamlit 앱에 대한 역할 계층 구조를 만드는 방법을 보여줍니다.

-- Create dedicated roles for Streamlit
CREATE ROLE streamlit_developer;
CREATE ROLE streamlit_viewer;

-- Grant hierarchy
GRANT ROLE streamlit_viewer TO ROLE streamlit_developer;

-- Grant privileges for app creation
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_developer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT USAGE ON COMPUTE_POOL streamlit_compute_pool TO ROLE streamlit_developer;
GRANT USAGE ON INTEGRATION python_package_index TO ROLE streamlit_developer;

-- Grant privileges for app viewing
GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_viewer;
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_viewer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_viewer;
GRANT USAGE ON STREAMLIT streamlit_db.apps.my_app TO ROLE streamlit_viewer;
Copy

앱 개발자는 ``streamlit_wh``에 대한 USAGE 권한도 필요하지만, 이는 뷰어 역할에서 상속됩니다. 필요한 권한에 대한 자세한 내용은 Streamlit 앱 생성 및 사용에 필요한 권한 섹션을 참조하세요.

시크릿 관리

외부 서비스 또는 민감한 자격 증명에 액세스하는 앱에 대한 적절한 시크릿 관리를 구성합니다.

  1. 적절한 권한을 부여하여 앱에 대한 시크릿 액세스를 활성화합니다.

    -- Grant privileges on secrets to app owner role
    GRANT READ ON SECRET my_secret TO ROLE streamlit_developer;
    GRANT USAGE ON INTEGRATION my_external_access_integration TO ROLE streamlit_developer;
    
    Copy
  2. Container Runtime 앱의 경우 앱 코드에 시크릿을 포함하는 대신 시크릿 액세스를 래핑하는 SQL 함수를 생성합니다.

자세한 내용은 시크릿 관리 및 Streamlit 앱 구성하기 섹션을 참조하십시오.

컨텍스트 함수 및 행 수준 보안

앱이 컨텍스트 함수(예: CURRENT_USER())를 사용하거나 행 액세스 정책으로 테이블에 액세스하려면 앱 소유자 역할에 전역 READ SESSION 권한을 부여합니다.

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_developer;
Copy

참고

행 액세스 정책에서 ``CURRENT_ROLE()``을 사용하는 앱은 기본적으로 소유자의 권한으로 실행되므로 항상 뷰어의 역할이 아닌 앱 소유자의 역할을 반환합니다.

자세한 내용과 예는 Streamlit in Snowflake 의 행 액세스 정책 섹션을 참조하세요.

Container Runtime만 해당: 패키지 리포지토리 보안

Container Runtime에 대한 하나 이상의 패키지 인덱스를 구성합니다.

Container Runtime은 PyPI과 같은 외부 리포지토리에서 패키지를 설치할 수 있습니다. JFrog Artifactory와 같이 선별된 패키지 인덱스를 사용하여 패키지 소스를 제어하거나 기본 패키지 인덱스인 PyPI을 사용할 수 있습니다. 사용하는 패키지 인덱스에 관계없이 앱이 종속성을 설치할 수 있도록 외부 액세스 통합(EAI)을 생성해야 합니다.

선별된 패키지 인덱스를 사용하면 다음과 같은 이점이 있습니다.

  • 이를 통해 공급망 공격을 방지하고 패키지가 신뢰할 수 있는 출처에서 제공되도록 보장합니다.

  • 이를 통해 앱에서 사용할 수 있는 패키지와 버전을 제어할 수 있습니다.

  • 패키지 설치에 대한 감사 추적을 제공합니다.

자세한 내용은 Container Runtime에 대한 종속성 관리하기 섹션을 참조하십시오.

Warehouse Runtime만 해당: 외부 제공 서비스 약관

Warehouse Runtime은 conda를 사용하여 앱의 종속성을 관리합니다. 앱에서 Mapbox를 사용하려면 `외부 제공 서비스 약관<https://www.snowflake.com/legal/external-offering-terms/>`_에 동의해야 합니다.

이 패키지 사용에 대한 자세한 내용은 Anaconda의 서드 파티 패키지 사용하기 섹션을 참조하세요.

사용 가능한 보안 기능

앱 보안 및 거버넌스를 강화하기 위해 다음과 같은 보안 기능을 사용할 수 있습니다.

외부 액세스 통합

앱이 액세스할 수 있는 외부 네트워크 및 서비스를 제어합니다.

  • 허용되는 엔드포인트를 정의하는 네트워크 규칙을 만듭니다.

  • 네트워크 규칙 및 인증 시크릿을 참조하는 외부 액세스 통합을 만듭니다.

  • Streamlit 앱에 외부 액세스 통합을 할당합니다.

이를 통해 앱의 무단 아웃바운드 연결을 방지하고 외부 액세스에 대한 감사 추적을 제공합니다.

자세한 내용은 Streamlit in Snowflake 의 외부 네트워크 액세스 섹션을 참조하십시오.

Git 통합

버전 제어 및 변경 내용 추적을 위해 Streamlit 앱을 Git 리포지토리와 통합합니다.

  • Git 리포지토리 오브젝트(READ, WRITE 또는 OWNERSHIP)에 적절한 권한을 부여합니다.

  • Git 통합을 사용하여 코드 변경 사항의 감사 추적을 유지 관리합니다.

  • 프로덕션 앱에 변경 사항을 배포하기 전에 코드 검토 프로세스를 구현합니다.

자세한 내용은 Streamlit in Snowflake 앱을 Git 리포지토리와 동기화하기 섹션을 참조하십시오.

비공개 연결

네트워크 보안 요구 사항이 엄격한 조직의 경우 비공개 연결을 구성하여 모든 Streamlit 트래픽이 비공개 네트워크 내에 유지되도록 보장합니다. Streamlit in Snowflake 는 다음 비공개 연결 옵션을 지원합니다.

비공개 연결은 공용 인터넷에 대한 노출을 제거하고 추가적인 네트워크 격리를 제공합니다.

자세한 내용은 Private connectivity for Streamlit in Snowflake 섹션을 참조하십시오.

로깅 및 추적

Warehouse Runtime의 경우 로깅 및 추적을 활성화하여 앱 동작을 모니터링하고 문제를 해결합니다.

  1. 이벤트 테이블을 만들어 계정과 연결합니다.

  2. Streamlit 앱이 포함된 데이터베이스에 적절한 로그 및 추적 수준을 설정합니다.

  3. 보안 이벤트, 오류 및 비정상적인 동작에 대한 로그를 정기적으로 검토합니다.

Container Runtime에는 아직 로깅 및 추적이 지원되지 않습니다.

자세한 내용은 Streamlit in Snowflake 에 대한 로깅 및 추적 섹션을 참조하십시오.

관리자를 위한 모범 사례

다음 모범 사례는 안전한 Streamlit 환경을 유지하는 데 도움이 됩니다.

전용 역할 및 스키마 사용:

  • 개발, 테스트, 프로덕션 앱에 대해 별도의 스키마를 만듭니다.

  • 프로덕션 앱이 실수로 변경되는 것을 방지하려면 각 환경에 서로 다른 역할을 사용합니다.

  • 개별 사용자 계정이 아닌 서비스 역할에 프로덕션 앱 소유권을 부여합니다.

최소 권한 액세스 구현:

  • 각 역할에 필요한 최소한의 권한만 부여합니다.

  • 역할 구성원 자격 및 권한을 정기적으로 검토하고 감사합니다.

  • 절대적으로 필요한 경우를 제외하고 앱 소유자 역할에 ACCOUNTADMIN 또는 기타 강력한 역할을 부여하지 마세요.

앱 수명 주기 관리:

  • 앱 승인 및 배포 프로세스를 수립합니다.

  • 앱을 프로덕션으로 승격하기 전에 코드 검토를 요구합니다.

  • 민감한 데이터에 액세스하고 추가 조사가 필요한 앱을 문서화합니다.

  • 사용하지 않거나 더 이상 사용되지 않는 앱을 정기적으로 검토하고 제거합니다.

리소스 사용량 모니터링:

  • 앱 워크로드에 적합한 웨어하우스 크기를 설정합니다.

  • 컴퓨팅 비용을 모니터링하고 비정상적인 사용 패턴에 대한 경고를 설정합니다.

  • Container Runtime의 경우 적절한 MIN_NODES 및 MAX_NODES 설정으로 컴퓨팅 풀을 구성합니다.

  • 다양한 앱 환경에 대해 별도의 웨어하우스를 사용하여 비용과 리소스를 분리합니다.

리소스 관리에 대한 자세한 내용은 Streamlit in Snowflake 의 비용 관리Streamlit 앱을 위한 런타임 환경 섹션을 참조하세요.

보안 앱 개발 사례 사용:

  • 자격 증명 또는 API 키를 앱 코드에 직접 삽입하면 안 됩니다.

  • 민감한 정보를 저장하려면 Snowflake 시크릿을 사용합니다.

  • SQL 주입을 방지하기 위해 사용자 입력의 유효성을 검사하고 삭제합니다.

  • 앱을 통해 노출되는 데이터를 뷰어가 볼 필요가 있는 데이터로만 제한합니다.

  • 앱을 더 많은 대상 그룹과 공유하기 전에 철저히 테스트합니다.

소유자 권한 보안 고려 사항에 대한 자세한 내용은 소유자 권한과 앱 보안 섹션을 참조하세요.

정기적인 보안 감사 수행:

  • CREATE STREAMLIT 권한이 있는 역할을 검토합니다.

  • 어떤 앱이 어떤 데이터 소스에 액세스하는지 감사합니다.

  • 외부 액세스 통합 및 네트워크 규칙을 검토합니다.

  • 이전 직원이 소유한 앱이나 비활성 계정이 있는지 확인합니다.

  • Git 리포지토리 액세스 및 커밋 기록을 검토합니다.

다음 쿼리를 사용하여 Streamlit 앱을 감사합니다.

-- List all Streamlit apps and their owners
SHOW STREAMLITS;

-- Check privileges on a specific app
SHOW GRANTS ON STREAMLIT streamlit_db.apps.my_app;

-- List all roles with CREATE STREAMLIT privileges
SHOW GRANTS OF CREATE STREAMLIT;
Copy