مقالات

امنیت در Kubernetes – بخش دوم

یکی از موارد مهم در امنیت کوبرنتیز بحث مربوط به secret‌ها در کوبرنتیز است. در این مقاله به معرفی object مربوط به secret و انواع آن با ذکر مثال‌های مختلف خواهیم پرداخت

امنیت در Kubernetes

موارد و مولفه‌های زیادی در امنیت کوبرنتیز دارای اهمیت می‌باشند، یکی از موارد مهم در امنیت کوبرنتیز بحث مربوط به secret‌ها در کوبرنتیز است. ما در این مقاله در ادامه بخش اول مقاله امنیت در کوبرنتیز به معرفی انواع secret‌ها خواهیم پرداخت. قطعا مطالعه این مقاله برای به کارگیری و استفاده از آن نیازمند آشنایی با داکر و کوبرنتیز است که در مقاله‌های مختلفی در آکادمی‌ ابری به آنها پرداخته شده است.

Basic authentication Secret

 Secrert از نوع kubernetes.io/basic-auth برای ذخیره سازی credentials به صورت basic authentication ارائه شده است. زمانی‌که از این نوع secret استفاده می‌کنیم فیلد data آن می‌بایست شامل 2 کلید زیر باشد.

Username:

نام کاربری برای authentication

Password:

رمز یا token برای  authentication

هر دو کلید به صورت رمز شده base64  است که در صورت تمایل برای عدم رمزنگاری می‌توانیم مقادیر را در فیلد stringData  مشخص نماییم.

فایل yaml زیر نمونه ای از مثال فوق است.

apiVersion: v1

kind: Secret

metadata:

name: secret-basic-auth

type: kubernetes.io/basic-auth

stringData:

username: admin

password: t0p-Secret

SSH authentication secrets

Secret   از نوع kubernetes.io/ssh-auth ارائه شده است، که برای ذخیره سازی اطلاعات تشخیص هویتSSH مورد استفاده قرار می‌گیرد. زمانی‌که از این نوع secret  استفاده می‌کنیم می‌بایست در فیلدی به نام ssh-privatekey  اطلاعات  مربوطه را که در فیلد data  یا stringData  وجود دارد را وارد نماییم.  در yaml   زیر نمونه‌ای از این نوع secret  وجود دارد.

apiVersion: v1

kind: Secret

metadata:

  name: secret-ssh-auth

type: kubernetes.io/ssh-auth

data:

  # the data is abbreviated in this example

  ssh-privatekey: |

MIIEpQIBAAKCAQEAulqb/Y...

این نوع secret  فقط برای راحتی user‌ها ارائه شده است.

برای بالاتر بردن امنیت و جلوگیری از حمله‌های man in the middle  تیم کوبرنتیز پیشنهاد کرده است که فایل  known_hostsرا در config map‌های کوبرنتیز اضافه کنیم.

TLS secrets

TLS secrets

kubernetes.io/tls نوع secret برای  certificate‌ها و کلید‌ها جهت استفاده از TLS ارائه شده است. در درجه اول این نوع secret که برای TLS  با ingress ‌ها در کوبرنتیز مورد استفاده قرار گرفته می‌شود.ingress ‌ها تنطیماتی هستند که در قالب kind در کوبرنتیز تعریف می‌شوند، که  کمک به دیده شدن APP کاربران از بیرون کوبرنتیز می‌کند. ممکن است ساختار این نوع secret  به همراه work load‌های دیگر در کوبرنتیز مورد استفاده قرار گرفته شود  و به  عبارت ساده تر می‌توانیم این گونه عنوان کنیم  که secret از نوع kubernetes.io/tls به همراه kind‌هایی از نوع ingress  در کوبرنتیز مورد استفاده قرار گرفته می‌شود و حتی ممکن است به جز kind  مربوط به ingress  از kind‌های دیگری نیز در  این نوع secret  مورد استفاده قرار گرفته شود. زمانی‌که از این نوع secret  استفاده می‌کنیم در فیلد data یا stringData می‌بایست از tls.key   و tls.crt استفاده و مقادیر آنها را مشخص نماییم. نمونه ای yaml از نوع tls secret  در مثال زیر گردآوری شده است.

apiVersion: v1

kind: Secret

metadata:

  name: secret-tls

type: kubernetes.io/tls

data:

  # the data is abbreviated in this example

  tls.crt: |

        MIIC2DCCAcCgAwIBAgIBATANBgkqh...

  tls.key: |

        MIIEpgIBAAKCAQEA7yn3bRHQ5FHMQ...

علاوه بر  yaml‌ها می‌توانیم tls secret  را با کامند kubectl و subcommand مربوط به TLS  بسازیم. مثال زیر بیانگر این موضوع است.

kubectl create secret tls my-tls-secret \

  --cert=path/to/cert/file \

  --key=path/to/key/file

Bootstrap token Secrets

Bootstrap token Secrets

برای bootstrap نیز ساختار secret وجود دارد که می‌توان از آن بهره مند شد. این نوع secret  برای طراحان و توسعه دهنگان وب می‌تواند کاربرد زیادی داشته باشد. در مثال زیر نمونه‌ای از این نوع secret  به صورت yaml گرد‌آوری شده است.

apiVersion: v1

kind: Secret

metadata:

  name: bootstrap-token-5emitj

  namespace: kube-system

type: bootstrap.kubernetes.io/token

data:

  auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6a3ViZWFkbTpkZWZhdWx0LW5vZGUtdG9rZW4=

  expiration: MjAyMC0wOS0xM1QwNDozOToxMFo=

  token-id: NWVtaXRq

  token-secret: a3E0Z2lodnN6emduMXAwcg==

  usage-bootstrap-authentication: dHJ1ZQ==

  usage-bootstrap-signing: dHJ1ZQ==

ساخت secret  در   kubernetes  را می‌توان به سه روش کلی تقسم بندی کرد.

  1. با استفاده از kubectl  کامند که در مثال‌ها ی زده شده به آن اشاره شد.

(با kubectl  می‌توانیم در ساخت secret  همان لحظه عبارت و محتوای اطلاعات خود را وارد کنیم و یا به یک فایل مشخص برای گرفتن اطلاعات اشاره کنیم)

  1. با استفاده از کانفیگ فایل yaml  که اکثر مثال‌های ارائه شده بر همین اساس بوده است.
  2. ایجاد pattern  یا الگویی شخصی سازی شده برای تولید secret

استفاده از secret ساخته شده در yaml  فایل‌ها

1_ استفاده به عنوان ENV در کانتینر تعریفی

فرض می‌کنیم secret  به نام manifest-example  ایجاد کردیم. حال در ساختار yaml  خود می‌توانیم secret فوق را به عنوان یک ENV (متغییر محیطی) فراخوانی کنیم. در نظر می‌گیریم که در secret  که ایجاد کردیم username   است که در آن تعریف شده است. و در مثال زیر در فیلد کانتینر، فیلد ENV تعریف شده است که نام اختیاری می‌تواند داشته باشد که در آن نیز در فیلد secretKetRef  عبارت secret  تعریف شده فراخوانی می‌شود،  در مثال فوق عبارت username  در secret تعریف شده فراخوانی شده است. که محتویات username  را در secret  تعریفی می‌خواند و آن را در ENV تعریفی به نام Username  قرار می‌دهد. (در حقیقت username  در secret  فراخوانی می‌شود و مقادیر آن به داخل نام ENV قرار داده خواهد شد).

امنیت کوبرنتیز

2_ فراخوانی در والیوم تعریفی

برعکس روش بالا می‌توانیم secret  ساخته شده را فراخوانی کنیم. در yaml  خود والیومی‌ تعریفی می‌کنیم که نام اختیاری به آن می‌دهیم. داخل فیلد والیوم secret  که از قبل ایجاد کردیم را فراخوانی می‌کنیم به طوری‌که به ازای همه مقادیر تعریفی در secret یک فایل ساخته خواهد شد. فایل‌های ساخته شده در مثال زیر در مسیری که در فیلد mountpath مشخص شده است قرار خواهند گرفت.

امنیت کوبرنتیز

در خصوص شخصی سازی  secret‌ها نیز می‌توان secretGenerator‌هایی ایجاد کرد که در قالب فایلی به نام  kustomization.yaml  این مورد انجام می‌شود.

در مثال زیر secret generator  ایجاد شده است که به فایل‌هایی مربوط به یوزرنیم و رمز اشاره می‌کند.

secretGenerator:

- name: db-user-pass

  files:

  - username.txt

  - password.txt

درsecret generator‌ها می‌توان نام کاربری و رمز در همان فایل kustomization.yaml مشخص کرد و یا در فایل فوق بیاییم و به متغییر‌های محیطی (env)  از پیش تعریف شده اشاره کنیم. در مثال‌های زیر موارد فوق را می‌توانیم بررسی کنیم.

secretGenerator:

- name: db-user-pass

  literals:

  - username=admin

  - password=1f2d1e2e67df
secretGenerator:

- name: db-user-pass

  envs:

  -.env.secret

بعد از اینکه فایل kustomization.yaml را ایجاد و secret generator را در فایل مطابق با مثال‌ها وارد کردیم و پس از تنظیم کانفیگ فایل مربوطه با کامند زیر اقدام به ساخت secret  با توجه به secret generator  ایجاد شده در فایل kustomization.yaml می‌کنیم.

kubectl apply -k.

بعد از از زدن کامند فوق خروجی زیر را خواهیم داشت.

secret/db-user-pass-96mffmfh4k created

در مقاله امنیت در کوبرنتیز به بررسی secret‌ها با مثال‌های متفاوتی اشاره شد که در مرجع رسمی‌سایت کوبرنتیز نیز به آنها اشاره شده بود. مرجع مورد استفاده در این دو مقاله لینک زیر است که مربوط به سایت رسمی‌Kubernets  است.

https://kubernetes.io/docs/concepts/configuration/secret/

نتیجه

یکی از فاکتور‌های مهم در امنیت کوبرنتیز استفاده مناسب و به جا از Kind مربوط به secret است. استفاده از آن می‌تواند راهکاری جهت ایمن سازی اطلاعات مهم و حیاتی در پاد‌های کوبرنتیز باشد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

دکمه بازگشت به بالا

دریافت سرویس تست رایگان

ارتباط با ابر زَس

تلفن:        91078149 –  021

ایمیل:       [email protected]