DevOps training: Tạo "VPN kiểu mới" trong 15 phút với Cloudflare Zerotrust
Tiếp tục là một trong những hạng mục trong khuôn khổ series DevOps training của mình, bài viết này sẽ giúp phổ cập những quy chuẩn security rất cơ bản tới mọi người, mọi nhà, mọi công ty lớn nhỏ theo một cách không thể đơn giản hơn.
First things first
Xin chào mọi người, lại là mình - Minh Monmen - người vẫn đang rất cố gắng trong công cuộc truyền bá văn hóa phẩm DevOps nhưng lại luôn mồm khuyên mọi người đừng làm DevOps nữa đây (vì sẽ đá chén cơm của mình đó). Hôm nay mình trở lại với một bài hướng dẫn cực kỳ cơ bản và trực quan thôi chứ cũng không có bí kíp công nghệ 99% gì ở đây cả. Số là mình thường xuyên đi cứu net - tất nhiên là không phải đi cứu các em gái xinh đẹp chơi net hết tiền đâu - mà là giải quyết những sự cố mà internet cũng không giúp được bạn.
Nói chơi vậy chứ thật ra là mình hay giúp giải quyết vấn đề của người khác: debug hộ, trace error hộ, tìm và vá lỗ hổng security hộ, optimize performance hộ,... Trong quá trình đấy thì đã gặp rất nhiều hạ tầng lớn nhưng lại thường gặp những lỗ hổng security rất cơ bản như expose service nội bộ, database port ra public, rồi jump host lại set remember password tới nhiều host bên trong,... Nhân gần đây tự nhiên có mấy em hỏi mình về cách mình (team DevOps) đang setup VPN hay cung cấp access nội bộ cho developer ra sao thì mình biên luôn bài viết này thay cho câu trả lời vậy.
Oke chưa? Let's start!
VPN, jump server và những niềm đau
Trước khi hướng dẫn thì hãy nói qua 1 chút về lý do tại sao chúng ta lại phải tạo thứ gọi là VPN kiểu mới. Nếu như các bạn đều đã quen với tụi OpenVPN, WireGuard,... rồi thì mình cũng không cần nói qua quá nhiều những nỗi đau của chúng nó nữa:
- Cấu hình phức tạp, setup server cho chúng nó còn phức tạp x10 (thằng dễ setup nhất là Pritunl)
- Tậm tịt, thường xuyên xịt keo nếu các bạn ở xa server VPN quá. Tui đã từng connect tới quả VPN ở Mỹ, well...
- Cung cấp access theo kiểu có tất cả hoặc không có gì: khó phân quyền và audit
- Exposed VPN IP hoặc cả port ra public... thật ra là list ra nghe cho nguy hiểm thôi chứ nó cũng không phải vấn đề gì lắm.
Rồi tới jump server, 1 giải pháp rất hay được sử dụng để làm bước đệm khi access vô hệ thống nội bộ, nhưng thường xuyên bị sử dụng sai:
- User lưu ssh key hay remember pass luôn trên jump server
- Dùng jump làm trung gian truyền file nhưng thường xuyên để lại... file đó trên jump server luôn
Well well well. Những nỗi đau này cứ đi làm qua vài công ty sử dụng đi rồi khắc hiểu.
Cloudflare Zerotrust to the rescue
Vậy giờ có thằng nào vừa nhanh, vừa an toàn, vừa bảo mật, vừa có auditing,... nhưng lại free và setup đơn giản không?
Câu trả lời là... KHÔNG.
Làm gì có thằng nào tài sắc vẹn toàn như thế. Thứ đáp ứng được những tiêu chí trên, gần với yêu cầu free và setup đỡ phức tạp nhất mà mình có thể tìm thấy đây là Cloudflare Zerotrust.
Gần free nhất thì là vì nó đang cho free tới 50 users (còn hơn thì là 7$/user/tháng). Con số này là rất rộng rãi và đủ xài với nhiều startup hay SME rồi.
Còn đỡ phức tạp nhất thì là vì bạn đang đọc bài viết này, và 15 phút tới đây bạn có thể setup xong 1 VPN hàng xịn với Cloudflare Zerotrust để khoe sếp về tiêu chuẩn security thế kỷ 21 rồi.
Cái hay nhất của Cloudflare Zerotrust so với VPN như trên là việc nó không cần expose IP hay port public, không cần allow firewall ingress gì cả mà chỉ cần allow firewall egress ra internet tới Cloudflare là đủ. Điều này khiến nó còn phù hợp kể cả trong trường hợp mạng ở nhà của bạn không có IP tĩnh mà bạn vẫn có thể truy cập dịch vụ trên máy bạn từ bên ngoài được.
Cách Cloudflare Tunnel hoạt động
Bởi vì mục đích của bài viết này chỉ là setup 1 cái VPN, do đó mình sẽ chỉ tập trung giới thiệu về hoạt động của Cloudflare Tunnel với 1 usecase cụ thể là như VPN để connect private network. Cloudflare Zerotrust (hay Cloudflare One) chứa rất nhiều feature khác phục vụ các mục đích về security, auditing,... khác nữa mình sẽ để các bạn tự khám phá.
Đây là bức hình có thể gọi là cheatsheet tóm tắt về cách hoạt động (kèm với vị trí cấu hình trên giao diện) của Cloudflare Tunnel. Đây là thứ từng làm mình mất rất nhiều thời gian để tìm và hiểu, giờ chỉ gói gọn trong 1 bức hình:
Diễn giải:
- User cài WARP trên thiết bị, login bằng email + OTP vào Zerotrust organization
- WARP client sẽ mở kết nối tunnel tới Cloudflare, dùng Split Tunnel config để quyết định traffic tới đâu sẽ dùng tunnel và traffic tới đâu sẽ dùng network trực tiếp của thiết bị
- Phía internal network sẽ cài 1 agent tên là
cloudflared
, KHÔNG CẦN expose public IP hay port ingress mà chỉ cần allow network egress tới Cloudflare - Cloudflare sẽ dùng config Tunnels + Routes để quyết định sẽ dẫn traffic từ người dùng tới cụm
cloudflared
nào, hay trực tiếp ra internet - Sau khi traffic tới
cloudflared
, phần routing tiếp theo sẽ hoàn toàn do private network của bạn đảm nhiệm.
Cấu hình Cloudflare Zerotrust và WARP client
Truy cập https://one.dash.cloudflare.com và login với tài khoản cloudflare của bạn (khuyến khích nên dùng mail công ty).
Chọn tên cho team của bạn:
Chọn plan Zero Trust Free là đụ:
Bạn sẽ cần nhập thẻ (dù miễn phí chưa mất tiền thì vẫn cần nhé):
Sau khi process xong thì bạn sẽ được dẫn ra trang overview. Giờ mình sẽ đi cấu hình cách login bằng cách vào Settings > Authentication:
Mặc định CF đã bật cho chúng ta login bằng cách nhận mã OTP qua email. Với mình thế là đủ, các bạn có thể tích hợp thêm các phương thức đăng nhập khác thì tùy:
Tiếp theo hãy mở Settings > WARP Client > Device enrollment permissions > Manage để cho phép các thiết bị login với Zerotrust:
Chọn Add a rule thể cho phép mọi user có email từ company của bạn (mình set Emails ending in @mycompany.com
) connect tới Zerotrust:
Tiếp theo hãy trở lại Settings > WARP Client > Device settings > Create profile để tạo cấu hình routing trên thiết bị của người dùng (xem là traffic nào sẽ đi qua Cloudflare, traffic nào đi qua internet bình thường của thiết bị):
Chọn tên và điều kiện apply profile này theo user ví dụ như hình dưới, mình sẽ apply profile Developer nếu email là monmen@mycompany.com
. Phần Split Tunnel là thứ cần cấu hình sẽ edit sau khi tạo profile.
Sau khi tạo profile, ấn vào tên profile đó và chọn Edit để cấu hình Split Tunnel. Lúc này hãy chọn mode là Include IPs and domains, tức là chỉ những dải IP được chỉ định mới được client gửi lên cloudflare, còn lại sẽ đi qua internet bình thường của thiết bị. Chọn Manage
Ví dụ dải IP trên tất cả các cụm server của mình là 10.0.0.0/8
, mình sẽ thêm dải này vô cái list này. Khi đó mọi traffic tới IP trong dải này sẽ được WARP client gửi lên Cloudflare.
Include IPs and domains thường được sử dụng trong những case muốn làm VPN đơn thuần (như chúng ta đang làm đây), còn Exclude IPs and domains thường được dùng trong những case mà doanh nghiệp muốn mọi traffic của client đều được routing tới Cloudflare nhằm đảm bảo khả năng audit và các tiêu chuẩn enterprise security. Để cho đơn giản, trong bài viết này mình sẽ chọn Include ÍP and domains
Cấu hình Cloudflare Tunnel và routing tới các cụm server private
Tiếp theo, mở Networks > Tunnels > Create a tunnel để tạo một kết nối tới cụm server private của mình:
Chỗ này mình sẽ sử dụng cloudflared
- một loại agent của Cloudflare chạy trong mạng nội bộ của mình để làm nhiệm vụ tạo tunnel:
Ở phần Configuration, mình sẽ chạy agent bằng docker cho đơn giản, hãy chọn Docker và bạn sẽ copy được câu lệnh để chạy cloudflared
với token tương ứng:
Các bạn có thể deploy
cloudflared
lên kubernetes, docker swarm, docker compose,... hoặc chỉ cần đơn giản là thêm-d
vào câu lệnh run docker ở trên để chạy agent bằng docker dưới nền:
docker run -d cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiN...
Sau khi các bạn chạy trong mạng nội bộ cái container trên thì trên Cloudflare sẽ hiển thị Connectors Online và trạng thái của Tunnel là Active.Next là setup 1 cái Route để Cloudflare biết lối gửi traffic tới cái agent này, ví dụ mình có dải Dev server là 10.1.0.0/16
:
Bạn có thể thêm nhiều route và nhiều dải tới tunnel sau này.
Cài đặt WARP trên client
Với user, hãy vô đây để tải và cài đặt WARP client: https://developers.cloudflare.com/warp-client/get-started/.
Sau khi cài xong, hãy mở Settings > Preferences:
Chọn Account > Login to Cloudflare Zero Trust:
Chọn Team name là tên bạn đã đặt ở đầu tiên khi đăng ký Zerotrust để tiếp tục. Cứ Ok ok và bạn sẽ được mở 1 trang web để login như này:
Check email để lấy OTP và voila, bạn đã thành công kết nối với Zerotrust.
Hãy thử connect tới 1 server Dev trực tiếp với IP trong terminal của bạn:
ssh monmen@10.1.0.100
Một số kinh nghiệm khi xài Cloudflare Zerotrust
Dưới đây là một số tips sau khi mình đã dùng một thời gian:
- Phần IPv6 mình xài thấy proxy lên CF không ổn định lắm nên mình chỉ dùng với IPv4. Các bạn có thể dùng và để ý điều này nếu thấy các kết nối có gì bất thường.
- Thông thường phần Network Routes có thể chứa rất nhiều IP/ dải IP để phục vụ routing tới tunnel tương ứng. Lúc này các bạn nên quản lý toàn bộ cấu hình Zero trust bằng công cụ IaC như Terraform hay Pulumi chứ không thêm tay hơi khoai đó.
- Phần gán profile cho từng user nếu không dùng các phương thức login hỗ trợ group thì khá mệt vì phải sửa condition cho mỗi user. Chỗ này đưa qua IaC như trên cũng là một cách đơn giản để giải quyết vấn đề.
- Nếu như các private location của bạn có dải IP bị overlap, ví dụ cùng 1 dải
10.1.0.0/16
chẳng hạn, thì hãy tạo thêm Virtual Network nằm trong Settings > WARP Client > Virtual Networks để cho phép user lựa chọn họ sẽ kết nối tới tunnel nào. - Nên setup ít nhất 2 instance
cloudflared
trên 2 node khác nhau để đảm bảo HA. - Nên có 1 phương án backup để tiếp cận hệ thống trong trường hợp tất cả các instance
cloudflared
đều down. Đó có thể là 1 lối SSH từ IP office qua firewall hoặc trực tiếp qua DC chẳng hạn. Bình thường thì disable hoặc chặn nhưng khi cần thì có thể mở mà không cầncloudflared
. Cái này để bạn không tự khóa mình ngoài ô tô còn chìa khóa thì vứt trên ghế lái thôi.
Tổng kết
Nếu như nhu cầu của bạn chỉ đơn giản là tạo 1 kết nối an toàn, bảo mật tới cụm server private của bạn thì là bạn đã xong rồi đó. Quá đơn giản vì mình đã chỉ cho bạn đúng những chỗ config cần thiết để setup rồi đúng không? Các bạn hãy tự khám phá thêm những tính năng khác, những cách exposed internal service khác với nhiều tùy chọn hơn như:
- Cloudflare Access để expose các service nội bộ với public hostname
- Local Domain Fallback để dùng DNS server nội bộ phân giải các private hostname (ví dụ từ máy bạn gọi trực tiếp được tới service kubernetes kiểu
my-service.namespace.svc.cluster.local
chẳng hạn) - Auditing, logging traffic của user
- Antivirus khi upload/download file, Data Loss Prevention để chống gửi thông tin nhạy cảm ra ngoài
- Công cụ thay thế SIEM cho networking khi sử dụng Exclude IPs và bắt buộc Zerotrust luôn bật trên mọi máy công ty,... ...
Hết rồi, hẹn gặp lại trong những bài viết tiếp theo của mình nha.
All rights reserved