$30 off During Our Annual Pro Sale. View Details »

Kubernetesのセキュリティのベストプラクティス

 Kubernetesのセキュリティのベストプラクティス

Ian Lewis

March 08, 2018
Tweet

More Decks by Ian Lewis

Other Decks in Technology

Transcript

  1. Kubernetesのセキュリティ
    ベストプラクティス
    ianmlewis@

    View Slide

  2. Ian Lewis

    ianlewis@

    Google

    Tokyo, Japan

    #kubernetes, #go,
    #python

    View Slide

  3. Kubernetes
    ● コンテナ
    オーケストレーション
    ● インフラ
    API/
    フレームワーク

    View Slide

  4. Guestbookアプリ

    Web Frontend
    ○ ウェブアプリ

    HTML/JS/CSS

    Message
    ○ メッセージを
    保存・閲覧

    NGWord

    NG
    ワードを
    検出する
    Kubernetes Cluster
    Web
    Frontend
    Redis
    NGWord
    message

    View Slide

  5. Kubernetes API Server
    1.
    フロントエンド
    Pod
    から
    トークンを取得
    2.
    トークンを利用し、
    API
    サーバーを攻撃
    3.
    シークレットなどを取得
    し、さらに
    サービスを攻撃
    Kubernetes Cluster
    Web
    Frontend
    Redis
    NGWord
    message



    View Slide

  6. Mitigate 1 & 2: RBAC

    Role Based Access Control
    ● ユーザーやサービスアカウントへロールを付与
    ● ロールが権限を持つ

    get secrets

    update configmap

    etc.

    RBAC
    設定はネームスプペース範囲

    GKE
    では
    IAM
    と連携

    View Slide

  7. Mitigate 1 & 2: RBAC
    ClusterRole
    ClusterRoleBinding
    1:many many:1
    Verb +
    Type

    View Slide

  8. Mitigate 2: API Server Firewall

    API
    サーバーへのアクセスを
    IP
    アドレスに制限

    GKE:
    ○ gcloud container clusters create
    --enable-master-authorized-networks
    --master-authorized-networks=....

    View Slide

  9. Mitigate 3: Network Policy
    ● データベースへのアクセスを必要のある
    Pod
    に制限
    ● ラブルセレクターで
    Pod
    を選択
    ● ネットワークプラグインで実装されてる
    : Calico, Weave, etc.

    View Slide

  10. NetworkPolicy
    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
    name: redis
    spec:
    podSelector:
    matchLabels:
    name: redis
    ingress:
    - from:
    - podSelector:
    matchLabels:
    name: guestbook

    View Slide

  11. ホストへアクセス
    1.
    コンテナ外へ突破
    2. Kubelet
    を攻撃
    3.
    同じホストに実行中の
    コンテナを攻撃
    Host
    Web
    Frontend

    View Slide

  12. Mitigate 1: non-rootユーザーで実行
    apiVersion: v1
    kind: Pod
    metadata:
    name: security-context-demo
    spec:
    securityContext:
    runAsUser: 1000

    View Slide

  13. Mitigate 1: 読込専用ファイルシステム
    apiVersion: v1
    kind: Pod
    metadata:
    name: security-context-demo
    spec:
    securityContext:
    readOnlyRootFilesystem: true

    View Slide

  14. Mitigate 1: no_new_privs
    apiVersion: v1
    kind: Pod
    metadata:
    name: security-context-demo
    spec:
    securityContext:
    allowPrivilegeEscalation: false

    View Slide

  15. Mitigate 1: 組み合わせ
    apiVersion: v1
    kind: Pod
    metadata:
    name: security-context-demo
    spec:
    securityContext:
    runAsUser: 1000
    readOnlyRootFilesystem: true
    allowPrivilegeEscalation: false

    View Slide

  16. Your App
    Container
    seccomp
    Mitigate 1:
    seccomp/
    AppArmor/
    SELinux
    AppArmor/
    SELinux

    View Slide

  17. seccomp
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    annotations:
    seccomp.security.alpha.kubernetes.io/pod: runtime/default
    ...

    View Slide

  18. AppArmor
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    annotations:
    container.apparmor.security.beta.kubernetes.io/hello: runtime/default
    spec:
    containers:
    - name: hello
    ...

    View Slide

  19. SELinux
    apiVersion: v1
    kind: Pod
    metadata:
    name: mypod
    spec:
    securityContext:
    seLinuxOptions:
    level: "s0:c123,c456"
    containers:
    - name: hello
    ...

    View Slide

  20. Mitigate 2 & 3: Kubeletの権限を制限する
    ● RBAC for Kubelet:
    ○ --authorization-mode=RBAC,Node
    --admission-control=...,NodeRestriction
    ● Rotate Kubelet certs:
    ○ kubelet … --rotate-certificates

    View Slide

  21. Unsecured Pods

    You follow the rules
    but others don't
    Kubernetes Cluster
    Web
    Frontend
    Redis
    NGWord
    message

    View Slide

  22. Mitigate: PodSecurityPolicy
    apiVersion: extensions/v1beta1
    kind: PodSecurityPolicy
    metadata:
    name: example
    spec:
    privileged: false # Don't allow privileged pods!
    # The rest fills in some required fields.
    seLinux:
    rule: RunAsAny
    supplementalGroups:
    rule: RunAsAny
    runAsUser:
    rule: 1000
    fsGroup:
    rule: RunAsAny
    volumes:
    - '*'

    View Slide

  23. istio

    Service mesh

    Envoy proxy
    組み込み

    View Slide

  24. トラフィクを傍受
    1.
    ネットーワーク上の通
    信を傍受
    2.
    あるサビースに不正リ
    クエストを送る
    Kubernetes Cluster
    Web
    Frontend
    Redis
    NGWord
    message

    View Slide

  25. istio
    1.
    サービス間の
    プロクシー
    2.
    暗号化
    3.
    証明書の自動更新
    4.
    ポリシーが
    セントラルサーバで集
    中して管理する
    Kubernetes Cluster
    Web
    Frontend
    Redis
    NGWord
    message

    View Slide

  26. Thanks!

    View Slide