Oracle 데이터베이스 시크릿 엔진

Oracle 데이터베이스 시크릿 엔진 (Oracle database secrets engine)

Oracle 데이터베이스 플러그인으로 Oracle 자격 증명을 동적으로 생성하는 방법을 다룹니다.

출처: 문서

본문

Enterprise에요. 적절한 Vault Enterprise 라이선스가 필요합니다.

Oracle 데이터베이스 플러그인은 이제 AWS의 HCP Vault Dedicated에서 데이터베이스 시크릿 엔진과 함께 사용할 수 있어요. 플러그인 구성(Oracle Instant Client 라이브러리 설치 포함)은 HCP가 관리합니다. 자세한 내용은 HCP Vault Dedicated 탭을 참고하세요.

이 시크릿 엔진은 데이터베이스 시크릿 엔진의 일부예요. database backend 페이지를 아직 읽지 않았다면 지금 읽어 주세요. 데이터베이스 백엔드를 설정하는 방법과 엔진이 기능하는 방식에 대한 개요를 설명합니다.

Oracle은 데이터베이스 시크릿 엔진이 지원하는 플러그인 중 하나예요. Oracle 데이터베이스에 대해 구성된 역할을 기반으로 자격 증명을 동적으로 생성할 수 있으며 정적 역할(static roles)도 지원합니다.

Oracle 데이터베이스 시크릿 플러그인의 첫 번째 엔터프라이즈 버전은 0.11.0이에요. Vault 호환성 요구사항은 Plugin management 페이지의 Enterprise plugins 섹션을 참고하세요.

기능 (Capabilities)

Orcale 데이터베이스 플러그인은 코어 Vault 코드 트리에 번들되지 않아요.

linux/amd64의 경우 releases page에서 사전 빌드된 바이너리를 다운로드하세요.

Oracle database plugin release notes를 참고하세요.

이 플러그인은 기본적으로 Alpine Linux와 호환되지 않아요.

플러그인 이름 루트 자격 증명 회전 동적 역할 정적 역할 사용자명 커스터마이즈
Customizable (see: Custom Plugins) Yes Yes Yes Yes (1.7+)

HCP Vault Dedicated에서는 Oracle Database Plugin을 HCP 플랫폼이 관리합니다. HCP Vault Dedicated에 추가 설치 단계는 필요 없어요.

플러그인 이름 루트 자격 증명 회전 동적 역할 정적 역할 사용자명 커스터마이즈
vault-plugin-database-oracle Yes Yes Yes Yes

설정 (Setup)

Oracle 데이터베이스 플러그인은 코어 Vault 코드 트리에 번들되지 않아요. linux/amd64용 사전 빌드 바이너리는 releases page에서 찾을 수 있습니다.

플러그인을 실행하기 전에 Oracle Instant Client 라이브러리를 설치해야 해요. 이는 Oracle에서 다운로드할 수 있으며, 기본 라이브러리 검색 경로에 넣거나 ld.so.conf 구성 파일에 정의해야 합니다.

Oracle 플러그인 호환성

다음 매트릭스를 사용해 0.11.0+ent부터 0.14.1+ent까지 모든 Enterprise 플러그인 릴리스에 대한 Vault Enterprise 요구사항과 테스트된 런타임 Instant Client 버전을 확인하세요.

Vault 요구사항은 플러그인 등록 전제 조건과 릴리스별 요구사항에 따라, 플러그인이 출시될 때 사용 가능했던 가장 새로운 Vault 마이너 라인으로 시작합니다.

플러그인 릴리스 Vault Enterprise 요구사항 Instant Client 19.x Instant Client 21.x Instant Client 23.x
0.14.1+ent 1.21.0+ Tested: 19.26.0.0.0, 19.32.0.0.0 Tested: 21.19.0.0.0 Tested: 23.9.0.25.07
0.14.0+ent 1.21.0+ Tested: 19.26.0.0.0 Untested Untested
0.13.0+ent 1.21.0+ Tested: 19.26.0.0.0 Untested Untested
0.12.3+ent 1.19.4+ Untested Untested Untested
0.11.0+ent 1.19.4+ Untested Untested Untested

1.19.4+ 하한은 0.11.0+ent 출시 당시 사용 가능한 패치가 아니라 Enterprise 플러그인 등록 전제 조건을 반영합니다. 플러그인 0.13.0+ent는 Vault 1.21.0 이전에 나왔지만, 그 release notes는 명시적으로 1.21.0+을 요구합니다.

  • Tested 는 동적 자격 증명, 폐기, 관리자 자격 증명 회전, 관리·셀프 매니지드 정적 역할을 포함해, 표시된 정확한 플러그인·클라이언트 버전에 대해 8가지 기능 검증 확인이 모두 통과했음을 의미합니다.
  • Untested 는 해당 플러그인·클라이언트 패밀리에 대해 완료된 기능 검증 결과가 기록되지 않았음을 의미합니다. 비호환을 뜻하지 않아요.

테스트는 Ubuntu 22.04(linux/amd64, QEMU 에뮬레이션)와 Oracle Database XE 21.3.0.0.0을 사용합니다. 각 테스트된 플러그인/클라이언트 쌍의 요구사항을 충족하는 테스트된 Vault Enterprise 버전은 1.21.10+ent, 2.0.4+ent, 2.1.0+ent입니다. 이 결과는 나열된 클라이언트 패치와 테스트 환경에만 적용되며 전체 클라이언트 패밀리나 다른 플랫폼에는 적용되지 않습니다. Vault 요구사항은 지원 기준선이며, 이 기능 테스트로 검증된 최초 패치가 아닙니다.

나열된 모든 플러그인 릴리스는 빌드 SDK로 Instant Client 19.26을 사용합니다. 빌드 SDK 버전이나 성공적인 라이브러리 로딩 확인이 런타임 검증을 확립하지는 않습니다.

플러그인 구성

최소 기능을 위해 플러그인에 다음 권한이 필요해요. 데이터베이스 역할에 구성된 SQL에 따라 추가 권한이 필요할 수 있습니다.

GRANT CREATE USER to vault WITH ADMIN OPTION;
GRANT ALTER USER to vault WITH ADMIN OPTION;
GRANT DROP USER to vault WITH ADMIN OPTION;
GRANT CONNECT to vault WITH ADMIN OPTION;
GRANT CREATE SESSION to vault WITH ADMIN OPTION;
GRANT SELECT on gv_$session to vault;
GRANT SELECT on v_$sql to vault;
GRANT ALTER SYSTEM to vault WITH ADMIN OPTION;

Vault는 사용자를 폐기할 때 사용자 세션을 종료하기 위해 ALTER SYSTEM이 필요해요. 이는 저장 프로시저로 대체해 Vault 관리자 사용자에게 부여할 수 있습니다.

mlock을 활성화한 상태로 Vault를 실행한다면 플러그인 바이너리에 ipc_lock capabilities를 활성화해야 해요.

  1. 데이터베이스 시크릿 엔진이 아직 활성화되지 않았다면 활성화해요.
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/

기본적으로 시크릿 엔진은 엔진 이름으로 활성화돼요. 다른 경로에 활성화하려면 -path 인자를 사용하면 됩니다.

  1. 플러그인을 다운로드해 등록해요.
$ vault write sys/plugins/catalog/database/vault-plugin-database-oracle \
    sha256="..." \
    command=vault-plugin-database-oracle
  1. 적절한 플러그인과 연결 정보로 Vault를 구성해요.
$ vault write database/config/my-oracle-database \
    plugin_name=vault-plugin-database-oracle \
    connection_url="{{username}}/{{password}}@localhost:1521/OraDoc.localhost" \
    allowed_roles="my-role" \
    username="VAULT_SUPER_USER" \
    password="myreallysecurepassword"

Oracle이 SSL을 사용한다면 SSL을 사용한 연결 예제를 참고하세요.

사용 중인 Oracle 버전에 컨테이너 데이터베이스가 있다면 connection_url 필드에서 컨테이너 데이터베이스가 아닌 플러그형 데이터베이스 중 하나에 연결해야 해요.

  1. "root" 사용자의 비밀번호를 즉시 회전할 것을 강력히 권장합니다. 자세한 내용은 Rotate Root Credentials을 참고하세요. 이렇게 하면 Vault가 동적·정적 자격 증명을 조작하는 데 사용하는 "root" 사용자에 Vault만 접근할 수 있게 보장됩니다.

주의하세요: root 사용자의 비밀번호는 회전되면 접근할 수 없게 되므로, 실제 root 사용자 대신 Vault가 사용할 전용 사용자를 만드는 것을 강력히 권장합니다.

  1. Vault의 이름을 데이터베이스 자격 증명을 만드는 SQL 문에 매핑하는 역할을 구성해요.
$ vault write database/roles/my-role \
    db_name=my-oracle-database \
    creation_statements='CREATE USER {{username}} IDENTIFIED BY "{{password}}"; GRANT CONNECT TO {{username}}; GRANT CREATE SESSION TO {{username}};' \
    default_ttl="1h" \
    max_ttl="24h"

참고: creation_statements는 파일에 지정하고 Vault CLI가 @ 기호로 해석하게 할 수 있어요:

$ vault write database/roles/my-role \
    creation_statements=@creation_statements.sql \
    ...

자세한 내용은 Commands 문서를 참고하세요.

정적 역할을 위한 Rootless 구성과 비밀번호 회전

Enterprise에요. 적절한 Vault Enterprise 라이선스가 필요합니다.

Oracle 데이터베이스 플러그인은 rootless DB 연결 구성으로 정적 역할(비밀번호 회전 포함)을 지원합니다.

rootless 구성으로는 연결 구성을 위해 권한 있는 루트 계정이 필요 없이, 정적 DB 사용자를 온보딩하고 Vault를 통한 정적 역할 회전을 사용할 수 있어요. 단일 루트 연결을 사용하는 대신 각 정적 역할은 데이터베이스에 대한 여러 전용 연결을 가집니다. 데이터베이스 사용자를 가능한 최소 권한 집합으로 정적 역할에 온보딩할 것을 강력히 권장합니다. 각 정적 역할은 데이터베이스에 새 연결을 열며, 최소 권한 부여는 Vault가 외부 시스템에 여러 고권한 연결을 만들지 않게 도와줍니다.

rootless 연결에서 out-of-band 비밀번호 회전이 발생하면 Vault가 데이터베이스 사용자와 동기화되지 않을 수 있어요. 관련 회전 오류를 해결하려면 외부 Oracle 데이터베이스에서 비밀번호를 수동으로 업데이트해야 합니다.

Vault는 rootless DB 연결에서 동적 역할/자격 증명을 지원하지 않아요.

설정:

  1. 데이터베이스 시크릿 엔진을 활성화해요. ($ vault secrets enable database)
  2. 루트 자격 증명 없이 데이터베이스에 연결을 구성하고 self_managed 파라미터로 rootless 워크플로를 활성화해요. 예:
$ vault write database/config/my-oracle-database \
plugin_name="vault-plugin-database-oracle" \
allowed_roles="my-role" \
connection_url="{{username}}/{{password}}@//localhost:1521/database-name" \
self_managed=true
  1. password 파라미터로 Oracle 데이터베이스의 사용자에게 전용 연결을 만드는 정적 역할을 구성해요. 예:
$ vault write database/static-roles/my-role \
db_name="my-oracle-database" \
username="staticuser" \
password="password" \
rotation_period="1h"
  1. vault read로 새 정적 자격 증명을 확인해요. 예:
$ vault read database/static-creds/my-role
Key                    Value
---                    -----
last_vault_rotation    2024-09-11T14:15:13.764783-07:00
password               XZY42BVc-UO5bMsbgxrW
rotation_period        1h
ttl                    59m55s
username               staticuser

SSL을 사용한 연결 (Connect using SSL)

Vault가 연결하려는 Oracle 서버가 SSL 리스너를 사용한다면 데이터베이스 플러그인에 connection_url 파라미터로 추가 구성이 필요해요.

vault write database/config/oracle \
  plugin_name=vault-plugin-database-oracle \
  connection_url='{{username}}/{{password}}@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=<HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVICE>))(SECURITY=(SSL_SERVER_CERT_DN="<DN>")(MY_WALLET_DIRECTORY=<WALLET_DIR>)))' \
  allowed_roles="my-role" \
  username="admin" \
  password="password"

예를 들어 연결·검증에 사용할 SSL 서버 인증서 DN과 Oracle Wallet 경로는 이렇게 구성할 수 있어요.

vault write database/config/oracle \
  plugin_name=vault-plugin-database-oracle \
  connection_url='{{username}}/{{password}}@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=hashicorp.com)(PORT=1523))(CONNECT_DATA=(SERVICE_NAME=ORCL))(SECURITY=(SSL_SERVER_CERT_DN="CN=hashicorp.com,OU=TestCA,O=HashiCorp=com")(MY_WALLET_DIRECTORY=/etc/oracle/wallets)))' \
  allowed_roles="my-role" \
  username="admin" \
  password="password"
Wallet 권한

참고: SSL로 연결할 때 사용하는 wallet은 고가용성 클러스터를 사용할 때 모든 Vault 서버에 있어야 해요.

Vault가 사용하는 wallet은 잘 알려진 위치에 적절한 파일시스템 권한과 함께 있어야 해요. 예를 들어 Vault가 vault 사용자로 실행 중이라면 wallet 디렉터리는 이렇게 설정할 수 있습니다.

mkdir -p /etc/vault/wallets
cp cwallet.sso /etc/vault/wallets/cwallet.sso
chown -R vault:vault /etc/vault
chmod 600 /etc/vault/wallets/cwallet.sso

TNS 이름 사용 (Using TNS names)

참고: SSL로 연결할 때 사용하는 tnsnames.ora 파일과 환경 변수는 고가용성 클러스터를 사용할 때 모든 Vault 서버에 있어야 해요.

Vault는 tnsnames.ora 파일을 사용해 Oracle 데이터베이스에 연결할 때 연결 문자열에서 TNS 이름을 선택적으로 사용할 수 있어요. tnsnames.ora 파일의 예는 다음과 같습니다.

AWSEAST=
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCPS)(HOST = hashicorp.us-east-1.rds.amazonaws.com)(PORT = 1523))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
  )
  (SECURITY =
      (SSL_SERVER_CERT_DN = "CN=hashicorp.rds.amazonaws.com/OU=RDS/O=Amazon.com/L=Seattle/ST=Washington/C=US")
      (MY_WALLET_DIRECTORY = /etc/oracle/wallet/east)
  )
)

AWSWEST=
(DESCRIPTION =
  (ADDRESS = (PROTOCOL = TCPS)(HOST = hashicorp.us-west-1.rds.amazonaws.com)(PORT = 1523))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SID = ORCL)
  )
  (SECURITY =
      (SSL_SERVER_CERT_DN = "CN=hashicorp.rds.amazonaws.com/OU=RDS/O=Amazon.com/L=Seattle/ST=Washington/C=US")
      (MY_WALLET_DIRECTORY = /etc/oracle/wallet/west)
  )
)

Vault가 TNS 이름을 사용하도록 구성하려면 Vault 서버에 다음 환경 변수를 설정하세요.

TNS_ADMIN=/path/to/tnsnames/directory

참고: Vault가 "could not open file" 오류를 반환하면 TNS_ADMIN 환경 변수가 Vault 서버에 있는지 다시 확인하세요.

데이터베이스 구성의 connection_url 파라미터에서 별칭(alias)을 사용해요.

vault write database/config/oracle-east \
    plugin_name=vault-plugin-database-oracle \
    connection_url="{{username}}/{{password}}@AWSEAST" \
    allowed_roles="my-role" \
    username="VAULT_SUPER_USER" \
    password="myreallysecurepassword"

vault write database/config/oracle-west \
    plugin_name=vault-plugin-database-oracle \
    connection_url="{{username}}/{{password}}@AWSWEST" \
    allowed_roles="my-role" \
    username="VAULT_SUPER_USER" \
    password="myreallysecurepassword"

HCP Vault Dedicated 기준:

  1. 데이터베이스 시크릿 엔진을 활성화해요. ($ vault secrets enable database)
  2. 적절한 플러그인과 연결 정보로 Vault를 구성해요. plugin-name은 vault-plugin-database-oracle로 설정해야 해요.

참고: connection_url 파라미터의 your-oracle-host를 Oracle 서버의 호스트네임으로 바꾸세요.

$ vault write database/config/my-oracle-database \
    plugin_name=vault-plugin-database-oracle \
    connection_url="{{username}}/{{password}}@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=your-oracle-host)(PORT=1521))(CONNECT_DATA=(SID=ORCL)))" \
    allowed_roles="my-role" \
    username="VAULT_SUPER_USER" \
    password="myreallysecurepassword"

HCP Vault Dedicated는 현재 AWS RDS(Relational Database Service)의 Oracle에 대한 SSL 연결을 지원합니다. Oracle이 AWS RDS에 배포되고 SSL을 사용한다면 HCP Vault Dedicated에서 SSL을 사용한 연결 예제를 참고하세요.

  1. "root" 사용자의 비밀번호를 즉시 회전할 것을 강력히 권장합니다. (Rotate Root Credentials 참고) 이렇게 하면 Vault가 동적·정적 자격 증명을 조작하는 데 사용하는 "root" 사용자에 Vault만 접근할 수 있게 보장됩니다.
  2. Vault의 이름을 데이터베이스 자격 증명을 만드는 SQL 문에 매핑하는 역할을 구성해요. (위 Vault 예제와 동일)

HCP Vault Dedicated에서 SSL을 사용한 연결

Oracle RDS에서 SSL을 사용하기 전에 SSL이 있는 옵션 그룹을 구성하고 다음을 설정해야 해요.

  • SQLNET.SSL_VERSION을 1.2로
  • SQLNET.CIPHER_SUITE를 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 중 하나로

Vault가 연결하려는 AWS RDS Oracle 인스턴스가 SSL 리스너를 사용한다면 데이터베이스 플러그인에 connection_url 파라미터로 추가 구성이 필요해요.

  • Wallet 위치·권한은 HCP 플랫폼이 관리합니다. wallet은 /etc/vault.d/plugin/oracle/ssl_wallet에서 사용할 수 있어요.
  • 현재 AWS RDS CA의 DN 형식은 SECURITY=(SSL_SERVER_CERT_DN="C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=your-rds-endpoint-url")입니다.
  • RDS 옵션 그룹에 SSL을 추가하고 SSL이 있는 옵션 그룹을 Oracle RDS 인스턴스에 적용하면 2484 포트의 리스너가 활성화됩니다.
  • HOST와 DN 파라미터의 your-rds-endpoint-url을 RDS 인스턴스의 엔드포인트로 바꾸세요.

참고: AWS RDS에서 SSL/TLS 사용에 대한 자세한 내용은 Using SSL/TLS to encrypt a connetion to a DB instance AWS 문서를 참고하세요.

$ vault write database/config/my-oracle-database \
  plugin_name=vault-plugin-database-oracle \
  connection_url="{{username}}/{{password}}@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=your-rds-endpoint-url)(PORT=2484))(CONNECT_DATA=(SERVICE_NAME=ORCL))(SECURITY=(SSL_SERVER_CERT_DN="C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=your-rds-endpoint-url")(MY_WALLET_DIRECTORY=/etc/vault.d/plugin/oracle/ssl_wallet)))" \
  allowed_roles="my-role" \
  username="admin" \
  password="password"

TNS 이름 사용: tnsnames.ora 구성은 현재 HCP Vault Dedicated에서 사용할 수 없어요.

사용법 (Usage)

동적 자격 증명 (Dynamic credentials)

시크릿 엔진이 구성되고 사용자/머신이 적절한 권한을 가진 Vault 토큰을 가지면 자격 증명을 생성할 수 있어요.

  1. 역할 이름으로 /creds 엔드포인트를 읽어 새 자격 증명을 생성해요.
$ vault read database/creds/my-role
Key                Value
---                -----
lease_id           database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
password           yRUSyd-vPYDg5NkU9kDg
username           V_VAULTUSE_MY_ROLE_SJJUK3Q8W3BKAYAN8S62_1602543009

API

구성 가능한 전체 옵션 목록은 Oracle database plugin API 페이지에서 확인할 수 있어요.

데이터베이스 시크릿 엔진 HTTP API에 대한 자세한 내용은 Database secrets engine API 페이지를 참고하세요.

더 알아보기 (Learn more)