この記事では、Kubernetes の非ルート コンテナーについて説明します: 非ルート コンテナー

序文

k8s 自体はコンテナーの定義と実装を担当しません. Kubernetes はコンテナー ランタイム インターフェイスを使用してコンテナー管理を実装し、コンテナーの実装はコンテナー ランタイム (Docker、CRI-O など) を介して実現されます。

非ルート コンテナとデフォルト コンテナの違い

The default inside the container is to execute commands as the root user, which means that the application has the maximum execution authority inside the container where it is located. プログラムは、コンテナー内のシステム ファイルを変更し、機密情報にアクセスし、実行時にシステム. パッケージでは、1024 未満の任意のポートをバインドすることもできます.

非ルート コンテナーの出現は、これらの危険な動作を防ぐためです。非ルート コンテナが開始されると、ルート コンテナに変換できなくなります. アプリケーションは特定のユーザー ロールでのみ実行できるため、悪意のあるコードが最高の実行権限を取得するのを防ぐことができます.

非ルート コンテナの長所と短所

利点: 1. セキュリティ。Openshift などの一部の k8s ディストリビューションでは、非ルート コンテナーを使用する必要があります。

欠点: 権限が不十分なため、アプリケーションが特定のファイルやディレクトリにアクセスしたり、作成したりできない場合があります。mysql、git、その他のアプリケーションなど。

非ルート コンテナの制限を回避する方法

アプリケーションが何かを行うために root 権限を使用する必要があるが、root 以外のコンテナーを使用して実行したい場合は、次のオプションを検討できます。

  1. initContainers を使用します。initContainers は、Pod 内の他のコンテナーが開始される前に実行して、コンテナーに必要な環境を初期化できる特別なコンテナーです。
  2.  Dockerfile を変更し、Dockerfile で root ユーザーとしての作業が完了したら、指定したユーザーに戻します。
  3.  Dockerfile で実行時にアクセスする必要があるファイルのアクセス許可を変更します (非推奨)。
  4.  マウントされたボリュームを使用する場合は、UID などのパラメーターを変更して、マウントされたボリュームの所有者を非ルート コンテナーで使用されるユーザーまたはグループに設定します。このようにして、ルート以外のコンテナはマウントされたボリュームに自分のユーザーとしてアクセスできます。

非ルート コンテナの作成方法

非ルート コンテナーの作成は、次の 2 つの部分に分割する必要があります。

Dockerfile

Dockerfile では、 コマンドUSER <UID>によって、デフォルトの root ユーザーを指定したユーザーに切り替えることができます。

以下に示すように、USER 1001以降のコマンドは、 UID 1001 のユーザー権限で実行されます。ユーザーが存在しない場合、docker は UID でユーザーを作成しようとします。

Red Hat によって起動された Pass プラットフォームである Openshift は、dockerfile で指定されたユーザーを無視しますが、ランダムな UID を使用することに注意してください。これは、Openshift 上のすべてのコンテナーがデフォルトで非ルート モードで実行されることも意味します。

FROM bitnami/minideb-extras:jessie-r22
LABEL maintainer "Bitnami <[email protected]>"

ENV BITNAMI_PKG_CHMOD="-R g+rwX"
...
RUN bitnami-pkg unpack nginx-1.12.2-0 --checksum cb54ea083954cddbd3d9a93eeae0b81247176235c966a7b5e70abc3c944d4339
...
USER 1001
ENTRYPOINT ["/app-entrypoint.sh"]
CMD ["nginx","-g","daemon off;"]

Kubernetes

Kubernetes で非ルート コンテナーを作成するには、Pod のコンテナー定義で securityContext を設定する必要があります。つまり、runAsUser フィールドと runAsGroup フィールドを設定してコンテナー内のプロセスのユーザーとグループを指定することにより、非ルート コンテナーが作成されます。

同時に、Dockerfile で USER コマンドを使用して、ファイルとディレクトリの権限を非 root ユーザーおよびグループに設定する必要があります。そうしないと、非 root ユーザーとしてコンテナーを実行するときに権限の問題が発生する可能性があります。

apiVersion: v1
kind: Pod
metadata:
  name: non-root-container-pod
spec:
  containers:
  - name: non-root-container
    image: my-non-root-image
    securityContext:
      runAsUser: 1000 # 指定非root用户
      runAsGroup: 3000 # 指定非root组

参考

非ルート コンテナーがセキュリティにとって重要な理由 (bitnami.com)

チャットGPT

おすすめ

転載: blog.csdn.net/qq_40404477/article/details/129905976