Docker によるコンテナセキュリティ入門

CompTIABeginner
オンラインで実践に進む

はじめに

Docker を用いたコンテナセキュリティの基本に関するハンズオンラボへようこそ。Docker は、コンテナ内でアプリケーションを開発、出荷、実行するための強力なプラットフォームです。コンテナはプロセス分離を提供しますが、アプリケーションとホストシステムを保護するためには、コンテナのセキュリティ確保が不可欠です。

このラボでは、Docker コンテナセキュリティの基本を探求します。まず、LabEx 環境で Docker が正しく設定されていることを確認します。次に、基本的な Nginx Web サーバーコンテナを実行し、その実行中のプロセスを検査し、リソース消費を調べます。最後に、コンテナにリソース制限を設定することで、基本的なセキュリティ制御を適用する方法を学びます。

このラボの終わりには、Docker 環境のセキュリティ確保に関わる初期ステップについて実践的な理解を得られるでしょう。

Docker のインストールとセットアップの確認

このステップでは、LabEx 環境に Docker が既にインストールされていることを確認し、それを使用するための適切な権限があることを保証します。

LabEx の仮想マシンには Docker がプリインストールされています。まず、Docker のバージョンを確認して、利用可能であることを確認しましょう。

docker --version

以下のような出力が表示され、Docker が正しくインストールされていることが確認できるはずです。

Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3

次に、Docker デーモンが実行されているか確認しましょう。

sudo systemctl status docker

このコマンドは Docker サービスのステータスを表示します。アクティブで実行中であることが表示されるはずです。

sudo なしで Docker コマンドを実行するには、ユーザーが docker グループに属している必要があります。LabEx 環境では、ユーザーは既に適切な権限で設定されています。これを検証しましょう。

groups $USER

出力に docker が含まれているはずで、ユーザーが必要な権限を持っていることが確認できます。

labex : labex sudo docker ssl-cert

ユーザーは既に docker グループに属しているため、sudo を必要とせずに Docker コマンドを直接実行できます。

簡単なコマンドを実行して、Docker が正常に機能していることをテストしましょう。

docker info

このコマンドは Docker に関するシステム全体の情報を表示し、Docker デーモンとの通信が成功していることを確認します。

基本的な Web サーバーコンテナの実行

このステップでは、最初のコンテナを実行します。軽量で高性能な Web サーバーを提供する公式の nginx イメージを使用します。

コンテナを実行するには、docker run コマンドを使用します。いくつかの一般的なフラグを使用します。

  • -d: コンテナをデタッチモード(バックグラウンド)で実行します。
  • -p 8080:80: ホストのポート 8080 をコンテナ内のポート 80 にマッピングします。これにより、localhost:8080 経由で Nginx サーバーにアクセスできます。
  • --name webserver: コンテナに覚えやすい名前を付けます。
  • nginx: 使用するイメージの名前です。

Nginx コンテナを開始するには、次のコマンドを実行します。

docker run -d -p 8080:80 --name webserver nginx

Docker はまず nginx イメージがローカルで利用可能か確認します。利用可能でない場合は、Docker Hub から自動的にダウンロードしてからコンテナを開始します。docker ps コマンドを使用して、コンテナが実行されていることを確認できます。

docker ps

出力には、webserver コンテナ、その ID、ベースとなっているイメージ、およびポートマッピングが表示されます。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   webserver

次に、Web サーバーが機能しているかテストしましょう。curl を使用して、マッピングされたポートのサーバーにリクエストを送信します。

curl localhost:8080

出力としてデフォルトの Nginx へようこそページ HTML が表示されるはずです。これは、コンテナが実行されており、アクセス可能であることを確認します。

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. For further configuration, refer to the
      <a href="http://nginx.org/">nginx.org</a> documentation.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

コンテナのプロセスとリソース使用状況の確認

このステップでは、コンテナ内で実行されているプロセスを検査し、そのリソース消費を監視する方法を学びます。これは、デバッグやコンテナ化されたアプリケーションの動作を理解するための基本的なスキルです。

コンテナの重要な機能の 1 つは、プロセスの分離です。ホストの視点から、コンテナに exec しなくても、コンテナ内で何が実行されているかを確認できます。docker top コマンドを使用すると、コンテナの主要なプロセスを表示できます。

webserver コンテナ内のプロセスを表示するには、次のコマンドを実行します。

docker top webserver

出力には、root として実行されている Nginx マスタープロセスと、systemd+(セキュリティ向上のためのシステムユーザー)として実行されているワーカープロセスが表示されます。Nginx が複数のワーカープロセスを持っていることに注意してください。これは、同時リクエストを効率的に処理するために一般的です。

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                4098                4078                0                   14:34               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            4161                4098                0                   14:34               ?                   00:00:00            nginx: worker process
systemd+            4162                4098                0                   14:34               ?                   00:00:00            nginx: worker process

次に、コンテナのリソース使用量を見てみましょう。docker stats コマンドは、コンテナの CPU、メモリ、ネットワーク、ディスク I/O のライブストリームを提供します。この実験のために静的なスナップショットを取得するには、--no-stream フラグを使用します。

docker stats --no-stream webserver

このコマンドは、webserver コンテナの現在のリソースメトリクスを含むテーブルを表示します。

CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O     PIDS
bda2386621a1   webserver   0.00%     3.125MiB / 3.505GiB   0.09%     6.31kB / 1.27kB   0B / 12.3kB   3

この出力から、コンテナは非常に少ない CPU(0.00%)、利用可能な 3.5 GiB システムメモリのうち約 3.1 MiB のメモリ(0.09%)を使用しており、3 つの実行中のプロセス(Nginx マスターと 2 つのワーカープロセス)があることがわかります。この情報は、アプリケーションのパフォーマンスのボトルネックや潜在的なリソースリークを特定するために不可欠です。

リソース制限などのコンテナセキュリティプロパティの検査

このステップでは、最も基本的でありながら重要なコンテナセキュリティ機能の 1 つであるリソース制限について説明します。デフォルトでは、コンテナはホストの CPU とメモリを好きなだけ使用できます。制限を設定することで、単一のコンテナがすべての利用可能なリソースを消費し、他のコンテナやホスト自体に影響を与えることを防ぎます。

まず、以前作成した webserver コンテナの設定を検査しましょう。docker inspect コマンドは、コンテナのすべての設定を含む詳細な JSON 出力を提供します。

docker inspect webserver

出力は非常に長いです。--format フラグを使用して特定のフィールドを抽出できます。メモリ制限が設定されているかどうかを確認してみましょう。

docker inspect --format='{{.HostConfig.Memory}}' webserver

出力は 0 になります。これはメモリ制限がないことを意味します。

0

次に、メモリ制限付きの新しいコンテナを作成しましょう。まず、ポートマッピングを再利用するため、既存のコンテナを停止して削除する必要があります。

docker stop webserver
docker rm webserver

次に、新しい Nginx コンテナを実行しますが、今回はメモリ使用量を 100 メガバイトに制限するために --memory="100m" フラグを追加します。新しい名前も付けます。

docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx

次に、この新しいコンテナのメモリ制限を検査します。

docker inspect --format='{{.HostConfig.Memory}}' webserver-limited

今回は、出力はバイト単位のメモリ制限(100 × 1024 × 1024)になります。

104857600

コンテナにリソース制約を正常に適用しました。これは、コンテナセキュリティとリソース管理における基本的なステップです。

まとめ

この実験では、Docker とコンテナセキュリティの基本的な側面について実践的な経験を積みました。

以下のことを正常に実行しました。

  • Docker のインストールを確認し、LabEx 環境で適切なアクセス権限を設定しました。
  • 基本的な Nginx Web サーバーを Docker コンテナとして実行しました。
  • ポートマッピングを行い、ホストからコンテナ化されたアプリケーションにアクセスしました。
  • docker top を使用して、コンテナ内で実行されているプロセスを検査しました。
  • docker stats を使用して、ライブリソース使用量を監視しました。
  • システムの安定性とセキュリティを向上させるために、コンテナにメモリなどのリソース制限を設定する方法を学びました。

これらのスキルは、本番環境でより複雑なマルチコンテナアプリケーションを管理および保護するための基盤となります。