【入門編】 DockerデーモンのUnixソケット権限分離とTCPソケットのTLS認証強制 – インフラ・ネットワーク & クラウドセキュリティ防御ガイド

Dockerは「便利な工具箱」、でも鍵をかけないと泥棒の入り口に?

こんにちは!セキュリティの世界へようこそ。今日は、皆さんが開発現場で毎日使っている「Docker」という非常に便利な工具箱を、泥棒から守るための「頑丈な鍵の付け方」についてお話しします。

Dockerをサーバーにインストールした時、実はそのままだと「街中の誰でも入れるガレージ」のような状態になっていることが多いんです。なぜ危険なのか、どうやって鍵をかけるのか。専門用語を並べる前に、身近な防犯に例えて紐解いていきましょう。

—

1. なぜ「Dockerの鍵」を閉める必要があるの?

Dockerデーモン(dockerd)は、サーバー内でコンテナを操る司令塔です。この司令塔にアクセスできるということは、そのサーバー上のファイルを自由にいじったり、新しいコンテナを立ち上げて仮想通貨のマイニングをさせたり、最悪の場合はサーバー全体を乗っ取られたりすることを意味します。

「Unixソケット」という名の勝手口

Dockerは通常、/var/run/docker.sock という「Unixソケット」という窓口を通じて操作を受け付けます。この窓口は、デフォルトだと「Dockerグループ」に入っているユーザーなら誰でも開けられるようになっています。

もし、サーバーにログインできる別のユーザーが、あなたの知らないところで勝手にこの窓口を叩いたら?あなたのコンテナは一瞬で掌握されてしまいますよね。これが「特権の分離」が求められる理由です。

「TCPソケット」という名の玄関

リモートからDockerを操作したい場合、ネットワーク越しに命令を送るTCPソケットを使います。これは、家の外から誰でも合鍵なしで入れる玄関のようなもの。TLS認証という「身分証明書」がないと、世界中の攻撃者があなたのサーバーのドアをノックし放題になってしまいます。

—

2. Unixソケットのアクセス権を厳格化する

まずは、サーバー内の「勝手口」を整理しましょう。Dockerを操作できるユーザーを最小限に絞るのが鉄則です。

やってみよう:権限の確認と変更

基本的には、Dockerグループに無闇に追加しないことが一番の防御です。

# 現在、誰がDockerを使える権限を持っているか確認
grep docker /etc/group

# もし不要なユーザーがいたら、グループから外しましょう
# sudo gpasswd -d [ユーザー名] docker

また、/var/run/docker.sock のパーミッションを確認してみてください。

ls -l /var/run/docker.sock
# srw-rw---- 1 root docker ... となっていれば、
# rootユーザーとdockerグループしかアクセスできない状態です。

これでも十分強力ですが、さらに安全を期すなら、そもそも「特定の管理者ユーザーしかDockerを触れない」ように運用ルールを徹底しましょう。

—

3. TCPソケットをmTLSで鉄壁にする

リモートからDockerを操作したい場合は、「身分証明書(証明書)」を使った相互認証(mTLS)が必須です。これをしないと、通信が丸見え(盗聴)になり、なりすましも容易になります。

mTLS(相互TLS認証)のイメージ

mTLSは、サーバーとクライアントが「お互いに顔写真付きの社員証を見せ合う」仕組みです。どちらかが正しい証明書を持っていなければ、通信自体が即座に拒否されます。

設定の手順(簡略版)

1. 認証局(CA)を作る: サーバーとクライアントの証明書にハンコを押すための親玉を作ります。
2. 証明書を発行する: サーバー用とクライアント用の鍵ペアを作ります。
3. Dockerデーモンに設定する: daemon.json を書き換えて、TLSを強制します。

以下は、Dockerデーモンの設定ファイル /etc/docker/daemon.json のサンプルです。

{
  "tlsverify": true,
  "tlscacert": "/etc/docker/certs/ca.pem",    // 認証局の証明書
  "tlscert": "/etc/docker/certs/server.pem",  // サーバーの証明書
  "tlskey": "/etc/docker/certs/server-key.pem", // サーバーの秘密鍵
  "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"]
}

ここが重要!

  • tlsverify を true にすることで、TLS認証を強制しています。
  • hosts で 2376 番ポートを指定していますが、ここで重要なのは「必ずファイアウォールでこのポートを制限する」ことです。証明書があれば安心とは言え、そもそも攻撃者に門前払いするのが最強の防犯です。

—

まとめ:セキュリティは「面倒くさい」のその先にある

今回紹介した対策は、最初は少し面倒に感じるかもしれません。証明書の有効期限管理や、権限の整理など、やることが増えますよね。

ですが、思い出してください。「泥棒は、一番鍵が開けやすそうな家を狙う」ということを。

皆さんが少しの手間を惜しまず、こうした設定を一つずつ積み重ねることで、インターネットという広大な街の中で、皆さんのサーバーは「防犯カメラと頑丈な鍵が完備された安全な家」になります。

セキュリティは、一度やって終わりではなく、日々の習慣です。まずは今日、ご自身のサーバーの /var/run/docker.sock が誰に開かれているか、確認することから始めてみませんか?一歩ずつ、確実に安全を手に入れましょう!

コメント

タイトルとURLをコピーしました