Konteynere bir GUI ekleyerek Docker ağlarında Kali Linux'un gücünün kilidini açın ve Python, Selenium ve Tor Tarayıcı tarafından desteklenen anonimleştirilmiş web kazıma ile bilgi toplama düzeyini artırın.
Bir DevOps Mühendisi olarak yüz binlerce konteyneri hem sevk ettim hem de diğer Mühendislerin sevk etmesini sağladım. Sürekli Teslimat ve çeşitli düzenleme yöntemlerini kullanıyorum: Kubernetes, AWS'deki Lambda Konteynerleri, hem Elastic Compute Cloud (EC2) hem de Fargate tarafından desteklenen Elastic Container Service (ECS). Konteynerler, özel yapım sistemler, otomatik dağıtımlar, güvenlik açığı taraması, araştırma amaçları, veri analitiği, makine öğrenimi, eski yazılım arşivleme, yerel geliştirme ve web kazıma için kullanışlıdır.
Bu kılavuzda, Xvfb ve bir VNC sunucusu kullanarak DockerHub'dan resmi Kali Linux konteynerine GUI eklemek için izlediğim adımları gözden geçireceğim. Burada tartıştığım kod kalilinux-xvfb açık kaynak deposunda yayınlanıyor ve genel kullanım için sürekli olarak Docker Hub'a gönderiliyor. Son olarak bu serinin 2. Bölümünde kaplardaki her şey teste tabi tutulacak. Tor Tarayıcı örneğini otomatikleştirmek ve web'den veri toplamak için özel bir Python betiği, Pytest ve Selenium kullanacağım.
Kali Linux'u bir konteynerde bulundurmanın ardındaki motivasyonun bir kısmı, ana makine tarafından konteynerler için oluşturulan özel ağ alanına görünürlük kazandırmaktır. Docker Desktop'ın varsayılan kurulumu bir NAT ağı kullanmaktır. Bağlantı noktaları ana makineye bağlı olmadığı sürece, docker run -p ile bu hizmete ana bilgisayardan erişilemez.
Aşağıdaki yazılım paketlerinin her biri için bağlantıların yer aldığı özet bölümleri eklenmiştir:
Kali Linux
Docker Masaüstü
Tor tarayıcısı
Tor Tarayıcı Başlatıcısı
Xvfb
Selenyum
Kullandığım yazılımlar için ek bağlantılar:
Kali Linux, gelişmiş Sızma Testi ve Güvenlik Denetimini amaçlayan Debian tabanlı bir Linux dağıtımıdır. 1
Mevcut güvenlik odaklı araçların çokluğu nedeniyle Kali Linux'u seçtim. Kali Linux ekibi düzenli olarak güncellenen bir Docker görüntüsü sağlar. Gerekli yazılımın çoğu Kali Linux Docker görüntüsünde mevcuttur ve bunları yüklemek için paket yöneticisini kullanacağım.
Docker Desktop, konteynerleri yerel olarak çalıştırmaya yönelik bir çerçevedir. Kapsayıcılar, işletim sistemini ve uygulama durumunu yeniden kullanılabilir bir işletim sistemi görüntüsünde paketlemenin bir yoludur. Ek kaynaklar Docker web sitesinde mevcuttur.
Konteynerler ve sanal makineler benzer kaynak izolasyonu ve tahsisi avantajlarına sahiptir ancak konteynerler donanım yerine işletim sistemini sanallaştırdığı için farklı çalışır. 2
Docker konteynerleri sanal makinelerden daha hafif olduğundan, geliştirme çalışmalarımda ağırlıklı olarak onları tercih ediyorum. Uzun vadede bu durum küçük bir metin dosyası olarak saklanabilir ve git ve benzeri araçlarla zaman içindeki değişiklikleri takip etmek çok daha kolaydır. Bir metin dosyasından yeniden bir görüntü türetme yeteneği güçlüdür. Bununla birlikte, bir Dockerfile'ın zamanla bakıma muhtaç hale gelmesi ve daha sonraki bir tarihte oluşturulmaması tamamen mümkündür. Diğer tüm İşletim Sistemlerinde ve Kod Olarak Altyapıda olduğu gibi, her şeyin güncel tutulması önemlidir.
Docker'a bir alternatif, Sanal Makine veya çıplak donanım kurulumu kullanmak olabilir. Bununla birlikte, sağlanması ve temizlenmesi kolay olduğundan, konteynerlerin geçici web tarayıcılarını çalıştırmak için mükemmel bir test ortamı olduğuna inanıyorum. Tek bir makinede çok sayıda konteyneri paralel olarak çalıştırabiliyorum ve bunlar neredeyse anında başlatılıp durdurulabiliyor. Daha sonra, ne zaman ek izolasyona ihtiyaç duysam, tüm bu kurulum sanal bir makinenin içinden de çalıştırılabilir.
Onion Router (Tor), trafiği bir dizi şifreli atlama noktası üzerinden yönlendiren küresel bir bilgisayar ağıdır. Bu, kullanıcının internette anonim olarak gezinmesine ve ayrıca yalnızca Tor Ağı'nda bulunan web sitelerine erişmesine olanak tanır.
Tor Tarayıcı, gizlilik ve güvenliğe odaklanan, Firefox'un yoğun biçimde yapılandırılmış bir sürümüdür. Tor Ağını kutudan çıktığı gibi kullanabilir.
torbrowser-launcher birçok Linux işletim sisteminde bulunur ve Tor Ağında bir web tarayıcısının başlatılmasını son derece kolay hale getirir.
Selenium, web tarayıcılarını otomatikleştirmek için bir araçtır. Bu örnekte Python'u kullandım ancak pek çok dil ve araç mevcut.
Tor Ağında bu Tor Tarayıcıyı otomatikleştirmek için Selenium'u kullanacağım. Bilgi paylaşımını hedeflerle sınırlamak için güvenlik bilincine sahip tarayıcının mevcut yapılandırmasından yararlanmaya çalışıyorum. Konteynerlerin çalışma zamanı durumlarını durdurarak temizleyebileceğim. Ortaya çıkan WebDriver oturumu, Tor aracılığıyla sağlanan rastgele bir IP adresine sahip olacak ve bu da onu web kazıma için çok güçlü bir araç haline getirecek.
XOrg bileşeni Xvfb, bir ekranı X pencere sistemine benzetmek için kullanılabilir. Daha sonra bu ekranı kapta bir X sunucusu başlatmak için kullanacağım. Bu emülasyon tekniği özellikle hızlı değildir ve grafik ağırlıklı uygulamalar GPU'dan faydalanacaktır.
Dockerfiles, Docker'ı çalıştırabilen herhangi bir Linux, macOS veya Windows dağıtımı üzerine kurulmalıdır. Bunu bir Intel işlemci kullanarak Docker Masaüstünde test ettim. Resmi Kalilinux ana konteyneri için bir ARM çeşidi mevcuttur. Bunu ARM'de çalıştırmayı deneyen herkesin geri bildirimini memnuniyetle karşılarım.
Bu, temel görüntüyü oluşturmak için kullandığım Docker dosyasıdır. Her satırın ne yaptığını açıklamak için birkaç yorum ekledim.
# 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 sunucusunun başlatılmasına yardımcı olur. X sunucusunu başlatmak için Xvfb komutunu kullanıyorum. Bir PID mevcutsa ve X sunucusunda bir sorun olduğunda süreci sonlandırıp yeniden başlatabilirim. X oturumlarını ağdan engellemeyi denedim, gereksiz olsa da yine de ekliyorum: -nolisten süper kullanıcı hakkında tcp tartışması
#!/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 İstemcileri metin kopyalamak ve yapıştırmak için pek ideal değildir. Bu durum, diğer ana bilgisayarların konteynere bağlanmasına yardımcı olmak için konteynere SSH anahtarları eklenerek giderilebilir. Bu, konteynere bağlanmak için SSH tünellerini kullanma olasılığını açar.
Bu Stack Exchange Makalesinde aşağıdaki ssh-keygen
komutuna başvurulmuştur.
#!/bin/bash # Generate SSH keys ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" cat ~/.ssh/id_rsa >> ~/.ssh/authorized_keys
Bu anahtarları kullanacaksam iş istasyonumda özel anahtara ihtiyacım var. Özel anahtarı docker'dan ana makineme kopyalamak için aşağıdaki komutları kullanıyorum, ancak bunu yapmanın birçok yolu var. Stack Overflow'ta bununla ilgili güzel bir tartışma vardı.
Kapsayıcı kimliğini ps komutuyla bulma:
docker ps
cp komutuyla kopyalamak için konteyner kimliğini kullanma:
# 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
Bunun konteynere kopyalanması gerekiyor, ancak Tor Projesinin burada sağladığı standart konfigürasyonun yalnızca yorumlanmamış bölümleridir.
# /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
Bu Docker dosyası önceki Docker dosyası üzerine kuruludur ve karışıma Tor Tarayıcı ve Python'u ekler. Tor Tarayıcıyı yüklemek için torbrowser-launcher paketini kullanıyorum.
# 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
Tıpkı daha önce olduğu gibi ancak daha az konfigürasyonla. Kök kullanıcıyı kullanacak.
# 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 Eylemleri iş akışı dosyası Docker görüntüsünü oluşturur ve Docker Hub'a aktarır. Bu, ek etiketlerin aktarıldığı Docker belgelerindeki stok iş akışıdır. Bu Eylemi günde bir kez tetiklemek için birprogram ekledim.
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
Artık kapları test edip çalışıp çalışmadıklarını görebilirim. Bu örnek için torbrowser
etiketini kullanacağım.
docker build
komutu hakkında daha fazla bilgi için Docker CLI Derleme Belgelerine bakın. Container'ları yerel olarak oluşturmak için aşağıdaki komutları kullanıyorum, aksi takdirde sonraki adımlarda isteğe bağlı olarak Docker Hub'dan alınabilirler.
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 .
Üzerinde çalıştığım dosyalara erişebilmem için konteynere bir birim bağlamam gerekiyor. Birim olarak ${HOME}/src
dizinini kullanıyorum.
Kullandığımız bayraklarla ilgili bazı kısa notlar aşağıda yer almaktadır; aksi takdirde docker run
komutu hakkında daha fazla bilgi için Docker CLI Çalıştırma Belgelerine bakın.
-it
konteyneri etkileşimli modda çalıştırmak için kullanılır.
--rm
çıkarken konteyner katmanlarını kaldırmak için kullanılır.
-p
bağlantı noktasını konteynerden ana makineye eşlemek için kullanılır.
-v
ana makineden konteynere bir birim bağlamak için kullanılır.
# 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
Daha sonra kullanıcı kapsayıcısını açmak, VNC aracılığıyla oturum açmak ve şu ana kadar her şeyin çalıştığını doğrulamak için Tor Tarayıcı Başlatıcıyı çalıştırmak istiyorum. Tor tarayıcı başlatıcısı kök kullanıcıyla çalışmaz.
Kapsayıcıyı varsayılan kullanıcıyla başlatın:
docker run -it --rm -p 5901:5901 -v "${HOME}/src":/src excitingtheory/kalilinux-xvfb:torbrowser
VNC sunucusunu konteynerde başlattığınızda, sunucu ana şifreyi soracaktır, ek bir salt görüntüleme şifresi ayarlıyorum.
/opt/start-vnc-server-once.sh
Aşağıda çıktının bir örneği verilmiştir.
Sunucuya bağlan iletişim kutusuna bulucu menüsünden ulaşılabilir: Go
-> Connect to Server
.
İletişim kutusu açıldığında vnc://localhost:5901
adresini girin ve Connect
tıklayın. Kolay erişim için bu adresi favori olarak kaydettim.
TightVNC gibi bir vnc istemcisi buna localhost:5901
üzerinden bağlanabilir.
Bağlandıktan sonra xfce4 masaüstünü görebiliyorum.
Artık Tor Tarayıcı Başlatıcısını VNC oturumundaki terminalden başlatabilirim.
torbrowser-launcher
Tarayıcı açıldığında Tor Projesi Bağlantı Denetleyicisine giderek çalışıp çalışmadığını kontrol edebilirim.
Bu, Selenium ve Python ile çalışmaya başlamadan önce bitirmek istediğim İşletim Sistemi kurulumu. Özetlemek gerekirse şunları yaptım:
Artık çalışan bir konteyner ortamı var. Gizli Python web kazımayla ilgili bu serideki bir sonraki yazıya göz atın.