‫わかりました｡ コンテナ内でrootで実行しないことは分かっています｡
‫でも､ コンテナの外では､ コンテナ内のルートは､ ホストの何かに直接アクセスすることはできないんですね｡
‫コンテナに根を張ったからと言って､
‫そこに牢屋があることに変わりはないのです｡
‫しかし､ その次のレベルとして､
‫コンテナ内でrootをとっているユーザが､ ホスト側に抜け出そうとした場合､
‫先ほど話したようなカーネルの脆弱性､ 例えばDirty
‫CowやDockerの別の脆弱性などがあるため､
‫このようなことが起こりえます｡
‫そして､ ここで行う次のステップは､ デフォルトでは有効になっていない､ ユーザーネームスペースを有効にすることです｡
‫このブログの記事へのリンクがあります｡
‫基本的には､ Dockerの設定でホストごとに設定することになります｡
‫Docker JSONのことです｡
‫これは､ Docker が新しいコンテナを作成するときに､
‫そのコンテナをホスト上の非 root ユーザとして実行するように指示します｡
‫コンテナを起動するためにDockerが使用する他のプログラムであるcontainerdとrunCがあります｡
‫デフォルトでは､ これらはrootで実行されます｡
‫Dockerの機能として､ ユーザーネームスペースを使用することができます｡
‫これは､ Dockerがコンテナを作成する際に､
‫Dockerのようにrootとして実行するサブプロセスとしてコンテナを起動しないことを意味します｡
‫高い番号のユーザーとして産み出されます｡
‫一種の､ 必ずしもランダムなユーザーではなく､ ハイレベルなユーザーです｡
‫つまり､ そのコンテナにセキュリティ上の脆弱性があり､
‫ユーザーがコンテナから脱出できたとしても､
‫ホストにはユーザーしか存在しないことになります｡
‫なぜなら､
‫そのコンテナを実行しているプロセスが使っているユーザーとして行動することになるからです｡
‫ランCは基本的に
‫そのコンテナを起動するのがrunCプログラムで､ rootではなく高番号のユーザーとして実行されます｡
‫そのユーザーは､
‫そのコンテナの外では何の権限も持っていないんだ｡ つまり､ その機能はホストごとの設定であって､
‫コンテナごとの設定ではないし､ ユーザーネームスペースですべてが動くわけでもない｡
‫試行錯誤して練習するしかないですね｡
‫いくつかのサーバーでこれを有効にして､ そのサーバーでアプリケーションを試し､
‫動作するかどうかを確認する必要があります｡
‫そうでない場合は､ アーキテクチャをセグメント化する必要があります｡
‫私がクラスタにユーザーネームスペースを実装するときはいつも､
‫ユーザーネームスペースを有効にした特定のワーカーノードを用意するのが普通です｡
‫そこで､ それをサポートし､ 連携するプログラムが稼働するのです｡
‫それ以外のものは､ どこか別の場所にある通常のDockerサーバーで実行する必要があります｡
‫そんな感じで､ セグメント分けをしています｡
‫私たちは､ サーバーを2つのクラスに分類しています｡
‫DMZを運用する場合､ DMZの中ですべてのサーバーのユーザーネームスペースを有効にして､
‫そこで実行するコンテナはユーザーネームスペースをサポートしなければならないんです｡
‫アプリケーションを見てきて､ ユーザーネームスペースをサポートしているかどうかを調べることはできません｡
‫それは... ユーザーネームスペースは､ 必ずしもDockerに特化した機能ではありません｡
‫これは基本的に､
‫コンテナがネームスペースで実行され､ そのコンテナを実行しているアプリケーションも少しロックダウンされることを意味します｡
‫すべてが対応できるわけではありません｡ 練習するか､ 他の人がその下で使えるようになったかどうか調べてみるしかないでしょう｡
‫MySQLとかの一般的なものには
‫しかし､ 明らかに､ あなた自身が開発しているプログラムについては､
‫それが動作するかどうかをテストする必要があります｡
‫私が使っているほとんどのプログラムや一般的な言語は､
‫ユーザーネーム・スペースで問題なく動作すると思います｡
‫ユーザーネームスペースの本当の問題は､
‫ボリュームへの書き込みやマウントのバインドが必要なアプリケーションがある場合､ あるいはユーザーのファイルアップロードがあり､
‫それらを多くの異なるコンテナで共有する場合です｡
‫そこで､ ユーザーの名前空間が不可能ではないのです｡
‫ただ､ ホスト上のディスクに書き込まれるファイルは､
‫現在､ 別のユーザーとして書き込まれているため､ 少し厄介なことになります｡
‫なぜなら､ コンテナを管理しているホスト上のそのプロセスは､
‫別のユーザーだからです｡
‫だから､ それらのファイルには異なるユーザーIDが表示されるので､ それに対処する必要があります｡
‫その時点でLinuxの標準的なパーミッションがあり､
‫その問題をLinux標準の様々な方法で自動化し解決すればいいだけです｡
‫その時点でDockerの問題でもないんです｡
‫ホストのパーミッションの問題なんです｡