Certified Kubernetes Security Specialist (CKS) 受験ログ

[Certified Kubernetes Security Specialist (CKS)](https://www.cncf.io/certification/cks/)を受験しました。どんな準備をしたかを書いておきます。

受験時のクラスターのバージョンは`v1.19`でした。

## 経緯

2018年11月、[CKAを取得](https://qiita.com/sotoiwa/items/3509ca3d18d1bed00dee)
2018年11月、[CKADを取得](https://qiita.com/sotoiwa/items/70cf93ebe2718a3be6b3)
2020年9月、11月にCKSという新しい資格ができることを知る
2020年12月上旬、サイバーマンデーセールでCKS試験とトレーニングのセットを購入
2020年12月中旬、UdemyでCKS対策の[このコース](https://www.udemy.com/course/certified-kubernetes-security-specialist/)を購入
2020年12月下旬、Udemyのコースのレッスンを受講開始
2020年1月11日、受験

## 自分のバックグラウンド

- IT業界は10年以上
- アプリケーションの開発経験はさほどなし
- 2017年後半からKubernetesに関わりはじめる
- 2018-2019年はIBMのKubernetesディストリビューションのデリバリーなどをする
- 2019年後半に転職し、最近はAmazon EKSの導入支援といった仕事をわりとよく実施している

## 試験に関する情報

試験に関する重要な情報が以下にあります。

- [Frequently Asked Questions: CKA and CKAD & CKS](https://docs.linuxfoundation.org/tc-docs/certification/faq-cka-ckad-cks)
- [Important Instructions: CKS](https://docs.linuxfoundation.org/tc-docs/certification/important-instructions-cks)

問題数は15-20問です。時間は2時間です。合格点は67%です。

アクセスできるドキュメントがCKAやCKSよりも多いです。以下のドキュメントにアクセスできます。タブは1つのみです。

- https://kubernetes.io/docs/
- https://github.com/kubernetes/
- https://kubernetes.io/blog/
- https://github.com/aquasecurity/trivy
- https://docs.sysdig.com/
- https://falco.org/docs/
- https://gitlab.com/apparmor/apparmor/-/wikis/Documentation

`k=kubectl`のエイリアスとkubectlの補完は設定されています。`jq`もインストールされています。

## 勉強方法

試験対策として何をやったらいいのか情報が少なく困りました。ちょうどCKS試験の存在を知った頃、[EKS Best Practice](https://aws.github.io/aws-eks-best-practices/security/docs/)と[CIS Benchmark for EKS](https://aws.amazon.com/jp/blogs/containers/introducing-cis-amazon-eks-benchmark/)をベースに、お客様のEKS環境のセキュリティをアセスメントするという案件に取り組んでおり、マネージドなKubernetesの上でのセキュリティ対策については理解深める機会がありました。一方、普段はマネージドなKubernetesしか触っていないので、コンテナランタイムやMasterコンポーネントの設定といったレイヤー低めな分野の理解がポイントになりそうと思いました。
### 公式のトレーニング

- [Kubernetes Security Essentials (LFS260)](https://training.linuxfoundation.org/training/kubernetes-security-essentials-lfs260/)

毎年恒例のサイバーマンデーセールでCKS試験と公式トレーニングをセットで購入したのですが、トレーニングが利用可能になるのが2021年1月上旬だったので、このトレーニングは実施していません。

### Udemyのコース

- [Kubernetes CKS 2021 Complete Course + Simulator](https://www.udemy.com/course/certified-kubernetes-security-specialist/)

UdemyでKiller Shellというところが作成している[CKS対策コース](https://www.udemy.com/course/certified-kubernetes-security-specialist/)を購入しました。このコースが大変素晴らしいものでした。これまであいまいに理解していた部分がどんどんクリアになっていく感覚があり、勉強していてとても楽しかったです。このコースと、コースについてくる模擬試験（Simulator、後述）をしっかりやれば試験対策としては十分そうと感じました。コースの紹介ページにディスカウントコードがあり、コードを適用すると安くなるはずです。

### Simulator

- [Kubernetes Exam Simulator](https://killer.sh/)

UdemyのコースにSimulatorのクーポンがついてきます。36時間のCKSテストセッションが2回利用できます。内容は毎回同じです。セッション中には環境をリセットして何度でもテストを受験できます。私の場合、2回のセッションの間に、間隔を開けて合計5回テストをやりました。模擬試験は問題数は実際より多く、難易度も実際よりも難しめに設定されているそうです。各問題は15分かければドキュメントを見ながら自力で解けるであろう問題が多いのですが、問題数が20問だとすると1問にかけられる時間は6分しかありません。1回目は全部を回答するのに4時間半かかり、正答率は60%くらいでした。2時間の時点だとおそらく30%くらいだったと思います。

5回目でやっと2時間以内に回答できました。Simuratorの問題には登場しなかったけれど、CKS対策コースでは登場していて出題されそうなテーマはレッスンを復習しました。

### 書籍

レイヤー低めな部分の理解を深めるために、以下の書籍を読んでいました。しかしSimuratorを繰り返し練習するほうが即効性がありそうに思えたので、そちらを優先した結果、書籍を読み終える前に試験日を迎えました。

- [Docker/Kubernetes開発・運用のためのセキュリティ実践ガイド](https://www.amazon.co.jp/dp/B085C8LYDC/)
- [イラストでわかるDockerとKubernetes](https://www.amazon.co.jp//dp/B08PNMRXKN/)

### その他

[ラズパイでEKS Distroを動かす](https://qiita.com/sotoiwa/items/f29889741b3b45cf10e4)、などをしてkubeadmの使い方を復習しました。[Kubernetes The Hard Way](https://github.com/kelseyhightower/kubernetes-the-hard-way)も復習しました（今回は[On AWS](https://github.com/prabhatsharma/kubernetes-the-hard-way-aws)でやりました）。

## Tips

CKA/CKADでも同じと思いますが、時間に余裕がないので、素早く操作できることが重要です。yamlをなるべく書かないようにする練習が必要です。

例えばRoleとRolebindingの作成は以下のようにできます。

```shell
k -n development create role secret-manager --verb=get,list --resource=secrets
k -n development create rolebinding secret-manager --role=secret-manager --user=jane
```

試験開始直後に以下を`.bashrc`に追記するとよいです。

```shell
export do="--dry-run=client -o yaml"
export fg="--force --grace-period=0"
```

例えば、最初は`$do`つきでコマンドを実行してyamlを確認し、OKそうなら`$do`を消して実行します。細かいカスタマイズが必要な場合はファイルにリダイレクトして、雛形として利用します。

```shell-session
$ k create clusterrole test --verb=use --resource=psp --resource-name=test $do
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  creationTimestamp: null
  name: test
rules:
- apiGroups:
  - policy
  resourceNames:
  - test
  resources:
  - podsecuritypolicies
  verbs:
  - use
```

Podの削除も地味に時間がかかることが多いので、以下のように実行してさっさと削除します。

```shell
k delete pod test $fg
```

Simuratorで練習している間は、コマンド実行時にネームスペースを先に書くことを習慣づけるように意識しました。この方が履歴からコマンドを再利用しやすいです。

```shell
k get pod -n development    # これだと例えばdescribe podに書き換えるのが大変
k -n development get pod    # ネームスペースを先に書いておくと履歴からコマンドの書き換えがしやすい
```

基本かも知れませんが、カーソルの行頭・行末への移動方法を覚えました。シェル上では`Ctrl+a`と`Ctrl+e`、viのノーマルモードでは`^`と`$`です。

アクセス可能とされているドキュメントに加え、Simuratorで練習していてよくアクセスするページはブックマークして素早くアクセスできるようにしました。

## 本番

今回は自宅で深夜に受験しました。試験時間の15分前にTake Examボタンが押せるようになります。押せますが、試験はまだ起動しません。CKAやCKADのときは、15分前から試験が起動してIDの確認や部屋の確認などがはじまったような記憶がありますが、今回は試験が起動できるようになったのは試験時間ちょうどからでした。案内メールにも15分前からテストが開始できるとあったのに、はじまらないので何かトラブルかと心配してチャットで問い合わせそうになりました。

試験のUIが以前とは変わっています。なのでSimulatorとも違います。問題文からリソース名などの文字列のコピーがクリックだけでできるようになっています。言語は選択できるようになっていますが、受験時点では英語のみでした。メモ帳に配点や回答状況などをメモする予定でしたが、新しいUIでメモ帳がどこにあるのか見つけられず、使えませんでした。後で見直したい問題にフラグをつける機能はありました。

残り時間が表示されると思われる領域が「time remaining」という表示のままだったので、監督官にチャットで質問したら、いつでも残り時間を聞いてくれという回答でした。30分毎にチャットでリマインドしようか？と提案してくれたので、お願いしました。残り時間がわずかになった頃、残り時間が表示されると思われる領域が、プログレスバーのようにバーの長さと色で残り時間を表してしているらしいことに気がつきました。残り時間が時間が文字で表示されていないのが、バグなのか仕様なのかよくわかりませんでした。

試験中に一度、突然テストが切断されました。何か禁止事項をやってしまって試験を強制終了されたのかと呆然としていたら、自動的に再接続されました。その後はそのまま続けることができました。

## 結果と感想

74%で合格。1問目が配点が大きく重ための問題で焦りました。とりあえずスキップすると、2問目も重ためでそれもスキップすると、3問目で何とか解けそうな問題が出てきました。解いているうちに調子が出てきて、結局合計3問くらいをスキップしつつひととおりの回答を終えた時点で、残り時間は約15分ありました。最初に戻り、1問目は解けました。最初は緊張して焦っていて問題の意味が頭によく入ってこなかったのですが、落ち着いてみれば準備していた内容でした。2問目は解けず、時間切れとなりました。

難易度は高いと感じました。Simulatorなしでは合格はできなかったと思います。約2年前に私が受けた時点のCKAとCKADは出題範囲がかなり被っている印象がありましたが、それらとCKSは出題範囲は異なります。Masterコンポーネントの設定変更やランタイムの変更などは、マネージドサービスやOpenShiftのようなKubernetesディストリビューションを使っているとやらない、あるいはそもそもできないと思いますが、出題範囲です。PodSecurityPolicyやNetworkPolicy、あるいはFalcoなども、なかなかそこまで取り組めていないことも多いと思いますが、出題範囲です。

試験の準備を通してKubernetesの理解が深まったと感じますし、実践的で楽しかったので、受験してよかったです。

## 参考リンク

- [Certified Kubernetes Security Specialist (CKS) 試験のFeedback](https://tetsuya-isogai.medium.com/certified-kubernetes-security-specialist-cks-%E8%A9%A6%E9%A8%93%E3%81%AEfeedback-c732b6e2deaa)
- [Certified Kubernetes Security Specialist "不"合格体験記](https://zenn.dev/oke_py/articles/aabfcc12ab69ac)
- [My feedback about Kubernetes Security Specialist exam (CKS)](https://jihadbenabra.medium.com/my-feedback-about-kubernetes-security-specialist-exam-a82b1af1a08c)
- [Kubernetes CKS 2021 Complete Course + Simulator](https://www.udemy.com/course/certified-kubernetes-security-specialist/)
- [Kubernetes Exam Simulator](https://killer.sh/)