paint-brush
Kali Linux Docker コンテナを使用して秘密の Web スクレイピングをサポートする@csfx
4,056 測定値
4,056 測定値

Kali Linux Docker コンテナを使用して秘密の Web スクレイピングをサポートする

Colin Barrett-Fox13m2023/07/23
Read on Terminal Reader

長すぎる; 読むには

GUI をコンテナに再度追加することで、Docker ネットワーク上で Kali Linux のパワーを解放します。 Python、Selenium、Tor ブラウザを利用した匿名化された Web スクレイピングで情報収集をレベルアップします。このシリーズのパート 2 では、コンテナ内のすべてがテストされます。
featured image - Kali Linux Docker コンテナを使用して秘密の Web スクレイピングをサポートする
Colin Barrett-Fox HackerNoon profile picture
0-item
1-item

コンテナに GUI を追加し直すことで Docker ネットワーク上の Kali Linux のパワーを解放し、Python、Selenium、Tor ブラウザを利用した匿名化された Web スクレイピングで情報収集をレベルアップします。


DevOps エンジニアとして、私は何十万ものコンテナを出荷し、また他のエンジニアが出荷できるようにしてきました。私は継続的デリバリーとさまざまなオーケストレーション方法を使用しています: Kubernetes、AWS 上の Lambda コンテナ、Elastic Compute Cloud (EC2) と Fargate の両方でサポートされる Elastic Container Service (ECS)。コンテナーは、カスタム ビルド システム、自動展開、脆弱性スキャン、研究目的、データ分析、機械学習、レガシー ソフトウェア アーカイブ、ローカル開発、Web スクレイピングに役立ちます。


このガイドでは、Xvfb と VNC サーバーを使用して、 DockerHub から公式の Kali Linux コンテナに GUI を追加するために行った手順について説明します。ここで説明するコードは、 kalilinux-xvfbオープン ソース リポジトリで公開されており、一般的な使用のために継続的にDocker Hubに配信されます。最後に、このシリーズのパート 2 では、コンテナ内のすべてがテストされます。カスタム Python スクリプト、Pytest、および Selenium を使用して Tor ブラウザ インスタンスを自動化し、Web からデータを収集します。


コンテナネットワーク

コンテナネットワークと接続の概要



Kali Linux をコンテナ内に組み込む動機の 1 つは、コンテナ用のホスト マシンによって作成されたプライベート ネットワーク スペースを可視化することです。 Docker Desktop からのデフォルトのセットアップでは、NAT ネットワークが使用されます。 docker run -pを使用してポートがホスト マシンにバインドされていない限り、そのサービスはホストからアクセスできません。


ソフトウェア

ここでは、次の各ソフトウェア パッケージへのリンクを含む概要セクションが追加されています。


  • カリ・リナックス

  • Dockerデスクトップ

  • Torブラウザ

  • Torブラウザランチャー

  • Xvfb

  • セレン


私が使用したソフトウェアの追加リンク:


カリ・リナックス


Kali Linux は、高度な侵入テストとセキュリティ監査を目的とした Debian ベースの Linux ディストリビューションです。 1


私が Kali Linux を選択したのは、利用可能なセキュリティに重点を置いたツールが膨大にあるためです。 Kali Linux チームは、定期的に更新される Docker イメージを提供します。必要なソフトウェアの多くは Kali Linux Docker イメージで利用できるので、パッケージ マネージャーを使用してそれらをインストールします。


Dockerデスクトップ

Docker Desktop は、コンテナーをローカルで実行するためのフレームワークです。コンテナーは、オペレーティング システムとアプリケーションの状態を再利用可能なオペレーティング システム イメージにパッケージ化する方法です。追加のリソースは、 Docker Web サイトで入手できます。


コンテナーと仮想マシンには同様のリソースの分離と割り当ての利点がありますが、コンテナーはハードウェアではなくオペレーティング システムを仮想化するため、機能が異なります。 2


Docker コンテナは仮想マシンよりも軽量であるため、開発作業では Docker コンテナを非常に好みます。長期的には、この状態は小さなテキスト ファイルとして保存でき、git や同様のツールを使用して経時的な変更を追跡するのがはるかに簡単になります。テキスト ファイルから画像を再度取得する機能は強力です。ただし、Dockerfile が時間の経過とともに破損し、後日ビルドできなくなる可能性は十分にあります。他のオペレーティング システムやコードとしてのインフラストラクチャと同様に、すべてを最新の状態に保つことが重要です。


Docker の代わりに、仮想マシンまたはベア メタル インストールを使用することもできます。ただし、コンテナーはプロビジョニングとクリーンアップが簡単であるため、一時的な Web クローラーを実行するための完璧なテストベッドであると私は考えています。単一のマシン上で多くのコンテナを並行して実行でき、ほぼ瞬時に開始および停止できます。その後、追加の分離が必要なときはいつでも、このセットアップ全体を仮想マシン内から実行することもできます。


Torブラウザ

オニオン ルーター (Tor) は、一連の暗号化されたホップを介してトラフィックをルーティングするコンピューターのグローバル ネットワークです。これにより、ユーザーはある程度匿名でインターネットを閲覧できるようになり、Tor ネットワーク上でのみ利用できる Web サイトにアクセスできるようになります。


  • Tor ブラウザは、プライバシーとセキュリティに重点を置いて高度に構成された Firefox のバージョンです。すぐに Tor ネットワークを使用できます。

  • torbrowser-launcher は多くの Linux オペレーティング システムに含まれており、Tor ネットワーク上で Web ブラウザを非常に簡単に起動できます。


セレン

Seleniumは Web ブラウザを自動化するツールです。この例では Python を使用しましたが、使用できる言語やツールは多数あります。


Selenium を使用して、Tor ネットワーク上のこの Tor ブラウザを自動化します。セキュリティを意識したブラウザの既存の設定を利用して、ターゲットへの情報の共有を制限しようとしています。コンテナーを停止することで、コンテナーのランタイム状態をクリーンアップできます。結果として得られる WebDriver セッションには、Tor を介して販売されるランダムな IP アドレスが含まれるため、Web スクレイピング用の非常に強力なツールになります。


Xvfb

XOrg コンポーネントXvfb を使用して、X ウィンドウ システムに対して画面をシミュレートできます。次に、この画面を使用してコンテナ内で X サーバーを起動します。このエミュレーション技術はそれほど高速ではないため、グラフィックスを多用するアプリケーションでは GPU の恩恵を受けることができます。

ファイルの概要

Dockerfile は、Docker を実行できる Linux、macOS、または Windows ディストリビューション上に構築する必要があります。 Intel プロセッサを使用して Docker Desktop でこれをテストしました。公式の Kalilinux ベース コンテナには ARM バリアントがあります。 ARM でこれを実行しようとしている人からのフィードバックをお待ちしています。


  1. Dockerfile
  2. TorBrowser.Dockerfile
  3. TorBrowser-root.Dockerfile
  4. startx-once.sh
  5. start-vnc-server-once.sh
  6. ssh-keys.sh
  7. トルク
  8. .github/workflows/main.yml


Dockerfile

これは、ベースイメージの構築に使用した Dockerfile です。各行の動作を説明するために、いくつかのコメントを追加しました。


 # From the official Kali Linux Docker image rolling release FROM kalilinux/kali-rolling # Leaving this here for now, but it's not needed ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # Install the packages we need # Got lucky with this one, there was a ticket about this: # https://github.com/dnschneid/crouton/issues/4461 `xfce4 dbus-launch not found` in this version of the image so installing dbus-x11 RUN apt-get update -y -q \ && apt-get install -y -q xvfb xfce4 xfce4-goodies tightvncserver net-tools curl openssh-server dbus-x11 # This line copies the shell scripts from the local directory to the container, and makes them executable. COPY *.sh /opt/ RUN chmod 755 /opt/*.sh # This line runs the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash



startx-once.sh

X サーバーの起動を支援します。 Xvfb コマンドを使用して X サーバーを起動しています。 PID が存在し、X サーバーに問題がある場合は、プロセスを強制終了して再起動できます。ネットワークから X セッションをブロックする実験をしましたが、不要かもしれませんが、とにかく追加しています: -nolisten tcpDiscussion on super user

 #!/bin/bash FILE=/opt/.x.pid if [[ -f "$FILE" ]]; then echo "$FILE exist" echo "PID: " `cat $FILE` else Xvfb -nolisten tcp $DISPLAY & echo $? > $FILE fi


ssh-keys.sh

VNC クライアントは、テキストのコピー アンド ペーストにはあまり適していません。この問題は、SSH キーをコンテナーに追加して、他のホストがコンテナーに接続できるようにすることで解決できます。これにより、SSH トンネルを使用してコンテナに接続できる可能性が広がります。


次のssh-keygenコマンドは、このStack Exchange の記事から参照されました。

 #!/bin/bash # Generate SSH keys ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys


これらのキーを使用する場合は、ワークステーションに秘密キーが必要です。次のコマンドを使用して、Docker からホスト マシンに秘密キーをコピーしていますが、これを行う方法は多数あります。これについては、 Stack Overflowで良い議論が行われました。


ps コマンドを使用してコンテナ ID を検索します。

 docker ps 


docker ps コマンドの出力


コンテナ ID を使用してcp コマンドでコピーします。

 # For root docker cp <containerId>:/root/.ssh/id_rsa /target/path/on/host # Otherwise for the user configured in the Dockerfile docker cp <containerId>:/home/username/.ssh/id_rsa /target/path/on/host


トルク

これはコンテナにコピーする必要がありますが、Tor プロジェクトがここで提供するボイラープレート構成のコメントされていないセクションにすぎません。

 # /etc/tor/torrc ## Tor opens a SOCKS proxy on port 9050 by default -- even if you don't ## configure one below. Set "SOCKSPort 0" if you plan to run Tor only ## as a relay, and not make any local application connections yourself. SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections. #SOCKSPort 192.168.0.1:9100 # Bind to this address:port too. ## Uncomment this to start the process in the background... or use ## --runasdaemon 1 on the command line. This is ignored on Windows; ## see the FAQ entry if you want Tor to run as an NT service. RunAsDaemon 1 ## The port on which Tor will listen for local connections from Tor ## controller applications, as documented in control-spec.txt. ControlPort 9051 ## If you enable the controlport, be sure to enable one of these ## authentication methods, to prevent attackers from accessing it. #HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C CookieAuthentication 1


TorBrowser.Dockerfile

この Dockerfile は以前の Dockerfile に基づいて構築されており、Tor Browser と Python が追加されています。 Torbrowser-launcherパッケージを使用して Tor ブラウザをインストールしています。


 # From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Create a user and add them to the sudo group, sudo still TBD but leaving for now, will not be able to switch users in this container. RUN useradd -s /bin/bash -m username \ && usermod -aG sudo username # Install python packages RUN pip3 install selenium pytest COPY torrc /etc/tor/torrc # Set the user and home directory for the container USER username ENV USER=username ENV HOME=/home/username # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash


TorBrowser-root.Dockerfile

以前と同じですが、構成が少なくなります。 root ユーザーを使用します。


 # From the base Dockerfile: FROM excitingtheory/kalilinux-xvfb ARG DISPLAY_NUMBER=1 ENV DISPLAY=:$DISPLAY_NUMBER # More info about torbrowser-launcher: # https://github.com/micahflee/torbrowser-launcher RUN apt-get update -y -q \ && apt-get install -y -q torbrowser-launcher python3 python3-pip # Install python packages RUN pip3 install selenium pytest # Copy the tor config file into the containera COPY torrc /etc/tor/torrc # Run the shell scripts that start the X server, and generate the SSH keys. RUN /opt/startx-once.sh RUN /opt/ssh-keys.sh # This line sets the entrypoint to bash, so that we can run commands in the container. ENTRYPOINT /bin/bash


.github/workflows/main.yml

Github Actions ワークフロー ファイルは Docker イメージを構築し、それを Docker Hub にプッシュします。これは、 Docker のドキュメントにあるストック ワークフローであり、追加のタグがプッシュされています。このアクションを 1 日に 1 回トリガーするスケジュールを追加しました。


GitHub アクションを使用したコンテナの継続的デリバリー



 name: docker build and push on: push: branches: - "main" schedule: - cron: '20 16 * * *' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build and push base image uses: docker/build-push-action@v4 with: context: . file: ./Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:latest - name: Build and push torbrowser root image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser-root.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser-root - name: Build and push torbrowser image uses: docker/build-push-action@v4 with: context: . file: ./TorBrowser.Dockerfile push: true tags: excitingtheory/kalilinux-xvfb:torbrowser


コンテナの使用

これで、コンテナをテストして、機能するかどうかを確認できます。この例ではtorbrowserタグを使用します。


コンテナの構築 (オプション)

docker buildコマンドの詳細については、Docker CLI Build Documentation を参照してください。コンテナーをローカルで構築するには、次のコマンドを使用します。それ以外の場合は、次のステップでオンデマンドで Docker Hub からコンテナーを取得できます。

 docker build -t excitingtheory/kalilinux-xvfb . docker build -t excitingtheory/kalilinux:torbrowser -f TorBrowser.Dockerfile . docker build -t excitingtheory/kalilinux:torbrowser-root -f TorBrowser-root.Dockerfile .


ボリュームを使用したコンテナの実行

作業中のファイルにアクセスできるように、コンテナにボリュームをマウントする必要があります。 ${HOME}/srcディレクトリをボリュームとして使用しています。


使用しているフラグに関する簡単なメモを以下に示します。それ以外の場合、 docker runコマンドの詳細については、Docker CLI Run ドキュメントを参照してください。


  • -it対話モードでコンテナを実行するために使用されます。

  • --rm終了時にコンテナー層を削除するために使用されます。

  • -pは、コンテナからホスト マシンにポートをマップするために使用されます。

  • -vは、ホスト マシンからコンテナにボリュームをマウントするために使用されます。


 # Run the base container docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb # Run the container with the default user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser # Run the container with the root user docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser-root


コンテナから Tor ブラウザを使用する

次に、ユーザー コンテナを開き、VNC 経由でログインし、Tor ブラウザ ランチャーを実行して、これまでのところすべてが機能していることを確認します。 Tor ブラウザ ランチャーは root ユーザーでは動作しません。

デフォルトのユーザーでコンテナを起動します。


 docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser


コンテナ内で VNC サーバーを起動すると、サーバーはメイン パスワードの入力を求めます。追加の表示専用パスワードを設定します。

 /opt/start-vnc-server-once.sh


以下は出力の例です。

VNC サーバーの起動時の出力


macOS で接続する

[サーバーに接続] ダイアログは、ファインダー メニューからアクセスできます: Go ] -> Connect to Server

vnc://localhost:5901 を指す macOS の「サーバーに接続」ダイアログの例


ダイアログが開いたら、アドレスvnc://localhost:5901を入力し、 Connectをクリックします。簡単にアクセスできるように、このアドレスをお気に入りとして保存しました。

Windows で接続する

TightVNC のような vnc クライアントは、 localhost:5901でこれに接続できます。

Kali Linux Xfce4 デスクトップに接続

接続すると、xfce4 デスクトップが表示されます。

コンテナ上でホストされ、VNC クライアントを通じてアクセスされるデスクトップ。


これで、VNC セッションのターミナルから Tor ブラウザ ランチャーを起動できるようになりました。

 torbrowser-launcher 


VNC クライアントを介して Docker で torbrowser-launcher を実行する


ブラウザが開いたら、 Tor プロジェクト接続チェッカーに移動してブラウザが動作しているかどうかを確認できます。

成功したテストの例:

https://check.torproject.org/ での接続テストに成功しました。




接続されていないホスト マシン上でサイトを開いて比較してみました。

https://check.torproject.org/ での接続テストの失敗




これまでの進捗状況

これは、Selenium と Python を使い始める前に完了しておきたいオペレーティング システムのセットアップです。要約すると、次のことを行いました。


  1. Selenium、Python、および単純な xfce4 デスクトップ環境のインストールされた依存関係。
  2. GitHub Actions を使用して、相互依存する 3 つの Docker イメージを構築し、プッシュしました。
  3. Docker コンテナ内で VNC サーバーが正常に起動されました。
  4. VNC クライアントを使用して、実行中のコンテナのデスクトップ環境に接続します。
  5. コンテナから Tor Browser Launcher を実行してテストし、Tor ネットワークに接続していることを確認しました。


これで、コンテナ環境が動作するようになりました。秘密の Python Web スクレイピングに関するこのシリーズの次の投稿をご覧ください。