Skip to content

ConfigMap বনাম Secret — কোনটায় কী রাখবেন

দুটোরই কাজ প্রায় একই রকম দেখতে — key-value ডেটা কন্টেইনারে ইনজেক্ট করা। কিন্তু একটাতে DB পাসওয়ার্ড রাখলে সেটা টিমের সবাই plaintext-এ পড়ে ফেলতে পারবে, আরেকটাতেও আসলে পারবে — যদি না আপনি সেটা জানেন।

রাফি হাসান

রাফি হাসান

DevOps ইঞ্জিনিয়ার

৭ মিনিটের পড়া
শেয়ার

নতুন কেউ Kubernetes শিখতে গিয়ে প্রথমেই যে ভুল ধারণাটা করে বসে: "Secret মানে এনক্রিপ্টেড, ConfigMap মানে সাধারণ টেক্সট।" নামটাই তো "Secret" — তাই মনে হয় এটা নিরাপদ একটা ভল্টের মতো কিছু।

আসল ঘটনাটা একটু অন্যরকম, আর এটা না জানলে প্রোডাকশনে DB পাসওয়ার্ড, API key — সবকিছু কার্যত সবার সামনে খোলা রাখার মতো ভুল করে ফেলা সহজ।

দুটোই আসলে key-value স্টোরেজ

ConfigMap আর Secret — দুটো অবজেক্টেরই কাজ একই: কিছু key-value ডেটা কন্টেইনারে পাঠানো, environment variable হিসেবে অথবা ফাইল হিসেবে মাউন্ট করে। কোড থেকে কনফিগারেশনকে আলাদা রাখাই এদের উদ্দেশ্য — যাতে একই Docker image dev, staging, প্রোডাকশনে আলাদা আলাদা ভ্যালু নিয়ে চলতে পারে।

পার্থক্যটা তৈরি হওয়ার কথা ছিল কী ধরনের ডেটা এখানে যাবে তার ভিত্তিতে — কনফিডেনশিয়াল বনাম নন-কনফিডেনশিয়াল। Kubernetes নিজে থেকে এই সীমারেখা জোর করে না, এটা সম্পূর্ণ আপনার সিদ্ধান্ত।

তাহলে Secret কী সুরক্ষা দেয়?

কিছু দেয়, কিন্তু যতটা মানুষ ভাবে তার চেয়ে কম:

  • kubectl get configmap বা kubectl describe configmap চালালে ভ্যালু সরাসরি স্ক্রিনে দেখা যায়। Secret-এর ক্ষেত্রে kubectl describe secret ভ্যালু লুকিয়ে রাখে (<redacted>), যদিও kubectl get secret -o yaml দিয়ে ঠিকই বের করা যায় base64 decode করে।
  • Secret অবজেক্টগুলো etcd-তে (Kubernetes-এর ডেটাবেসে) সাধারণত plaintext আকারেই সংরক্ষিত হয়, যদি না ক্লাস্টারে আলাদাভাবে encryption at rest চালু করা থাকে।
  • RBAC (Role-Based Access Control) দিয়ে secrets রিসোর্সের জন্য আলাদা পারমিশন সেট করা যায় — অর্থাৎ, "কে Secret পড়তে পারবে" এটা ConfigMap থেকে আলাদা করে নিয়ন্ত্রণ করা সম্ভব। এটাই আসল ব্যবহারিক সুবিধা।

ConfigMap-এ পাসওয়ার্ড

YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: db-config
data:
  DB_HOST: 'db.internal'
  DB_PASSWORD: 'p@ssw0rd123'

Secret + RBAC + encryption at rest

YAML
apiVersion: v1
kind: Secret
metadata:
  name: db-config
type: Opaque
stringData:
  DB_HOST: 'db.internal'
  DB_PASSWORD: 'p@ssw0rd123'
বাম পাশের কনফিগারেশনে DB পাসওয়ার্ড 'read' পারমিশন থাকা যেকোনো ইউজার/সার্ভিস এক কমান্ডে প্লেইন টেক্সটে দেখতে পারবে।

উপরের দুটো YAML প্রায় একই রকম দেখতে, আর kubectl apply করলে দুটোই একইভাবে কাজ করবে অ্যাপের দৃষ্টিকোণ থেকে। পার্থক্যটা তৈরি হয় ক্লাস্টার-লেভেল কনফিগারেশনে — RBAC পলিসি, encryption at rest, আর অডিট লগিং কোন রিসোর্স টাইপের জন্য কতটা কড়া, তার ওপর।

কবে কোনটা বাছবেন

সহজ নিয়ম: যা প্রকাশ পেলে ক্ষতি হবে, সেটা Secret-এ। যা প্রকাশ পেলে কিছু হবে না, সেটা ConfigMap-এ।

DB পাসওয়ার্ড, API key, TLS সার্টিফিকেটের প্রাইভেট কী, third-party টোকেন — Secret। ফিচার ফ্ল্যাগ, লগ লেভেল, API-র বেস URL, রিট্রাই কাউন্ট — ConfigMap। কোনো একটা ভ্যালু নিয়ে দ্বিধায় থাকলে, ধরে নিন সেটা Secret — পরে ConfigMap-এ সরানো সহজ, উল্টোটা করতে গেলে অনেক আগেই এক্সপোজ হয়ে গিয়ে থাকবে।

Quick check

একজন ডেভেলপার একটা Kubernetes Secret বানিয়েছেন যাতে API key আছে। এতে কি key-টা নিরাপদ হয়ে গেছে?

চেকলিস্ট — নতুন করে সেটআপ করার আগে

ConfigMap/Secret সেটআপ রিভিউ করার আগে যা দেখবেন

0/5 শেষ

Secret ব্যবহার করা মানে "সমস্যা সমাধান হয়ে গেছে" না — এটা শুধু সঠিক জায়গায় সঠিক প্রশ্নটা জিজ্ঞেস করার সুযোগ তৈরি করে দেয়: এই ডেটাটা কে দেখতে পারবে, আর কীভাবে সেটা নিশ্চিত করছি।

  • #Kubernetes
  • #DevOps
  • #Security
শেয়ার

সম্পর্কিত লেখা

DevOps ও ক্লাউড৮ মিনিটের পড়া

Deployment আপডেট করলে সাইট ডাউন হয় না কেন — Rolling Update ভেতরে ভেতরে কী করে

kubectl apply চালানোর পর সাইট একবারও ডাউন হয় না, অথচ পুরনো কোড সরে গিয়ে নতুন কোড চলে আসে। জাদু না — maxSurge আর maxUnavailable নামের দুটো সংখ্যা এটা সম্ভব করে।

রাফি হাসানরাফি হাসান
DevOps ও ক্লাউড৮ মিনিটের পড়া

Pod রানিং দেখাচ্ছে, তবু ট্রাফিক পাচ্ছে না — কেন

kubectl get pods বলছে Running, অথচ ইউজার 502 পাচ্ছে। কারণটা Kubernetes-এর দোষ না — কেউ liveness আর readiness probe-এর পার্থক্যটা কখনো বুঝিয়ে দেয়নি।

রাফি হাসানরাফি হাসান
ব্যবসা ও মনোবিজ্ঞান৮ মিনিটের পড়া

মানুষ কেন অচেনা কারো কাছ থেকে কিনতে দ্বিধা করে — Trust Signal যেভাবে সেল বাড়ায়

একই ল্যান্ডিং পেজ, একই দাম, একই প্রোডাক্ট — শুধু নিচে তিনটা রিভিউ যোগ করলেই কনভার্শন বদলে যায়। এটা কাকতালীয় না, মানুষ সিদ্ধান্ত নেওয়ার সময় অন্যদের আচরণ দেখেই ভরসা করে।

সাদিয়া ইসলামসাদিয়া ইসলাম

মাসে একটা কাজের ইমেইল

ডিজাইন সিস্টেম প্যাটার্ন, ফ্রন্ট-এন্ড টেকনিক আর লার্ন প্ল্যাটফর্মের নোট। কোনো প্রচার নেই, অন্যের লিংকের সংকলনও নেই।

যেকোনো সময় আনসাবস্ক্রাইব করতে পারবেন। আপনার ঠিকানা কারো সাথে শেয়ার করি না।