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
- 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)
-
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
- 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
- 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)
-
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é - 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
- Cài đặt Ruby Mine lên Windows/Linux tuỳ ý (ở đây mình sử dụng Windows)
- 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
- 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à xongRuby Mine có hỗ trợ rất nhiều kiểu SDK, từ local tới remote, rất là tiện 👍
- 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é.
- 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.
- 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 - 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