Dockerセキュリティ:
今すぐ役に立つテクニックから,次世代技術まで [Japan Container Days発表レポート]
NTTの須田です.Moby (≒Docker),BuildKit,containerdなど,コンテナ関連のオープンソースソフトウェアのメンテナ (開発委員.コミッタとも.)を務めています.また,Docker Meetup Tokyoの企画・運営も行っています.
2018年12月4日から5日にかけて,日本最大のコンテナ技術カンファレンスである,Japan Container Days (JKD)が開催されました.本記事では,須田の発表 「Dockerセキュリティ: 今すぐ役に立つテクニックから,次世代技術まで」の一部をかいつまんでご紹介します.発表の全体についてはSlideshareの資料をご覧ください.
プライベートリポジトリを用いるイメージビルド
Dockerfileの中から,プライベートなGitリポジトリなどへアクセスする際は注意が必要です. id_rsa
などの鍵ファイルを COPY
( ADD
)して RUN git
等を実行し,後で鍵を削除( RUN rm
)すればよいだけのように思われるかも知れませんが,このような方法は危険です.鍵のファイルを後で RUN rm
しても, COPY
命令に対応するイメージレイヤ中には,鍵ファイルが残るためです.他者が参照可能なレジストリにイメージをpushすると,鍵ファイルを奪取される恐れがあります.
Docker 18.09からは,鍵を用いて安全にイメージをビルドする手法として, docker build --secret
及び docker build --ssh
が用意されています.これらのコマンドを利用すると,鍵をイメージに残さずに,安全にイメージをビルドすることが出来ます.(Docker 18.09の新機能については,須田の前回の記事もご覧ください)
Dockerソケットの保護
docker
コマンドは,リモートのDockerホストにREST APIを用いて接続することが出来ます.Dockerホストが攻撃者に乗っ取られることを防ぐには,TLSを有効化したり,ポートへアクセス可能なIPアドレスを絞ったりする必要があります.しかしながら,こうした設定は容易ではありません.実際,Dockerホストの設定不備を突いて仮想通貨を発掘するマルウェアが確認されています.
Docker 18.09では,須田が2017年より提案してきた,SSHを用いたリモートDockerホスト接続機能が採用されています.SSHは,リモートのLinuxホストに接続する最も一般的な方法であり,TLSに比べて簡単に設定することが出来ます.
(須田の前回の記事もご覧ください)
SSHを用いたDockerホスト接続機能は,奇しくもJapan Container Daysと同時に開催されたDockerCon EUでも,キーノートにて紹介されたようです.(動画の0:57:16あたり)
非rootユーザでのDockerデーモンの実行
Dockerは,NamespacesやCapabilitiesなどを用いて,アプリケーションをホストや他のアプリケーションから隔離します.Dockerを用いることにより,アプリケーションに脆弱性があっても,その実際の影響範囲を限定することが出来ます.
しかしながら,Docker自体や関連コンポーネントには,過去にさまざまな脆弱性が見つかっています.Dockerデーモンはホストのroot権限で動作するため,Dockerデーモンの脆弱性を攻撃者につかれると,ホストのroot権限を奪取される恐れがあります.
次期バージョンのDockerでは,非rootユーザにてDockerデーモン及び関連コンポーネントを実行することが可能となる見込み(須田の提案)です.root権限での動作を避けることにより,Dockerデーモン及び関連コンポーネントに脆弱性があったとしても,その影響を軽減することが出来ます.
非rootユーザでのDockerデーモン実行をいち早く試すには,Usernetesを使うと便利です.Usernetesには,非rootユーザでの実行を可能にするパッチが適用された,Docker(およびKubernetes)のバイナリが含まれています.Usernetesは,アーカイブを非rootユーザのホームディレクトリ以下に展開するだけで,簡単にインストールできます.
代替ランタイム
コンテナの機能自体は,DockerではなくruncなどのOCI (Open Container Initiative)ランタイムに実装されています. OCIランタイムは,Dockerがデフォルトで用いるruncの他,Kata Containers,gVisor,Nabla Containersなどが存在します.これらの代替ランタイムを用いると,コンテナ間のアイソレーションを更に強めることが出来ます.ただし,性能面や互換性面での欠点が存在することに注意が必要です.
また,2018年11月27日には,AWSのLambdaやFargate向けに開発された軽量VMであるFirecrackerがオープンソース化されました.今のところFirecrackerはDockerのランタイムとしては利用出来ませんが,今後,containerdプラグインを通じて可能になるものと見込まれます.また,FirecrackerはKata Containersでも採用が予定されており,今後更なる注目を集めるものと思われます.
おわりに
私たちNTTは,オープンソースコミュニティで共に活動する仲間を募集しています.ぜひ弊社 ソフトウェアイノベーションセンタ紹介ページ及び,採用情報ページをご覧ください.