分12前回からだいぶ間隔が空いてしまいました。前回の最後に案内したudzuraさんのCRIUに関する記事はもう少し時間がかかるようですので,もうしばらく私が担当したいと思います。今回から数回は,Linuxカーネルに実装されているケーパビリティについて説明します。ケーパビリティは2.2カーネルのころから実装されてきているかなり古くからある機能で,コンテナ向けの機能ではなく一般的に使われている機能です。コンテナの安全性を高めるための重要な機能でもあります。setuid一般的にはUNIX系のOSでは,プロセスはroot権限(実効ユーザIDが0)で実行される特権プロセスと,一般ユーザ権限で実行される(実効ユーザIDが0以外の)非特権プロセスに分けられます。一般ユーザは,通常はそのユーザの権限でプログラムを実行すれば良いのですが,一般ユーザが実行するプログラムであっても処理の内容によっては特権が必要な場合があります。↑(このsがsetuidされている印)ケーパビリティ先に紹介したpingコマンドは,パケット送信にRawソケットを使います。このRawソケットを使う場合には特権が必要ですのでsetuidされており,root権限で実行されていたのでした。逆に言うとRawソケットを使うのに必要な権限のみが必要なのに,広範囲に渡るrootが持つ強い権限すべてをpingコマンドに渡していることになります。これはセキュリティ上の観点から望ましいことではありません。Linuxにはこのような場合に使える,rootが持っている絶対的な権限を細かく分け,必要な権限だけを与える仕組みが存在します。これがケーパビリティ(capability)です。ケーパビリティはスレッドごとに設定され,スレッドは自身が持つケーパビリティを変更できます。CAP_NET_RAWというケーパビリティがあればRawソケットを使用できます。Linuxカーネルでは,このような細分化されたケーパビリティが多数定義されており,/usr/include/linux/capability.hで定義されています。:(略)ケーパビリティの実装は結構古くて,2.2カーネル以降で使えます。カーネルの進化とともに新たなケーパビリティが追加されているので,カーネルのバージョンによって指定できるケーパビリティが異なります。どのようなケーパビリティが定義されており,それぞれのケーパビリティがどのような権限に対応しているのか,いつのカーネルから使えるようになったかについては,マニュアルcapabilities(7)に載っています。プロセスのケーパビリティプロセス(実際はスレッド)はそれぞれ4種類のケーパビリティセットというものを持っています。ケーパビリティセットは,内部的にはビット列で,ケーパビリティを持っていれば1がセットされます。Set(以降,バウンディングセット)というものがあります。実際にカーネルがプロセスが持つ権限をチェックする時は,Effectiveケーパビリティをチェックします。Effectiveで許可されていない操作はできません。ケーパビリティが変化する機会は3種類あります。capset(2):システムコールでケーパビリティを設定するexecve(2):システムコールの前後でケーパビリティが変化するprctl(2):システムコールでAmbientケーパビリティやバウンディングセットを設定するexecve(2)システムコールはプログラムを実行するためのシステムコールです。このシステムコールとケーパビリティの関係については次回で説明します。実行中のプロセスが持つケーパビリティを確認するでは実際にプロセスでケーパビリティがどのように設定されているかを見てみましょう。プロセス(スレッド)が持つケーパビリティは/proc/<PID>/statusファイルで確認できます。PIDが1であるinitのPermitted(CapPrm⁠)⁠,Effective(CapEff⁠)⁠,バウンディングセット(CapBnd)は,次のようにすべて1が設定された状態になっています。0000000000000000特定のケーパビリティだけが設定されている,ホストの時刻合わせを行うためのデーモンであるntpdは次のようになっています。ファイルでケーパビリティを確認できます。このファイルを見ただけでは何かのビットが立っていることはわかっても,それぞれのビットが意味するケーパビリティを覚えていないと,プロセスが何のケーパビリティを持っているかはわかりません。わかりやすくプロセスのケーパビリティセットを確認したい場合はlibcapに含まれるgetpcapsコマンドが使えます(Ubuntuの場合はlibcap2-binパッケージに含まれています⁠)⁠。cap_net_bind_service,cap_sys_time+epポート番号1024番未満を使うには特権が必要です。ntpdは一般ユーザであるntpユーザ権限で動作しており,本来であればntpdで使うポートである123番ポートは使えないはずです。特権ポートが使えるケーパビリティであるcap_net_bind_serviceを持っているので123番ポートを使えます。システムクロックを設定できるケーパビリティであるcap_sys_timeを持っていますので,本来は一般ユーザではできないシステムクロックの設定ができるわけです。ntpdは必要最低限のケーパビリティのみを持った状態で実行されているということです。不要な特権を持たずにデーモンが実行されていますので,より安全性が高まるというわけです。Linux著者プロフィール加藤泰文(かとうやすふみ)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.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。