コンテナ内で実行されているプロセスとホスト システム間のユーザー名、グループ名、ユーザー ID (UID)、グループ ID (GID) のマッピングを理解することは、安全なシステムを構築する上で重要な部分です。他のオプションが指定されていない場合、コンテナ内のプロセスはルート ユーザーとして実行されます (Dockerfile で別の UID が指定されていない限り)。この記事では、これがどのように機能するか、権限を正しく付与する方法、および例を示して説明します。 uid/gid セキュリティのステップバイステップの分析まず、uid と gid がどのように実装されているかを確認しましょう。 Linux カーネルは、カーネルレベルのシステム コールを使用して、要求された特権を付与するかどうかを判断し、uid および gid スペースを管理する責任があります。たとえば、プロセスがファイルに書き込もうとすると、カーネルはプロセスを作成した uid と gid をチェックして、ファイルを変更するのに十分な権限があるかどうかを判断します。ユーザー名の代わりに uid が使用されます。 サーバー上で Docker コンテナを実行する場合、カーネルは 1 つだけです。コンテナ化がもたらす大きな価値の 1 つは、これらすべての独立したプロセスが単一のカーネルを引き続き共有できることです。つまり、Docker コンテナを実行しているサーバー上でも、uid と gid の世界全体が単一のカーネルによって制御されます。 したがって、同じ uid を異なるコンテナーで使用したり、異なるユーザーに割り当てることはできません。これは、一般的な Linux ツールに表示されるユーザー名 (およびグループ名) がカーネルの一部ではなく、外部ツール (/etc/passwd、LDAP、Kerberos など) によって管理されるためです。したがって、異なるユーザー名が表示される場合がありますが、異なるコンテナーであっても、同じ uid/gid に対して異なる権限を持つことはできません。最初はかなり混乱するかもしれませんので、いくつかの例を見てみましょう。 シンプルなDocker実行まず、docker グループのメンバーであるサーバーに通常のユーザー (marc) としてログインします。この方法では、sudo コマンドを使用せずに Docker コンテナを起動できます。次に、コンテナの外側から、このプロセスがどのように見えるかを見てみましょう。 私は sudo を入力したことがなく、root ではありませんでしたが、実行した sleep コマンドは root として開始され、root 権限がありました。ルート権限があるかどうかはどうすればわかりますか?コンテナ内のルートはコンテナ外のルートと同じですか?はい、前述したように、単一のカーネルと、uid および gid の共有プールが存在するためです。コンテナ外に表示されるユーザー名は「root」なので、コンテナ内のプロセスは uid=0 のユーザーとして開始されていることが分かります。 定義されたユーザーを含むDockerfileDockerfile で別のユーザーを作成し、そのユーザーとしてコマンドを起動するとどうなりますか?例を簡略化するために、ここでは gid を指定していませんが、同じ概念がグループ ID にも適用されます。 まず、ユーザー ID が 1001 の「marc」というユーザーとしてこれらのコマンドを実行します。 Dockerファイル: 建てる: ここでは一体何が起こっているのでしょうか、そしてそれは何を意味するのでしょうか?私は、uid 1001 の「appuser」というユーザーを持つ Docker イメージを構築しました。テスト サーバーでは、uid 1001 の「marc」というアカウントも使用しています。コンテナを起動すると、Dockerfile に「USER appuser」という行が含まれていたため、sleep コマンドが appuser として実行されました。ただし、これは実際には appuser として実行されているわけではなく、Docker イメージで appuser として識別されるユーザーの uid として実行されています。 コンテナ外で実行されているプロセスを調べると、ユーザー「marc」にマップされていることがわかりますが、コンテナ内ではユーザー「appuser」にマップされています。これら 2 つのユーザー名は、実行コンテキストが認識しているユーザー名を 1001 にマップしているだけを示しています。 これはあまり重要ではありません。しかし、コンテナ内では、ユーザー「appuser」がコンテナ外のユーザー「marc」から権限と特権を取得したことを認識することが重要です。 Linux ホスト上のユーザー marc または uid 1001 に付与された権限は、コンテナー内の appuser にも付与されます。 コンテナのアクセス権限を制御する方法もう 1 つのオプションは、Docker コンテナを実行するときにユーザー名またはユーザー ID とグループ名またはグループ ID を指定することです。 最初の例をもう一度使ってみましょう。 ここで何をしたのでしょうか?ユーザー 1001 として起動するコンテナーを作成しました。そのため、ps や top (またはほとんどの監視ツール) などのコマンドを実行すると、プロセスは「marc」ユーザーにマップされます。 興味深いことに、そのコンテナに ssh すると、1001 ユーザーのエントリが /etc/passwd ファイルに存在せず、「名前がありません」と表示されることがわかります。コンテナの bash プロンプトで。 コンテナを作成するときにユーザー フラグを指定すると、Dockerfile 内の値も上書きされることに注意することが重要です。 2番目の例を覚えていますか?当時、私は、uid がローカル ホスト上の異なるユーザー名にマップされている Dockerfile を使用していました。コマンドラインでユーザーフラグを使用して、「sleep infinity」プロセスを実行するコンテナを起動すると何が起こりますか? 上記の最後の例では、スリープ プロセスを実行するコンテナーが 2 つあることがわかります。1 つは「marc」、もう 1 つは「root」です。これは、2 番目のコマンドがコマンド ラインで --user フラグを渡すことによってユーザー ID を変更したためです。 要約するこれを調べてみると、制限された権限でコンテナを実行するすべての方法がホストのユーザー システムを利用していることがわかります。
|
<<: SaaS とオンプレミスの IT 管理プラットフォームの導入: 長所と短所
>>: テスラがハッキングされた? Kubernetes クラスターを保護し、ハッカーの侵入を防ぐにはどうすればよいでしょうか?
Microsoft Windows Virtual Desktop を展開する前に、IT プロフェッ...
12月15日、Tencent Cloud + Community Developer Confere...
最新の映画サイトを立ち上げてからまだ 2 か月も経っていませんが、最適化のテクニックと経験を皆さんと...
SEOテクノロジーを使用して、予算ゼロで Web サイトの正確なトラフィックを 2 倍にするにはどう...
製品を市場に投入し、初期の認知度を得た後、どのようにユーザーベースをさらに拡大できるでしょうか?顧客...
ご存知のとおり、ユーザー エクスペリエンスは検索エンジン最適化のプロセス、特に Baidu にとって...
IoT デバイスの増加により、企業がデジタル化を進める中で処理できる、また処理しなければならないデー...
Raysync はビッグデータ転送ソフトウェア (プラットフォーム) として、常に前進し、より包括的...
[51CTO.comより] 第9回中国(天津浜海)国際エコシティフォーラムと2018年中国国際デジタ...
Cloudive はトルコに登録された会社で、KVM ベースのサービス、40G ネットワークへのアク...
dedipath は、OpenVZ および KVM シリーズすべてを 50% 割引、継続割引、同じ更...
世界にはドメイン名がいくつあるのでしょうか? Xiaoye は正確な数を知りません。しかし、ドメイン...
MMVゼネラルマネージャーのハスル・サンジ氏(写真提供:テンセントテクノロジー)テンセントテクノロジ...
気がつけば、SEOを始めて1年以上経ちました。この間、多くのことを経験し、多くのことを学び、百度のラ...
He Guijiang 氏は、A5 Webmaster Network の検索マーケティング部門で ...