Cassandra์šฉ TLS ๊ตฌ์„ฑ

์ด ์ฃผ์ œ์—์„œ๋Š” Cassandra ๋…ธ๋“œ์™€ ํด๋ผ์ด์–ธํŠธ ๋ฐ Cassandra ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•œ ์ธ์ฆ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋Ÿฐํƒ€์ž„ ์˜์—ญ์—์„œ Cassandra์šฉ TLS๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

Cassandra๋Š” ํด๋ผ์ด์–ธํŠธ ๋จธ์‹ ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ„ ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋…ธ๋“œ ๊ฐ„์˜ ๋ณด์•ˆ ํ†ต์‹ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋™ ์ค‘์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋˜์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Apigee Hybrid์—์„œ๋Š” TLS๊ฐ€ Cassandra ๋…ธ๋“œ ๊ฐ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ์™€ Cassandra ๋…ธ๋“œ ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ์„ค๋ช…๋œ ๋Œ€๋กœ ์žฌ์ •์˜ ํŒŒ์ผ์— ์ง์ ‘ ๋ฐฐ์น˜๋˜๊ฑฐ๋‚˜ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์— ์ถ”๊ฐ€๋œ ์‚ฌ์šฉ์ž ์ด๋ฆ„/๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cassandra ์‚ฌ์šฉ์ž ์ธ์ฆ์— ๋Œ€ํ•œ ์ •๋ณด

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ”Œ๋žซํผ์€ Cassandra๋ฅผ ๋Ÿฐํƒ€์ž„ ์˜์—ญ ๋ฐ์ดํ„ฐ์˜ ๋ฐฑ์—”๋“œ Datastore๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Cassandra์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ํ†ต์‹ ์—๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Cassandra์™€ ํ†ต์‹ ํ•˜๋Š” ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋‹จ๊ณ„๋Š” ์žฌ์ •์˜ ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ ์‚ฌ์šฉ์ž๋ฅผ ํฌํ•จํ•œ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž๋Š” ์•„๋ž˜์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. DML ์‚ฌ์šฉ์ž: ํด๋ผ์ด์–ธํŠธ ํ†ต์‹ ์ด Cassandra(KMS, KVM, ์บ์‹œ ๋ฐ ํ• ๋‹น๋Ÿ‰)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  2. DDL ์‚ฌ์šฉ์ž: ํ‚ค์ŠคํŽ˜์ด์Šค ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ •์˜ ์ž‘์—…์„ ์œ„ํ•ด MART์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  3. ๊ด€๋ฆฌ ์‚ฌ์šฉ์ž: Cassandra ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ๋“  ๊ด€๋ฆฌ ํ™œ๋™์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  4. ๊ธฐ๋ณธ Cassandra ์‚ฌ์šฉ์ž: ์ธ์ฆ์ด ์‚ฌ์šฉ ์„ค์ •๋˜๊ณ  ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด cassandra์ธ ๊ฒฝ์šฐ Cassandra์—์„œ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. JMX ์‚ฌ์šฉ์ž: Cassandra JMX ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ธ์ฆํ•˜๊ณ  ํ†ต์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  6. Jolokia ์‚ฌ์šฉ์ž: Cassandra JMX API๋กœ ์ธ์ฆํ•˜๊ณ  ํ†ต์‹ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ Cassandra ์‚ฌ์šฉ์ž ์ •๋ณด

Apigee Hybrid ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  Cassandra ์ธ์ฆ์ด ์‚ฌ์šฉ ์„ค์ •๋˜๋ฉด ์ดˆ๊ธฐ ์‚ฌ์šฉ์ž ๊ณ„์ •์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„ cassandra๋กœ ์‹๋ณ„๋˜๋Š” ๊ธฐ๋ณธ Cassandra ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๋Š” ์ˆ˜ํผ์œ ์ € ์—ญํ• ์„ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž ์—ญํ•  ์ถ”๊ฐ€ ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ์ˆ˜์ •๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

Apigee Hybrid apigee-cassandra-user-setup ์ž‘์—…์—์„œ๋Š” ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ƒˆ ์—ญํ• ์„ ์„ค์ •ํ•˜๊ณ  ์ด ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. apigee-cassandra-user-setup ์ž‘์—…์€ Apigee Hybrid ์ธ์Šคํ„ด์Šค์˜ ์ดˆ๊ธฐ ์„ค์น˜, ํ›„์† ์ธ์Šคํ„ด์Šค ์—…๊ทธ๋ ˆ์ด๋“œ, ๋ฆฌ์ „ ํ™•์žฅ ์ค‘ ์ƒˆ ์ธ์Šคํ„ด์Šค ํ”„๋กœ๋น„์ €๋‹ ์ค‘์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Apigee Hybrid apigee-cassandra-user-setup ์ž‘์—…์ด ์‹คํ–‰๋˜๋ฉด ์ƒˆ ์„ค์น˜ ๋˜๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ์˜ ์ผ๋ถ€๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€ ๊ตฌ์„ฑ์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๋Š” apigee-cassandra-user-setup ์ž‘์—…์ด ์ƒˆ Cassandra ํฌ๋“œ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์กด์žฌ๊ฐ€ ๋ณด์žฅ๋˜๋Š” ์œ ์ผํ•œ ์‚ฌ์šฉ์ž์ž…๋‹ˆ๋‹ค. ์ˆ˜ํผ์œ ์ € ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ์•Œ๋ ค์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์—†์œผ๋ฉด Apigee Hybrid ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ๋ฆฌ์ „ ํ™•์žฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ณด์•ˆ ๊ฐ•ํ™” ์กฐ์น˜์— ๋”ฐ๋ผ ์ตœ์ดˆ ์‚ฌ์šฉ ํ›„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ„์† ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ cassandra ์‚ฌ์šฉ์ž๋Š” ์ƒˆ ์„ค์น˜ ๋ฐ ๋ฆฌ์ „ ํ™•์žฅ ์ค‘ apigee-cassandra-user-setup ์ž‘์—…์„ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์š”์†Œ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์žฌ์ •์˜ ํŒŒ์ผ์˜ ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์— ๋”ฐ๋ผ Cassandra์˜ ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. overrides.yaml ํŒŒ์ผ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ๋ณธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

cassandra:
   auth:
     default:  ## the password for the new default user (static username: cassandra)
       password: "NEW_PASSWORD"
     admin: ## the password for the admin user (static username: admin_user)
       password: "NEW_PASSWORD"
     ddl: ## the password for the DDL User (static username: ddl_user)
       password: "NEW_PASSWORD"
     dml: ## the password for the DML User (static username: dml_user)
       password: "NEW_PASSWORD"
     jmx:
       username: "jmxuser" ## the username for the JMX User
       password: "NEW_PASSWORD" ## the password for the JMX User
     jolokia:
       username: "jolokiauser" ## the username to access jolokia interface
       password: "NEW_PASSWORD" ## the password for jolokia user

๋‹ค์Œ์— ์œ ์˜ํ•˜์„ธ์š”.

  • ์ธ์ฆ ๊ธฐ๊ด€(CA) ์ˆœํ™˜์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์•”ํ˜ธ๋กœ ์ƒ์„ฑ๋œ ์„œ๋ฒ„ ์ธ์ฆ์„œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์—์„œ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •

์ด ์„น์…˜์—์„œ๋Š” ์ธ์ฆ์— Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์„ ์‚ฌ์šฉํ•˜๋„๋ก Cassandra๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ…œํ”Œ๋ฆฟ์„ YAML ํŒŒ์ผ์— ์ €์žฅํ•˜๊ณ  ํ•„์ˆ˜ ์†์„ฑ(์˜ˆ: my-secret.yaml)์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  name: SECRET_NAME
  namespace: APIGEE_NAMESPACE
type: Opaque
data:
  default.password: DEFAULT_PASSWORD   #base64-encoded string
  admin.user: ADMIN_USERNAME   #base64-encoded string
  admin.password: ADMIN_PASSWORD   #base64-encoded string
  dml.user: DML_USERNAME   #base64-encoded string
  dml.password: DML_PASSWORD   #base64-encoded string
  ddl.user: DDL_USERNAME   #base64-encoded string
  ddl.password: DDL_PASSWORD   #base64-encoded string
  jmx.user: JMX_USERNAME   #base64-encoded string
  jmx.password: JMX_PASSWORD   #base64-encoded string
  jolokia.user: JOLOKIA_USERNAME   #base64-encoded string
  jolokia.password: JOLOKIA_PASSWORD   #base64-encoded string
  

์—ฌ๊ธฐ์„œ SECRET_NAME์€ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋Œ€ํ•ด ์„ ํƒํ•œ ์ด๋ฆ„์ด๊ณ  APIGEE_NAMESPACE๋Š” Apigee ํฌ๋“œ๊ฐ€ ๋ฐฐํฌ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค(๊ธฐ๋ณธ๊ฐ’์€ apigee)์ด๋ฉฐ _USERNAME ๋ฐ _PASSWORD๋Š” ๊ฐ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ด๋ฆ„๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Base64๋กœ ์ธ์ฝ”๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl apply -f SECRET_FILE

์žฌ์ •์˜ ํŒŒ์ผ์— ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

cassandra:
  auth:
    secret: SECRET_NAME

์—…๋ฐ์ดํŠธ๋œ Cassandra ์žฌ์ •์˜๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

$APIGEECTL_HOME/apigeectl apply -f overrides/overrides.yaml --datastore

Cassandra ๋กœ๊ทธ ํ™•์ธ

Cassandra๊ฐ€ ์‹œ์ž‘๋˜๋Š” ์ฆ‰์‹œ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋กœ๊ทธ์—์„œ๋Š” Cassandra ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ์ด ์•”ํ˜ธํ™”๋˜์—ˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

kubectl logs apigee-cassandra-2 -n apigee -f

INFO  00:44:36 Starting listening for CQL clients on /10.0.2.12:9042 (encrypted)...
INFO  00:44:36 Binding thrift service to /10.0.2.12:9160
INFO  00:44:36 enabling encrypted thrift connections between client and server
INFO  00:44:36 Listening for thrift clients...