Deadshot adalah pemindai Permintaan Tarik yang mencari pengenalan rahasia melalui PR dengan mencocokkan setiap garis perbedaan dengan serangkaian ekspresi rahasia yang diketahui.
Layanan bertanggung jawab untuk:
Layanan TIDAK:
Deadshot adalah aplikasi multi-kontainer Flask-Celery-Redis yang diinstal sebagai aplikasi Github untuk dijalankan pada setiap Permintaan Tarik yang dibuat pada cabang utama repo tempat aplikasi Github diinstal.
Kontainer Flask adalah titik masuk untuk layanan dengan menampilkan rute API yang ditentukan di blueprints.py. Setelah muatan permintaan Tarik diterima di rute API, layanan meneruskan muatan tersebut ke antrean Redis agar kontainer Seledri dapat mengambil dan memindai melalui perbedaan Permintaan Tarik. Setelah wadah seledri memindai ekspresi reguler rahasia tertentu, ia mengomentari PR, slack memberi tahu saluran tim keamanan, atau membuat tiket JIRA untuk ditindaklanjuti oleh tim. Aplikasi Github dikonfigurasi dengan URL Flask API dan rahasia bersama yang digunakan untuk menghasilkan checksum SHA payload.
Salah satu cara menyiapkan URL API adalah dengan menerapkan kode ini pada host dan menetapkan penyeimbang beban aplikasi ke host ini.
Catatan: Saat membuat aplikasi, pastikan Anda memiliki DNS yang siap untuk host tempat Anda akan menerapkan kontainer Deadshot dan string rahasia aman untuk rahasia webhook.
Admin Github perlu membuat dan menginstal aplikasi Github di Github sebelum menjalankan atau menerapkan aplikasi Deadshot. Untuk mengetahui lebih banyak tentang membuat aplikasi Github, silakan baca panduan ini
Nama Aplikasi: deadshot (Semua huruf kecil. Ini penting karena layanan menggunakan nama ini untuk mengambil komentar sebelumnya yang dibuat pada PR)
URL webhook: http://your-hosted-deadshot-dns/api/v1/deadshot-webhook
Untuk mengujinya secara lokal, Anda dapat membuat titik akhir ngrok untuk dimasukkan ke bagian webhook aplikasi Github Anda
Agar aplikasi ini berfungsi, aplikasi Github Anda harus mengaktifkan izin dan langganan berikut di halaman izin aplikasi Github: Izin Repositori:
Semua izin lainnya tidak diubah ke nilai default Tidak ada akses
Berlangganan acara:
Terakhir klik "Buat Aplikasi GitHub". Setelah pembuatan aplikasi berhasil, ikuti tautan “buat kunci pribadi” di bagian atas halaman web aplikasi
Setelah kunci pribadi dibuat, simpanlah di lokasi yang aman. Kunci pribadi yang dihasilkan ini adalah salah satu bagian data yang digunakan untuk menghasilkan token sesi untuk interaksi aplikasi.
Setelah membuat kunci pribadi, instal aplikasi di semua organisasi yang ingin Anda pantau.
Ini adalah aplikasi multi-kontainer yang dirancang untuk menampilkan ketiga kontainer (Flask, Seledri, Redis) melalui /bin/run.sh, jadi menjalankan image Dockerfile akan menampilkan keseluruhan aplikasi
Tiga variabel di bawah ini adalah nilai string tunggal yang disediakan oleh pengguna
Variabel lingkungan di bawah ini memuat jalur ke file dengan kredensial di dalamnya. Muat nilai kunci file json dalam file yang tersedia di sini sebelum menjalankan aplikasi.
Catatan: Jika Anda tidak memindahkan lokasi file rahasia JSON maka Anda tidak perlu memperbarui tiga nilai variabel lingkungan di atas yang sudah ada di Dockerfiles atau docker-compose.yaml
Perintah ini akan menggunakan docker-compose.yaml untuk menampilkan semua container. Harap perbarui konfigurasi/lingkungan/localdev.env dengan nilai yang relevan dengan organisasi Anda sebelum menjalankan perintah di bawah ini
make serve
Setelah Anda selesai melakukan ini dan tidak bermaksud menggunakan Dockerfile untuk menyajikan aplikasi, lalu lompat ke bagian "Pemeriksaan Kesehatan Server"
Ada dua cara untuk membangun dan menjalankan Dockerfiles. Ada empat Dockerfile yang ada di repositori, tiga di antaranya digunakan untuk menghasilkan image individual untuk setiap container yang diperlukan agar layanan ini berfungsi, dan yang keempat adalah pengaturan Dockerfile untuk membuat image yang dapat digunakan untuk memunculkan Aplikasi labu atau pekerja seledri bergantung pada nilai variabel lingkungan DEADSHOT_RUN_MODE (api atau pekerja) yang disediakan Untuk menjalankan salah satu langkah di bawah ini, Anda harus ada di folder akar repositori
Catatan: Pastikan Anda telah memperbarui variabel lingkungan di file Dockerfile.api dan Dockerfile.celery
Ada tiga Dockerfile yang relevan dengan langkah ini. Dockerfile.api, Dockerfile.celery, dan Dockerfile.redis
docker build -f Dockerfile.api -t deadshot-api:<version> .
docker build -f Dockerfile.celery -t deadshot-worker:<version> .
docker build -f Dockerfile.redis -t deadshot-redis:<version> .
Ketiga gambar yang dibuat pada langkah sebelumnya semuanya berjalan di jaringan terpisah sehingga tidak dapat berkomunikasi satu sama lain. Untuk mengaktifkan komunikasi antar kontainer, kita perlu menambahkannya ke jaringan kontainer
docker network create deadshot-network
Jalankan gambar menggunakan jaringan yang dibuat dalam urutan berikut: Mulai wadah redis:
docker run --net deadshot-network --name redis deadshot-redis:<version>
Mulai wadah seledri:
docker run --net deadshot-network deadshot-worker:<version>
Mulai wadah Flask API:
docker run --net deadshot-network -p 9001:9001 deadshot-api:<version>
Untuk membuat gambar buruh pelabuhan tunggal untuk memunculkan pekerja api dan seledri berdasarkan variabel lingkungan DEADSHOT_RUN_MODE
make build
Perintah ini juga akan membuat image redis yang diperlukan untuk layanan
Jika image yang dibangun dijalankan dengan variabel lingkungan DEADSHOT_RUN_MODE=api maka akan memunculkan aplikasi Flask. Jika image dijalankan dengan variabel lingkungan DEADSHOT_RUN_MODE=worker maka Celery Worker akan diinisiasi
Sekarang API siap menerima permintaan yang menavigasi ke http://localhost:9001/api/v1/heartbeat
di browser harus mengembalikan respons yang valid atau Anda dapat melakukan curl
curl localhost:9001/api/v1/healthcheck
Keduanya akan menampilkan pesan berikut: {"healthcheck": "ready"}
Jika Anda memiliki payload webhook dari aplikasi Github untuk Permintaan Tarik, maka Anda dapat menjalankan perintah curl berikut secara lokal untuk menguji aplikasi Anda:
curl -X POST -H " content-type: application/json " -H " X-GitHub-Enterprise-Host: github.mockcompany.com " -H " X-Hub-Signature: sha1=85df4936c6396c149be94144befab41168149840 " -H " X-GitHub-Event: pull_request " -d @tests/fixtures/good_pr.json http://localhost:9001/api/v1/deadshot-webhook
Jika Anda ingin alat ini memantau jenis rahasia lainnya, tambahkan ekspresi reguler Anda di file regex.json
Catatan: Tanda pemeriksaan entropi memungkinkan Anda mencari temuan dengan entropi tinggi selain pencocokan ekspresi reguler
Saat ini, Deadshot hanya menguji dengan Github Enterprise, tetapi juga dapat bekerja dengan cloud Github.