SCIM을 사용하여 사용자 및 그룹 관리하기

이 항목에서 설명되는 사항:

  1. Snowflake와 SCIM 통합.

  2. Snowflake를 사용한 SCIM 사용 사례.

  3. Snowflake SCIM APIs를 사용하여 ID 공급자에게 요청하기.

SCIM 개요

SCIM은 RESTful API를 사용하여 클라우드 애플리케이션에서 사용자 ID 및 그룹(즉, 역할)의 자동화된 관리를 편리하게 수행할 수 있는 개방형 사양입니다.

이러한 APIs에서는 JSON 형식의 키-값 페어 속성과 함께 공통 메서드(예: GET, POST)를 사용합니다. 사용자 속성 세트는 사용자에게 고유합니다. 유사하게, 그룹 속성 세트는 그룹에 고유합니다.

현재 Snowflake는 SCIM 2.0을 지원하여 Snowflake를 Okta 및 Microsoft Azure AD와 통합하고, 모두 ID 공급자의 역할을 수행합니다. 또한, Snowflake는 Okta 및 Microsoft Azure가 아닌(즉, 사용자 지정) ID 공급자도 지원합니다. ID 공급자의 사용자 및 그룹은 Snowflake에 프로비저닝할 수 있으며, 서비스 공급자의 역할을 수행합니다.

중요

Snowflake에서 특정 SCIM 역할은 ID 공급자에서 가져온 모든 사용자 및 역할을 소유해야 합니다. Snowflake SCIM 역할이 가져온 사용자 또는 역할을 소유하지 않으면, ID 공급자의 업데이트가 Snowflake와 동기화되지 않습니다. Snowflake SCIM 역할은 ID 공급자(IdP)에 따라 다르며 다음과 같습니다.

  • Okta SCIM 역할: okta_provisioner

  • Azure AD SCIM 역할: aad_provisioner

  • 사용자 지정 SCIM 역할: generic_scim_provisioner

Snowflake SCIM 역할을 사용하는 방법에 대한 자세한 내용은 Okta, Azure ADCustom SCIM 통합 에 대한 SCIM 구성 섹션을 참조하십시오.

ID 공급자는 SCIM 클라이언트를 사용하여 Snowflake SCIM 서버에 RESTful API를 요청합니다. API 요청의 유효성을 검사할 때 Snowflake는 사용자 또는 그룹에 대한 작업을 수행합니다.

인증 프로세스에서는 OAuth Bearer 토큰을 사용하며 이 토큰은 6개월 동안 유효합니다. 고객은 반드시 인증 토큰을 추적해야 하며 온디맨드 방식으로 새 토큰을 생성할 수 있습니다. 각 API 요청 동안 토큰은 인증 Bearer 매개 변수로 헤더에 전달됩니다.

초기 Snowflake SCIM 구성 후, Snowflake SCIM API를 사용하여 해결할 수 있는 사용 사례는 다음과 같습니다.

  1. 사용자 수명 주기 관리

  2. Active Directory 그룹을 Snowflake 역할에 매핑

조심

현재, Snowflake SCIM API를 사용하면 관리자는 고객의 ID 공급자에서 Snowflake에 이르기까지의 사용자 및 그룹을 관리할 수 있습니다.

그러므로 사용자 및 그룹 ID 및 액세스 관리를 위해 Snowflake SCIM API를 사용하는 경우에는 Snowflake에서 사용자 및 그룹 변경을 하지 마십시오. 이러한 변경 사항은 고객 ID 공급자와 다시 동기화되지 않습니다.

SCIM 사용 사례

Snowflake SCIM API를 통해 해결할 수 있는 사용 사례는 다음과 같습니다.

사용자 관리

관리자는 조직의 ID 공급자에서 Snowflake로 사용자를 프로비저닝하고 관리를 수행할 수 있습니다. 사용자 관리는 ID 공급자에서 Snowflake로 일대일 매핑됩니다.

역할 관리

관리자는 조직의 ID 공급자에서 Snowflake로 그룹(즉, 역할)을 프로비저닝하고 관리를 수행할 수 있습니다. 역할 관리는 ID 공급자에서 Snowflake로 일대일 매핑됩니다.

감사

관리자는 rest_event_history 테이블을 쿼리하여 ID 공급자가 Snowflake에 업데이트(즉, SCIM API 요청)를 전송 중인지 확인할 수 있습니다.

SCIM을 사용한 사용자 관리하기

Snowflake는 SCIM APIs를 사용한 사용자 수명 주기 관리를 지원합니다. 사용자 수명 주기 관리는 조직 전체에서 사용자가 이용하는 경로와 일치하는 관리 활동입니다. 사용자 수명 주기의 일반적인 이벤트에 포함되는 활동은 다음과 같습니다.

  1. 사용자 만들기 및 활성화.

  2. email 또는 password 등 사용자 속성 업데이트.

  3. 종료 시 사용자 비활성화.

Snowflake에서 SCIM를 사용하여 사용자 수명 주기를 자동화하기 위해서는 API 요청의 본문에서 사용자 속성을 전달해야 합니다. ID 공급자로부터의 성공적인 API 요청은 Snowflake의 사용자에게 거의 즉시 영향을 줍니다.

사용자 속성

사용자 속성은 사용자와 연결된 키-값 페어입니다. 이러한 페어는 표시 이름 및 이메일 주소와 같은 사용자 관련 정보입니다. ID 공급자는 일부 경우 surname, familyName 또는 lastName 와 같이 속성 키를 다르게 정의하며, 이는 모두 사용자의 성을 나타냅니다. Snowflake는 다중값 사용자 속성을 지원하지 않습니다.

Snowflake SCIM API는 사용자 속성을 JSON 형식으로 전달하며, 이는 해당 사용자 API 예시에서 제공됩니다.

사용자 수명 주기 관리를 위해 Snowflake가 지원하는 SCIM 속성은 다음과 같습니다. 별도로 명시된 경우를 제외하고 속성은 쓰기가 가능합니다.

중요

테이블에서 Snowflake userNameloginName 속성은 모두 SCIM 속성에 매핑됩니다 userName. Snowflake는 userNameloginName 의 Snowflake 속성에서 서로 다른 값을 지원합니다. 이러한 속성 값 분리를 통해 고객은 Snowflake에 액세스하기 위해 사용할 수 있는 속성 값을 보다 자세하게 제어할 수 있습니다.

자세한 내용은 POST 및 PATCH에 대한 사용자 API 예시를 참조하십시오.

SCIM 사용자 속성

Snowflake 사용자 속성

타입

설명

id

id

문자열

Snowflake에서 사용자의 변경 불가능한 고유 식별자(즉, GUID)입니다.

Snowflake는 DESCRIBE USER 또는 SHOW USERS 출력에서 이 값을 노출하지 않습니다.

이 특성을 포함하는 특정 요청 경로(예: PATCH)의 경우 REST_EVENT_HISTORY 테이블 함수를 호출하여 id 를 찾을 수 있습니다.

IdP 로그를 확인하여 값이 일치하도록 하십시오.

userName

userName, loginName

문자열

Snowflake에 로그인하기 위한 식별자. 이러한 Snowflake 특성에 대한 자세한 내용은 CREATE USER 섹션을 참조하십시오.

name.givenName

firstName

문자열

사용자의 이름입니다.

name.familyName

familyName

문자열

사용자의 성입니다.

emails

email

문자열

사용자 이메일 주소. 이 값은 단일 이메일 주소를 지원합니다.

displayName

displayName

문자열

사용자 인터페이스에서 사용자에 대해 표시되는 이름입니다.

externalID

N/A

문자열

프로비저닝 클라이언트(예: Azure, Okta)가 설정한 고유 식별자입니다.

password

password

문자열

사용자의 비밀번호입니다. 이 값은 JSON 응답에서 반환되지 않습니다.

참고: SCIM 보안 통합 SYNC_PASSWORD 속성이 FALSE 로 설정되고 SCIM API 요청이 password 특성을 지정하는 경우, Snowflake는 password 특성의 값을 무시합니다. API 요청의 다른 모든 특성은 그에 따라 처리됩니다.

active

disabled

부울

false 로 설정되면 사용자를 비활성화합니다.

groups

N/A

문자열

사용자가 속한 그룹의 목록입니다. group displayName은 필수입니다.

사용자의 그룹은 읽기 전용이며 해당 구성원 자격은 SCIM 그룹 API를 사용하여 업데이트해야 합니다.

meta.created

createdON

문자열

사용자가 Snowflake에 추가된 시간입니다.

meta.lastModified

lastModified

문자열

사용자가 Snowflake에서 마지막으로 수정된 시간입니다.

meta.resourceType

N/A

문자열

사용자는 사용자 값을 가져야 합니다.

schemas

N/A

문자열

네임스페이스 URIs를 나타내는 쉼표로 구분된 문자열 배열입니다. 지원되는 값:

  • urn:ietf:params:scim:schemas:core:2.0:User

  • urn:ietf:params:scim:schemas:extension:enterprise:2.0:User

  • urn:ietf:params:scim:schemas:extension:2.0:User

사용자 지정 속성

Snowflake는 defaultRole, defaultWarehouse, defaultSecondaryRoles 와 같이 RFC 7643 에서 정의되지 않은 사용자 지정 속성을 설정할 수 있도록 지원합니다.

현재, Snowflake는 네임스페이스 2개를 사용하여 다음 POST, PUT 및 PATCH API 요청에 대한 사용자 지정 속성을 설정할 수 있도록 지원합니다.

urn:ietf:params:scim:schemas:extension:enterprise:2.0:User

이 네임스페이스는 Snowflake의 원래 SCIM 구현의 일부였으며, Okta SCIM 통합서만 사용자 지정 속성을 설정하기 위해 사용할 수 있습니다.

이 네임스페이스는 Microsoft Azure SCIM 통합 또는 사용자 지정 SCIM 통합 사용자 지정 특성을 설정하기 위해서는 지원되지 않습니다.

urn:ietf:params:scim:schemas:extension:2.0:User

이 새로운 네임스페이스는 모든 SCIM 통합에 대한 사용자 지정 특성을 설정하기 위해 사용할 수 있으며, 사용자 지정 SCIM 통합 또는 Microsoft Azure SCIM 통합을 사용하여 사용자 지정 특성에 반드시 사용해야 합니다.

사용자 APIs

편리한 사용자 수명 주기 관리를 위해 Snowflake가 지원하는 APIs는 다음과 같습니다. 사용자는 필터를 사용하여 사용자 정보를 가져올 수 있으며 사용자를 생성, 업데이트, 비활성화 및 삭제할 수도 있습니다.

목적

메서드 & API

참고

사용자가 있는지 확인합니다.

GET scim/v2/Users?filter=userName eq "{{user_name}}"

지정된 userName 및 성공 시 200 의 HTTP 상태 코드와 함께 사용자 계정의 세부 정보를 반환합니다.

특정 사용자에 대한 세부 정보를 가져옵니다.

GET scim/v2/Users/{{user_id}}

지정된 user_id 및 성공 시 200 의 HTTP 상태 코드와 함께 사용자 계정의 세부 정보를 반환합니다.

특정 사용자에 대한 세부 정보를 가져옵니다.

GET scim/v2/Users?startIndex=0&count=1

SCIM 클라이언트가 스키마를 읽을 수 있도록 샘플 사용자를 반환하고 성공 시 200 의 HTTP 상태 코드를 반환합니다.

사용자를 만듭니다.

POST scim/v2/Users

Snowflake에서 사용자를 만들고 성공 시 HTTP 201 상태 코드를 반환합니다.

이미 있는 사용자이거나 다른 충돌이 발생하면 Snowflake는 HTTP 409 상태 코드를 반환합니다.

부분 특성을 사용하여 사용자를 업데이트합니다.

PATCH scim/v2/Users/{id}

active 키가 false로 설정되면 해당 사용자를 비활성화합니다.

현재 비활성화된 사용자를 활성화하려면 active 를 true로 설정합니다.

PATCH에서는 특성 값을 대체하는 배열이 포함된 Operations 키(즉, op)가 필요합니다.

성공 시 200, 실패 시 204 (즉, 내용 없음)의 HTTP 상태 코드를 반환합니다.

사용자를 업데이트합니다.

PUT scim/v2/Users/{id}

해당 id 의 사용자가 있는지 확인합니다. 변경이 불가능한 특성을 변경하도록 요청되면 이 작업은 실패합니다.

그렇지 않으면, 요청에 따라 읽기-쓰기 또는 쓰기 전용 특성을 대체합니다.

요청 본문의 변경이 불가능한 특성 값이 Snowflake의 값과 일치하지 않으면 400 의 HTTP 상태 코드를 반환합니다.

사용자를 삭제합니다.

DELETE scim/v2/Users/{id}

SCIM API 요청에 대한 자세한 내용은 SCIM API 요청하기 를 참조하십시오.

POST scim/v2/Users

userNameloginName동일한 값에 매핑된 사용자를 생성합니다.

{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:extension:2.0:User"
        ],
    "userName": "test_user_1",
    "password": "test",
    "name": {
        "givenName": "test",
        "familyName": "user"
        },
    "emails": [{
        "value": "test.user@snowflake.com"
        }
    ],
    "displayName": "test user",
    "active": true
}
Copy

userNameloginName다른 값에 매핑된 사용자를 생성합니다.

ID 공급자가 Okta인 경우, 이 절차 를 따릅니다.

{
    "active": true,
    "displayName": "test user",
    "emails": [
        {
            "value": "test.user@snowflake.com"
        }
    ],
    "name": {
        "familyName": "test_last_name",
        "givenName": "test_first_name"
    },
    "password": "test_password",
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
    ],
    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
        "snowflakeUserName": "USER5"
    },
    "userName": "USER5"
}
Copy
PATCH scim/v2/Users/{id}

userNameloginName동일한 값에 매핑된 사용자를 업데이트합니다.

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "replace",
        "value": {
            "active": false
        }
    }]
}
Copy

userNameloginName다른 값에 매핑된 사용자를 업데이트합니다.

ID 공급자가 Okta인 경우, 이 절차 를 따릅니다.

{
    "Operations": [
        {
            "op": "Replace",
            "path": "userName",
            "value": "test_updated_name"
        },
        {
            "op": "Replace",
            "path": "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User.snowflakeUserName",
            "value": "USER5"
        }
    ],
    "schemas": [
        "urn:ietf:params:scim:api:messages:2.0:PatchOp"
    ]
}
Copy
PUT scim/v2/Users/{id}

"defaultRole", "defaultSecondaryRoles""defaultWarehouse" 필드 설정을 포함하여 사용자를 업데이트합니다.

"defaultRole", "defaultSecondaryRoles""defaultWarehouse" 속성을 지정하려면, Snowflake에서는 반드시 extension 스키마 중 1개를 사용해야 합니다. defaultSecondaryRoles 에 대해 유일하게 가능한 값은 "ALL" 입니다.

참고

Snowflake는 이를 지원하지만, PATCH 작업에 비해 많은 비용이 소요되므로 PUT 작업을 사용할 때는 주의해야 합니다. 대신, PATCH 작업을 사용하십시오.

{
    "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User",
        "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
        ],
    "userName": "test_user_1",
    "password": "test",
    "name": {
        "givenName": "test",
        "familyName": "user"
        },
    "emails": [{
        "primary": true,
        "value": "test.user@snowflake.com",
        "type": "work"
        }
    ],
    "displayName": "test user",
    "active": true,
    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
        "defaultRole" : "test_role",
        "defaultSecondaryRoles" : "ALL",
        "defaultWarehouse" : "test_warehouse"
    }
}
Copy

SCIM을 사용하여 역할 관리하기

Snowflake는 SCIM을 사용한 Okta, Azure AD 및 사용자 지정 애플리케이션에서 역할 가져오기를 지원합니다. 이러한 역할과 Snowflake 역할 사이에는 일대일 직접 매핑이 있습니다.

일반적으로 그룹의 동의어에 해당하는 역할은 액세스 권한의 논리적인 컬렉션입니다. Snowflake 모델에서는 역할에 할당된 권한을 통해 보안 오브젝트에 액세스할 수 있습니다. 그런 다음, 이러한 권한은 다른 역할이나 사용자에게 할당됩니다.

역할에 부여된 액세스 허가 및 권한은 역할의 모든 구성원(예: 사용자)에게 자동으로 상속됩니다. 자세한 내용은 액세스 제어의 개요 섹션을 참조하십시오.

사용자가 조직에서 계속해서 업무를 수행함에 따라 Snowflake에 대한 액세스 요구 사항이 변경될 수 있습니다. 예를 들어, 사용자는 IC(individual contributor)에서 부하 직원을 거느린 관리자로 변경될 수 있습니다. 역할 변경 시, 관리자만 사용할 수 있는 데이터 세트에 대한 Snowflake 액세스가 허용되어야 할 수도 있습니다.

조직에서 사용자의 역할 구성원 자격이 변경됨에 따라 조직 역할이 해당 Snowflake 역할에 매핑되면 Snowflake에 대한 액세스가 자동으로 변경될 수 있습니다.

역할 속성

Snowflake SCIM API는 역할 속성을 JSON 형식으로 전달하며, 이는 해당 역할 API 예시에서 제공됩니다.

역할 수명 주기 관리를 위해 Snowflake가 지원하는 SCIM 속성은 다음과 같습니다. 별도로 명시된 경우를 제외하고 속성은 쓰기가 가능합니다.

SCIM 그룹 속성

Snowflake 그룹

타입

설명

id

id

문자열

Snowflake에서 역할의 변경 불가능한 고유 식별자(즉, GUID)입니다.

Snowflake는 이 값을 노출하지 않습니다. Information Schema 테이블 함수 REST_EVENT_HISTORY 를 호출하면 이 값을 찾을 수 있습니다.

IdP 로그를 확인하여 값이 일치하도록 하십시오.

displayName

name

문자열

사용자 인터페이스에서 역할에 대해 표시되는 이름입니다.

members.value

N/A

문자열

역할의 구성원인 사용자의 userID 값입니다.

schemas

N/A

문자열

네임스페이스 URI를 나타내는 문자열 배열입니다.

예: urn:ietf:params:scim:schemas:core:2.0:Group.

역할 APIs

사용자는 필터를 사용하여 역할 정보를 가져오고 역할을 생성하며 역할 구성원 자격을 업데이트하고 역할을 삭제할 수 있습니다. 편리한 역할 관리를 위해 Snowflake가 지원하는 APIs는 다음과 같습니다.

목적

메서드 & API

참고

표시 이름으로 그룹을 가져옵니다.

GET scim/v2/Groups?filter=displayName="scim_test_group"

지정된 displayName 및 성공 시 200 의 HTTP 상태 코드와 함께 그룹의 세부 정보를 반환합니다.

groupId 로 그룹을 가져옵니다.

GET scim/v2/Groups/{group_id}

지정된 groupId 및 성공 시 200 의 HTTP 상태 코드와 함께 그룹의 세부 정보를 반환합니다.

샘플 그룹을 가져옵니다.

GET scim/v2/Groups?startIndex=0&count=1

SCIM 클라이언트가 스키마를 읽을 수 있도록 샘플 그룹을 반환하고 성공 시 200 의 HTTP 상태 코드를 반환합니다.

새 그룹을 만듭니다.

POST scim/v2/Groups

성공 시 201 의 HTTP 상태 코드와 함께 새 그룹을 만듭니다.

그룹을 업데이트합니다.

PATCH scim/v2/Groups/{id}

그룹 표시 이름 특성 또는 그룹 구성원 자격을 업데이트합니다.

PATCH에는 추가 또는 대체 여부를 나타내는 배열이 포함된 작업(즉, op) 키가 필요합니다.

성공 시 200, 실패 시 204 (즉, 내용 없음)의 HTTP 상태 코드를 반환합니다.

그룹을 삭제합니다.

DELETE scim/v2/Groups/{id}

SCIM API 요청에 대한 자세한 내용은 SCIM API 요청하기 를 참조하십시오.

POST scim/v2/Groups
{
    "schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
    "displayName":"scim_test_group2"
}
Copy
PATCH scim/v2/Groups/{id}
{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "replace",
        "value": {
            "displayName": "updated_name"
            }
        },
        {
            "op" : "remove",
            "path": "members[value eq \"user_id_1\"]"
        },
        {
          "op": "add",
          "value": [{
            "value": "user_id_2"
            }]
        }
    ]
}
Copy

SCIM을 사용하여 감사하기

Snowflake에 쿼리하여 지정된 시간 간격 동안 수행된 SCIM API 요청을 확인할 수 있습니다.

예를 들어, 이 정보는 Snowflake에 프로비저닝해야 하는 조직의 활성 사용자가 Snowflake에 프로비저닝된 사용자와 일치하는지를 판단하는 데 도움이 될 수 있습니다.

아래 SQL은 Information Schema 테이블 함수 REST_EVENT_HISTORY 를 호출하여 최근 5분 동안 발생한 SCIM REST API 요청을 최대 200까지 확인하기 위한 대표적인 예입니다.

use role accountadmin;
use database demo_db;
use schema information_schema;
select *
    from table(rest_event_history(
        'scim',
        dateadd('minutes',-5,current_timestamp()),
        current_timestamp(),
        200))
    order by event_timestamp;
Copy

이 쿼리의 수정 방법에 대한 자세한 내용은 DATEADDCURRENT_TIMESTAMP 함수를 참조하십시오.

지원되는 SCIM 통합

사용자 및 그룹을 Snowflake에 프로비저닝, 관리 및 동기화할 수 있도록 Snowflake와 통합할 수 있는 ID 공급자는 다음과 같습니다.

  1. Okta

  2. Microsoft Azure Active Directory

  3. Custom

    참고

    Custom SCIM 통합을 사용하면 전용 통합이 없는 ID 공급자가 Snowflake에서 사용자 및 그룹을 프로비저닝, 관리 및 동기화할 수 있습니다.

    현재, Custom SCIM 통합은 Okta 및 Microsoft Azure AD가 아닌 ID 공급자용으로만 사용할 수 있습니다.

Okta를 ID 공급자로 사용하는 고객은 Snowflake와 Okta SCIM 통합 에서 제공되는 지침을 따라야 합니다.

Microsoft Azure Active Directory를 ID 공급자로 사용하는 고객은 Snowflake와 Azure SCIM 통합 에서 제공되는 지침을 따라야 합니다.

Okta 또는 Microsoft Azure Active Directory를 ID 공급자로 사용하지 않는 고객은 자체 SCIM 클라이언트를 생성한 후 Snowflake와의 사용자 지정 SCIM 통합 에서 제공되는 지침을 따라야 합니다.

SCIM으로 복제 사용하기

Snowflake는 원본 계정에서 대상 계정으로의 SCIM 보안 통합의 복제 및 장애 조치/장애 복구를 지원합니다.

자세한 내용은 여러 계정에 보안 통합 및 네트워크 정책 복제 섹션을 참조하십시오.

다음 항목: