SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

【デブサミ2020夏】セッションレポート(AD)

コンテナベースの開発パイプラインでセキュリティを実装する際の勘所とは?【デブサミ2020夏】

【A-8】コンテナベースの開発パイプラインへ“セキュリティ”を実装してみよう

  • X ポスト
  • このエントリーをはてなブックマークに追加

セキュリティを担保するのは難しい

 だが「コンテナは便利だが、セキュリティ面で気をつければならないことがある」と野原氏は続ける。

 「コンテナはカーネルを共有するが、そのカーネルを共有しているところがきちんと独立しているか。コンテナ専用OS、例えばRPMのパッケージがインストールできないなどのセキュリティをどう確保していくか。さらにコンテナはライフサイクルが特殊なので、その辺をどう継続的に見ていくかなどの課題があります」(野原氏)

 Dockerを使うときは、まずDockerファイルを記述する。このDockerファイルの1行1行はDockerのイメージレイヤとして、sha256:ハッシュ値のディレクトリに収納される。そして、これらのディレクトリを集めたものが1つのコンテナのイメージになる。

 「こういった環境で、ホストからセキュリティを提供するようなケースでは、ホストで見つかった脆弱性を、sha256:ハッシュ値のディレクトリからイメージにひも付きけることは難しい」(野原氏)

 また、Dockerは重複排除の機能があるため、同じsha256のハッシュ値を持つディレクトリであれば、1つを残して排除されることになる。つまり、このときにつけた脆弱性がイメージとしてその1つだけにひも付いているのかどうか、人の手で探すのは困難であると言うのだ。それだけではない。Dockerはスケールアウト・スケールインの動きも独特であることも影響する。

 「例えば、クラウドネイティブでアプリケーションの特定のアドレスや特定の機器にひも付かず動くという前提でつくってほしいと言われるとします。このような考え方はコンテナオーケストレーターにも取り入れられているため、Kubernetesの環境で、4ノードのクラスタの中に3つのコンテナをデプロイしたとします。明示的に指定しなければどこにデプロイされるか分かりません。このような環境でスケールアウトする場合は、今動いているのにプラスしていけばよいが、スケールインする場合は、どこのクラスタにどのコンテナが残るか分かりません。こういった動きをするコンテナに対して、特定のノードや特定のアドレスの形のセキュリティのアプローチは通用しないのです」(野原氏)

 コンテナ環境は設定変更やバージョンアップの方法が通常のアプローチと異なる。従来の仮想マシンであれば、問題が起きるとログインをして修正をして、その仮想マシンを運用し直せばよかった。

 だが、コンテナは元のイメージをリビルドして、入れ替えるというアプローチのライフサイクルになる。したがって、セキュリティのアプローチも変わってくる。コンテナは画一的なイメージの利用を前提としているため、そこで想定されない動きがないことを監視していくアプローチに変えなければならない。

 コンテナの実行環境の構成にも注意が必要になる。インフラはもちろん、Runtimeや関連ツールのバージョン、docker.sockに対する権限、ホストディレクトリのマウント状況、環境変数でコンテナに渡すクリアテキストのパスワード、イメージの脆弱性、ランタイム挙動の監視などのコンテナの構成、さらにはKubernetesやetcd、CoreDNSなどのコンポーネントのバージョンや設定など、コンテナオーケストレーターも脆弱性を持ちうるので見ていかなければならない。

 例えば、環境変数の部分。MySQLのイメージを動かすときに、「docker run -e MYSQL_ROOT_PASSWORD」といった環境変数を渡す方法を採用していたとする。この場合「docker inspect」やKubernetesであれば「kubectl describe」というコマンドで、ホストから簡単にパスワードが見えてしまう。

 Dockerfileの記述においても注意が必要だ。パスワードを入れるのは論外だが、JSON Web Tokenのファイルをコピーして、何か処理をし、その後削除するというプログラムでも、コンテナからは見えなくなっているがレイヤには残っているので、ファイルシステムから見えてしまうという問題がある。そのほかにも便利なイメージを使いたいという開発者の気持ちを悪用し、Docker Hubにマイニングスクリプトが仕掛けるという例もあるそうだ。

起動時の環境変数が見える
起動時の環境変数が見える

DevSecOpsを実現するためのツールとは

 つまり、「コンテナ環境のセキュリティは従来とは異なるアプローチが必要になる」と野原氏。ではどのような方法があるのか。その最適解は「NIST SP.800-190というコンテナに特化したガイドラインに準拠したコンテナセキュリティツールを使うことをお勧めする」と野原氏は言う。

 どのようなツールを使って環境をセキュアにしていけばよいのか。野原氏はGitHubとCircleCI、JFrog Artifactory、JFrog Xray、Twistlock(現在の名称はPrisma Cloud Compute)を紹介する。CircleCIはGitHubとシームレスに連携するCI/CDツール。

 JFrog Artifactoryは10年以上の実績がある成果物管理システムで、27種のパッケージ管理やリポジトリのプロキシ機能、アクセス制御などを提供する。JFrog XrayはArtifactoryのオプションとして使え、Artifactory上のデータにセキュティ(脆弱性診断とライセンスチェック)とそれに連動するアクセス制御を提供する。TwistlockはKubernetesのノードやコンテナホストにエージェント導入することで、コンテナの脆弱性、マルウェア検知・コンプライアンスを静的にスキャン。また、実行環境においても機械学習ベースのランタイム監視を行うほか、CIツールへの組み込みも可能。

 Dockerのイメージやサーバレス、IaC(TerraformやAWS CloudFormation、Kubernetesのマニュフェストも含まれる)のスキャンができる。もちろん、NISR SP800-190に準拠している。これらのツールを組み合わせていくのだが、この際に注意すべきポイントが2つある。「シフトレフトと自動化」である。

 つまり、なるべくDev側でチェックするようにすることと、人手を介さないように自動化することだ。シフトレフトされた側だけではなく、運用環境でのセキュリティの自動化を検討していかなければならない。こうすることで、DevOpsを継続しつつ、計画以外のすべてのところでセキュリティを担保することができるそうだ。

 実際に今回紹介した構成とほぼ同じ環境で2種類のデモを実施。最後に野原氏は、「正しいツールを組み合わせて使うことで、運用環境、開発環境に効率的にセキュリティを自動適用できるようになります」とセッションを締めた。

よりセキュアにかつ不便の少ない環境構築例
よりセキュアにかつ不便の少ない環境構築例
関連リンク

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
【デブサミ2020夏】セッションレポート連載記事一覧

もっと読む

この記事の著者

CodeZine編集部(コードジンヘンシュウブ)

CodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12760 2020/09/15 12:28

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング