原文連接:fuckcloudnative.io/posts/secur…linux
對於大部分 Kubernetes 用戶來講,安全是可有可無的,或者說沒那麼緊要,就算考慮到了,也只是敷衍一下,草草了事。實際上 Kubernetes 提供了很是多的選項能夠大大提升應用的安全性,只要用好了這些選項,就能夠將絕大部分的攻擊抵擋在門外。爲了更容易上手,我將它們總結成了幾個最佳實踐配置,你們看完了就能夠開幹了。固然,本文所述的最佳安全實踐僅限於 Pod 層面,也就是容器層面,於容器的生命週期相關,至於容器以外的安全配置(好比操做系統啦、k8s 組件啦),之後有機會再嘮。web
大部分狀況下容器不須要太多的權限,咱們能夠經過 Security Context
限定容器的權限和訪問控制,只需加上 SecurityContext 字段:api
apiVersion: v1
kind: Pod
metadata:
name: <Pod name>
spec:
containers:
- name: <container name>
image: <image>
+ securityContext:
複製代碼
allowPrivilegeEscalation=true
表示容器的任何子進程均可以得到比父進程更多的權限。最好將其設置爲 false,以確保 RunAsUser
命令不能繞過其現有的權限集。安全
apiVersion: v1
kind: Pod
metadata:
name: <Pod name>
spec:
containers:
- name: <container name>
image: <image>
securityContext:
+ allowPrivilegeEscalation: false
複製代碼
爲了防止來自容器內的提權攻擊,最好不要使用 root 用戶運行容器內的應用。UID 設置大一點,儘可能大於 3000
。markdown
apiVersion: v1
kind: Pod
metadata:
name: <name>
spec:
securityContext:
+ runAsUser: <UID higher than 1000>
+ runAsGroup: <UID higher than 3000>
複製代碼
這個就不用多說了吧,requests 和 limits 都加上。網絡
ServiceAccount 爲 Pod 中運行的進程提供身份標識,怎麼標識呢?固然是經過 Token 啦,有了 Token,就防止假冒僞劣進程。若是你的應用不須要這個身份標識,能夠沒必要掛載:svg
apiVersion: v1
kind: Pod
metadata:
name: <name>
spec:
+ automountServiceAccountToken: false
複製代碼
對於 Linux 來講,用戶層一切資源相關操做都須要經過系統調用來完成,那麼只要對系統調用進行某種操做,用戶層的程序就翻不起什麼風浪,即便是惡意程序也就只能在本身進程內存空間那一分田地晃悠,進程一終止它也如風消散了。seccomp(secure computing mode)就是一種限制系統調用的安全機制,能夠能夠指定容許那些系統調用。oop
對於 Kubernetes 來講,大多數容器運行時都提供一組容許或不容許的默認系統調用。經過使用 runtime/default
註釋或將 Pod 或容器的安全上下文中的 seccomp 類型設置爲 RuntimeDefault
,能夠輕鬆地在 Kubernetes 中應用默認值。post
apiVersion: v1
kind: Pod
metadata:
name: <name>
annotations:
+ seccomp.security.alpha.kubernetes.io/pod: "runtime/default"
複製代碼
默認的 seccomp 配置文件應該爲大多數工做負載提供足夠的權限。若是你有更多的需求,能夠自定義配置文件。url
容器依賴於傳統的Unix安全模型,經過控制資源所屬用戶和組的權限,來達到對資源的權限控制。以 root 身份運行的容器擁有的權限遠遠超過其工做負載的要求,一旦發生泄露,攻擊者能夠利用這些權限進一步對網絡進行攻擊。
默認狀況下,使用 Docker 做爲容器運行時,會啓用 NET_RAW
capability,這可能會被惡意攻擊者進行濫用。所以,建議至少定義一個PodSecurityPolicy
(PSP),以防止具備 NET_RAW 功能的容器啓動。
經過限制容器的 capabilities,能夠確保受攻擊的容器沒法爲攻擊者提供橫向攻擊的有效路徑,從而縮小攻擊範圍。
apiVersion: v1
kind: Pod
metadata:
name: <name>
spec:
securityContext:
+ runAsNonRoot: true
+ runAsUser: <specific user>
capabilities:
drop:
+ -NET_RAW
+ -ALL
複製代碼
若是你對 Linux capabilities 這個詞一臉懵逼,建議去看看個人腦殘入門系列:
若是容器不須要對根文件系統進行寫入操做,最好以只讀方式加載容器的根文件系統,能夠進一步限制攻擊者的手腳。
apiVersion: v1
kind: Pod
metadata:
name: <Pod name>
spec:
containers:
- name: <container name>
image: <image>
securityContext:
+ readOnlyRootFilesystem: true
複製代碼
總之,Kubernetes 提供了很是多的選項來加強集羣的安全性,沒有一個放之四海而皆準的解決方案,因此須要對這些選項很是熟悉,以及瞭解它們是如何加強應用程序的安全性,才能使集羣更加穩定安全。
最後,請記住:你須要萬分當心你的 YAML 文件內容縮進,若是你的 YAML 文件很是多,眼睛看花了,但願下面的神器能夠助你一臂之力: