امنیت در 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
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 نیز ساختار 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 را میتوان به سه روش کلی تقسم بندی کرد.
- با استفاده از kubectl کامند که در مثالها ی زده شده به آن اشاره شد.
(با kubectl میتوانیم در ساخت secret همان لحظه عبارت و محتوای اطلاعات خود را وارد کنیم و یا به یک فایل مشخص برای گرفتن اطلاعات اشاره کنیم)
- با استفاده از کانفیگ فایل yaml که اکثر مثالهای ارائه شده بر همین اساس بوده است.
- ایجاد 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 است. استفاده از آن میتواند راهکاری جهت ایمن سازی اطلاعات مهم و حیاتی در پادهای کوبرنتیز باشد.