Deadshot เป็นเครื่องสแกนคำขอดึงที่จะค้นหาการแนะนำความลับผ่านทาง PR โดยการจับคู่แต่ละบรรทัดที่แตกต่างกันกับชุดของสำนวนลับที่รู้จัก
การบริการมีหน้าที่:
บริการไม่ได้:
Deadshot เป็นแอปพลิเคชันหลายคอนเทนเนอร์ Flask-Celery-Redis ที่ติดตั้งเป็นแอป Github เพื่อรันกับทุกคำขอ Pull Request ที่สร้างขึ้นกับสาขาหลักของ repo ที่ติดตั้งแอป Github
คอนเทนเนอร์ Flask เป็นจุดเริ่มต้นสำหรับบริการโดยการเปิดเผยเส้นทาง API ที่กำหนดไว้ใน blueprints.py เมื่อได้รับเพย์โหลดคำขอ Pull บนเส้นทาง API บริการจะส่งต่อเพย์โหลดไปยังคิว Redis เพื่อให้คอนเทนเนอร์ Celery หยิบและสแกนส่วนต่างของคำขอ Pull หลังจากที่คอนเทนเนอร์คื่นฉ่ายสแกนหานิพจน์ทั่วไปของความลับที่ระบุแล้ว จะแสดงความคิดเห็นเกี่ยวกับ PR, slack แจ้งเตือนช่องทางของทีมรักษาความปลอดภัย หรือสร้างตั๋ว JIRA เพื่อให้ทีมติดตามผล แอป Github ได้รับการกำหนดค่าด้วย URL ของ Flask API และข้อมูลลับที่ใช้ร่วมกันซึ่งใช้ในการสร้างเช็คซัมเพย์โหลด SHA
วิธีหนึ่งในการตั้งค่า URL ของ API คือการปรับใช้โค้ดนี้บนโฮสต์และกำหนดตัวโหลดบาลานเซอร์ของแอปพลิเคชันให้กับโฮสต์นี้
หมายเหตุ: เมื่อสร้างแอป โปรดตรวจสอบให้แน่ใจว่าคุณมี DNS พร้อมสำหรับโฮสต์ที่คุณจะปรับใช้คอนเทนเนอร์ Deadshot และสตริงข้อมูลลับที่ปลอดภัยสำหรับข้อมูลลับของเว็บฮุค
ผู้ดูแลระบบ Github จะต้องสร้างและติดตั้งแอป Github บน Github ก่อนที่จะเรียกใช้หรือปรับใช้แอปพลิเคชัน Deadshot หากต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการสร้างแอป Github โปรดอ่านคู่มือนี้
ชื่อแอป: deadshot (ตัวพิมพ์เล็กทั้งหมด นี่เป็นสิ่งสำคัญเนื่องจากบริการใช้ชื่อนี้เพื่อดึงความคิดเห็นก่อนหน้านี้ที่ทำไว้กับ PR)
URL ของเว็บฮุค: http://your-hosted-deadshot-dns/api/v1/deadshot-webhook
หากต้องการทดสอบในเครื่อง คุณสามารถสร้างจุดสิ้นสุด ngrok เพื่อป้อนเข้าสู่ส่วน webhook ของแอป Github
เพื่อให้แอปพลิเคชันนี้ทำงานแอป Github ของคุณจะต้องเปิดใช้งานการอนุญาตและการสมัครสมาชิกต่อไปนี้บนหน้าการอนุญาตของแอป Github: สิทธิ์ของพื้นที่เก็บข้อมูล:
การอนุญาตอื่นๆ ทั้งหมดจะไม่เปลี่ยนแปลงเป็นค่าเริ่มต้นคือ ไม่มีการเข้าถึง
สมัครสมาชิกกิจกรรม:
สุดท้ายคลิก “สร้างแอป GitHub” หลังจากสร้างแอปสำเร็จแล้ว ให้ทำตามลิงก์ "สร้างคีย์ส่วนตัว" ที่ส่วนบนสุดของหน้าเว็บแอป
เมื่อสร้างรหัสส่วนตัวแล้วให้เก็บไว้ในตำแหน่งที่ปลอดภัย คีย์ส่วนตัวที่สร้างขึ้นนี้เป็นหนึ่งในข้อมูลที่ใช้ในการสร้างโทเค็นเซสชันสำหรับการโต้ตอบกับแอป
หลังจากสร้างคีย์ส่วนตัวแล้ว ให้ติดตั้งแอปในองค์กรทั้งหมดที่คุณต้องการให้ตรวจสอบ
นี่คือแอปพลิเคชันหลายคอนเทนเนอร์ที่ออกแบบมาเพื่อดึงทั้งสามคอนเทนเนอร์ (Flask, Celery, Redis) ผ่านทาง /bin/run.sh ดังนั้นการเรียกใช้อิมเมจ Dockerfile ควรดึงแอปพลิเคชันทั้งหมดขึ้นมา
ตัวแปรสามตัวด้านล่างเป็นค่าสตริงเดี่ยวที่ผู้ใช้ระบุไว้
เส้นทางโหลดตัวแปรสภาพแวดล้อมด้านล่างไปยังไฟล์ที่มีข้อมูลรับรองอยู่ โหลดค่าคีย์ของไฟล์ json ในไฟล์ที่มีอยู่ที่นี่ก่อนเรียกใช้แอปพลิเคชัน
หมายเหตุ: หากคุณไม่ย้ายตำแหน่งไฟล์ความลับ JSON คุณไม่จำเป็นต้องอัปเดตค่าตัวแปรสภาพแวดล้อมสามค่าข้างต้นที่มีอยู่แล้วใน Dockerfiles หรือ docker-compose.yaml
คำสั่งนี้จะใช้ docker-compose.yaml เพื่อแสดงคอนเทนเนอร์ทั้งหมด โปรดอัปเดต configuration/environment/localdev.env ด้วยค่าที่เกี่ยวข้องกับองค์กรของคุณก่อนที่จะรันคำสั่งด้านล่าง
make serve
เมื่อคุณทำสิ่งนี้เสร็จแล้วและไม่ต้องการใช้ Dockerfile เพื่อให้บริการแอปพลิเคชัน ให้ข้ามไปที่ส่วน "การตรวจสุขภาพเซิร์ฟเวอร์"
มีสองวิธีในการสร้างและรัน Dockerfiles มี Dockerfiles สี่ไฟล์อยู่ในพื้นที่เก็บข้อมูล โดยสามไฟล์ใช้เพื่อสร้างอิมเมจแต่ละอิมเมจสำหรับแต่ละคอนเทนเนอร์ที่จำเป็นสำหรับบริการนี้ในการทำงาน และอันที่สี่คือการตั้งค่า Dockerfile เพื่อสร้างรูปภาพที่สามารถใช้เพื่อเรียกใช้ แอปพลิเคชัน Flask หรือตัวทำงานคื่นฉ่าย ขึ้นอยู่กับค่าตัวแปรสภาพแวดล้อม DEADSHOT_RUN_MODE (api หรือตัวทำงาน) ที่ให้มา ในการรันขั้นตอนใด ๆ ด้านล่างนี้ คุณจะต้องแสดงอยู่ในโฟลเดอร์รูทของที่เก็บ
หมายเหตุ: ตรวจสอบให้แน่ใจว่าคุณได้อัปเดตตัวแปรสภาพแวดล้อมในไฟล์ Dockerfile.api และ Dockerfile.celery
มี Dockerfiles สามไฟล์ที่เกี่ยวข้องกับขั้นตอนนี้ Dockerfile.api, Dockerfile.celery และ 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> .
รูปภาพทั้งสามที่สร้างขึ้นในขั้นตอนก่อนหน้านี้ทั้งหมดทำงานในเครือข่ายที่แยกจากกัน ซึ่งจะทำให้ไม่สามารถพูดคุยกันเองได้ เพื่อเปิดใช้งานการสื่อสารระหว่างคอนเทนเนอร์ เราจำเป็นต้องเพิ่มการสื่อสารเหล่านั้นในเครือข่ายคอนเทนเนอร์
docker network create deadshot-network
เรียกใช้อิมเมจโดยใช้เครือข่ายที่สร้างขึ้นตามลำดับต่อไปนี้: เริ่มคอนเทนเนอร์ redis:
docker run --net deadshot-network --name redis deadshot-redis:<version>
เริ่มภาชนะคื่นฉ่าย:
docker run --net deadshot-network deadshot-worker:<version>
เริ่มคอนเทนเนอร์ Flask API:
docker run --net deadshot-network -p 9001:9001 deadshot-api:<version>
เพื่อสร้างอิมเมจนักเทียบท่าเดี่ยวสำหรับเรียกใช้งาน api และคื่นฉ่ายตามตัวแปรสภาพแวดล้อม DEADSHOT_RUN_MODE
make build
คำสั่งนี้จะสร้างอิมเมจ Redis ที่จำเป็นสำหรับการบริการด้วย
หากอิมเมจที่สร้างขึ้นถูกรันด้วยตัวแปรสภาพแวดล้อม DEADSHOT_RUN_MODE=api มันจะเรียกแอปพลิเคชัน Flask ขึ้นมา หากอิมเมจถูกรันด้วยตัวแปรสภาพแวดล้อม DEADSHOT_RUN_MODE=worker จากนั้นผู้ปฏิบัติงานคื่นฉ่ายจะเริ่มต้นขึ้น
ขณะนี้ API พร้อมรับคำขอที่นำทางไปยัง http://localhost:9001/api/v1/heartbeat
ในเบราว์เซอร์ควรส่งคืนการตอบกลับที่ถูกต้องหรือคุณอาจทำการขด
curl localhost:9001/api/v1/healthcheck
ทั้งสองควรแสดงข้อความต่อไปนี้: {"healthcheck": "ready"}
หากคุณมีเพย์โหลดของเว็บฮุคของแอป Github สำหรับ Pull Request ของคุณ คุณสามารถเรียกใช้คำสั่ง curl ต่อไปนี้ในเครื่องเพื่อทดสอบแอปพลิเคชันของคุณได้:
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
หากคุณต้องการให้เครื่องมือตรวจสอบความลับประเภทอื่นๆ ให้เพิ่มนิพจน์ทั่วไปของคุณในไฟล์ regex.json
หมายเหตุ: แฟล็กตรวจสอบเอนโทรปีช่วยให้คุณค้นหาผลการวิจัยเอนโทรปีสูงได้ นอกเหนือจากการจับคู่นิพจน์ทั่วไป
ในเวลานี้ Deadshot ได้ทดสอบกับ Github Enterprise เท่านั้น แต่ควรทำงานกับคลาวด์ Github ได้เช่นกัน