Calendarが多数作られていますね。2014の16日目の記事としても書きました。興味深い記事が並んでいて勉強になりますね。LinuxでのLXCの利用に焦点を当てて記事を書いていただきました。Linuxでのコンテナの作成,ネットワーク構成の応用的な解説,コンテナでサウンドを扱う話まで,面白い記事が続きましたね。Linux以外でも十分に応用ができる話でしたし,サウンドの記事に関してはサウンド以外のデバイスをコンテナで使う場合にも非常に参考になる話だったと思います。田向さん担当の記事のうち,第14回と第15回では一般ユーザによるコンテナの利用の話が出てきました。Namespace)について説明しましょう。ユーザ名前空間ユーザ名前空間については第2回で少し説明しました。回が開いてしまいましたので,改めて基本的なところから説明していきたいと思います。ユーザ名前空間は3.8カーネルで実装された,現時点では一番新しい名前空間です。この機能により名前空間内で独立したUID,GIDを持てるようになります。名前空間内のUID,GIDとホストOS上のUID,GIDの間はマッピングによるひもづけが行われます。名前空間内のUID,GIDはホスト上では別のUID,GIDを持つことになります。名前空間内ではUID,GIDが共に0のrootユーザを,ホストOS上ではUID,GID共に100000である一般ユーザとして扱えます。この機能により,コンテナ内では特権を持ちつつ,ホストOS上では特権を持たないユーザが作成でき,ホストOSとコンテナの間で権限の分離ができるようになり,セキュアにコンテナ環境を提供できるようになります。ユーザ名前空間は一般ユーザが作成できます。名前空間内の特権ユーザは本来の特権ユーザとは異なりますので,名前空間内であってもホストOS上の特権ユーザができる操作の全てができるわけではありません。名前空間内の特権ユーザに許可する操作についてはまだ議論がされていたりしますし,未知のセキュリティ問題が出てくるかも知れません。今後も細かい動きは変化していくかもしれません。それではユーザ名前空間について細かく見ていきましょう。UID,GIDのマッピング前述のように,ユーザ名前空間を作成すると,名前空間内と名前空間外で二重にIDを持つことになります。名前空間を作成した後にこの二重のIDの間をひもづけるためのマッピングを作成します。このマッピングは/proc以下の各PID名のディレクトリ以下のuid_mapとgid_mapというファイルに書き込みます。名前空間内のプロセスに対してマッピングを定義するわけですね。この定義は同じユーザ名前空間内のプロセスにも継承されますので,コンテナの最初のプロセスにマッピングを書けば,コンテナ内のプロセスには全て同じマッピングが定義されます。ホストOS上の通常のプロセスのこの2つのファイルの中身を見てみましょう。42949672953つの数字が並んでいますね。このようにuid_mapとgid_mapの書式は同じで,以下のような意味となります。(範囲)名前空間内で使用する最初のUID/GIDを「⁠(⁠名前空間内の最初のID⁠)⁠」で指定します。"0"を指定すると,名前空間内で通常のOS環境のようにrootユーザから使い始められます。アプリケーションコンテナを使う場合でrootユーザは不要であれば必ずしも"0"から始める必要はありません。,「⁠(⁠名前空間内の最初のID⁠)⁠」に対応する名前空間外のIDを「⁠(⁠名前空間外の最初のID⁠)⁠」で指定します。「⁠名前空間内の最初のUID」に"0"を,「⁠名前空間外の最初のUID」に"100000"と指定すると,名前空間内のrootは名前空間外のID=100000にひもづけられます。最後に,名前空間内で使用するIDの個数を「⁠(⁠範囲⁠)⁠」で指定します。"65536"と指定すると名前空間内で0~65535までのIDが使用できるということになります。前述の例だと名前空間外では100000~165535までにひもづけられます。前述の例をマッピングファイルに書くと以下のようになります。65536名前空間を作成した直後など,マッピングファイルへのマッピングがされていない状態では名前空間内部のIDはUIDとして/proc/sys/kernel/overflowuidの値GIDとして/proc/sys/kernel/overflowgidの値が使用されます。ユーザ名前空間でのUID,GIDのマッピングの様子では,実際にユーザ名前空間を作成して,マッピングの様子を見てみましょう。14.10の環境を使用しています。LTSではutil-linuxのバージョンが低いために,これから使用するunshareコマンドにユーザ名前空間を作成する機能がありません。現在のユーザの確認です。-gubuntu10001000ご覧のようにUID/GID=1000/1000のubuntuというユーザです。先に説明したマッピングがされない状態でのマッピング先も確認しておきます。/proc/sys/kernel/overflowgid6553465534次にunshareコマンドを実行して新しいユーザ名前空間を作成してみましょう。ユーザ名前空間を作成するには--userオプションを指定します。コマンドを指定しなければ作成した名前空間でシェルが起動します。(作成した名前空間内で実行されている)1551新しいユーザ名前空間で起動したシェルで,自身のUID/GIDとPIDを確認します。groups=65534(nogroup)まだマッピングのための操作を行っていませんので,先に説明した通りデフォルトのUID/GIDへマッピングされているのがわかります。/proc/1551/statusのUid/Gidの行で,いずれの値も65534となっていますね。procで調べてくださいね。ここで別のターミナルを開いて,ホストOS上の親の名前空間上でどうなっているかを同じコマンドを実行して見てみましょう。/proc/1551/statusご覧のように親の名前空間上では,いずれのIDも1000となっています。作成した名前空間内のUID/GID=65534/65534というマッピングがされており,それぞれの名前空間ではそれぞれの名前空間でのIDで処理が行われているのがわかります。マッピングを作成してみましょう。このマッピング操作は作成したユーザ名前空間の親の名前空間から実行する必要があります。新しく作成したユーザ名前空間内のUID/GID=0/0のユーザ,つまりrootを,ホストOSの名前空間上のUID/GID=1000/1000のユーザに割り当ててみます。1000※)その後、カーネルの修正によりgid_mapへの書き込みは一般ユーザ権限ではできなくなっています(正確には`CAP_SETGID`のケーパビリティが必要⁠)⁠。/proc/1551/gid_mapのようにする必要があります。ホストOS上ではプロセスのUID/GIDは変化していません。同じユーザで実行しているのでこれは当たり前ですね。ここで作成したユーザ名前空間のシェルに戻ってみましょう。/proc/1551ご覧のように,先ほどは65534だったUIDとGIDが0になっています。マッピングを定義した時点でそのマッピングが有効になり,定義したユーザでの処理になります。ユーザ名前空間内でのいろいろな操作このユーザ名前空間内でファイルを作成してみましょう。testfilerootの所有でファイルが作成されましたね。/home/ubuntu/testfile親の名前空間上のユーザの所有のファイルとして見えていますね。次に,ユーザ名前空間内ではrootユーザであっても,名前空間の外では特権を持たないことがわかる例を見てみましょう。ここまでの例では,新たなユーザ名前空間のみを作成しました。他の名前空間は作成していませんので,親であるホストOSの名前空間と同じ名前空間にいることになります。ネットワークインターフェースを見てみると,親の名前空間と同じインターフェースが見えます。ff:ff:ff:ff:ff:ff通常はrootであればネットワークインターフェースをdownさせたり,新しくインターフェースを作成することができます。ユーザ名前空間内のrootは親の名前空間では一般ユーザであり特権を持ちませんのでそのような操作はできません。permittedrootであっても,このようにいずれの操作もエラーで返ってきているのがわかります。思われるかも知れません。そんなことはありません。ユーザ名前空間内の特権ユーザは新たに他の名前空間を作ることができます。通常は一般ユーザではユーザ名前空間以外の名前空間は新たに作れません。試しにホストOS上の一般ユーザでネットワーク名前空間を作るコマンドを実行してみましょう。permitted以上のように親の名前空間で一般ユーザで実行するとエラーになりますね。ところが,ユーザ名前空間内のrootユーザのシェルで同じコマンドを実行すると,この操作が実行できます。ff:ff:ff:ff:ff:ff以上のように作成したユーザ名前空間内の特権ユーザであれば,新たにネットワーク名前空間が作れます。この新たに作ったネットワーク名前空間では特権がありますので,自由にインターフェースを定義できます。外部と通信を行う場合は親環境であるホストOS上での特権が必要になるので,ユーザ名前空間を作成したからと言って,自由に外部と通信ができるわけではありません。名前空間内部では通常のrootのように自由に操作できますので,通常のrootと同じようにコンテナが管理できるわけです。著者プロフィール加藤泰文(かとうやすふみ)2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。