# 고객 구성 Snowflake 통합 (레거시)

{% hint style="warning" %}
Panther는 새 계정에 대해 이 방법을 지원하지 않으며, 기존 고객을 다음 중 하나로 이전할 예정입니다. [지원되는 방법](/ko/system-configuration/panther-deployment-types/legacy-configurations/snowflake-setup.md) 향후.
{% endhint %}

## 개요

이 구성에서는 Panther가 접근 권한이 없으며, Panther를 대신하여 명령을 실행하려면 데이터베이스 관리자(DBA)가 필요합니다.

이 가이드는 이미 AWS에 Snowflake 인스턴스가 있다고 가정합니다.

이상적으로는 Panther 배포와 Snowflake 인스턴스가 동일한 AWS 리전에 있어야 합니다. Panther와 Snowflake를 같은 리전에 두면 쿼리 및 데이터 이동에 대한 지연 시간(리전 간 통신과 비교하여)이 줄어듭니다.

Panther는 Snowflake 인스턴스에 접근하기 위해 두 개의 Snowflake 사용자/역할을 사용합니다:

1. 쿼리를 위한 읽기 전용 사용자/역할
2. 새 로그 소스가 Panther에 등록될 때 테이블을 생성할 수 있도록 Panther 데이터베이스에만 엄격한 권한을 가진 관리자 사용자/역할.

Snowflake에서는 테이블 접근을 공유할 수 있습니다. 이를 통해 비즈니스 데이터와 보안 데이터를 Panther에서 쿼리할 수 있습니다(다음을 통해 `PANTHER_READ_ONLY` 역할).

자체 Snowflake 인스턴스를 관리하는 경우, Panther가 수집한 데이터로 테이블과 뷰를 생성할 수 있습니다. 이러한 사용자 정의 객체를 Panther 데이터베이스 안에 두지 마세요. 예상치 못한 테이블과 뷰는 오류를 유발합니다. 대신 Panther가 아닌 데이터베이스에 생성한 뒤 Panther와 공유하세요.

{% hint style="danger" %}
접두사로 사용자 또는 기타 데이터베이스 객체를 생성하지 마세요 `PANTHER_`.
{% endhint %}

## 기존 고객 관리형 Snowflake 통합을 구성하는 방법

#### 1. Panther에서 구성 정보 수집

1. Panther 콘솔에 로그인합니다.
2. 오른쪽 상단의 톱니바퀴 아이콘을 클릭합니다.
3. 드롭다운 메뉴에서 **일반**.

에서 다음 정보를 찾을 수 있습니다:

* Snowflake ReadOnly Lambda Role ARN
* Snowflake Admin Lambda Role ARN
* Lookup Tables Lambda Role ARN

<figure><img src="/files/06e2454a40c0f54c2fcf576860998144dba15153" alt="In the Panther Console, the General Settings page is open. The Snowflake Settings tab is selected. The screen shows a list of Snowflake configuration ARNs."><figcaption></figcaption></figure>

이 ARN들을 잘 보관해 두세요. 나중에 사용합니다.

#### 2. Snowflake에서 구성 정보 수집

Panther를 구성하려면 다음 항목을 가져와야 합니다. `SNOWFLAKE_IAM_USER` 를 Snowflake에서 가져와야 합니다.

Snowflake SQL 셸에서 아래 SQL을 실행하되, 다음을 바꿔서 사용하세요. `myaccountid` 를 AWS 계정 ID로, 그리고 `myaccountregion` 를 해당 계정의 리전으로 바꾸세요:

```sql
SELECT system$get_aws_sns_iam_policy('arn:aws:sns:myaccountregion:myaccountid:panther-processed-data-notifications');
```

다음과 유사한 응답이 표시되어야 합니다:

```javascript
{
 "Version":"2012-10-17",
 "Statement":[
  {
    "Sid":"1",
    "Effect":"Allow",
    "Principal":{
       "AWS":"arn:aws:iam::87654321XXXX:user/k7m2-s-v2st0722"
    },
    "Action":["sns:Subscribe"],
    "Resource":["arn:aws:sns:us-west-1:12345678XXXX:panther-processed-data-notifications"]
  }
 ]
}
```

위 예에서 `SNOWFLAKE_IAM_USER` 은(는) `AWS` 속성 `arn:aws:iam::87654321XXXX:user/k7m2-s-v2st0722`. 이 내용을 잘 보관하세요. 나중 단계에서 이것을 사용할 것입니다.

#### 3. Snowflake에서 Panther 데이터베이스를 생성합니다

Snowflake SQL 셸에서 실행하세요:

```sql
USE ROLE SYSADMIN;

---------------- 데이터베이스
CREATE database IF NOT EXISTS panther_logs;
CREATE database IF NOT EXISTS panther_룰_matches;
CREATE database IF NOT EXISTS panther_룰_errors;
CREATE database IF NOT EXISTS panther_cloudsecurity;
CREATE database IF NOT EXISTS panther_monitor;
CREATE database IF NOT EXISTS panther_views;
CREATE database IF NOT EXISTS panther_stored_procedures;
CREATE database IF NOT EXISTS panther_lookups;
CREATE database IF NOT EXISTS panther_signals;
```

#### 4. Snowflake에서 읽기 전용 역할과 관리 역할을 생성합니다

{% hint style="warning" %}
***1.18로 업그레이드하는 자체 호스팅 Snowflake 배포 고객의 경우***

Snowflake 데이터 클라우드를 사용하는 자체 호스팅 고객은 데이터베이스 관리자가 다음 권한 세트를 추가하거나, 최신 버전의 설정 지침을 반영하도록 자동화 스크립트를 업데이트해야 합니다:
{% endhint %}

```yaml
USE ROLE SECURITYADMIN;
GRANT CREATE STAGE, CREATE PIPE ON ALL SCHEMAS IN DATABASE PANTHER_MONITOR 
  TO ROLE panther_admin_role;
```

***참고***: 반드시 업데이트하세요 `<your warehouse>` 아래 SQL 블록 첫 줄의 값을 Panther가 사용하도록 원하는 Snowflake 웨어하우스 이름으로 설정하세요.

전용 Panther 웨어하우스(예: PANTHER\_WH)를 생성하는 것을 권장합니다. 그러면 비용을 쉽게 추적하고 다른 Snowflake 리소스와 독립적으로 용량을 조정할 수 있습니다.

Snowflake SQL 셸에서 실행하세요:

```sql
SET WAREHOUSE_NAME = '<your_warehouse>';
USE ROLE SECURITYADMIN;

--------------- panther_readonly_role 생성
CREATE ROLE IF NOT EXISTS panther_readonly_role;

---------------- panther_readonly_role에 대한 권한 부여

-- 웨어하우스
GRANT USAGE
  ON WAREHOUSE IDENTIFIER($WAREHOUSE_NAME)
  TO ROLE panther_readonly_role;

-- panther_logs
GRANT USAGE
  ON DATABASE panther_logs
  TO ROLE panther_readonly_role;
GRANT USAGE
  ON SCHEMA panther_logs.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON ALL TABLES IN SCHEMA panther_logs.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON ALL VIEWS IN SCHEMA panther_logs.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON FUTURE TABLES IN SCHEMA panther_logs.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON FUTURE VIEWS IN SCHEMA panther_logs.public
  TO ROLE panther_readonly_role;

-- panther_룰_matches
GRANT USAGE
  ON DATABASE panther_룰_matches
  TO ROLE panther_readonly_role;
GRANT USAGE
  ON SCHEMA panther_룰_matches.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON ALL TABLES IN SCHEMA panther_룰_matches.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON ALL VIEWS IN SCHEMA panther_룰_matches.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON FUTURE TABLES IN SCHEMA panther_룰_matches.public
  TO ROLE panther_readonly_role;
GRANT SELECT
  ON FUTURE VIEWS IN SCHEMA panther_룰_matches.public
  TO ROLE panther_readonly_role;

-- panther_룰_errors
GRANT USAGE
  ON DATABASE panther_룰_errors
  TO ROLE panther_readonly_role;
GRANT USAGE
  SCHEMA panther_룰_errors.public에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_룰_errors.public의 모든 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_룰_errors.public의 모든 VIEW에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_룰_errors.public의 향후 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_룰_errors.public의 향후 VIEW에서
  TO ROLE panther_readonly_role;

-- panther_cloudsecurity
GRANT USAGE
  DATABASE panther_cloudsecurity에서
  TO ROLE panther_readonly_role;
GRANT USAGE
  SCHEMA panther_cloudsecurity.public에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_cloudsecurity.public의 모든 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_cloudsecurity.public의 모든 VIEW에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_cloudsecurity.public의 향후 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_cloudsecurity.public의 향후 VIEW에서
  TO ROLE panther_readonly_role;

--panther_monitor
GRANT USAGE
  DATABASE PANTHER_MONITOR에서 
  PANTHER_READONLY_ROLE에 부여;  
GRANT USAGE 
  SCHEMA PANTHER_MONITOR.PUBLIC에서 
  PANTHER_READONLY_ROLE에 부여;  
GRANT SELECT 
  SCHEMA PANTHER_MONITOR.PUBLIC의 모든 TABLE에  대해 
  TO ROLE panther_readonly_role;
GRANT SELECT 
  SCHEMA PANTHER_MONITOR.PUBLIC의 모든 VIEW에   대해 
  TO ROLE panther_readonly_role;
GRANT SELECT 
  SCHEMA PANTHER_MONITOR.PUBLIC의 향후 TABLE에  대해 
  TO ROLE panther_readonly_role;
GRANT SELECT 
  SCHEMA PANTHER_MONITOR.PUBLIC의 향후 VIEW에   대해 
  TO ROLE panther_readonly_role;

-- panther_views
GRANT USAGE
  DATABASE panther_views에서
  TO ROLE panther_readonly_role;
GRANT USAGE
  SCHEMA panther_views.public에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_views.public의 모든 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_views.public의 모든 VIEW에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_views.public의 향후 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_views.public의 향후 VIEW에서
  TO ROLE panther_readonly_role;

-- panther_lookups
GRANT USAGE
  DATABASE panther_lookups에서
  TO ROLE panther_readonly_role;
GRANT USAGE
  SCHEMA panther_lookups.public에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_lookups.public의 모든 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_lookups.public의 모든 VIEW에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_lookups.public의 향후 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_lookups.public의 향후 VIEW에서
  TO ROLE panther_readonly_role;
  
  -- panther_signals
GRANT USAGE
  DATABASE panther_signals에서
  TO ROLE panther_readonly_role;
GRANT USAGE
  SCHEMA panther_signals.public에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_signals.public의 모든 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_signals.public의 모든 VIEW에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_signals.public의 향후 TABLE에서
  TO ROLE panther_readonly_role;
GRANT SELECT
  SCHEMA panther_signals.public의 향후 VIEW에서
  TO ROLE panther_readonly_role;

--------------- panther_admin_role 생성
존재하지 않으면 ROLE panther_admin_role 생성;

ROLE panther_readonly_role 부여
    TO ROLE panther_admin_role;

---------------- panther_admin_role에 대한 부여

-- panther_logs
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION 생성 권한
  DATABASE panther_logs의 모든 SCHEMA에
  TO ROLE panther_admin_role;

-- panther_룰_matches
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION 생성 권한
  DATABASE panther_룰_matches의 모든 SCHEMA에
  TO ROLE panther_admin_role;

-- panther_룰_errors
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION 생성 권한
  DATABASE panther_룰_errors의 모든 SCHEMA에
  TO ROLE panther_admin_role;

-- panther_cloudsecurity
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION 생성 권한
  DATABASE panther_cloudsecurity의 모든 SCHEMA에
  TO ROLE panther_admin_role;

-- panther_monitor
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION 생성 권한
  데이터베이스 PANTHER_MONITOR의 모든 스키마에서 
  TO ROLE panther_admin_role;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_MONITOR.PUBLIC의 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_MONITOR.PUBLIC의 향후 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;

-- panther_lookups
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION, CREATE PROCEDURE, CREATE FUNCTION 권한 부여 
  데이터베이스 PANTHER_LOOKUPS의 모든 스키마에서 
  역할 PANTHER_ADMIN_ROLE에 부여;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_LOOKUPS.PUBLIC의 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_LOOKUPS.PUBLIC의 향후 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;

-- panther_signals
CREATE TABLE, CREATE VIEW, CREATE STAGE, CREATE PIPE, MODIFY, ADD SEARCH OPTIMIZATION, CREATE PROCEDURE, CREATE FUNCTION 권한 부여 
  데이터베이스 PANTHER_SIGNALS의 모든 스키마에서
  역할 PANTHER_ADMIN_ROLE에 부여;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_SIGNALS.PUBLIC의 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;
SELECT, INSERT, UPDATE 권한 부여 
  스키마 PANTHER_SIGNALS.PUBLIC의 향후 모든 테이블에서 
  역할 PANTHER_ADMIN_ROLE에 부여;

-- panther_views
CREATE VIEW, MODIFY 권한 부여
  데이터베이스 panther_views의 모든 스키마에서
  TO ROLE panther_admin_role;

-- panther_stored_procedures
데이터베이스 panther_stored_procedures에 USAGE 권한 부여
TO ROLE panther_admin_role;

CREATE PROCEDURE, CREATE FUNCTION, MODIFY, USAGE 권한 부여
데이터베이스 panther_stored_procedures의 모든 스키마에서
TO ROLE panther_admin_role;

-- 이를 통해 panther_admin_role이 Panther의 s3 버킷을 위한 스토리지 통합을 생성할 수 있습니다
-- 참고: 이 권한 부여는 Panther의 초기 온보딩이 성공적으로 완료된 후 제거할 수 있습니다
USE ROLE ACCOUNTADMIN;

ROLE panther_admin_role에 ACCOUNT에 대한 CREATE INTEGRATION 권한 부여;

-- panther가 Snowflake의 감사 데이터베이스에 접근할 수 있도록 허용(선택 사항)
ROLE panther_readonly_role에 snowflake 데이터베이스의 IMPORTED PRIVILEGES 권한 부여;
```

#### 5. Snowflake에 읽기 전용 사용자와 관리자 사용자 생성

참고: 아래에 `<your_readonly_password>` 및 `<your_admin_password>` 를 설정하세요. Snowflake SQL 셸에서 실행:

```sql
USE ROLE SECURITYADMIN;

-- panther_readonly 사용자
CREATE USER IF NOT EXISTS panther_readonly password='<your_readonly_password>';

ROLE panther_readonly_role 부여
   USER panther_readonly에 부여;

ALTER USER panther_readonly
   SET default_role = panther_readonly_role;

-- panther_admin 사용자
CREATE USER IF NOT EXISTS panther_admin password='<your_admin_password>';

ROLE panther_admin_role 부여
   USER panther_admin에;

ALTER USER panther_admin
   SET default_role = panther_admin_role;

ALTER USER PANTHER_ADMIN 
   SET TIMEZONE = 'UTC';
```

#### 6. AWS Secrets 생성을 더 쉽게 하기 위한 저장 프로시저 생성(선택 사항)

AWS Secret Manager에 복사해서 붙여넣을 수 있는 JSON 문서를 생성하는 이 저장 프로시저를 정의합니다(입력 타이핑 절약). Snowflake SQL 셸에서 실행:

```sql
USE ROLE SYSADMIN;

CREATE or replace FUNCTION panther_stored_procedures.public.generate_secret(USN VARCHAR, PWD VARCHAR, WHS VARCHAR, HST VARCHAR)
  OBJECT 반환
    SQL 언어
    STRICT
    AS
  $$
  SELECT object_construct('account', current_account(),
                        'user', USN ,
                        'password', PWD ,
                        'host',TRIM(REPLACE(HST,'https://'),'/'),
                        'port','443',
                        'warehouse',WHS) AS SECRET
  $$;
  -- 여기에서 값을 사용자 비밀번호, 사용할 컴퓨트 웨어하우스, 그리고 호스트명에 맞게 사용자 지정하세요.
  -- 호스트명은 일반적으로 클러스터에 로그인할 때 사용한 URL의 "<something>.snowflakecomputing.com" 형식입니다.
  -- SELECT panther_stored_procedures.public.generate_secret('panther_readonly','password123','COMPUTE_WH','<something>.snowflakecomputing.com');
```

#### 7. Panther Snowflake Secrets를 위한 AWS 계정에 KMS 키를 생성합니다

이 키는 8단계의 일부로 AWS 계정에 저장할 Snowflake 시크릿을 암호화하는 데 사용됩니다.

1. AWS 계정에 로그인합니다
2. (선택 사항) Snowflake 계정이 있는 동일한 리전으로 이동합니다
3. KMS 서비스로 이동합니다
4. 을 클릭합니다 `키 생성`
5. 을 선택합니다 `대칭형` 를 유형으로 선택한 다음 `다음`
6. 별칭을 다음으로 설정합니다 `panther-secret`. 클릭하세요 `다음`. 다음 페이지에서 `다음` (기본값 수락)
7. 을 클릭합니다 `다른 AWS 계정 추가` 를 클릭하고 Panther가 설치된 계정 ID를 입력합니다.
8. 을 클릭한 다음 `다음` 를 클릭합니다 `완료`.

#### 8. 읽기 전용 사용자 AWS Secret과 관리자 사용자 AWS Secret을 생성합니다

다음을 사용하게 됩니다 [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) 를 사용하여 Snowflake 사용자 비밀번호를 저장합니다. 이는 Panther 계정의 단일 Lambda 함수에서만 접근할 수 있도록 구성됩니다.

아래 과정을 다음 항목에 대해 각각 한 번씩 반복합니다. `panther_readonly` 사용자와 한 번, 그리고 `panther_admin` 사용자에 대해 한 번 수행합니다.

* 콘솔을 통해 AWS Secrets Manager에 접속하여 페이지에서 다음을 선택합니다. `새 시크릿 저장` 버튼을 클릭합니다.
* 제목이 다음과 같은 페이지가 표시됩니다. `새 시크릿 저장`. 다음을 선택합니다. `기타 유형의 시크릿` 을 유형 목록에서 선택합니다. 다음 키/값 쌍을 지정합니다:

|     필드    | 설명                                                                                                                  |
| :-------: | ------------------------------------------------------------------------------------------------------------------- |
| `account` | Snowflake 계정의 이름입니다. 이는 다음을 실행하여 찾을 수 있습니다. `SELECT CURRENT_ACCOUNT()`                                              |
|   `사용자`   | 이전에 생성한 Snowflake 사용자, 또는 `panther_readonly` 또는 `panther_admin`                                                     |
|   `비밀번호`  | 이전에 생성한 Snowflake 사용자 비밀번호                                                                                          |
|   `호스트`   | 이는 일반적으로 `<something>.snowflakecomputing.com` 클러스터에 로그인할 때 사용한 URL에서 가져옵니다. 제거하세요 `https://` 및 뒤에 오는 모든 `/` 호스트명에서. |
|    `포트`   | 사용 `443` 별도로 구성하지 않은 경우                                                                                             |
|  `웨어하우스`  | 활성 Snowflake 웨어하우스의 이름                                                                                              |

위 항목을 직접 입력하거나, Snowflake SQL 셸에서 다음 명령을 실행하여 지정된 4개 매개변수의 적절한 값( `account` 및 `포트` 는 자동으로 채워져야 합니다). 다음에 대해 한 번 수행하세요. `panther_readonly` 사용자와 한 번, 그리고 `panther_admin`:

```sql
SELECT panther_stored_procedures.public.generate_secret(<user>,<password>,<warehouse>,<host>);
```

그런 다음 결과를 2개의 비밀 항목 각각의 "plaintext" 편집기 탭에 복사하여 붙여넣을 수 있습니다.

<figure><img src="/files/609322e4957b64927656c53585cc1c7ef9dee63d" alt="The image shows the &#x22;Store a new secret&#x22; screen from the AWS console. The option &#x22;Other type of secrets&#x22; is selected. The dropdown for &#x22;Select the encryption key&#x22; is set to &#x22;panther-secret.&#x22;"><figcaption></figcaption></figure>

***참고***: 6개 필드(*계정, 호스트, 비밀번호, 포트, 사용자, 웨어하우스*)가 모두 입력되어 있고 올바른 값인지 확인하세요. 그렇지 않으면 Panther 람다가 Snowflake에 연결하는 데 문제가 발생할 수 있습니다.

* "암호화 키 선택"에서 `panther-secret` 을(를) 드롭다운에서 선택하세요.
* 시크릿 키/값을 입력하세요.
* 을 클릭한 다음 `다음`.

<figure><img src="/files/85303bc3d4af5f76e43039c63a099519b334afeb" alt="On the &#x22;Store a new secret&#x22; page in AWS, the secret type &#x22;Other types of secrets&#x22; is selected. Under &#x22;Specify the key/value pairs to be stored in this secret,&#x22; the following keys are entered: account, host, password, port, user, and warehouse."><figcaption></figcaption></figure>

* 시크릿의 이름과 설명을 입력하라는 화면이 표시됩니다. 이를 입력한 다음 `다음`.

<figure><img src="/files/6f7d84720ccd37b72e48174a3fa37d47f1446c22" alt="On the &#x22;Store a new secret&#x22; page in AWS, the secret name and description fields are filled out."><figcaption></figcaption></figure>

* AWS Secrets Manager가 시크릿을 얼마나 자주 교체할지 설정한 다음 **다음**.

<figure><img src="/files/757f985d20bf69ac414e23a5903276c4a4edfce2" alt="The image shows the AWS Console during the process of storing a new secret. Under &#x22;Configure automatic rotation,&#x22; the options available are &#x22;Disable automatic rotation&#x22; and &#x22;Enable automatic rotation.&#x22;"><figcaption></figcaption></figure>

* 마지막으로 개요 화면이 표시됩니다. 맨 아래로 스크롤하여 `저장` 버튼.

#### 시크릿의 권한 업데이트

두 개의 Panther AWS 시크릿에 대한 권한을 구성해야 하며, 그렇게 하면 특정 Panther Lambda만 Snowflake 시크릿에 접근할 수 있습니다.

Panther `panther-snowflake-api` 는 다음을 사용할 것입니다. `panther_readonly` 사용자는 사용자 쿼리에 사용되는 반면, `panther-snowflake-admin-api` 는 다음을 사용할 것입니다. `panther_admin` 사용자는 새 로그 소스가 온보딩될 때 테이블을 생성하는 데 사용됩니다.

그 `panther-lookup-tables-api` Snowflake에서 조회 테이블을 관리하기 위해 해당 권한을 사용합니다.

콘솔로 이동하여 위에서 만든 각 시크릿을 선택하세요. 개요 화면에서 다음을 클릭합니다. `권한 편집` 버튼. 아래 정책 JSON을 복사하고, 적절한 항목으로 바꿉니다. `<snowflake lambda role>`다음 중 하나:

* `panther-snowflake-api` 첫 번째 단계에서 수집한 역할
* `panther-snowflake-admin-api` 첫 번째 단계에서 수집한 역할

다음을 대체합니다 `<lookup tables lambda role>` 와 함께 `panther-lookup-tables-api` 첫 번째 단계에서 수집한 룰

값으로 `<secret ARN>` 업데이트 중인 비밀의 ARN을 사용하세요.

```javascript
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"AWS": "<snowflake lambda role>" },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "<secret ARN>"
        },
        {
            "Effect": "Allow",
            "Principal": {"AWS": "<lookup tables lambda role>" },
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "<secret ARN>"
        }
    ]
}
```

그다음 클릭하세요 **저장**.

다음 항목의 값을 메모해 두세요. `arn` 비밀에 대한 것입니다. 나중에 이것을 사용합니다.

#### 9. Snowflake가 활성화된 Panther 배포

#### SaaS 고객 관리형 배포 사용자

Panther 담당자(POC)에게 다음을 보내세요:

* `SNOWFLAKE_IAM_USER` 첫 번째 단계에서 수집한
* 에 대한 ARN `panther_readonly` 사용자 AWS Secret
* 에 대한 ARN `panther_admin` 사용자 AWS Secret

Panther POC가 Snowflake를 활성화하기 위해 이러한 설정으로 Panther를 다시 배포할 것입니다.

#### CloudPrem 사용자

자신의 계정에서 Panther를 실행하는 고객(이를 `CloudPrem이라고 합니다)은` 먼저 Panther의 초기 설정을 위해 마스터 템플릿을 배포해야 합니다. 마스터 템플릿을 배포한 후 아래와 같이 마스터 스택 파라미터를 구성하세요:

* 업데이트: `SnowflakeAPISecretARN` 파라미터를 위에서 생성한 비밀의 ARN으로 `panther_readonly` 사용자에 대해 한 번 수행합니다.
* 업데이트: `SnowflakeAdminAPISecretARN` 파라미터를 위에서 생성한 비밀의 ARN으로 `panther_admin` 사용자에 대해 한 번 수행합니다.
* 업데이트: `SnowflakeDestinationClusterARNs` 파라미터를 `<SNOWFLAKE_IAM_USER>` 의 초기 단계에서의 값으로

CloudFormation 스택에 대한 업데이트를 실행하세요.

#### Snowpipe 처리 검증

Panther가 Snowflake용으로 구성되면 다음 일곱 개의 데이터베이스가 있어야 합니다:

* `panther_logs`
* `panther_룰_matches`
* `panther_룰_errors`
* `panther_cloudsecurity`
* `panther_views`
* `pather_stored_procedures`
* `panther_monitor`

데이터가 정기적으로 처리되고 있다면 몇 분 안에 테이블에 데이터가 있어야 합니다. 이는 로그 수집 속도에 따라 달라집니다.

간단한 쿼리를 실행하여 데이터 수집이 제대로 작동하는지 빠르게 테스트할 수 있습니다:

```sql
SELECT count(1) AS c FROM panther_views.public.all_logs ;
```

구성은 다음에서 테스트할 수 있습니다. [데이터 탐색기](/ko/search/data-explorer.md). 데이터가 있다고 알고 있는 테이블에 대해 동일한 쿼리를 몇 번 실행해 보세요(Snowflake 콘솔에서 확인).

#### 비밀 정보 회전

비밀 정보를 회전하려면 새 사용자를 생성하고 비밀 정보를 편집하여 기존 사용자와 비밀번호를 새 사용자와 비밀번호로 바꾸세요. Snowflake에서 기존 사용자를 삭제/비활성화하기 전에 한 시간 기다리세요.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.panther.com/ko/system-configuration/panther-deployment-types/legacy-configurations/customer-managed-snowflake.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
