เสริมความปลอดภัยให้ Backend Applications ด้วย NGINX App Protect - ตอนที่ 6 - เสริมความปลอดภัยให้กับ gRPC ผ่าน IDL
Tags: nginx, waf, proen, appprotect
Published: 2021-10-16 03:09:31

*บทความนี้เป็นการใช้งาน NGINX Plus และ NGINX App Protect บน Proen Cloud มี Add-ons สำเร็จรูปพร้อมใช้แบบ Subscription รายเดือนครับ

ในตอนที่ 1 - 4 เราได้ติดตั้ง NGINX Plus, NGINX App Protect รวมถึงการ Configure transparent mode เพื่อให้พร้อมใช้งานร่วมกับ Backend Applications

ตอนที่ 1 - ติดตั้ง NGINX Plus และ NGINX App Protect
https://bit.ly/napproen

ตอนที่ 2 - ปรับแต่ง NGINX App Protect - transparent mode
https://bit.ly/napproen-ep2

ตอนที่ 3 - ปรับแต่ง NGINX App Protect - Data Guard
https://bit.ly/napproen-ep3

ตอนที่ 4 - ปรับแต่ง NGINX App Protect - HTTP Compliance
https://bit.ly/napproen-ep4

ตอนที่ 5 - Rescue Apache HTTP Server from CVE-2021-41773
https://bit.ly/napproen-ep5

วันนี้จะขอกลับมามุมวิชาการครับ การสื่อสารกันผ่าน Application Programming Interface/API ปัจจุบันเป็นสิ่งที่เลี่ยงไม่ได้แล้ว ดังนั้น NGINX WAF App Protect จึงปกป้องไปถึงตัว API ด้วย วันนี้เราจะโฟกัสที่ตัว gRPC, โดยจะมีหลักการเดียวกันกับรูปแบบที่เป็นทั้ง JSON และ XML

RPC - Remote Procedure Call คืออะไร ?

ตอนที่เราเขียนโปรแกรม มักจะมีงานที่ต้องทำซ้ำๆ กัน เช่น การดึงข้อมูล User จะมี Input ได้แก่ UserID, JWT เป็น Credential ในการดึงข้อมูล
จากนั้นจะได้ output เป็น UserID, Name, Surname, และ Information อื่นๆ การทำงานที่ซ้ำ ๆ กันแบบนี้  มักจะเขียนเป็น Function / Procedure เพื่อให้ไม่ต้องเขียนรายละเอียดการทำงานข้างในซ้ำหลายๆ ครั้ง

ในยุคเก่า Procedures ต่างๆ รวมกันอยู่ในโปรแกรมขนาดใหญ่เพียงโปรแกรมเดียว เป็นแบบ Monolithic ข้อดีคือการสื่อสารกันระหว่างแต่ละ Procedures ถูกควบคุมเบ็ดเสร็จ จัดการง่ายในแบบโปรแกรมเดียว, แต่ปัจจุบันเราอยู่ในยุคของ Microservices หมายความว่าแต่ละ Procedures จะแยกกันอยู่ในรูปแบบของ Microservices โดยแต่ละ Procedures อาจถูกบริหารจัดการโดยทีมต่างกัน การสื่อสารกันระหว่าง Microservices เหล่านี้จึงต้องมีรูปแบบที่คุยกันได้, จึงเป็นที่มาของ Remote Procedure Call(RPC)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ivatvce4m2rn0v7tcn22.jpg)

gRPC เป็น Framework ที่ Google เคลมว่า เป็น High performance RPC. หรือก็คือ ประสิทธิภาพดีกว่า RPC ธรรมดาๆนั่นเองครับ

"gRPC is a modern open source high performance Remote Procedure Call (RPC) framework that can run in any environment"

ตอนนี้เรารู้แล้วว่า การทำงานของ Microservices ซึ่งอาจจะอยู่กันคนละ Process, ไปจนถึงคนละ Data center นั้น จำเป็นต้องมีรูปแบบการสื่อสารระหว่างกัน, โดยเราพูดถึง gRPC จาก Google โดยอยู่ใต้ของเขตของ Application Programming Interface อีกทีครับ

ทีนี้ปัญหาถัดมา ก็คือผู้พัฒนา Microservices ใช้ภาษาในการเขียนที่ต่างกัน, ซึ่งเดิมปัญหานี้ไม่เกิดขึ้นกับ Monolithic ครับเพราะเป็น Application ใหญ่ตัวเดียว ซึ่งมักถูกเขียนด้วยภาษาเดียวอยู่แล้ว เราอาจกล่าวได้ว่า เมื่อแก้ปัญหาเดิม ของ Monolithic Application ได้แล้ว เราก็จะเจอปัญหาใหม่จาก Microservices รอให้เราพัฒนา/แก้ไขต่อในอนาคตครับ 

การที่ Microservices แต่ละตัว ถูกเขียนด้วยโปรแกรมต่างกัน คุยกันด้วยคนละมาตรฐาน ถูกแก้ด้วย Interface Description Language(IDL) โดย App Protect รองรับ IDL เวอร์ชั่นใหม่ ที่เป็นตัว Proto3 ครับ

IDL คืออะไร

Interface Description Language จะนิยามรูปแบบและขนาดของ Interface ที่จะ API คุยกันครับ ตัวอย่างเช่น เมื่อเรากำหนดรูปแบบข้อมูลเป็น double, เมื่อแปลงเป็นการทำงานร่วมกับภาษา C++ ก็จะได้ข้อมูลชนิด double, แต่ถ้าเป็น Go ก็จะได้ข้อมูลแบบ float64 ซึ่งทั้งสองแบบก็คือเลขทศนิยม ขนาด 8 bytes นั่นเอง

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6g53dc0b2416uc4gb876.jpg)

NGINX WAF App Protect ช่วยป้องกันได้ละเอียดถึงระดับ IDL ครับ โดยเรา include IDL ไฟล์ไว้ใน WAF policies ทำให้ App Protect สามารถตรวจสอบ Interface ในขั้นตอน request/response ได้ว่าตรงตาม IDL ไฟล์ที่กำหนดหรือไม่
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lcdh2yj5gr2hh7fsm4tk.jpg)

ถ้ามี IDL หลายไฟล์ เราสามารถตั้งไฟล์ที่เป็น primary แล้ว include ไฟล์อื่นๆเข้ามา หรือจะรวมส่งในไฟล์เดียวแบบ tar และ gzipped tar(tgz) ก็ได้ครับ
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmc1ofxulmobi692tnbn.jpg)

วันนี้เราได้รู้จัก Remote Procedure Call ที่ใช้สื่อสารระหว่าง Microservices, gRPC high performance RPC จาก Google, Interface Definition Language ที่จะนิยาม Interface ให้กับ Microservices, และยังช่วยให้ App Protect รู้จักและควบคุมมาตรฐาน Interface ได้ด้วยครับ

สัปดาห์หน้า พบกับการลงตัวอย่าง IDP file, รวมถึงการปรับแต่ง proto3 ให้ Match กับแต่ละ services และการ Tuning gRPC WAF ในกรณีไม่ปกติด้วยครับ กดติดตามได้ที่

FB Page: นั่งเล่น NGINX
https://web.facebook.com/NungLenNGINX
FB Group: ร่วมพูดคุยและแลกเปลี่ยนความรู้ไปกับเรา NGINX Super User TH
https://web.facebook.com/groups/394098015436072

เริ่มต้นใช้งานได้ที่ https://app.manage.proen.cloud/
มีทีม Support ให้ครับ
อีกหนึ่งช่องทาง nginx@mfec.co.th