Cassandra์šฉ TLS ๊ตฌ์„ฑ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

apiVersion: v1
kind: Secret
metadata:
  name: $SECRET_NAME
  namespace: $APIGEE_NAMESPACE
type: Opaque
data:
  default.password: $PASSWORD   #base64-encoded string
  admin.user: $USERNAME   #base64-encoded string
  admin.password: $PASSWORD   #base64-encoded string
  dml.user: $USERNAME   #base64-encoded string
  dml.password: $PASSWORD   #base64-encoded string
  ddl.user: $USERNAME   #base64-encoded string
  ddl.password: $PASSWORD   #base64-encoded string
  jmx.user: $USERNAME   #base64-encoded string
  jmx.password: $PASSWORD   #base64-encoded string
  jolokia.user: $USERNAME   #base64-encoded string
  jolokia.password: $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...