본문 바로가기
WIKI 기술 지식 베이스

Forecasting security

원문 보기 위키 갱신

출처: 문서

본문

Forecasting 보안

Forecasting은 anomaly detection과 동일한 보안 프레임워크를 사용해요. 이 페이지에서는 사용자가 forecaster를 생성, 실행, 조회할 수 있도록 권한을 구성하는 방법, 시스템 인덱스에 대한 접근을 제한하는 방법, 그리고 팀 간에 예측 결과를 격리하는 방법을 설명해요.

모든 예제에서는 자격 증명, 인덱스 이름, 역할 이름을 여러분의 환경에 맞는 값으로 바꿔서 사용하세요. {: .note}

Forecasting이 생성하는 인덱스

다음 표는 Forecasting API에서 사용하는 인덱스와 일반 사용자에게의 표시 여부를 설명해요.

인덱스 패턴 용도 일반 사용자에게 표시 여부
.opensearch-forecasters forecaster 설정을 저장해요. 아니요
.opensearch-forecast-checkpoints 모델 스냅샷(checkpoint)을 저장해요. 아니요
.opensearch-forecast-state 실시간 및 run-once forecasting의 작업 메타데이터를 저장해요. 아니요
opensearch-forecast-result* 백테스트와 실시간 forecasting의 예측 결과를 저장해요. 예

사용자는 .opensearch-forecast-checkpoints에 직접 접근할 필요가 없어요. 이 인덱스는 플러그인이 내부적으로 사용해요.

.opensearch-forecasters를 조회하려면 Get forecaster 또는 Search forecasters API를 사용하세요.

.opensearch-forecast-state를 조회하려면 ?task=true 쿼리 파라미터와 함께 Get forecaster API를 사용하거나 Search tasks API를 직접 호출하세요.

클러스터 권한

각 Forecasting API 라우트는 다음 표와 같이 특정 클러스터 수준 권한에 매핑돼요. forecaster를 관리하거나 상호작용하는 역할에는 이 권한들을 반드시 부여해야 해요.

라우트 필요한 권한
POST /_plugins/_forecast/forecasters cluster:admin/plugin/forecast/forecaster/write
PUT /_plugins/_forecast/forecasters/{id} cluster:admin/plugin/forecast/forecaster/write
POST /_plugins/_forecast/forecasters/_validate cluster:admin/plugin/forecast/forecaster/validate
POST /_plugins/_forecast/forecasters/_suggest/{types} cluster:admin/plugin/forecast/forecaster/suggest
GET /_plugins/_forecast/forecasters/{id}
GET /_plugins/_forecast/forecasters/{id}?task=true
cluster:admin/plugin/forecast/forecasters/get
DELETE /_plugins/_forecast/forecasters/{id} cluster:admin/plugin/forecast/forecaster/delete
POST /_plugins/_forecast/forecasters/{id}/_start
POST /_plugins/_forecast/forecasters/{id}/_stop
cluster:admin/plugin/forecast/forecaster/jobmanagement
POST /_plugins/_forecast/forecasters/{id}/_run_once cluster:admin/plugin/forecast/forecaster/runOnce
POST /_plugins/_forecast/forecasters/_search
GET /_plugins/_forecast/forecasters/_search
cluster:admin/plugin/forecast/forecasters/search
GET /_plugins/_forecast/forecasters/tasks/_search cluster:admin/plugin/forecast/tasks/search
POST /_plugins/_forecast/forecasters/{id}/results/_topForecasts cluster:admin/plugin/forecast/result/topForecasts
GET /_plugins/_forecast/forecasters/{id}/_profile cluster:admin/plugin/forecast/forecasters/profile
GET /_plugins/_forecast/stats cluster:admin/plugin/forecast/forecaster/stats
GET /_plugins/_forecast/forecasters/count
GET /_plugins/_forecast/forecasters/match
cluster:admin/plugin/forecast/forecaster/info

필요한 역할

forecasting 사용자는 다음과 같은 책임을 기준으로 세 가지 유형의 권한이 필요해요:

  • forecasting 작업 관리
  • 원본 데이터 읽기
  • 예측 결과 접근

이 책임들은 다음 표와 같이 세 개의 서로 다른 보안 계층에 해당해요.

계층 제어 대상 일반적인 역할
Forecaster 제어 forecaster 설정을 생성, 편집, 시작, 중지, 삭제 또는 조회하는 권한 forecast_full_access
(lifecycle 관리)
또는
forecast_read_access
(조회 전용)
데이터 소스 읽기 forecaster가 학습과 예측에 사용하는 원시 메트릭 인덱스를 쿼리할 수 있는 권한을 부여 data_source_read 같은 커스텀 역할
결과 읽기 사용자와 Alerting 모니터에게 opensearch-forecast-result* 문서에 대한 접근 권한을 부여 forecast_result_read 같은 커스텀 역할

내장 역할인 forecast_full_access와 forecast_read_access는 Forecasting API에만 적용돼요. 여기에는 원본 인덱스나 결과 인덱스에 대한 권한이 포함되어 있지 않아요. 이 권한들은 별도로 부여해야 해요. {: .note}

Forecaster 제어 역할

Forecasting API에는 그대로 사용하거나 커스텀 역할을 만들 때 템플릿으로 쓸 수 있는 두 가지 내장 역할이 포함되어 있어요:

  • forecast_read_access – forecaster에 대한 읽기 전용 접근이 필요한 분석가를 위한 역할이에요. 이 역할을 가진 사용자는 forecaster 세부 정보와 결과를 볼 수 있지만, forecaster를 생성, 수정, 시작, 중지, 삭제할 수는 없어요.

  • forecast_full_access – forecaster의 생성, 편집, 시작, 중지, 삭제를 포함해 전체 lifecycle을 관리하는 책임이 있는 사용자를 위한 역할이에요. 이 역할은 원본 인덱스에 대한 접근 권한을 부여하지 않아요. forecaster를 생성하려면 사용자가 forecaster가 읽어 들이는 인덱스나 alias에 대해 search 액션을 포함하는 인덱스 수준 권한도 함께 가지고 있어야 해요.

다음 예제는 이 역할들이 정의되는 방식을 보여줘요:

forecast_read_access:
  reserved: true
  cluster_permissions:
    - 'cluster:admin/plugin/forecast/forecaster/info'
    - 'cluster:admin/plugin/forecast/forecaster/stats'
    - 'cluster:admin/plugin/forecast/forecaster/suggest'
    - 'cluster:admin/plugin/forecast/forecaster/validate'
    - 'cluster:admin/plugin/forecast/forecasters/get'
    - 'cluster:admin/plugin/forecast/forecaster/info'
    - 'cluster:admin/plugin/forecast/forecasters/search'
    - 'cluster:admin/plugin/forecast/result/topForecasts'
    - 'cluster:admin/plugin/forecast/tasks/search'
  index_permissions:
    - index_patterns:
        - 'opensearch-forecast-result*'
      allowed_actions:
        - 'indices:admin/mappings/fields/get*'
        - 'indices:admin/resolve/index'
        - 'indices:data/read*'

forecast_full_access:
  reserved: true
  cluster_permissions:
    - 'cluster:admin/plugin/forecast/*'
    - 'cluster:admin/settings/update'
    - 'cluster_monitor'
  index_permissions:
    - index_patterns:
        - '*'
      allowed_actions:
        - 'indices:admin/aliases/get'
        - 'indices:admin/mapping/get'
        - 'indices:admin/mapping/put'
        - 'indices:admin/mappings/fields/get*'
        - 'indices:admin/mappings/get'
        - 'indices:admin/resolve/index'
        - 'indices:data/read*'
        - 'indices:data/read/field_caps*'
        - 'indices:data/read/search'
        - 'indices:data/write*'
        - 'indices_monitor'

{% include copy.html %}

이 역할에는 특정 원본 인덱스나 결과 인덱스에 대한 기본 index_permissions가 포함되어 있지 않아요. 이는 의도된 설계로, 데이터 접근 요구 사항에 맞는 패턴을 여러분이 직접 추가할 수 있게 해줘요.

데이터 소스 read 역할

각 forecaster는 생성한 사용자의 자격 증명을 사용해 원본 인덱스를 쿼리해요. 이를 가능하게 하려면 해당 사용자에게 여러분의 데이터 인덱스에 대한 읽기 권한을 반드시 부여해야 해요.

다음 예제 요청은 network-metrics 인덱스에 대한 읽기 접근을 허용하는 최소한의 역할을 생성해요:

PUT _plugins/_security/api/roles/data_source_read
{
  "index_permissions": [{
    "index_patterns": ["network-metrics"],
    "allowed_actions": ["read"]
  }]
}

{% include copy-curl.html %}

index_patterns를 실제 데이터 소스에 맞게 수정할 수 있어요.

결과 읽기 역할

forecast_result_read 역할을 가진 사용자는 예측 결과를 조회하고, 그 결과를 쿼리하는 Alerting 모니터를 구성할 수 있어요.

다음 예제 요청은 opensearch-forecast-result* 패턴과 일치하는 모든 인덱스에 대한 읽기 접근을 부여하는 역할을 정의해요:

PUT _plugins/_security/api/roles/forecast_result_read
{
  "index_permissions": [{
    "index_patterns": ["opensearch-forecast-result*"],
    "allowed_actions": ["read"]
  }]
}

{% include copy-curl.html %}

팀 간에 결과 데이터를 격리해야 한다면, 다음 섹션에서 보여주는 것처럼 backend role 필터와 함께 문서 수준 보안(document-level security, DLS)을 사용해 이 역할을 강화할 수 있어요.

보안 역할 구성 예제

다음 예제 요청은 devOpsEngineer 사용자를 생성하고 forecasting에 필요한 세 가지 역할을 모두 할당해요:

PUT _plugins/_security/api/internalusers/devOpsEngineer
{
  "password": "DevOps2024!",
  "opendistro_security_roles": [
    "forecast_full_access",
    "data_source_read",
    "forecast_result_read"
  ]
}

{% include copy-curl.html %}

이 구성을 통해 다음이 가능해져요:

  • devOpsEngineer가 forecaster를 관리할 수 있어요 (forecast_full_access).
  • forecaster가 원본 인덱스를 성공적으로 쿼리할 수 있어요 (data_source_read).
  • 사용자와 구성된 모니터가 예측 결과를 읽을 수 있어요 (forecast_result_read).

forecaster 구성에 대한 읽기 전용 접근을 부여하려면 forecast_full_access를 forecast_read_access로 바꾸세요.


(심화) backend role로 접근 제한하기

backend role을 사용해 팀별 격리를 적용할 수 있어요. 이 패턴을 사용하면 구성과 결과를 분리한 상태로 서로 다른 팀이 독립적으로 forecaster를 운영할 수 있어요.

이 모델은 세 개의 계층으로 이루어져 있어요:

  1. 구성 격리 – Forecasting API는 일치하는 backend role을 가진 사용자만 사용할 수 있어요.
  2. 결과 격리 – DLS가 opensearch-forecast-result*에 있는 예측 결과에 대한 접근을 제한해요.
  3. 원본 데이터 접근 – 최소한의 읽기 전용 역할이 각 forecaster가 자신의 인덱스를 스캔할 수 있게 해줘요.

다음 섹션에서는 각 계층을 구성하는 방법을 설명해요.

사용자에게 backend role 할당하기

대부분의 환경에서는 backend role이 LDAP이나 SAML을 통해 할당돼요. 하지만 내부 사용자 데이터베이스를 사용하는 경우에는 다음 예제와 같이 수동으로 설정할 수 있어요:

# Analyst
PUT _plugins/_security/api/internalusers/alice
{
  "password": "alice",
  "backend_roles": ["analyst"]
}

# HR staff
PUT _plugins/_security/api/internalusers/bob
{
  "password": "bob",
  "backend_roles": ["human-resources"]
}

이렇게 할당한 backend role은 팀 단위로 forecaster와 예측 결과에 대한 접근을 제어하는 데 사용할 수 있어요.

구성 접근을 위한 backend-role 필터링 활성화하기

팀별로 forecaster 구성을 격리하려면 클러스터 수준에서 backend-role 필터링을 활성화하세요:

PUT _cluster/settings
{
  "persistent": {
    "plugins.forecast.filter_by_backend_roles": true
  }
}

{% include copy-curl.html %}

이 설정이 활성화되면 OpenSearch는 각 forecaster 문서에 생성자의 backend role을 기록해요. 일치하는 backend role을 가진 사용자만 해당 forecaster를 조회, 편집, 삭제할 수 있어요.

팀별 result‑access 역할 만들기

예측 결과는 공유 인덱스에 저장되기 때문에, DLS를 사용해 backend role별로 접근을 제한하세요.

다음 예제 요청은 analyst backend role을 가진 사용자가 자기 팀의 예측 결과만 읽고 쓸 수 있도록 허용하는 역할을 생성해요:

PUT _plugins/_security/api/roles/forecast_analyst_result_access
{
  "index_permissions": [{
    "index_patterns": ["opensearch-forecast-result*"],
    "dls": """
    {
      "bool": {
        "filter": [{
          "nested": {
            "path": "user",
            "query": {
              "term": {
                "user.backend_roles.keyword": "analyst"
              }
            },
            "score_mode": "none"
          }
        }]
      }
    }""",
    "allowed_actions": ["read","write"]
  }]
}

{% include copy-curl.html %}

human-resources 같은 다른 팀의 결과를 격리하려면 별도의 역할(예: forecast_human_resources_result_access)을 만들고 term 값을 알맞은 backend role에 맞게 수정하세요.

data-source 읽기 접근 정의하기

data_source_read 역할은 앞선 예제들과 같은 방식으로 정의돼요. 이 역할은 각 forecaster가 학습과 예측에 사용하는 메트릭 인덱스에 대한 최소한의 읽기 접근을 부여해요.

이 역할을 팀 전반에서 재사용하거나, 인덱스별 제한이 필요하다면 별도의 버전을 만들 수도 있어요.

사용자를 세 역할에 매핑하기

다음 예제는 analyst backend role을 사용해 alice 사용자를 필요한 세 역할인 full_access, result_access, data_source_read 모두에 매핑해요:

PUT _plugins/_security/api/internalusers/alice
{
  "password": "alice",
  "backend_roles": ["analyst"],
  "opendistro_security_roles": [
    "forecast_full_access",
    "forecast_analyst_result_access",
    "data_source_read"
  ]
}

{% include copy-curl.html %}

이 구성으로 Alice는 다음을 할 수 있어요:

  • analyst backend role이 태그된 forecaster만 생성, 시작, 중지, 삭제할 수 있어요.
  • analyst backend role이 태그된 예측 결과만 조회할 수 있어요.
  • 자신의 forecaster의 원본 데이터로 network-metrics 인덱스를 읽을 수 있어요.

HR 팀의 bob 같은 두 번째 사용자를 구성하려면 human-resources backend role과 forecast_human_resources_result_access를 사용해 같은 방식으로 설정하세요.

backend role이 없는 사용자

사용자가 forecast_read_access 역할은 가지고 있지만 backend role이 없다면, 어떤 forecaster도 조회할 수 없어요. backend-role 필터링은 엄격한 일치를 강제하기 때문에 사용자의 역할과 일치하지 않는 구성에 대한 접근을 차단해요.


세분화된 접근 제어로 원격 인덱스 선택하기

포리캐스터의 데이터 소스로 원격 인덱스를 사용하려면 크로스 클러스터 검색 문서의 인증 흐름 섹션에 나온 단계를 따르세요.

이 과정이 성공하려면 사용자가 다음 조건을 충족해야 해요:

  • 로컬 클러스터와 원격 클러스터 양쪽에 존재하는 보안 역할을 사용해야 해요.
  • 그 역할이 양쪽 클러스터에서 동일한 사용자 이름에 매핑되어 있어야 해요.

예시: 로컬 클러스터에서 새 사용자 생성하기

다음 명령어를 사용해서 포리캐스터를 생성할 수 있는 새 사용자를 로컬 클러스터에 만드세요:

curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9200/_plugins/_security/api/internalusers/forecastuser' \
  -H 'Content-Type: application/json' \
  -d '{"password":"password"}'

{% include copy.html %}

다음 명령어를 사용해서 새 사용자를 forecast_full_access 역할에 매핑하세요:

curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9200/_plugins/_security/api/rolesmapping/forecast_full_access' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

{% include copy.html %}

원격 클러스터에서는 동일한 사용자를 만들고, 다음 명령어와 같이 forecast_full_access 역할에 매핑하세요:

# Create the user
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9250/_plugins/_security/api/internalusers/forecastuser' \
  -H 'Content-Type: application/json' \
  -d '{"password":"password"}'

# Map the role
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9250/_plugins/_security/api/rolesmapping/forecast_full_access' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

{% include copy-curl.html %}

양쪽 클러스터에서 소스 인덱스 읽기 권한 부여하기

포리캐스터를 생성하려면 포리캐스터가 읽는 모든 소스 인덱스, 별칭, 패턴에 대해 search 또는 read 액션 그룹의 인덱스 수준 권한도 사용자에게 필요해요. 원격 인덱스를 읽을 때는 양쪽 클러스터 모두에서 권한 검사가 이루어져요. 양쪽 위치에서 동일한 역할을 정의하고 매핑하세요.

로컬 클러스터에서는 다음 명령어와 같이 소스 인덱스에 대한 접근을 허용하는 read 역할을 정의하고 포리캐스팅 사용자에게 매핑하세요:

# Create a role that can search the data
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9200/_plugins/_security/api/roles/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{
        "index_permissions":[{
          "index_patterns":["network-requests"],
          "allowed_actions":["search"]
        }]
      }'

# Map the role to forecastuser
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9200/_plugins/_security/api/rolesmapping/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

{% include copy-curl.html %}

원격 클러스터에서는 다음 명령어와 같이 동일한 역할을 정의하고 동일한 사용자에게 매핑해서 클러스터 간에 권한이 동일하게 유지되도록 하세요:

# Create the identical role
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9250/_plugins/_security/api/roles/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{
        "index_permissions":[{
          "index_patterns":["network-requests"],
          "allowed_actions":["search"]
        }]
      }'

# Map the role to the same user
curl -XPUT -k -u 'admin:<custom-admin-password>' \
  'https://localhost:9250/_plugins/_security/api/rolesmapping/data_source_read' \
  -H 'Content-Type: application/json' \
  -d '{"users":["forecastuser"]}'

{% include copy-curl.html %}

로컬 클러스터에 원격 클러스터 등록하기

cluster.remote.<alias>.seeds 설정 아래에 시드 노드를 지정해서 원격 클러스터를 로컬 클러스터에 등록하세요. OpenSearch에서는 이것을 follower 클러스터 추가라고 불러요.

원격 클러스터가 트랜스포트 포트 9350에서 대기하고 있다고 가정하고, 로컬 클러스터에서 다음 명령어를 실행하세요:

curl -X PUT "https://localhost:9200/_cluster/settings" \
  -H "Content-Type: application/json" \
  -u "admin:<custom-admin-password>" \
  -d '{
    "persistent": {
      "cluster.remote": {
        "follower": {
          "seeds": [ "127.0.0.1:9350" ]
        }
      }
    }
  }'

{% include copy.html %}

  • 원격 노드가 다른 호스트에 있다면 127.0.0.1을 해당 노드의 트랜스포트 레이어 IP로 바꾸세요.
  • follower 별칭은 원하는 어떤 이름이든 사용할 수 있으며, 원격 인덱스를 참조하거나 크로스 클러스터 복제를 구성할 때 사용돼요. {: .note}

커스텀 결과 인덱스 권한

기본 결과 인덱스를 사용하는 대신 예측 결과를 위한 커스텀 인덱스를 지정할 수 있어요. 커스텀 인덱스가 아직 존재하지 않는다면, 포리캐스터를 생성하고 실시간 분석이나 테스트 실행을 시작할 때 자동으로 생성돼요.

커스텀 인덱스가 이미 존재한다면, Forecasting API가 인덱스 매핑이 예상되는 예측 결과 구조와 일치하는지 확인해요. 호환성을 보장하려면 인덱스가 forecast-results.json 파일에 정의된 스키마를 따라야 해요.

사용자가 OpenSearch Dashboards에서 포리캐스터를 만들든 Forecasting API를 호출해서 만들든, 시스템은 사용자가 커스텀 인덱스에 대해 다음 인덱스 수준 권한을 갖고 있는지 확인해요:

  • indices:admin/create – 커스텀 결과 인덱스를 생성하고 롤오버하는 데 필요해요.
  • indices:admin/aliases – 인덱스 별칭을 생성하고 관리하는 데 필요해요.
  • indices:data/write/index – 인덱스에 예측 결과를 쓰는 데 필요해요(싱글 스트림 포리캐스터).
  • indices:data/read/search – 예측 결과를 표시할 때 커스텀 인덱스를 검색하는 데 필요해요.
  • indices:data/write/delete – 오래된 예측 결과를 삭제하고 디스크 사용량을 관리하는 데 필요해요.
  • indices:data/write/bulk* – 플러그인이 Bulk API를 사용해서 결과를 쓰기 때문에 필요해요.

다음 단계

TLS, 인증 백엔드, 테넌트 격리, 감사 로깅에 대한 자세한 내용은 보안 플러그인 문서를 참고하세요.

더 알아보기 (Learn more)