【测试备忘录】认证 Kubernetes 安全专家 (CKS)考试

首先

本文是关于备考Certified Kubernetes Security Specialist (CKS)考试时需要记住的内容的备忘录。

基准

    • CIS Benchmark

CIS-CAT

CISが提供するCIS Benchmarksへの準拠をチェックするツール
kubernetes用のCIS-CATはPro版(有償)にしかないため注意

kube-bench

CIS Benchmarksに基づくOSSのチェックツール

kube-benchコマンドで実行

kube-bench run –targets=master

maseterノードに対して実行

kube-bench run –targets=node

workerノードに対して実行

Kubelet 安全

    • kubeletと通信するポート

10250

フルアクセス
kubelet.serviceの設定値–anonymous-authはデフォルトでtrueのためfalse推奨

falseの場合はcurl送信時にオプションでclient ca fileを渡せば認証される

10255

読み取り専用
無効にする場合はreadOnlyPortを0に設定

用 kubectl proxy 和 kubectl port-forward。

    • kubectl proxy

API serverへの通信をプロキシ

kubectl port-forward

展開されたpodと通信するためのポートフォワーディング

Linux 强化保护

    • 特定のユーザをログイン不可(sshやsu不可)にしたい

usermod -i /sbin/nologin

sshログイン時の挙動制御

/etc/sshd/sshd_configを編集

sudo実行可能ユーザの制御

/etc/sudoersを編集

ポート番号を私用しているプログラムが知りたい

netstat -plntにgrepで確認

-pはPID/Programを表示

-lはリスニング状態のソケットのみ表示

-nはホスト名やサービス名を解決せずに、IPアドレスやポート番号を表示

-tはTCPプロトコルのみ表示

Seccomp是一种操作系统的安全机制。

    • プロセスのシステムコールを制限し、アプリケーションやプロセスのセキュリティを向上させる

 

    • デフォルトのseccompプロファイルの場所

/var/lib/kubelet/seccomp

特定のseccompプロファイルを指定してPodを作成する

spec.securityContext.seccompProfile.localhostProfileにパスを設定
記載するパスはkubeletの起動引数で指定されたseccompプロファイルの場所以下からで良い(デフォルトでは/var/lib/kubelet/seccomp/)

AppArmor 应用防护系统

    • 特定のプロセスが実行できる操作やアクセスできるファイルなどのシステムリソースに対するアプリケーションのアクセス制御を実施する

 

    • 関連コマンド

aa-status

apparmor-parser

-a (–add)
-p (–preprocess)

podに設定したい場合

annotaionsにcontainer.apparmor.security.beta.kubernetes.io/: を追加

は以下の3種類

runtime/default: ランタイムのデフォルトのプロファイルを適用する

localhost/: (profile_name)という名前でホストにロードされたプロファイルを適用する

unconfied: いかなるプロファイルもロードされないことを示す

OPA门卫

    • Kubernetesリソース(ポッド、サービス、ネームスペースなど)に適用されるポリシーを定義し、それらのポリシーを実行してリソースの作成や変更を制御する

 

    • Validating Admission Controllerとして動作し、Kubernetes APIリクエストが送信される前にポリシーの適用を確認する

 

    • ValidatingWebhookConfigrationリソース内でOPAサーバの情報を記載

.regoファイルからconfigmapを作成する場合は–from-file=で指定

ConstraintTemplateリソース内にconstraintを強制するRegoロジックとコンストレイントのスキーマの両方が記述されているためまずここを確認

kubectl get crdで各リソース名を確認

容器运行时

    • runc

kubernetesデフォルトのcontainer runtime

gVisor

ホストのオペレーティングシステムとコンテナ化されたアプリケーションの間に中間層として機能
docker実行時にオプションで指定可能

–runtime runsc

kata container

仮想マシンを作成し、その中でコンテナを実行
docker実行時にオプションで指定可能

–runtime kata

运行时类

RuntimeClassリソースを作成後、Podのspec.runtimeClassNameにリソース名を記載

Pod之间的mTLS通信

    一般的にIstioが使用

准入控制器

    • admission controllerの有効化

kube-apiserverの起動オプションに–enable-admission-pluginsを追記して指定

admission controller用のconfigファイルを明示的に指定

kube-apiserverの起動オプションに–admission-control-config-fileを追記して指定

Kubesec的中文解释是什么?

    • podのスキャニングを提供

kubesecコマンドを使用、詳細な使い方は-hで確認

Trivy: 查漏补缺

    • コンテナイメージの脆弱性スキャンを提供

trivyコマンドを使用、詳細な使い方は-hで確認

翻译:猎隼

    • Kubernetesクラスタ内で実行されるアプリケーションやサービスの動作を監視し、異常なアクティビティやセキュリティ違反を検出する

 

    • デフォルトの設定ファイル

/etc/falco/falco.yaml

ルール設定ファイル

/etc/falco/falco_rule.yaml

/etc/falco/falco_rule.local.yaml

記載することでデフォルトのルールをオーバーライド可能

falcoのホットリロード

kill -1 $(cat /var/run/falco.pid)

outputのフォーマットを変えたい

outputフィールドを公式ドキュメントを参考に変更する

検出された脅威はjournalctl -u falcoで確認する

审计

    • kube-apiserverにフラグを追加することで有効化

–audit-policy-file

policyリソース定義ファイルを指定

–audit-log-path

auditログを書き込むファイルを指定

–audit-log-maxage

監査ログファイルを保持する最大日数を指定

–audit-log-maxsize

ログファイルがローテーションされるまでの最大サイズをメガバイト単位で指定

–audit-log-maxbackup

保持する監査ログファイルの最大数を指定

policyリソースの書き方に関する注意点

基本的な書き方は公式ドキュメント参照
groupの記載が必要なリソースを対象にする場合はkubectl api-resourcesで確認すること

秘密

    • ServiceAccountTokenの自動マウントを止めたい(下記2つのうちいずれかの方法で実施)

podのマニフェストファイル内でspec.automountServiceAccountTokenをfalseに設定
serviceaccountのマニフェストファイル内でautomountServiceAccountTokenをfalseに設定

网络策略

    • リソースにlabelが複数設定されている場合はその分も設定すること

kubernetes側の処理によって自動的に付与されるlabelは設定しなくても良い

from配下の条件はAND条件になる
from間の条件はOR条件になる
DNSのみ通信許可したい場合のサンプルyaml

portsにTCP/UDPの53のみ許可の設定を記載する

サンプルyaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny
namespace: default
spec:
podSelector: {}
policyTypes:
– Egress
– Ingress
egress:
– ports:
– port: 53
protocol: TCP
– port: 53
protocol: UDP

apiserver

    • オプション

–kubernetes-service-node-port

apiserverのセットアップ時に作成されるserviceのタイプがnodePortになり、指定したport番号を使用する
このオプションが指定されていない場合、作成されるserviceのタイプはclusterIPになる
この項目を変更した際は、既存のservcieを削除しないと新たなタイプのserviceが作成されないため注意

kube-apiserverが立ち上がってこない時にログを見て調査したい

/var/log/pods or /var/log/containers

kube-apiserverの起動に失敗している場合は関連ログ(読み込めないフラグ等)が置かれている

journalctl -u kubelet
crictl logs <kube-apiserverのCONTAINER_ID>
journalctl | grep kube-apiserver
cat /var/log/syslog | grep kube-apiserver

kubeletのconfigファイル(/etc/kubernetes/kubelet.conf等)をKUBECONFIG環境変数に設定することでapiserverと通信可能

NodeRestrictionを有効化することによって制限できる

TLS接続における最小バージョンと暗号スイートの設定

–tls-min-version=VersionTLS12

–tls-cipher-suites=TLS_AES_128_GCM_SHA256

値は問題で指定されるものでよい

ETCD的含义

    • ETCDはデータを/registry/{type}/{namespace}/{name}配下に書き込む

 

    • etcdctlで参照する際はetcdctl (cert関連オプション) getを使用する

 

    • 暗号スイートの指定

–cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
値は問題で指定されるものでよい
api-serverの設定変更し起動してくることを確認 → ETCDの設定変更という順番でやらないとETCDが上がってこなかった(たまたま?)

Pod安全标准

    • namespace単位でpodにセキュリティ制御をかける

 

    • namespaceリソース内のmetadata.annotationsに設定する

 

    • 基本は3つのprofileから選択

Privileged

特権を許可(ほぼ制限なし)

Baseline

既知の特権昇格を防止する最小限の制限ポリシー

Restricted

厳しく制限されたポリシーで、現在のpod hardeningのベストプラクティスに従う

容器的不可变性

    • bash/shellの削除

startupProbeでremove /bin/bash

filessytemをreadonlyに

securitycontextで設定

root userでコンテナを実行しない(run as user and non root)

securitycontextで設定

Secure and Herden Images

    • imageに対してのベストプラクティス

パッケージバージョンを明確にすること(latestは使わない)

root userで実行しない
filessytemをreadonlyに
shell accessを削除

Other

    • curlを用いてkubernetesリソースを取得したい

ひな形を覚えておく(↓認証にtokenを使う場合)
curl htts://kubernetes.default/api/v1/namespaces/default/pods -H “Authorization: Bearer $(token)” -k

命令

    • kubectl

config

get-context -o name

context nameを表示する

view –raw

機密データを表示する

sha512sum

SHA-512ハッシュ値を計算して表示する
kubernetesコンポーネントファイルのバイナリを比較する際に使用

strace

-p

指定したPIDのプログラムがどのシステムコールを実行し、それに伴う引数や結果を表示する

-c

統計情報として表示

systemctl

list-units –type service

systemctlが管理しているunitの一覧を表示

广告
将在 10 秒后关闭
bannerAds