Reading Time: 14 minutes

Phần lớn thời gian, bạn sẽ tập trung vào việc triển khai và vận hành các ứng dụng đám mây của mình. Trong quá trình thiết lập và triển khai đó, điều quan trọng là phải tích hợp các biện pháp bảo mật chặt chẽ và toàn diện cho hệ thống và ứng dụng trước khi chúng được đưa vào sử dụng công khai.

các cách bảo mật máy chủ

Việc áp dụng các biện pháp bảo mật máy chủ được hướng dẫn trong bài này trước khi triển khai sẽ giúp đảm bảo rằng mọi phần mềm chạy trên hạ tầng của bạn đều có một cấu hình bảo mật cơ bản vững chắc, thay vì chỉ áp dụng các giải pháp tạm thời sau khi đã triển khai.

Hướng dẫn này sẽ giới thiệu một số cách bảo vệ máy chủ thực tiễn mà bạn có thể thực hiện trong quá trình cấu hình và thiết lập hạ tầng máy chủ. Danh sách này không phải là đầy đủ tất cả mọi thứ bạn có thể làm để bảo vệ máy chủ, nhưng nó là điểm khởi đầu tốt để bạn xây dựng tiếp.

Theo thời gian, bạn có thể phát triển một chiến lược bảo mật phù hợp hơn với nhu cầu cụ thể của môi trường và ứng dụng của mình.

Các cách bảo mật máy chủ

1. Sử dụng SSH Keys (Khóa SSH)

SSH (Secure Shell) là một giao thức được mã hóa dùng để quản trị và giao tiếp với máy chủ. Khi làm việc với máy chủ, bạn sẽ dành phần lớn thời gian trong phiên dòng lệnh (terminal), được kết nối với máy chủ thông qua SSH. Thay vì sử dụng đăng nhập bằng mật khẩu, SSH key cung cấp một cách đăng nhập an toàn hơn thông qua cơ chế mã hóa và được khuyến nghị cho tất cả người dùng.

Khi sử dụng SSH key, một cặp khóa riêng tư (private key) và khóa công khai (public key) sẽ được tạo ra để phục vụ cho việc xác thực. Khóa riêng sẽ được người dùng giữ bí mật và bảo vệ cẩn thận, trong khi khóa công khai có thể chia sẻ cho máy chủ. Đây là một ví dụ về mã hóa bất đối xứng (asymmetric encryption) – một mô hình phổ biến được sử dụng rộng rãi trong các hệ thống bảo mật.

Để cấu hình xác thực bằng khóa SSH, bạn cần đặt khóa SSH công khai của mình trên máy chủ vào đúng vị trí ( ~/.ssh/authorized_keys).

Khóa SSH tăng cường bảo mật như thế nào?

Với SSH, mọi hình thức xác thực – bao gồm cả xác thực bằng mật khẩu – đều được mã hóa hoàn toàn. Tuy nhiên, khi cho phép đăng nhập bằng mật khẩu, những kẻ tấn công độc hại có thể tự động thử đăng nhập vào máy chủ liên tục, đặc biệt nếu máy chủ có địa chỉ IP công khai. Mặc dù có thể giới hạn quyền truy cập sau nhiều lần đăng nhập sai từ cùng một IP, và trên thực tế kẻ tấn công cũng bị giới hạn bởi tốc độ đăng nhập, nhưng bất kỳ tình huống nào mà kẻ tấn công có thể thực hiện tấn công brute force với xác suất thành công đáng kể đều là một rủi ro bảo mật.

Việc thiết lập xác thực bằng khóa SSH cho phép bạn tắt hoàn toàn đăng nhập bằng mật khẩu. Khóa SSH thường có nhiều bit dữ liệu hơn so với mật khẩu. Bạn có thể tạo ra một chuỗi băm khóa SSH dài 128 ký tự từ một mật khẩu dài 12 ký tự, khiến việc brute-force khó hơn nhiều. Một số thuật toán mã hóa có thể bị phá bằng cách đảo ngược băm mật khẩu nhiều lần trên máy tính đủ mạnh. Tuy nhiên, những thuật toán như RSA mặc định được tạo bởi các ứng dụng SSH hiện đại thì hiện tại vẫn chưa thể bị phá vỡ một cách khả thi.

Cách triển khai khóa SSH

Khóa SSH là phương thức được khuyến nghị để đăng nhập từ xa vào bất kỳ môi trường máy chủ Linux nào. Một cặp khóa SSH có thể được tạo trên máy cục bộ của bạn bằng lệnh ssh, sau đó bạn có thể chuyển khóa công khai lên máy chủ từ xa.

Đối với bất kỳ thành phần nào của hệ thống yêu cầu truy cập bằng mật khẩu, hoặc dễ bị tấn công brute force, bạn có thể cài đặt giải pháp như fail2ban trên máy chủ để giới hạn số lần đoán mật khẩu.

Một thông lệ bảo mật quan trọng là không cho phép người dùng root đăng nhập trực tiếp qua SSH. Thay vào đó, hãy đăng nhập bằng một người dùng không có đặc quyền và sau đó nâng quyền khi cần thiết bằng công cụ như sudo. Cách tiếp cận này nhằm hạn chế quyền truy cập, được gọi là nguyên tắc đặc quyền tối thiểu (principle of least privilege). Sau khi bạn đã kết nối với máy chủ và tạo tài khoản người dùng không có đặc quyền có thể đăng nhập bằng SSH, bạn có thể vô hiệu hóa đăng nhập root bằng cách đặt dòng PermitRootLogin no trong tệp /etc/ssh/sshd_config và khởi động lại tiến trình SSH của máy chủ với lệnh sudo systemctl restart sshd.

2. Tường lửa

Tường lửa là một thiết bị phần mềm hoặc phần cứng kiểm soát cách các dịch vụ được mở ra với mạng và loại lưu lượng nào được phép đi vào và ra khỏi một hoặc nhiều máy chủ. Một tường lửa được cấu hình đúng sẽ đảm bảo rằng chỉ những dịch vụ nên công khai mới có thể được truy cập từ bên ngoài máy chủ hoặc mạng của bạn.

Trên một máy chủ thông thường, có thể có nhiều dịch vụ đang chạy mặc định. Các dịch vụ này có thể được phân loại thành các nhóm sau:

  • Dịch vụ công khai có thể được truy cập bởi bất kỳ ai trên Internet, thường là ẩn danh. Ví dụ điển hình là máy chủ web phục vụ trang web của bạn.
  • Dịch vụ riêng tư chỉ nên được truy cập bởi một nhóm tài khoản được ủy quyền hoặc từ các vị trí nhất định. Ví dụ, bảng điều khiển cơ sở dữ liệu như phpMyAdmin.
  • Dịch vụ nội bộ chỉ nên có thể truy cập từ chính máy chủ, không để lộ ra Internet. Ví dụ như cơ sở dữ liệu chỉ chấp nhận kết nối cục bộ.

Tường lửa có thể đảm bảo rằng quyền truy cập vào phần mềm của bạn bị giới hạn theo các nhóm trên với mức độ chi tiết khác nhau. Dịch vụ công khai có thể để mở cho Internet, dịch vụ riêng tư có thể được hạn chế theo các tiêu chí như loại kết nối, còn dịch vụ nội bộ có thể bị chặn hoàn toàn khỏi Internet. Với các cổng không sử dụng, quyền truy cập thường bị chặn hoàn toàn trong hầu hết các cấu hình.

Tường lửa tăng cường bảo mật như thế nào?

Ngay cả khi dịch vụ của bạn đã triển khai các tính năng bảo mật hoặc bị giới hạn trên các giao diện mong muốn, tường lửa vẫn đóng vai trò như một lớp bảo vệ cơ bản bằng cách giới hạn các kết nối đến và đi khỏi dịch vụ trước khi lưu lượng được xử lý bởi ứng dụng.

Một tường lửa được cấu hình đúng sẽ hạn chế quyền truy cập vào mọi thứ ngoại trừ các dịch vụ cụ thể mà bạn cần để mở, thường bằng cách chỉ mở các cổng tương ứng với các dịch vụ đó. Ví dụ, SSH thường sử dụng cổng 22, còn HTTP/HTTPS (truy cập trình duyệt) thường sử dụng cổng 80 và 443. Việc chỉ để lộ một vài phần mềm giúp giảm thiểu bề mặt tấn công trên máy chủ, giới hạn những thành phần có thể bị khai thác.

Cách triển khai tường lửa

Có nhiều loại tường lửa cho hệ thống Linux, và một số có mức độ phức tạp cao hơn những cái khác. Nói chung, bạn chỉ cần điều chỉnh cấu hình tường lửa khi có thay đổi trong dịch vụ chạy trên máy chủ. Dưới đây là một số lựa chọn để bắt đầu:

  • UFW (Uncomplicated Firewall) được cài sẵn trong một số bản phân phối như Ubuntu.
  • Nếu bạn dùng Red Hat, Rocky hoặc Fedora, bạn có thể tham khảo bài cách thiết lập tường lửa bằng firewalld để sử dụng công cụ mặc định của chúng
  • Nhiều phần mềm tường lửa như UFWfirewalld sẽ ghi các quy tắc vào tệp cấu hình có tên là iptables. Lưu ý rằng một số phần mềm khác như Docker cũng có thể tự ghi quy tắc vào iptables, có thể gây xung đột với UFW, vì vậy bạn nên biết cách đọc cấu hình iptables trong các trường hợp như vậy.

Lưu ý: Nhiều nhà cung cấp dịch vụ đám mây cho phép bạn cấu hình tường lửa như một dịch vụ chạy ở lớp ngoài của máy chủ, không cần cấu hình trực tiếp. Các cấu hình này được triển khai ở biên mạng bằng các công cụ quản lý. Chúng thường dễ sử dụng hơn nhưng khó tự động hóa (script) hoặc sao chép (replicate) hơn.

Hãy chắc chắn rằng cấu hình tường lửa của bạn có mặc định là chặn mọi lưu lượng không xác định. Như vậy, bất kỳ dịch vụ mới nào được triển khai sẽ không vô tình bị mở ra Internet. Thay vào đó, bạn phải cấp quyền truy cập một cách rõ ràng, buộc bạn phải đánh giá cách dịch vụ được vận hành, truy cập và ai được phép sử dụng.

3. Mạng VPC (Virtual Private Cloud)

Mạng VPC là mạng riêng dành cho tài nguyên trong hạ tầng của bạn. VPC cung cấp kết nối an toàn hơn giữa các tài nguyên vì các giao diện mạng trong VPC không thể truy cập từ Internet công cộng.

VPC cải thiện bảo mật như thế nào?

Một số nhà cung cấp dịch vụ đám mây sẽ mặc định gán cho máy chủ của bạn một giao diện mạng công cộng và một giao diện mạng riêng. Khi tắt giao diện mạng công cộng của một phần trong hạ tầng, chỉ có thể kết nối thông qua giao diện mạng nội bộ, nghĩa là lưu lượng giữa các hệ thống sẽ không đi qua Internet công cộng, giảm nguy cơ bị lộ hoặc đánh chặn.

Bằng cách chỉ cho phép một vài cổng Internet chuyên dụng (gọi là ingress gateways) hoạt động như điểm truy cập duy nhất giữa tài nguyên trong VPC và Internet công cộng, bạn có thể kiểm soát và theo dõi tốt hơn lưu lượng truy cập công cộng vào hệ thống. Các hệ thống điều phối container hiện đại như Kubernetes có khái niệm ingress gateway rất rõ ràng, vì chúng tạo nhiều giao diện mạng riêng mặc định, cần chọn lọc để mở ra ngoài.

Cách triển khai mạng VPC

Nhiều nhà cung cấp hạ tầng đám mây cho phép bạn tạo và thêm tài nguyên vào mạng VPC ngay trong trung tâm dữ liệu của họ.

Lưu ý: Nếu bạn dùng DigitalOcean và muốn thiết lập gateway VPC riêng.

Việc cấu hình mạng riêng thủ công có thể yêu cầu kiến thức nâng cao về cấu hình máy chủ và mạng. Một lựa chọn thay thế đơn giản hơn là sử dụng VPN để kết nối giữa các máy chủ.

4. VPN và mạng riêng (Private Networking)

VPN (Virtual Private Network) là cách để tạo kết nối an toàn giữa các máy tính từ xa, và biểu diễn kết nối đó như một mạng riêng nội bộ. Điều này cho phép bạn cấu hình dịch vụ như thể chúng đang chạy trong một mạng nội bộ và kết nối các máy chủ từ xa qua các liên kết bảo mật.

VPN tăng cường bảo mật như thế nào?

Sử dụng VPN là cách để tạo ra một mạng riêng mà chỉ các máy chủ của bạn có thể nhìn thấy. Mọi giao tiếp đều được bảo mật và riêng tư hoàn toàn. Các ứng dụng khác có thể được cấu hình để truyền dữ liệu thông qua giao diện ảo mà phần mềm VPN tạo ra. Bằng cách này, chỉ những dịch vụ cần thiết cho người dùng công khai mới cần được mở ra Internet, còn các dịch vụ nội bộ vẫn được bảo vệ qua mạng riêng.

Cách triển khai VPN

Việc sử dụng mạng riêng thường đòi hỏi bạn phải đưa ra quyết định về giao diện mạng ngay khi triển khai máy chủ, và cấu hình ứng dụng, tường lửa để ưu tiên sử dụng các giao diện mạng nội bộ đó. So với điều đó, triển khai VPN yêu cầu cài thêm công cụ và thiết lập các tuyến mạng bổ sung, nhưng thường có thể triển khai trực tiếp trên hạ tầng đang chạy, không cần thay đổi cấu trúc ban đầu.

Mỗi máy chủ trong mạng VPN cần có dữ liệu cấu hình và bảo mật chung để thiết lập kết nối VPN. Sau khi VPN được thiết lập, bạn cần cấu hình lại ứng dụng để sử dụng đường hầm VPN làm kênh truyền dữ liệu.

Wireguard cũng là một giải pháp VPN phổ biến khác. Nhìn chung, các VPN đều tuân theo nguyên tắc giới hạn điểm truy cập (ingress) vào máy chủ đám mây bằng cách tạo mạng riêng phía sau một số điểm truy cập công cộng. Tuy nhiên, nếu như cấu hình VPC thường là một phần của kiến trúc hạ tầng cốt lõi, thì VPN có thể được triển khai một cách linh hoạt và ít ràng buộc hơn .

5. Kiểm tra dịch vụ (Service Auditing)

Một hệ thống bảo mật tốt luôn bắt đầu bằng việc phân tích các hệ thống đang chạy, hiểu rõ bề mặt tấn công, và khóa chặt những thành phần có thể bị lợi dụng ở mức tối đa.

Kiểm tra dịch vụ là phương pháp giúp bạn biết được những dịch vụ nào đang chạy trên hệ thống, chúng đang sử dụng cổng nào để giao tiếp và sử dụng giao thức gì. Thông tin này rất hữu ích để bạn xác định những dịch vụ nào nên được công khai, từ đó cấu hình tường lửa, hệ thống giám sát và cảnh báo một cách hiệu quả.

Kiểm tra dịch vụ giúp tăng cường bảo mật như thế nào?

Mỗi dịch vụ đang chạy dù dùng cho nội bộ hay công khai đều mở rộng bề mặt tấn công cho các đối tượng xấu. Càng nhiều dịch vụ đang hoạt động, nguy cơ phần mềm của bạn có lỗ hổng bảo mật càng cao.

Sau khi bạn nắm rõ các dịch vụ mạng đang chạy trên máy chủ, bạn có thể bắt đầu phân tích từng dịch vụ. Khi kiểm tra, hãy tự hỏi những câu sau đối với mỗi dịch vụ đang hoạt động:

  • Dịch vụ này có thực sự cần thiết không?
  • Dịch vụ có đang chạy trên các giao diện mạng không phù hợp không?
  • Dịch vụ này nên gắn với giao diện mạng công khai hay nội bộ?
  • Các quy tắc tường lửa của tôi có cho phép đúng lưu lượng hợp lệ truy cập tới dịch vụ không?
  • Các quy tắc tường lửa có đang chặn lưu lượng không hợp lệ không?
  • Tôi có phương thức nào để nhận cảnh báo bảo mật liên quan đến lỗ hổng của dịch vụ này không?

Việc kiểm tra dịch vụ nên là quy trình tiêu chuẩn khi cấu hình bất kỳ máy chủ mới nào trong hệ thống của bạn. Thêm vào đó, nên thực hiện lại việc kiểm tra này mỗi vài tháng để phát hiện các dịch vụ có thể đã bị thay đổi cấu hình một cách vô tình hoặc ngoài ý muốn.

Cách triển khai kiểm tra dịch vụ

Để kiểm tra các dịch vụ mạng đang hoạt động trên hệ thống, bạn có thể sử dụng lệnh ss để liệt kê tất cả các cổng TCP và UDP đang được sử dụng.

Một ví dụ về lệnh hiển thị tên chương trình, PID, và địa chỉ đang lắng nghe lưu lượng TCP và UDP là:

sudo ss -plunt

Các tùy chọn p, l, u, n, và t trong lệnh ss hoạt động như sau:

  • p: hiển thị tiến trình cụ thể đang sử dụng socket (bao gồm tên chương trình và PID).
  • l: chỉ hiển thị các socket đang lắng nghe kết nối (listening).
  • u: bao gồm cả các socket sử dụng giao thức UDP (bên cạnh TCP).
  • n: hiển thị giá trị số cho địa chỉ IP và cổng, thay vì cố gắng dịch sang tên miền hoặc tên dịch vụ.
  • t: bao gồm các socket sử dụng giao thức TCP (bên cạnh UDP).

Khi chạy lệnh này, bạn sẽ nhận được đầu ra tương tự như sau:

Output
Netid       State        Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      Process
tcp         LISTEN       0            128                      0.0.0.0:22                    0.0.0.0:*         users:(("sshd",pid=812,fd=3))
tcp         LISTEN       0            511                      0.0.0.0:80                    0.0.0.0:*         users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6))
tcp         LISTEN       0            128                         [::]:22                       [::]:*         users:(("sshd",pid=812,fd=4))
tcp         LISTEN       0            511                         [::]:80           

Các cột chính bạn cần chú ý trong kết quả của lệnh ss là:

  • Netid: giao thức mạng được sử dụng (ví dụ: tcp, udp).
  • Local Address:Port: địa chỉ IP và cổng mà dịch vụ đang lắng nghe.
  • Process name: tên tiến trình đang sử dụng socket đó.

Nếu Local Address:Port hiển thị là 0.0.0.0, điều đó có nghĩa là dịch vụ đang chấp nhận kết nối trên tất cả các giao diện mạng IPv4. Nếu là [::], thì dịch vụ đang chấp nhận kết nối trên tất cả các giao diện mạng IPv6.

Trong ví dụ kết quả trước, SSHNginx đều đang lắng nghe trên tất cả các giao diện mạng công cộng cho cả giao thức IPv4 và IPv6.

Bạn cần quyết định xem có muốn cho phép SSH và Nginx lắng nghe trên cả hai giao diện hay chỉ một trong số đó. Thông thường, bạn nên tắt các dịch vụ đang chạy trên các giao diện không được sử dụng để thu hẹp bề mặt tấn công.

6. Cập nhật tự động (Unattended Updates)

Cập nhật bản vá thường xuyên cho máy chủ của bạn là điều cần thiết để duy trì mức độ bảo mật cơ bản tốt. Nhiều sự cố bảo mật xảy ra do phần mềm lỗi thời không được cập nhật. Cập nhật thường xuyên có thể giảm thiểu lỗ hổng và ngăn chặn kẻ tấn công khai thác máy chủ của bạn.

Cập nhật tự động giúp bảo mật như thế nào?

Việc triển khai cập nhật tự động sẽ giúp:

  • Giảm công sức thủ công cần thiết để duy trì bảo mật.
  • Rút ngắn thời gian tồn tại của lỗ hổng trên máy chủ.
  • Tự động cập nhật các gói phần mềm mỗi ngày, đảm bảo bạn không bỏ sót bất kỳ bản vá quan trọng nào.

Ví dụ: nếu có một lỗ hổng nghiêm trọng mới được phát hiện, các bản cập nhật tự động sẽ giúp bạn được vá ngay khi có bản sửa lỗi, thay vì phải chờ đến khi bạn chủ động kiểm tra và cập nhật.

7. Hạ tầng khóa công khai (PKI) và mã hóa SSL/TLS

PKI (Public Key Infrastructure) là một hệ thống dùng để:

  • Tạo, quản lý, và xác thực chứng chỉ số.
  • Xác định danh tính của các cá nhân, máy chủ, hoặc dịch vụ.
  • Thiết lập kênh truyền thông được mã hóa an toàn.

Các chứng chỉ SSL/TLS là một phần quan trọng trong hệ thống PKI. Chúng được sử dụng để:

  • Xác thực lẫn nhau giữa hai thực thể (ví dụ: trình duyệt và máy chủ).
  • Sau khi xác thực, thiết lập kênh giao tiếp được mã hóa, đảm bảo tính riêng tư và toàn vẹn của dữ liệu trao đổi.

Hạ tầng khóa công khai (PKI) giúp tăng cường bảo mật như thế nào?

Việc thiết lập một tổ chức chứng thực (CA) và quản lý các chứng chỉ cho máy chủ của bạn giúp cho từng thực thể trong hạ tầng có thể xác minh danh tính của nhau và mã hóa lưu lượng trao đổi. Điều này có thể ngăn chặn các cuộc tấn công “man-in-the-middle”, nơi kẻ tấn công giả mạo một máy chủ trong hệ thống để đánh cắp hoặc thay đổi dữ liệu truyền qua.

Mỗi máy chủ có thể được cấu hình để tin tưởng một CA trung tâm. Sau đó, bất kỳ chứng chỉ nào được ký bởi CA này đều được tin tưởng ngầm định, tạo nên một nền tảng bảo mật thống nhất trong nội bộ hệ thống.

Cách triển khai PKI

Việc cấu hình một CA và thiết lập hạ tầng khóa công khai (PKI) đi kèm có thể đòi hỏi khá nhiều công sức ban đầu. Ngoài ra, quá trình quản lý chứng chỉ cũng tạo thêm gánh nặng hành chính ví dụ như khi cần cấp mới, ký hoặc thu hồi chứng chỉ.

Với nhiều người dùng, việc triển khai đầy đủ PKI chỉ trở nên hợp lý khi hạ tầng hệ thống phát triển đến một quy mô nhất định. Trước đó, sử dụng VPN để mã hóa giao tiếp giữa các thành phần có thể là một giải pháp trung gian hợp lý và nhẹ nhàng hơn.

Kết luận

Các chiến lược được trình bày trong hướng dẫn này là tổng quan về những bước thực tế bạn có thể thực hiện để nâng cao bảo mật hệ thống. Một điểm quan trọng là: càng trì hoãn việc triển khai các biện pháp bảo mật, hiệu quả của chúng càng giảm.

Bảo mật không nên là một yếu tố được cân nhắc sau cùng, mà cần được tích hợp ngay từ lúc khởi tạo hạ tầng. Khi bạn đã có một nền tảng bảo mật vững chắc, bạn có thể triển khai dịch vụ và ứng dụng với niềm tin rằng chúng đang hoạt động trong một môi trường an toàn theo mặc định.

Tuy nhiên, bảo mật không phải là trạng thái tĩnh mà là một quá trình liên tục và lặp lại. Hãy luôn đặt câu hỏi: mỗi thay đổi có thể ảnh hưởng đến bảo mật như thế nào? Và bạn có thể làm gì để đảm bảo luôn xây dựng các cấu hình và môi trường an toàn ngay từ đầu cho phần mềm của mình?

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất