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

User and role management

원문 보기 위키 갱신

출처: 문서

본문

사용자 및 역할 관리

OpenSearch Security 플러그인을 사용해 OpenSearch 클러스터에 대한 접근을 제어하려면 사용자 및 역할 관리가 필수예요. 기본적으로 오퍼레이터는 기본 사용자가 포함된 데모 보안 설정을 사용해요. 프로덕션 설치에서는 이를 여러분만의 설정으로 교체하세요.

보안은 두 가지 방법으로 설정할 수 있어요:

  • 직접 보안 설정 정의하기
  • Kubernetes 리소스로 사용자와 역할 관리하기

두 방식을 조합해서 사용하는 것은 지원되지 않아요. CRD 사용을 시작하고 나면 서로 덮어쓰기 때문에 직접 보안 설정을 제공할 수 없어요. {: .note}

직접 보안 설정 정의하기

커스텀 사용자와 역할이 담긴 보안 설정을 직접 제공할 수 있어요. 필요한 보안 설정 YAML 파일을 모두 담은 시크릿을 제공하세요.

OpenSearchCluster 커스텀 리소스에서 다음 필드를 사용해 보안을 설정하세요:

# ...
spec:
  security:
    config: # Everything related to the security configuration
      securityConfigSecret:
        name: # Name of the secret that contains the security configuration files
      adminSecret:
        name: # Name of a secret that contains the admin client certificate
      adminCredentialsSecret:
        name: # Name of a secret that contains username/password for admin access
# ...

{% include copy.html %}

보안 설정 YAML 파일이 담긴 시크릿의 이름을 securityConfigSecret.name으로 지정하세요. 이 시크릿은 여러분이 관리하는 기준 설정 역할을 해요.

오퍼레이터는 <cluster-name>-security-config-generated라는 이름의 자체 런타임 시크릿을 만들고 여러분의 파일을 그 안에 복사해요. 시크릿을 제공하지 않으면 오퍼레이터는 번들로 제공되는 기본값을 사용해요. 오퍼레이터는 클러스터에 설정을 적용하기 전에 admin 및 OpenSearch Dashboards(kibanaserver) 사용자의 비밀번호 해시를 자동으로 업데이트해요.

이제 보안 설정 시크릿에서 admin 또는 kibanaserver 사용자의 비밀번호 해시를 제공할 필요가 없어요. 오퍼레이터가 credentials 시크릿에서 비밀번호 해시를 자동으로 생성하고, 이 사용자들에 대해 보안 설정 시크릿에 제공한 해시 값은 모두 덮어써요. 즉, 비밀번호를 credentials 시크릿과 보안 설정 시크릿 두 곳이 아니라 한 곳(credentials 시크릿)에서만 관리하면 돼요. {: .important}

OpenSearch는 클러스터를 처음 생성할 때 모든 파일이 적용되기를 요구해요. 보안 설정 시크릿에 제공하지 않은 파일에는 오퍼레이터가 Security 플러그인에 포함된 기본 파일을 사용해요. {: .note}

기본 파일을 사용하지 않으려면 각 파일에 최소한의 설정이라도 제공하세요:

tenants.yml: |-
  _meta:
    type: "tenants"
    config_version: 2

{% include copy.html %}

이 최소 설정 파일들은 나중에 시크릿에서 제거할 수 있어요. 그러면 다른 설정 파일을 수정할 때 CRD나 REST API로 생성한 리소스를 덮어쓰지 않아요.

오퍼레이터가 OpenSearch와 통신할 때 사용할 사용자를 위해, username과 password 필드가 담긴 시크릿을 adminCredentialsSecret.name으로 제공할 수 있어요. 오퍼레이터는 이 사용자를 클러스터 상태 조회, 헬스 체크 수행, 클러스터 스케일링 작업 중 노드 드레이닝 조정에 사용해요.

이 필드를 생략하면 오퍼레이터가 기본 admin 사용자 이름과 무작위 비밀번호로 <cluster-name>-admin-password를 자동 생성해요. 그런 다음 비밀번호 해시를 생성해서 생성된 보안 설정에 추가해요.

직접 시크릿을 제공하면 오퍼레이터가 여러분의 시크릿에서 비밀번호를 읽고, 해시를 생성하고, 원본 시크릿은 수정하지 않은 채 생성된 보안 설정에 추가해요.

마찬가지로 OpenSearch Dashboards의 경우 dashboards.opensearchCredentialsSecret을 제공하지 않으면, 오퍼레이터가 kibanaserver 사용자용 무작위 비밀번호로 <cluster-name>-dashboards-password를 자동 생성하고, 비밀번호 해시를 자동으로 생성해서 생성된 보안 설정에 추가해요.

HTTP에 대한 TLS도 설정해야 해요. 필요한 인증서를 모두 오퍼레이터가 생성하게 할 수도 있고, 직접 제공할 수도 있어요. 직접 만든 인증서를 사용한다면, 오퍼레이터가 보안 설정을 적용할 때 사용할 admin 인증서도 함께 제공해야 해요.

HTTP 위의 TLS용 인증서를 직접 제공한다면, admin 클라이언트 인증서(ca.crt, tls.key, tls.crt 필드를 가진 Kubernetes TLS 시크릿 형태)도 adminSecret.name으로 제공해야 해요. 인증서의 DN은 security.tls.http.adminDn 아래에 나열되어야 해요.

adminDn은 admin 인증서가 노드 인증서로 사용되거나 인식될 수 없도록 정의해야 해요. 그렇지 않으면 OpenSearch가 admin 인증서를 사용한 인증 요청을 모두 거부해요. {: .important}

오퍼레이터는 OpenSearch 클러스터에 보안 설정을 적용하기 위해 별도의 Kubernetes job(<cluster-name>-securityconfig-update라는 이름)을 사용해요. 이 job은 클러스터 초기 프로비저닝 중에 실행돼요. 오퍼레이터는 보안 설정이 담긴 시크릿의 변경 사항도 감시하고, 변경이 감지되면 업데이트 job을 다시 실행해 새 설정을 적용해요. 오퍼레이터는 일정한 간격으로만 변경 여부를 확인하기 때문에 변경 사항이 적용되는 데 1~2분 정도 걸릴 수 있다는 점에 유의하세요. 몇 분이 지나도 변경 사항이 적용되지 않으면 kubectl로 <cluster-name>-securityconfig-update job의 pod 로그를 확인하세요. 설정에 오류가 있다면 거기에 보고돼요.

Kubernetes 리소스로 보안 설정 관리하기

오퍼레이터는 사용자, 역할, 액션 그룹, 테넌트 같은 보안 설정 리소스를 Kubernetes 오브젝트로 생성, 업데이트, 관리할 수 있는 커스텀 Kubernetes 리소스를 제공해요.

OpenSearch 사용자

오퍼레이터로 Kubernetes에서 OpenSearch 사용자를 관리할 수 있어요. 오퍼레이터는 이미 존재하는 사용자는 수정하지 않아요. 예시 사용자는 다음과 같이 만들 수 있어요:

apiVersion: opensearch.org/v1
kind: OpensearchUser
metadata:
  name: sample-user
  namespace: default
spec:
  opensearchCluster:
    name: my-first-cluster
  passwordFrom:
    name: sample-user-password
    key: password
  backendRoles:
    - kibanauser

{% include copy.html %}

OpenSearchUser의 네임스페이스는 OpenSearch 클러스터 자체가 배포된 네임스페이스여야 해요.

default 네임스페이스에 sample-user-password라는 시크릿이 존재하고, password 키에 Base64로 인코딩된 비밀번호가 담겨 있어야 해요. {: .note}

여러 사용자의 비밀번호를 같은 시크릿에 저장할 수도 있어요. 그러려면 각 키가 사용자 이름과 같고 그 값이 사용자 비밀번호인 시크릿을 만드세요. 그렇게 하지 않으면 시크릿 변경이 사용자 조정(reconciliation)을 트리거하지 않아요.

OpenSearch 역할

오퍼레이터로 Kubernetes에서 OpenSearch 역할을 관리할 수 있어요. 오퍼레이터는 이미 존재하는 역할은 수정하지 않아요. 예시 역할은 다음과 같이 만들 수 있어요:

apiVersion: opensearch.org/v1
kind: OpensearchRole
metadata:
  name: sample-role
  namespace: default
spec:
  opensearchCluster:
    name: my-first-cluster
  clusterPermissions:
    - cluster_composite_ops
    - cluster_monitor
  indexPermissions:
    - indexPatterns:
        - logs*
      allowedActions:
        - index
        - read

{% include copy.html %}

OpenSearch 사용자와 역할 연결하기

오퍼레이터를 사용하면 OpensearchUserRoleBinding으로 사용자, 백엔드 역할, 역할을 원하는 만큼 연결할 수 있어요. 바인딩에 포함된 각 사용자는 각 역할을 부여받아요:

apiVersion: opensearch.org/v1
kind: OpensearchUserRoleBinding
metadata:
  name: sample-urb
  namespace: default
spec:
  opensearchCluster:
    name: my-first-cluster
  users:
    - sample-user
  backendRoles:
    - sample-backend-role
  roles:
    - sample-role

{% include copy.html %}

OpenSearch 액션 그룹

오퍼레이터로 Kubernetes에서 OpenSearch 액션 그룹을 관리할 수 있어요. 오퍼레이터는 이미 존재하는 액션 그룹은 수정하지 않아요. 예시 액션 그룹은 다음과 같이 만들 수 있어요:

apiVersion: opensearch.org/v1
kind: OpensearchActionGroup
metadata:
  name: sample-action-group
  namespace: default
spec:
  opensearchCluster:
    name: my-first-cluster
  allowedActions:
    - indices:admin/aliases/get
    - indices:admin/aliases/exists
  type: index
  description: Sample action group

{% include copy.html %}

OpenSearch 테넌트

오퍼레이터로 Kubernetes에서 OpenSearch 테넌트를 관리할 수 있어요. 오퍼레이터는 이미 존재하는 테넌트는 수정하지 않아요. 예시 테넌트는 다음과 같이 만들 수 있어요:

apiVersion: opensearch.org/v1
kind: OpensearchTenant
metadata:
  name: sample-tenant
  namespace: default
spec:
  opensearchCluster:
    name: my-first-cluster
  description: Sample tenant

{% include copy.html %}

커스텀 admin 사용자

기본값과 다른 admin 사용자로 클러스터를 만들려면 직접 admin credentials 시크릿을 제공하세요. 오퍼레이터가 비밀번호 해시를 자동으로 생성해서 보안 설정에 추가해 주기 때문에, 더 이상 보안 설정 시크릿에 비밀번호 해시를 직접 생성해서 넣을 필요가 없어요.

먼저 admin 사용자 설정이 담긴 시크릿을 만드세요(이 예제에서는 admin-credentials-secret):

apiVersion: v1
kind: Secret
metadata:
  name: admin-credentials-secret
type: Opaque
data:
  # admin
  username: YWRtaW4=
  # admin123
  password: YWRtaW4xMjM=

{% include copy.html %}

보안 설정 시크릿에 비밀번호 해시를 포함할 필요는 없어요. 오퍼레이터가 자동으로 다음을 수행해요:

  1. adminCredentialsSecret에서 비밀번호를 읽어요.
  2. bcrypt 해시를 생성해요.
  3. 생성된 보안 설정 시크릿(<cluster-name>-security-config-generated)에서 admin 사용자의 해시를 덮어써요. {: .important}

직접 보안 설정 시크릿을 제공하는 경우 admin 사용자 정의를 선택적으로 포함할 수 있지만, 제공한 해시는 오퍼레이터가 자동으로 덮어써요:

internal_users.yml: |-
  _meta:
    type: "internalusers"
    config_version: 2
  admin:
    # hash field is optional - operator will override it automatically
    reserved: true
    backend_roles:
    - "admin"
    description: "Demo admin user"

{% include copy.html %}

cluster.yaml 파일에 다음 보안 설정을 추가하세요:

security:
  config:
    adminCredentialsSecret:
      name: admin-credentials-secret # The secret with the admin credentials for the operator to use
    securityConfigSecret:
      name: securityconfig-secret # Optional: The secret containing your customized security configuration
  tls:
    transport:
      generate: true
    http:
      generate: true

{% include copy.html %}

최소한 security.tls 섹션은 보안이 활성화된 상태로 클러스터를 시작하기 위해 필요해요. transport와 http 양쪽에 generate: true를 설정하면 오퍼레이터가 필요한 TLS 인증서를 자동으로 생성해요. 또한 오퍼레이터는 admin 및 OpenSearch Dashboards credentials 시크릿(<cluster-name>-admin-password와 <cluster-name>-dashboards-password)이 명시적으로 지정되지 않은 경우 자동으로 생성해요. {: .note}

admin 비밀번호 변경하기

클러스터를 만든 후 admin 비밀번호를 변경하려면 admin-credentials-secret에서 비밀번호를 업데이트하세요. 오퍼레이터가 자동으로 다음을 수행해요:

  1. 비밀번호 변경을 감지해요.
  2. 새 비밀번호 해시를 생성해요.
  3. 생성된 보안 설정 시크릿을 업데이트해요.
  4. 보안 설정 업데이트 job을 트리거해서 변경 사항을 OpenSearch에 적용해요.

더 이상 보안 설정 시크릿에서 비밀번호 해시를 직접 업데이트할 필요가 없어요.

커스텀 OpenSearch Dashboards 사용자

OpenSearch Dashboards가 클러스터에 연결하려면 OpenSearch 사용자(보통 kibanaserver)가 필요해요.

커스텀 credentials 시크릿을 제공하지 않으면 오퍼레이터가 자동으로 다음을 수행해요:

  1. kibanaserver 사용자용 무작위 비밀번호로 <cluster-name>-dashboards-password라는 시크릿을 생성해요.
  2. 비밀번호 해시를 생성해서 생성된 보안 설정 시크릿에 자동으로 추가해요.
  3. OpenSearch Dashboards가 이 credentials를 사용하도록 설정해요.

커스텀 credentials를 사용하려면 username과 password 키를 가진 시크릿을 만들고, 클러스터 spec으로 오퍼레이터에 전달하세요:

spec:
  dashboards:
    opensearchCredentialsSecret:
      name: dashboards-credentials # This is the name of your secret that contains the credentials for OpenSearch Dashboards to use

{% include copy.html %}

admin 사용자를 설정할 때와 마찬가지로, 보안 설정 시크릿에 kibanaserver 사용자의 비밀번호 해시를 포함할 필요는 없어요. 오퍼레이터가 자동으로 다음을 수행해요:

  1. opensearchCredentialsSecret에서 비밀번호를 읽어요(제공하지 않은 경우 생성된 무작위 비밀번호를 사용해요).
  2. bcrypt 해시를 생성해요.
  3. 생성된 보안 설정 시크릿에서 kibanaserver 사용자의 해시를 덮어써요. {: .important}

더 알아보기 (Learn more)