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 が誰に開かれているか、確認することから始めてみませんか?一歩ずつ、確実に安全を手に入れましょう!
コメント