【测试备忘录】认证 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のみ許可の設定を記載する
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の一覧を表示