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

Modifying the security YAML files

원문 보기 위키 갱신

출처: 문서

본문

security YAML 파일 수정하기

Security 설치는 Security 플러그인이 클러스터 내에서 사용자, 역할, 활동을 관리하는 방식을 정의하는 데 필요한 설정을 저장하는 여러 YAML 구성 파일을 제공해요. 이 설정은 인증 백엔드 구성부터 허용된 엔드포인트와 HTTP 요청 목록에 이르기까지 다양해요.

설정을 .opendistro_security 인덱스에 로드하려고 securityadmin.sh를 실행하기 전에, 먼저 YAML 파일의 초기 구성을 수행하세요. 파일은 config/opensearch-security 디렉터리에서 찾을 수 있어요. 다른 클러스터에서 재사용할 수 있도록 이 파일들을 백업해 두는 것도 좋은 습관이에요.

YAML 파일을 사용할 때 권장하는 접근 방식은 admin과 kibanaserver 사용자 같은 예약 및 숨김 리소스를 먼저 구성하는 거예요. 그다음에는 OpenSearch Dashboards나 REST API를 사용해 다른 사용자, 역할, 매핑, 액션 그룹, 테넌트를 만들 수 있어요.

action_groups.yml

이 파일에는 보안 구성에 필요한 역할 매핑이 들어 있어요. role_mapping.yml 파일은 <OPENSEARCH_HOME>/config/opensearch-security/roles_mapping.yml에서 찾을 수 있어요.

일부 메타데이터를 제외하면 기본 파일은 비어 있어요. Security 플러그인이 자동으로 추가하는 정적 액션 그룹을 여러 개 갖고 있기 때문이에요. 이 정적 액션 그룹들은 다양한 사용 사례를 커버하며, 플러그인을 시작하기에 아주 좋은 방법이에요.

---
my-action-group:
  reserved: false
  hidden: false
  allowed_actions:
  - "indices:data/write/index*"
  - "indices:data/write/update*"
  - "indices:admin/mapping/put"
  - "indices:data/write/bulk*"
  - "read"
  - "write"
  static: false
_meta:
  type: "actiongroups"
  config_version: 2

allowlist.yml

allowlist.yml를 사용하면 엔드포인트와 HTTP 요청을 허용된 엔드포인트 및 요청 목록에 추가할 수 있어요. 활성화하면 슈퍼 관리자를 제외한 모든 사용자는 지정된 엔드포인트와 HTTP 요청에만 접근할 수 있고, 해당 엔드포인트와 연관된 다른 모든 HTTP 요청은 거부돼요. 예를 들어 GET _cluster/settings가 허용 목록에 추가되면, 사용자는 클러스터 설정을 업데이트하려고 _cluster/settings로 PUT 요청을 보낼 수 없어요.

allowlist.yml 파일은 <OPENSEARCH_HOME>/config/opensearch-security/allowlist.yml에서 찾을 수 있어요.

이 방식으로 엔드포인트 접근을 구성할 수 있긴 하지만, 대부분의 경우 더 세분화된 설정을 제공하는 Security 플러그인의 사용자와 역할로 권한을 구성하는 것이 여전히 가장 좋다는 점에 유의하세요.

---
_meta:
  type: "allowlist"
  config_version: 2

# Description:
# enabled - feature flag.
# if enabled is false, all endpoints are accessible.
# if enabled is true, all users except the SuperAdmin can only submit the allowed requests to the specified endpoints.
# SuperAdmin can access all APIs.
# SuperAdmin is defined by the SuperAdmin certificate, which is configured with the opensearch.yml setting plugins.security.authcz.admin_dn:
# Refer to the example setting in opensearch.yml to learn more about configuring SuperAdmin.
#
# requests - map of allow listed endpoints and HTTP requests

#this name must be config
config:
  enabled: true
  requests:
    /_cluster/settings:
      - GET
    /_cat/nodes:
      - GET

클러스터 설정에 대한 PUT 요청을 허용하려면 /_cluster/settings 아래 허용된 작업 목록에 PUT을 추가하세요.

requests:
  /_cluster/settings:
    - GET
    - PUT

커스텀 인덱스도 허용 목록에 추가할 수 있어요. allowlist.yml는 와일드카드를 지원하지 않기 때문에, 추가하려는 모든 인덱스를 직접 지정해야 해요.

requests: # Only allow GET requests to /sample-index1/_doc/1 and /sample-index2/_doc/1
  /sample-index1/_doc/1:
    - GET
  /sample-index2/_doc/1:
    - GET

internal_users.yml

이 파일에는 Security 플러그인의 내부 사용자 데이터베이스에 추가하고 싶은 초기 사용자들이 들어 있어요. 이 파일은 <OPENSEARCH_HOME>/config/opensearch-security/internal_users.yml에서 찾을 수 있어요.

파일 형식상 해시된 비밀번호가 필요해요. 해시를 생성하려면 plugins/opensearch-security/tools/hash.sh -p <new-password>를 실행하세요. 데모 사용자를 그대로 두기로 했다면, 비밀번호를 변경하고 securityadmin.sh를 다시 실행해서 새 비밀번호를 적용하세요.

---
# This is the internal user database
# The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh

_meta:
  type: "internalusers"
  config_version: 2

# Define your internal users here
new-user:
  hash: "$2y$12$88IFVl6IfIwCFh5aQYfOmuXVL9j2hz/GusQb35o.4sdTDAEMTOD.K"
  reserved: false
  hidden: false
  opendistro_security_roles:
  - "specify-some-security-role-here"
  backend_roles:
  - "specify-some-backend-role-here"
  attributes:
    attribute1: "value1"
  static: false

## Demo users

admin:
  hash: "$2a$12$VcCDgh2NDk07JGN0rjGbM.Ad41qVR/YFJcgHp0UGns5JDymv..TOG"
  reserved: true
  backend_roles:
  - "admin"
  description: "Demo admin user"

kibanaserver:
  hash: "$2a$12$4AcgAt3xwOWadA5s5blL6ev39OXDNhmOesEoo33eZtrq2N0YrU3H."
  reserved: true
  description: "Demo user for the OpenSearch Dashboards server"

kibanaro:
  hash: "$2a$12$JJSXNfTowz7Uu5ttXfeYpeYE0arACvcwlPBStB1F.MI7f0U9Z4DGC"
  reserved: false
  backend_roles:
  - "kibanauser"
  - "readall"
  attributes:
    attribute1: "value1"
    attribute2: "value2"
    attribute3: "value3"
  description: "Demo read-only user for OpenSearch dashboards"

logstash:
  hash: "$2a$12$u1ShR4l4uBS3Uv59Pa2y5.1uQuZBrZtmNfqB3iM/.jL0XoV9sghS2"
  reserved: false
  backend_roles:
  - "logstash"
  description: "Demo logstash user"

readall:
  hash: "$2a$12$ae4ycwzwvLtZxwZ82RmiEunBbIPiAmGZduBAjKN0TXdwQFtCwARz2"
  reserved: false
  backend_roles:
  - "readall"
  description: "Demo readall user"

snapshotrestore:
  hash: "$2y$12$DpwmetHKwgYnorbgdvORCenv4NAK8cPUg8AI6pxLCuWf/ALc0.v7W"
  reserved: false
  backend_roles:
  - "snapshotrestore"
  description: "Demo snapshotrestore user"

nodes_dn.yml

nodes_dn.yml를 사용하면 인증서의 고유 이름(DN)을 허용 목록에 추가해서 노드나 클러스터 간 통신을 원하는 만큼 활성화할 수 있어요. 예를 들어 허용 목록에 DN CN=node1.example.com을 넣어 둔 노드는 그 DN을 사용하는 다른 노드나 인증서가 보낸 통신을 수락해요.

DN은 슈퍼 관리자나 Transport Layer Security(TLS) 인증서를 가진 관리자만 접근할 수 있는 시스템 인덱스에 인덱싱돼요. 프로그래밍 방식으로 허용 목록에 DN을 추가하고 싶다면 REST API를 사용하세요.

---
_meta:
  type: "nodesdn"
  config_version: 2

# Define nodesdn mapping name and corresponding values
# cluster1:
#   nodes_dn:
#       - CN=*.example.com

roles_mapping.yml

---
manage_snapshots:
  reserved: true
  hidden: false
  backend_roles:
  - "snapshotrestore"
  hosts: []
  users: []
  and_backend_roles: []
logstash:
  reserved: false
  hidden: false
  backend_roles:
  - "logstash"
  hosts: []
  users: []
  and_backend_roles: []
own_index:
  reserved: false
  hidden: false
  backend_roles: []
  hosts: []
  users:
  - "*"
  and_backend_roles: []
  description: "Allow full access to an index named like the username"
kibana_user:
  reserved: false
  hidden: false
  backend_roles:
  - "kibanauser"
  hosts: []
  users: []
  and_backend_roles: []
  description: "Maps kibanauser to kibana_user"
complex-role:
  reserved: false
  hidden: false
  backend_roles:
  - "ldap-analyst"
  hosts: []
  users:
  - "new-user"
  and_backend_roles: []
_meta:
  type: "rolesmapping"
  config_version: 2
all_access:
  reserved: true
  hidden: false
  backend_roles:
  - "admin"
  hosts: []
  users: []
  and_backend_roles: []
  description: "Maps admin to all_access"
readall:
  reserved: true
  hidden: false
  backend_roles:
  - "readall"
  hosts: []
  users: []
  and_backend_roles: []
kibana_server:
  reserved: true
  hidden: false
  backend_roles: []
  hosts: []
  users:
  - "kibanaserver"
  and_backend_roles: []

roles.yml

이 파일에는 Security 플러그인에 추가하고 싶은 초기 역할들이 들어 있어요. 기본적으로 이 파일에는 OpenSearch 기본 배포판에 포함된 플러그인의 사용을 허가하는 사전 정의된 역할들이 들어 있어요. Security 플러그인도 여러 정적 역할을 자동으로 추가해요.

---
complex-role:
  reserved: false
  hidden: false
  cluster_permissions:
  - "read"
  - "cluster:monitor/nodes/stats"
  - "cluster:monitor/task/get"
  index_permissions:
  - index_patterns:
    - "opensearch_dashboards_sample_data_*"
    dls: "{\"match\": {\"FlightDelay\": true}}"
    fls:
    - "~FlightNum"
    masked_fields:
    - "Carrier"
    allowed_actions:
    - "read"
  tenant_permissions:
  - tenant_patterns:
    - "analyst_*"
    allowed_actions:
    - "kibana_all_write"
  static: false
_meta:
  type: "roles"
  config_version: 2

tenants.yml

이 파일을 사용하면 OpenSearch Dashboards 테넌트를 원하는 만큼 지정해서 OpenSearch 클러스터에 추가할 수 있어요. 테넌트에 대한 자세한 내용은 OpenSearch Dashboards 멀티 테넌시를 참고하세요.

다른 YAML 파일들과 마찬가지로, 클러스터에 꼭 필요한 테넌트는 tenants.yml로 추가하고, 추가로 구성하거나 만들어야 할 테넌트가 있다면 OpenSearch Dashboards나 REST API를 사용하는 것을 권장해요.

---
_meta:
  type: "tenants"
  config_version: 2
admin_tenant:
  reserved: false
  description: "Demo tenant for admin user"

opensearch.yml

opensearch.yml 파일에는 많은 OpenSearch 설정 외에도 TLS 인증서 경로와 고유 이름, 신뢰할 수 있는 인증 기관 같은 인증서 속성이 들어 있어요. 이 파일은 <OPENSEARCH_HOME>/config/에서 찾을 수 있어요.

plugins.security.ssl.transport.pemcert_filepath: esnode.pem
plugins.security.ssl.transport.pemkey_filepath: esnode-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
transport.ssl.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: esnode.pem
plugins.security.ssl.http.pemkey_filepath: esnode-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.allow_unsafe_democertificates: true
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
  - CN=kirk,OU=client,O=client,L=test, C=de

plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.cache.ttl_minutes: 60
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.indices: [".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opendistro-notifications-*", ".opendistro-notebooks", ".opendistro-asynchronous-search-response*"]
node.max_local_storage_nodes: 3

opensearch.yml의 Security 플러그인 설정 전체 목록은 Security 설정을 참고하세요. {: .note}

구성 다듬기

plugins.security.allow_default_init_securityindex 설정을 true로 설정하면, OpenSearch가 시작할 때 보안 인덱스 생성 시도가 실패한 경우 Security 플러그인이 기본 보안 설정으로 설정돼요. 기본 보안 설정은 opensearch-project/security/config 디렉터리에 있는 YAML 파일에 저장돼요. 이 설정의 기본값은 false예요.

plugins.security.allow_default_init_securityindex: true

Security 플러그인에는 인증 속도를 높이는 데 도움이 되는 인증 캐시가 있어요. 백엔드에서 반환된 사용자 객체를 임시로 저장해서 Security 플러그인이 반복해서 요청할 필요가 없게 해 줘요. 캐시가 시간 초과되기까지 걸리는 시간을 정하려면 plugins.security.cache.ttl_minutes 속성을 사용해 분 단위 값을 설정하면 돼요. 기본값은 60이에요. 값을 0으로 설정하면 캐싱을 비활성화할 수 있어요.

plugins.security.cache.ttl_minutes: 60

사용자의 시스템 인덱스 접근 활성화하기

시스템 인덱스 권한을 사용자에게 매핑하면, 그 사용자는 권한 이름에 지정된 시스템 인덱스를 수정할 수 있어요(유일한 예외는 Security 플러그인의 시스템 인덱스예요). plugins.security.system_indices.permission.enabled 설정은 관리자가 이 권한을 역할 매핑에 사용할 수 있게 하거나 숨길 수 있는 방법을 제공해요.

true로 설정하면 이 기능이 활성화되고, 역할을 수정할 수 있는 권한을 가진 사용자가 시스템 인덱스 접근을 허가하는 권한을 포함하는 역할을 만들 수 있어요:

plugins.security.system_indices.permission.enabled: true

false로 설정하면 권한이 비활성화되고, 관리자 인증서를 가진 관리자만 시스템 인덱스를 변경할 수 있어요. 기본적으로 새 클러스터에서는 이 권한이 false로 설정돼요.

시스템 인덱스 권한에 대해 더 알아보려면 시스템 인덱스 권한을 참고하세요.

비밀번호 설정

사용자 비밀번호를 특정 검증 규칙으로 확인하고 싶다면, 이 파일에 정규 표현식(regex)을 지정하세요. 비밀번호가 검증을 통과하지 못했을 때 표시되는 오류 메시지도 포함할 수 있어요. 다음 예제는 새 비밀번호가 최소 8자 이상이고 대문자, 소문자, 숫자, 특수 문자를 각각 하나 이상 포함하도록 OpenSearch에 요구하는 regex를 포함하는 방법을 보여 줘요.

OpenSearch는 OpenSearch Dashboards나 REST API를 통해 만든 사용자와 비밀번호만 검증한다는 점에 유의하세요. 데모 구성 설치 프로그램이 요구하는 초기 관리자 비밀번호는 별도의 고정된 규칙 집합을 기준으로 검증돼요. 자세한 내용은 관리자 비밀번호 요구 사항과 비밀번호 관리를 참고하세요.

plugins.security.restapi.password_validation_regex: '(?=.*[A-Z])(?=.*[^a-zA-Z\d])(?=.*[0-9])(?=.*[a-z]).{8,}'
plugins.security.restapi.password_validation_error_message: "Password must be minimum 8 characters long and must contain at least one uppercase letter, one lowercase letter, one digit, and one special character."

또한 점수 기반 비밀번호 강도 추정기를 사용하면 새 내부 사용자를 만들거나 사용자 비밀번호를 업데이트할 때 비밀번호 강도에 대한 임계값을 설정할 수 있어요. 이 기능은 zxcvbn 라이브러리를 활용해 대문자, 숫자, 특수 문자 같은 전통적인 기준 충족 여부보다 비밀번호의 복잡성을 중시하는 정책을 적용해요.

사용자 정의에 대한 정보는 사용자 정의를 참고하세요.

이 기능은 예약(reserved)으로 지정된 사용자와는 호환되지 않아요. 예약 리소스에 대한 정보는 예약 및 숨김 리소스를 참고하세요. {: .important }

점수 기반 비밀번호 강도 기능을 구성하려면 두 가지 설정이 필요해요. 다음 표에서 이 두 설정을 설명해요.

설정 설명
plugins.security.restapi.password_min_length 비밀번호 길이의 최소 문자 수를 설정해요. 기본값은 8이고, 이 값이 곧 최솟값이기도 해요.
plugins.security.restapi.password_score_based_validation_strength 비밀번호가 강한지 약한지 판단하는 임계값을 설정해요. 임계값의 복잡도가 점점 높아지는 네 가지 값이 있어요.
fair--매우 "추측 가능한" 비밀번호: 속도 제한이 적용된 온라인 공격으로부터 보호를 제공해요.
good--다소 추측 가능한 비밀번호: 속도 제한이 없는 온라인 공격으로부터 보호를 제공해요.
strong--안전하게 "추측 불가능한" 비밀번호: 오프라인 slow-hash 시나리오로부터 중간 수준의 보호를 제공해요.
very_strong--매우 추측 불가능한 비밀번호: 오프라인 slow-hash 시나리오로부터 강력한 보호를 제공해요.

다음 예제는 opensearch.yml 파일에 구성된 설정과 함께, 최소 10자 비밀번호와 가장 높은 강도를 요구하는 임계값을 활성화하는 모습을 보여 줘요:

지정된 임계값에 미치지 못하는 비밀번호로 사용자를 만들려고 하면 "약한 비밀번호" 경고가 생성되고, 사용자를 저장하기 전에 비밀번호를 수정해야 한다는 사실을 알려 줘요.

다음 예제는 비밀번호가 약할 때 Create user API가 반환하는 응답이에요:

더 알아보기 (Learn more)