컨테이너에 GUI를 다시 추가하여 Docker 네트워크에서 Kali Linux의 강력한 기능을 활용하고 Python, Selenium 및 Tor 브라우저에서 제공하는 익명 웹 스크래핑을 통해 정보 수집 수준을 높이세요.
DevOps 엔지니어로서 저는 수십만 개의 컨테이너를 배송하고 다른 엔지니어들이 배송할 수 있도록 지원했습니다. 저는 지속적 전달과 다양한 오케스트레이션 방법(Kubernetes, AWS의 Lambda 컨테이너, Elastic Compute Cloud(EC2)과 Fargate가 모두 지원하는 Elastic Container Service(ECS))을 사용합니다. 컨테이너는 맞춤형 빌드 시스템, 자동화된 배포, 취약성 검색, 연구 목적, 데이터 분석, 기계 학습, 레거시 소프트웨어 보관, 로컬 개발 및 웹 스크래핑에 유용합니다.
이 가이드에서는 Xvfb 및 VNC 서버를 사용하여 DockerHub의 공식 Kali Linux 컨테이너 에 GUI를 추가하기 위해 수행한 단계를 살펴보겠습니다. 여기서 논의하는 코드는 kalilinux-xvfb 오픈 소스 저장소에 게시되어 있으며 일반적인 사용을 위해 Docker Hub 에 지속적으로 제공됩니다. 마지막으로 이 시리즈의 2부에서는 컨테이너에 있는 모든 것을 테스트합니다. 맞춤형 Python 스크립트, Pytest 및 Selenium을 사용하여 Tor 브라우저 인스턴스를 자동화하고 웹에서 데이터를 수집하겠습니다.
컨테이너에 Kali Linux를 사용하는 이유 중 하나는 컨테이너용 호스트 시스템에서 생성된 프라이빗 네트워크 공간에 대한 가시성을 확보하는 것입니다. Docker Desktop의 기본 설정은 NAT 네트워크를 사용하는 것입니다. docker run -p 를 사용하여 포트가 호스트 시스템에 바인딩되지 않는 한 해당 서비스는 호스트에서 액세스할 수 없습니다.
다음 각 소프트웨어 패키지에 대한 링크가 포함된 요약 섹션이 추가되었습니다.
칼리 리눅스
도커 데스크탑
토르 브라우저
Tor 브라우저 실행기
Xvfb
셀렌
내가 사용한 소프트웨어에 대한 추가 링크:
Kali Linux는 고급 침투 테스트 및 보안 감사를 목표로 하는 Debian 기반 Linux 배포판입니다. 1
저는 사용 가능한 보안 중심 도구가 너무 많아서 Kali Linux를 선택했습니다. Kali Linux 팀은 정기적으로 업데이트되는 Docker 이미지를 제공합니다. 필요한 소프트웨어의 대부분은 Kali Linux Docker 이미지에서 사용할 수 있으며 패키지 관리자를 사용하여 이를 설치하겠습니다.
Docker Desktop은 컨테이너를 로컬에서 실행하기 위한 프레임워크입니다. 컨테이너는 재사용 가능한 운영 체제 이미지에 운영 체제와 애플리케이션 상태를 패키징하는 방법입니다. Docker 웹사이트 에서 추가 리소스를 확인할 수 있습니다.
컨테이너와 가상 머신은 리소스 격리 및 할당 이점이 유사하지만 컨테이너가 하드웨어 대신 운영 체제를 가상화하기 때문에 다르게 작동합니다. 2
Docker 컨테이너는 가상 머신보다 가볍기 때문에 개발 작업에서 Docker 컨테이너를 크게 선호합니다. 장기적으로 이 상태는 작은 텍스트 파일로 저장될 수 있으며 git 및 유사한 도구를 사용하여 시간 경과에 따른 변경 사항을 추적하는 것이 훨씬 쉽습니다. 텍스트 파일에서 이미지를 다시 파생시키는 기능은 강력합니다. 그러나 Dockerfile이 시간이 지남에 따라 파손되어 나중에 빌드하지 못할 수도 있습니다. 다른 운영 체제 및 코드형 인프라와 마찬가지로 모든 것을 최신 상태로 유지하는 것이 중요합니다.
Docker의 대안은 가상 머신 또는 베어메탈 설치를 사용하는 것입니다. 그러나 컨테이너는 프로비저닝 및 정리가 쉽기 때문에 임시 웹 크롤러를 실행하기 위한 완벽한 테스트베드라고 생각합니다. 단일 시스템에서 여러 컨테이너를 병렬로 실행할 수 있으며 거의 즉시 시작하고 중지할 수 있습니다. 그런 다음 추가 격리가 필요할 때마다 이 전체 설정을 가상 머신 내부에서도 실행할 수 있습니다.
Onion Router(Tor)는 일련의 암호화된 홉을 통해 트래픽을 라우팅하는 컴퓨터의 글로벌 네트워크입니다. 이를 통해 사용자는 어느 정도 익명으로 인터넷을 탐색할 수 있으며 Tor 네트워크에서만 사용할 수 있는 웹사이트에 액세스할 수도 있습니다.
Tor 브라우저는 개인 정보 보호 및 보안에 중점을 두고 엄격하게 구성된 Firefox 버전입니다. 즉시 Tor 네트워크를 사용할 수 있습니다.
torbrowser-launcher는 많은 Linux 운영 체제에 포함되어 있으며 Tor 네트워크에서 웹 브라우저를 매우 쉽게 시작할 수 있습니다.
Selenium은 웹 브라우저를 자동화하는 도구입니다. 이 예에서는 Python을 사용했지만 사용할 수 있는 언어와 도구가 많이 있습니다.
저는 Tor 네트워크에서 이 Tor 브라우저를 자동화하기 위해 Selenium을 사용할 것입니다. 보안을 고려한 브라우저의 기존 구성을 활용하여 대상에 대한 정보 공유를 제한하려고 합니다. 컨테이너 런타임 상태를 중지하여 정리할 수 있습니다. 결과 WebDriver 세션에는 Tor를 통해 판매되는 임의의 IP 주소가 있으므로 웹 스크래핑을 위한 매우 강력한 도구가 됩니다.
XOrg 구성 요소 Xvfb를 사용하여 X 윈도우 시스템에 대한 화면을 시뮬레이션할 수 있습니다. 그런 다음 이 화면을 사용하여 컨테이너에서 X 서버를 시작하겠습니다. 이 에뮬레이션 기술은 특별히 빠르지 않으며 그래픽이 많은 응용 프로그램은 GPU의 이점을 누릴 수 있습니다.
Dockerfile은 Docker를 실행할 수 있는 Linux, macOS 또는 Windows 배포판에서 빌드되어야 합니다. Intel 프로세서를 사용하여 Docker Desktop에서 이것을 테스트했습니다. 공식 Kalilinux 기본 컨테이너에는 ARM 변형이 있습니다. ARM에서 이 기능을 실행해 보시는 분들의 피드백을 주시면 감사하겠습니다.
기본 이미지를 빌드하는 데 사용한 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
X 서버를 시작하는 데 도움이 됩니다. Xvfb 명령을 사용하여 X 서버를 시작하고 있습니다. PID가 있고 X 서버에 문제가 있는 경우 프로세스를 종료하고 다시 시작할 수 있습니다. 네트워크에서 X 세션을 차단하는 방법을 실험했는데 불필요할 수도 있지만 어쨌든 추가하고 있습니다. -nolisten 슈퍼 유저에 대한 tcp 토론
#!/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
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
컨테이너 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
이 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
이전과 비슷하지만 구성이 더 적습니다. 루트 사용자를 사용합니다.
# 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 Actions 워크플로 파일은 Docker 이미지를 빌드하여 Docker Hub에 푸시합니다. 이는 추가 태그가 푸시되는 Docker 문서 의 스톡 워크플로입니다. 이 작업을 하루에 한 번 실행하는일정을 추가했습니다.
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 빌드 설명서를 참조하세요. 컨테이너를 로컬로 빌드하려면 다음 명령을 사용합니다. 그렇지 않으면 다음 단계에서 요청 시 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 실행 설명서를 참조하세요.
-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
다음으로 사용자 컨테이너를 열고 VNC를 통해 로그인한 후 Tor 브라우저 실행기를 실행하여 지금까지 모든 것이 작동하는지 확인하려고 합니다. Tor 브라우저 실행 프로그램은 루트 사용자와 작동하지 않습니다.
기본 사용자로 컨테이너를 시작합니다.
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
컨테이너에서 VNC 서버를 시작하면 서버에서 기본 비밀번호를 묻는 메시지를 표시하고 추가 보기 전용 비밀번호를 설정합니다.
/opt/start-vnc-server-once.sh
아래는 출력의 예입니다.
서버에 연결 대화 상자는 찾기 메뉴( Go
-> Connect to Server
에서 찾을 수 있습니다.
대화 상자가 열리면 vnc://localhost:5901
주소를 입력하고 Connect
클릭합니다. 쉽게 접근할 수 있도록 이 주소를 즐겨찾기에 저장했습니다.
TightVNC와 같은 vnc 클라이언트는 localhost:5901
에서 이에 연결할 수 있습니다.
연결되면 xfce4 데스크탑을 볼 수 있습니다.
이제 VNC 세션의 터미널에서 Tor 브라우저 실행기를 시작할 수 있습니다.
torbrowser-launcher
브라우저가 열리면 Tor Project Connection Checker 로 이동하여 브라우저가 작동하는지 확인할 수 있습니다.
이것은 Selenium 및 Python 작업을 시작하기 전에 완료하고 싶었던 운영 체제 설정입니다. 요약하면 다음과 같은 작업을 수행했습니다.
이제 작동하는 컨테이너 환경이 생겼습니다. 은밀한 Python 웹 스크래핑에 관한 이 시리즈의 다음 게시물을 확인하세요.