Setup debug Gitlab, tưởng không khó mà cũng không khó lắm

Chuyện là gần đây Gitlab có bản Security Release mới, trong đó có một lỗi Arbitrary file read via group import feature khá là thú vị, ảnh hưởng đến tất cả các phiên bản GitLab CE/EE có đầu là 14.5 trở lên nên mình cùng với anh @vigov5 đã thử setup lên research bug này

Chuyện là gần đây Gitlab có bản Security Release mới, trong đó có một lỗi Arbitrary file read via group import feature khá là thú vị, ảnh hưởng đến tất cả các phiên bản GitLab CE/EE có đầu là 14.5 trở lên nên mình cùng với anh @vigov5 đã thử setup lên research bug này xem sao 😄. Bạn đọc có thể đọc thêm thông tin tại đây
https://about.gitlab.com/releases/2022/01/11/security-release-gitlab-14-6-2-released/#arbitrary-file-read-via-group-import-feature

Mình chưa setup debug Ruby on Rails bao giờ, nên đã mất 2 ngày trời setup. Viết lên đây vừa là chia sẻ cho bạn đọc cũng như là một nơi lưu trữ lỡ mình có lỗi ở đâu đó thì còn có cái vào đọc lại =))

Setup

Để setup debug Ruby (cụ thể hơn thì là setup debug Gitlab) thì bạn cần khá là nhiều thứ và có nhiều cách để debug, mình đã thử được 2 cách debug khá ổn, nhưng trong bài này chắc là mình chỉ viết trọng tâm vào 1 cách thôi, các còn lại tương tự ấy mà 😄. Đầu tiên các bạn cần:

  • Ruby Mine (mình chọn IDE này vì đồ của JetBrains debug lúc nào cũng ngon)
    https://www.jetbrains.com/ruby/
  • Docker (Docker giúp cài đặt môi trường sạch sẽ, ít lỗi)
  • Một máy tính cấu hình đủ khoẻ, Gitlab khá ngốn tài nguyên, còn với các project nhẹ nhàng khác thì cấu hình yếu chút cũng được
  • Kiên trì kiên trì và kiên trì 😦

Một chiếc note nho nhỏ: Môi trường debug của mình hiện tại đang sử dụng là Windows, kết hợp kèm với WSL2 để chạy Linux, đối với Linux thì làm tương tự nhưng ít bước hơn Windows, các bạn có thể lược bỏ bước nếu muốn nhé.

Setup env với docker

  1. Clone repo https://gitlab.com/gitlab-org/gitlab-development-kit (Ở đây mình sử dụng gitlab-deveopment-kit vì chính Gitlab cũng bảo rằng mình cần dùng cái này để tránh gặp lỗi trong quá trình setup, do Gitlab có quá nhiều thành phần)
  2. cd gitlab-development-kit
     docker build -t gdk:base .
     docker run -it --name gitlab gdk:base bash.

    Sử dụng câu lệnh trên để build một image env với ruby

  3. Vào trong docker trên, chạy lệnh one line duy nhất để dựng môi trường hoàn chỉnh
    curl"https://gitlab.com/gitlab-org/gitlab-development-kit/-/raw/main/support/install"|bash

    Lệnh này sẽ giúp các bạn cài môi trường Gitlab sạch sẽ, kiểu gì cũng xài được, nếu lỗi thì gõ lại cái lệnh đó là được, khi nào báo Success thì là ok

  4. Mở một terminal khác gõ lệnh
    docker commit gitlab gdk:ready
    

    để lưu lại thành docker image, tiện sau này có sử dụng lại đỡ phải ngồi chờ build cái đống trên bước 3 (lâu phết đấy)

  5.  docker run -it -p 3000:3000 -p 12345:12345 gdk:ready bash

    Truy cập vào trong docker image gdk:ready vừa mới lưu lại xong.
    Nếu ở phần này các bạn bị lỗi không mở được port 3000 thì bên dưới mình sẽ hướng dẫn cách fix nhé

  6. Bên trong docker vào thư mục gitlab-development-kit chạy
    gdk stop
    gdk start webpack gitlab-workhorse rails-background-jobs sshd praefect praefect-gitaly-0 redis postgresql
    

    Lệnh này sử dụng để khởi động các dịch vụ cần thiết của Gitlab

Vậy là xong các bước dựng env, tiếp theo đến bước debug với RubyMine

Debug Gitlab với Ruby Mine

  1. Cài đặt Ruby Mine lên Windows/Linux tuỳ ý (ở đây mình sử dụng Windows)
  2. Cài đặt SDK Ruby cho Ruby Mine, ở đây mình sử dụng WSL2 để cài đặt cho nó đơn giản, bạn nào k thích dùng WSL2 thì có thể cài Ruby cho Windows tại https://rubyinstaller.org/downloads/
    Trên WSL2 gõ

    sudoapt-getinstall rails
    

    là được, chờ xíu là xong, ở đây mình đang sử dụng base kali-linux

  3. Tại Ruby Mine, vào File -> Settings -> Search Ruby SDK and Gems
    Ở thư mục gitlab chọn dấu + -> New remote … rồi làm như hình là xong

    Ruby Mine có hỗ trợ rất nhiều kiểu SDK, từ local tới remote, rất là tiện 👍

  4. Clone repo gitlab trên máy local
    git clone https://gitlab.com/gitlab-org/gitlab
    

    Ở đây mình clone trên WSL2 luôn

    git checkout v14.6.1-ee
    

    để về version bị lỗi

    Chú ý, trên Docker các bạn cũng checkout về nhánh này để chạy code version này nhé.

  5. Tiếp tục vào Run -> Edit configurations

    Các bạn cài đặt như hình là xong. Phần remote port để là 12345 do nãy mình có map port docker 12345 ra ngoài rồi. Phần remote root folder thì giống như hình còn phần local root folder thì để đường dẫn là thư mục gitlab trên máy các bạn.

  6. Trên container docker gõ
    rdebug-ide --host 0.0.0.0 --port 12345 -- bin/rails s -b 0.0.0.0
    

    Lúc này trên container docker sẽ chờ tín hiệu nhận debug từ Ruby Mine, ấn nút Debug hoặc Shift + F9 để connect, sau đó chờ server start lên là được
    Trên máy local truy cập vào http://localhost:3000 xem có vào được Gitlab chưa, nếu vào được thì là ok 😄

  7. Tuy nhiên các bạn sẽ gặp vấn đề là k debug được, do default Gitlab chạy có nhiều Worker, cần phải tắt Worker đi để cho nó chạy Single thôi là có thể debug được (cảm ơn anh @vigov5 rất nhiều vì cái này)
    vim config/puma.rb
    

    Lặp lại bước 6 là có thể debug được gòi 😄

Kết

Trên đây là một cách debug webapp Ruby sử dụng Ruby Mine, cũng có thể sử dụng VSCode debug cũng được, nhưng cá nhân mình thích Ruby Mine hơn vì tính tiện dụng của nó, thay vì docker các bạn cũng có thể sử dụng WSL2 hay cài đặt trực tiếp lên Windows nhưng mà nó có khá nhiều lỗi + Gitlab là một project khá lớn cần cài đặt các thành phần bổ trợ khá nhiều nên mình thấy cách trên có vẻ tối ưu nhất, các project khác các bạn có thể làm tương tự

Extend

Lúc setup debug mình có gặp một lỗi liên quan đến Windows, nó không cho phép mình mở port 3000 map từ Docker ra ngoài, hoá ra là nó bị excludedport, cách fix như sau

netsh interface ipv4 show excludedportrange protocol=tcp

Sử dụng lệnh này để check xem mình có đang bị Exclusion port nào k, nếu port mình đang muốn mở ở trong khoảng start port – end port thì cần xoá nó đi

Mở powershell quyền Administrator lên

net stop winnat
netsh interface ipv4 delete excludedportrange protocol=tcp startport=2972 numberofports=100
net start winnat

Với startport và numberofport các bạn tự định nghĩa nhé. See you.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ