설치 매뉴얼
개요
Snowflake란?
- 클라우드 기반 데이터 플랫폼입니다.
- AWS, Azure, GCP 같은 퍼블릭 클라우드 위에서 동작하며, 대량 데이터 저장·분석에 적합합니다.
- 데이터베이스(DB), 웨어하우스(분석용 자원), 스키마(테이블/뷰가 들어 있는 공간) 개념을 가지고 있고, 보안 정책(네트워크 정책, 인증 방식)을 통해 접근을 제어합니다.
로그프레소 소나에서 Snowflake로 접속하려면 서비스 전용 사용자와 권한을 Snowflake에 구성해야 합니다.
실행 환경 준비
Snowsight (웹 UI)
-
https://app.snowflake.com/ 으로 접속해 로그인하세요.
-
메뉴에서 Projects > Worksheets로 이동하세요. 화면 우측 상단에서 + 또는 + > SQL Worksheet 버튼을 클릭하면 SQL 편집기 창이 열립니다.
-
여기서
CREATE USER ...
,GRANT ...
같은 SQL을 직접 입력하고 ▶ 버튼으로 실행할 수 있습니다. 2 개 이상의 SQL 문으로 작성된 스크립트는 Run All 버튼 또는 Ctrl + Shift + Enter 단축키로 실행해야 합니다.
SnowSQL (CLI)
-
SnowSQL 설치하기를 참고해 설치하세요.
-
터미널/명령 프롬프트에서 다음 명령으로 로그인하세요.
-
snowsql 프롬프트에서 SQL을 실행하세요.
Snowflake 설정
Snowflake에 접속해 접속 정보를 확인하고, 로그프레소 소나의 연결에 필요한 설정을 진행합니다. 아래 절차를 순서대로 실행하세요. SQL문을 예시와 함께 실행하는데 필요한 최소 권한(역할)을 "역할 생성 (SECURITYADMIN)"과 같은 형식으로 함께 표시했습니다. 모든 단계를 한 번에 실행하려면 ACCOUNTADMIN 권한으로 수행하세요. 운영 환경에서는 위 역할 분리를 권장합니다.
작업 | 실행 권한 |
---|---|
롤 생성, 롤 사용자 부여 | SECURITYADMIN |
사용자 생성, 사용자에 네트워크 정책 적용 | USERADMIN |
웨어하우스/DB/스키마 생성, 객체 권한 부여 | SYSADMIN |
네트워크 정책 생성, 계정 단위 적용 | ACCOUNTADMIN |
PAT 발급 | LOGPRESSO 본인 |
1. Snowflake 접속 정보 확인
Admin > Accounts 메뉴로 이동하여 ACCOUNT 이름 위에 마우스 커서를 올리면 접속 URL을 확인할 수 있습니다. 접속 도메인은 로그프레소 소나에서 접속 프로파일을 설정할 때 필요합니다.
2. 역할 생성 (SECURITYADMIN)
로그프레소 소나가 사용할 계정에 부여할 역할(ROLE)을 생성하세요. 여기서는 읽기 전용이라 가정하고 역할을 생성합니다.
3. 웨어하우스 생성 (SYSADMIN)
웨어하우스는 저장된 데이터를 읽고, 가공하고, 쿼리를 실행하는 연산 자원입니다. 운영환경에 적합한 웨어하우스의 크기는 웨어하우스의 개요 문서를 참고해 산정하세요.
CREATE WAREHOUSE IF NOT EXISTS SEC_WH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED = TRUE;
- Snowflake에서 저장소(Storage)와 연산(Compute)은 각각 분리된 구조입니다. 저장소는 공용 데이터 레이크처럼 모든 계정이 공유하지만, 연산 자원을 "웨어하우스"라는 단위로 예약/관리하도록 구성되어 있습니다.
4. 데이터베이스 및 스키마 생성 (SYSADMIN)
CREATE DATABASE IF NOT EXISTS SECOPS_DB;
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SIEM_LOGS;
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SOAR_INCIDENTS;
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SOAR_PLAYBOOKS;
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SOAR_ENRICH;
5. 사용자 생성 (USERADMIN)
CREATE USER LOGPRESSO
PASSWORD = 'TempPassw0rd!' -- 이 암호는 잘 알려진 암호이므로 운영 환경에서 사용하지 마세요.
DEFAULT_ROLE = LOGPRESSO_READONLY_ROLE
DEFAULT_WAREHOUSE = SEC_WH
DEFAULT_NAMESPACE = SECOPS_DB.SIEM_LOGS
MUST_CHANGE_PASSWORD = FALSE;
6. 역할을 사용자에 부여 (SECURITYADMIN)
7. 역할에 최소 권한 부여 (SYSADMIN)
GRANT USAGE ON WAREHOUSE SEC_WH TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON DATABASE SECOPS_DB TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON SCHEMA SECOPS_DB.SOAR_ENRICH TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SOAR_ENRICH TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SOAR_ENRICH TO ROLE LOGPRESSO_READONLY_ROLE;
8. 네트워크 정책 생성 및 적용
- 정책 생성 (ACCOUNTADMIN)
-- SONAR_PUBLIC_IP: 203.0.113.10/32
-- PAT를 사용하는 경우, 네트워크 정책은 강제사항
-- PAT대신 암호를 사용하더라도 네트워크 정책을 적용을 권장합니다.
CREATE NETWORK POLICY IF NOT EXISTS SONAR_NP
ALLOWED_IP_LIST = ('203.0.113.10/32');
PAT대신 암호를 사용하더라도 네트워크 정책을 적용하는 편이 안전합니다.
- 사용자에 정책 적용 (USERADMIN)
9. PAT 발급 (LOGPRESSO 계정으로 실행)
반환된 토큰 문자열은 접속 프로파일 설정에서 암호로 사용됩니다.
10. SQL 스크립트 샘플
지금까지 설명한 내용을 담은 SQL 스크립트는 아래와 같습니다.
-- =========================================================
-- 샘플 환경
-- ACCOUNT : acme1234.ap-northeast-2
-- WAREHOUSE : SEC_WH
-- DB : SECOPS_DB
-- SCHEMA (SIEM) : SIEM_LOGS
-- SCHEMA (SOAR) : SOAR_INCIDENTS, SOAR_PLAYBOOKS, SOAR_ENRICH
-- ROLE : LOGPRESSO_READONLY_ROLE
-- USER : LOGPRESSO
-- TEMP_PASSWORD : TempPassw0rd!
-- SONAR_PUBLIC_IP: 203.0.113.10/32
-- OAUTH_INTEGRATION_NAME : SONAR_OAUTH_INT
-- =========================================================
-- 1. ROLE
CREATE ROLE IF NOT EXISTS LOGPRESSO_READONLY_ROLE;
-- 2. WAREHOUSE
CREATE WAREHOUSE IF NOT EXISTS SEC_WH
WAREHOUSE_SIZE = XSMALL
AUTO_SUSPEND = 60
AUTO_RESUME = TRUE
INITIALLY_SUSPENDED = TRUE;
-- 3. DB/SCHEMA (SIEM + SOAR)
CREATE DATABASE IF NOT EXISTS SECOPS_DB;
-- SIEM 로그 스키마
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SIEM_LOGS;
-- SOAR 스키마 (인시던트, 플레이북)
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SOAR_INCIDENTS;
CREATE SCHEMA IF NOT EXISTS SECOPS_DB.SOAR_PLAYBOOKS;
-- 4. USER (암호는 예시일 뿐이며, 사용하지 마세요.)
CREATE USER IF NOT EXISTS LOGPRESSO
PASSWORD = 'TempPassw0rd!'
DEFAULT_ROLE = LOGPRESSO_READONLY_ROLE
DEFAULT_WAREHOUSE = SEC_WH
DEFAULT_NAMESPACE = SECOPS_DB.SIEM_LOGS
MUST_CHANGE_PASSWORD = FALSE;
-- 5. ROLE 부여
GRANT ROLE LOGPRESSO_READONLY_ROLE TO USER LOGPRESSO;
-- 6. 최소 권한 (SIEM + SOAR 읽기 전용)
GRANT USAGE ON WAREHOUSE SEC_WH TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON DATABASE SECOPS_DB TO ROLE LOGPRESSO_READONLY_ROLE;
-- SIEM (스키마는 실제 환경에 맞도록 구성해서 사용)
GRANT USAGE ON SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SIEM_LOGS TO ROLE LOGPRESSO_READONLY_ROLE;
-- SOAR
GRANT USAGE ON SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT USAGE ON SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SOAR_INCIDENTS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA SECOPS_DB.SOAR_PLAYBOOKS TO ROLE LOGPRESSO_READONLY_ROLE;
-- 7. 네트워크 정책 (PAT 사용자 권장)
CREATE NETWORK POLICY IF NOT EXISTS SONAR_NP
-- RFC 5737 문서 예시 대역(203.0.113.0/24). 운영 환경에서 사용하는 소나의 IP 주소로 교체하세요.
ALLOWED_IP_LIST = ('203.0.113.10/32');
ALTER USER LOGPRESSO SET NETWORK_POLICY = SONAR_NP;
예시로 설명한 SQL문을 ▶ > Run All 버튼을 클릭해 실행한 뒤 다음과 같이 Statement executed successfully 메시지가 나타나면 정상적으로 쿼리문이 실행되었음을 의미합니다.
아래 SQL문은 LOGPRESSO 계정으로 실행해야 합니다.
-- 8. PAT 발급 (LOGPRESSO 세션에서 실행하세요)
SELECT SYSTEM$GENERATE_ACCESS_TOKEN('SONAR_OAUTH_INT');
-- 실행 결과로 반환되는 토큰 문자열(JWT)을 접속 프로파일 설정 중 암호 입력란에 사용하세요.
로그프레소 접속 프로파일 설정
이 문서를 참고해 접속 프로파일을 추가하세요.
다음은 접속 프로파일 설정 중 필수 입력 항목입니다.
-
이름: 접속 프로파일을 식별할 고유한 이름
-
식별자: 로그프레소 쿼리 등에서 사용할 접속 프로파일의 고유 식별자
-
유형: 데이터베이스 선택
-
데이터베이스 유형: 사용자 정의
-
접속 문자열
- 암호에 계정 암호를 사용할 때:
jdbc:snowflake://ACCOUNT.snowflakecomputing.com/?db=DB&schema=SCHEMA&warehouse=WH
- 암호에 PAT를 사용할 때:
jdbc:snowflake://ACCOUNT.snowflakecomputing.com/?db=DB&schema=SCHEMA&warehouse=WH&authenticator=oauth
- JDBC 드라이버 구성하기 문서 참조
- ACCOUNT: 이전 단계에서 확인한 URL의 서브도메인을 입력
- DB: 기본 데이터베이스
- SCHEMA: 스키마
- WH: 웨어하우스
- 암호에 계정 암호를 사용할 때:
-
계정: Admin > Users & Roles 메뉴에서 확인할 수 있는 사용자 이름
-
암호: 사용자 암호 또는 PAT(Programmatic Access Token) 사용. PAT 사용 시 네트워크 정책 활성화가 필요합니다.
필요한 스키마에 따라 접속 프로파일을 여러 개 추가하세요.