初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）セキュリティ編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

## リポジトリ

[https://github.com/kubernetes-practical-guide/examples/tree/master/ch7.3.1/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch7.3.1/manifests/mattermost)

## コンテナ内でプロセスを実行するユーザを設定する

- クラスタそのもののセキュリティのリスクとアプリケーション自体のセキュリティのリスクがある
- SecurityContext は Pod 全体、コンテナごとに権限を設定できる機能である
- その中で、今回は「コンテナ内でプロセスを実行するユーザを設定」する機能を使ってみる

```diff:タグの変更とユーザ権限の定義の追加
     spec:
+      securityContext:
+        runAsUser: 1000
+        fsGroup: 1000
       containers:
-      - image: k8spracticalguide/mattermost:4.10.2
+      - image: k8spracticalguide/mattermost:4.10.2-procps
         name: mattermost
+        securityContext:
+          allowPrivilegeEscalation: false
         env:
```

USER が 1000 で実行されていることを確認できます

```console:マニュフェストの適用
$ kubectl apply -f mattermost-deploy.yaml
deployment.apps/mattermost configured

$ kubectl exec mattermost-6fcff795d6-kswk6 ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000         1  0.0  0.0   4292   744 ?        Ss   08:59   0:00 /bin/sh -c /mm/mm_entrypoint.sh
1000         6  0.8  1.1 503792 45268 ?        Sl   08:59   0:00 ./bin/platform --config=config/config.json
1000        18  1.0  0.0  36640  2664 ?        Rs   09:00   0:00 ps aux
```

## 一般ユーザで動作するようにコンテナイメージを変更する

- コンテナイメージを編国して、一般ユーザで動作するようにします

```diff:DockerfileでUSERコマンド等を追加
 WORKDIR /mm
 COPY --from=downloader /mattermost /mm_entrypoint.sh ./
 RUN apt-get update && apt-get install -y procps
-RUN chmod +x mm_entrypoint.sh
+RUN chmod +x mm_entrypoint.sh \
+  && groupadd -g 2000 mattermost \
+  && useradd -u 1000 -g mattermost mattermost \
+  && chown -R mattermost:mattermost ./
+USER mattermost
 ENTRYPOINT /mm/mm_entrypoint.sh
```

```diff:今回のDockerfileのメージで実行するようにマニュフェストを変更している
     spec:
-      securityContext:
-        runAsUser: 1000
-        fsGroup: 1000
       containers:
-      - image: k8spracticalguide/mattermost:4.10.2-procps
+      - image: k8spracticalguide/mattermost:4.10.2-non-root
         name: mattermost
         securityContext:
           allowPrivilegeEscalation: false
```

USER が mattermost で実行されていることを確認できます

```console:マニュフェスト適用
$ kubectl apply -f mattermost-deploy.yaml
deployment.apps/mattermost configured

$ kubectl exec mattermost-5545c76765-hmw7t ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
matterm+     1  0.0  0.0   4292   784 ?        Ss   09:12   0:00 /bin/sh -c /mm/mm_entrypoint.sh
matterm+     6  1.4  1.3 443476 52596 ?        Sl   09:12   0:00 ./bin/platform --config=config/config.json
matterm+    28  0.0  0.0  36640  2788 ?        Rs   09:13   0:00 ps aux
```

## 次は 7.4 章をやっていきます。

**「ネットワークのセキュリティを強化する」**です。

# 最後に

セキュリティは大切なので、書籍を読みながら今回は**写経**ですが読み込んで本質を考えていきたいと思います。

この書籍に出会い、自分自身で気になることを改めて考えるきっかけをもらえました。
個人的に開発の学びなおしとして「アルゴリズムの再勉強」「React」を地道に別途まなんでおります。
> アイディアがないのでなかなか学習のみすが・・・

React の[Doc](https://ja.reactjs.org/docs/getting-started.html) は一読した中で**SOLID** 等のエッセンスがぐっと凝縮されている感じがしました。

今回のマニュフェストについてもそういうエッセンスを入れながら作成できるようになっていきたいと思います。


# 今までの投稿
1. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Pod編](https://qiita.com/nodokaodayaka/items/04d8bc3c9c40443c1cd3)
2. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）NameSpace 編](https://qiita.com/nodokaodayaka/items/73bc1c939a665aaa4b7b)
3. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Label 編](https://qiita.com/nodokaodayaka/items/fd5284475fb1ba920559)
4. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ReplicaSet 編](https://qiita.com/nodokaodayaka/items/fc9f749f123649a2dbd9)
5. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Deployment 編](https://qiita.com/nodokaodayaka/items/2c9d4eefec40d4896126)
6.  [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Service 編](https://qiita.com/nodokaodayaka/items/28955bd813eaf512baf5)
7. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）ConfigMap 編](https://qiita.com/nodokaodayaka/items/09c7627eaa913da78cf8)
8. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Secret 編](https://qiita.com/nodokaodayaka/items/8bc1a5963a7c7c177010)
9. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）操作編](https://qiita.com/nodokaodayaka/items/09cb848164e4a1855c83)
10. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編](https://qiita.com/nodokaodayaka/items/ae95e04b064b7600f6af) 
11. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート２](https://qiita.com/nodokaodayaka/items/fa87fd7a3733957e7aca) 
12. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（Label操作）](https://qiita.com/nodokaodayaka/items/8f1892eb1627d0717180)
13. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（OwnerReference 操作）](https://qiita.com/nodokaodayaka/items/b4ad326be41626da9b2e)
14. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト編](https://qiita.com/nodokaodayaka/items/8d212a5f1eeb2685f51c)
15. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）マニュフェスト(ConfigMap)編](https://qiita.com/nodokaodayaka/items/7dd2f3885d8e957ffaad)
16. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編](https://qiita.com/nodokaodayaka/items/71c6f7d469cf2f277d3d)
17. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート２](https://qiita.com/nodokaodayaka/items/2663e1931bd1ec007785)
18. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート３](https://qiita.com/nodokaodayaka/items/9ad45aa52d76bcb844d7)
19. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）通信編 パート４](https://qiita.com/nodokaodayaka/items/e6ef632223f9ac2cc99e)
20. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート１（NodePort）](https://qiita.com/nodokaodayaka/items/754a32235cf7e648e8f9)
21. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート２（LoadBalancer）](https://qiita.com/nodokaodayaka/items/79df5bbefbb0e1a938bd)
22. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）公開編パート３（Ingress）](https://qiita.com/nodokaodayaka/items/f4433cce735f967c294e)
23. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編](https://qiita.com/nodokaodayaka/items/ae7dc8d442280b5bb9ab)
24. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）外部ストレージ編パート２](https://qiita.com/nodokaodayaka/items/beead2c136d591fe18d6)
25. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編](https://qiita.com/nodokaodayaka/items/9cd9cff01b15d7ab3e01)
26. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編 パート２](https://qiita.com/nodokaodayaka/items/bac0fa82f390b315f411)
27. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）StatefulSet編 パート３](https://qiita.com/nodokaodayaka/items/5583bbbb70438b8f9a0f)
28. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）スケール編](https://qiita.com/nodokaodayaka/items/e524099729d6baabca87)
29. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Mattermost接続編](https://qiita.com/nodokaodayaka/items/59953e5a21e5394ecb6a)
30. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）Job編](https://qiita.com/nodokaodayaka/items/de74818175eb2a6dfb5b)
31. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）安定編](https://qiita.com/nodokaodayaka/items/1e0184e65dc8ed9b161d)
32. [初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）安定編パート２](https://qiita.com/nodokaodayaka/items/6842b5604c2e52c25a17)