Vận hành Thực tiễn
Mã hóa ổ đĩa trên máy chủ không do bạn sở hữu
Mã hóa toàn bộ ổ đĩa bảo vệ một ổ đĩa rời khỏi tòa nhà. Nó không bảo vệ một máy đang chạy, vì khóa lúc đó nằm trong bộ nhớ mà hypervisor có thể truy cập — và hai kiểu mã hóa được bán dưới cùng một cụm từ chỉ khác nhau ở việc ai đang giữ khóa đó.
15 phút đọc Đã công bố 28 tháng 8, 2026 Đã kiểm tra hôm nay
Mọi nhà cung cấp bán sự riêng tư đều nói rằng ổ đĩa được mã hóa. Điều đó thường đúng, và thường trả lời một câu hỏi không ai đặt ra. Mã hóa có ba trạng thái cần quan tâm, và một máy chủ dành trọn vòng đời hoạt động của nó trong đúng trạng thái mà mã hóa toàn bộ ổ đĩa không bao phủ. Đây là nơi ranh giới đó thực sự nằm, những gì thuộc về mỗi phía của nó, và trong hai cách sắp xếp được bán dưới cùng một cụm từ, đâu mới là cách khiến chính bạn giữ khóa.
Ba trạng thái, và trạng thái không ai mã hóa
Dữ liệu được mô tả là đang ở một trong ba trạng thái, và ngành này đã giải quyết thuyết phục hai trong số đó. Khi lưu trữ (at rest) là dữ liệu nằm trên ổ đĩa mà không có gì đang đọc: được giải quyết bằng mã hóa toàn bộ ổ đĩa, cùng với mã hóa ở tầng cơ sở dữ liệu hoặc object-store phía trên nó. Khi truyền (in transit) là dữ liệu đang đi qua mạng: được giải quyết bằng TLS, triệt để đến mức một chứng chỉ cấp sai giờ đây trở thành tin tức. Khi sử dụng (in use) là dữ liệu được nạp vào bộ nhớ của một tiến trình đang chạy — nơi mọi byte mà máy chủ của bạn phục vụ đều phải đi qua, dù chỉ trong khoảnh khắc, để có thể được phục vụ.
Cụm từ mã hóa khi lưu trữ (encryption at rest) rất chính xác, và chính xác theo kiểu dễ bị đọc lướt qua. Nó mô tả trạng thái dữ liệu của bạn khi máy đang tắt. Một máy chủ là một cỗ máy mà toàn bộ công việc của nó là không được tắt. Trong suốt những tháng nó vận hành, các ổ đĩa của nó đang mở, các tệp cơ sở dữ liệu của nó có thể đọc được bởi bất kỳ tiến trình nào chạy dưới đúng người dùng, và việc mã hóa chẳng làm gì cả ngoài việc chờ một lần mất điện.
Điều thứ hai mà bốn từ đó che giấu là ai đang giữ khóa. Hai cách sắp xếp hoàn toàn khác nhau được bán dưới cùng cách gọi đó. Một nhà cung cấp có thể mã hóa tầng lưu trữ bằng khóa do chính họ quản lý: điều đó bảo vệ quy trình thanh lý phần cứng của nhà cung cấp và thu hẹp mức độ rủi ro vi phạm dữ liệu của chính họ, và nó thực sự bảo vệ bạn trước việc một ổ đĩa rời khỏi tòa nhà — nhưng bên giữ khóa chính là bên mà bạn đang muốn hỏi về. Hoặc ổ đĩa có thể được mã hóa bên trong chính máy của bạn, với một khóa không tồn tại ở đâu khác ngoài trong đầu bạn và trong bộ nhớ của một kernel đang chạy. Chỉ cách sắp xếp thứ hai mới thay đổi được những gì một bên thứ ba có thể lấy được, và chỉ cách thứ hai mới là điều mà phần còn lại của hướng dẫn này nói đến.
Tất cả những điều này không phải là lập luận chống lại việc mã hóa ổ đĩa. Đó là lập luận cho việc biết rõ bạn đã bao phủ được kịch bản nào trong tám kịch bản dưới đây, và chưa bao phủ được kịch bản nào. Mã hóa chặn được một điều có thật thì đáng để có; mã hóa mà bạn tin là chặn được cả tám thì còn tệ hơn không có gì, vì niềm tin đó khiến cuộc trò chuyện dừng lại ở đó.
Khóa nằm ở đâu khi máy đang chạy
Khi bạn mở khóa một volume LUKS, cụm mật khẩu bạn gõ vào không phải là khóa. Nó chỉ giải mã một khóa chủ được lưu trong phần header của volume, và khóa chủ đó sau đó được giữ trong bộ nhớ của kernel cho đến khi volume được đóng lại hoặc máy mất điện. Mọi thao tác đọc và mọi thao tác ghi đều đi qua nó. Không có cấu hình nào của một ổ đĩa mã hóa đang hoạt động mà trong đó khóa nằm ở một nơi khác trong khi ổ đĩa đang được sử dụng — đó không phải là một chi tiết triển khai mà ai đó có thể sửa được, đó chính là ý nghĩa của việc dùng một ổ đĩa mã hóa.
Trên phần cứng do chính bạn sở hữu, bộ nhớ đó nằm trong một thùng máy, trong một căn phòng do bạn kiểm soát, và cách tấn công nó rất hiếm gặp: cần có mặt vật lý, và tận dụng vài giây dữ liệu còn sót lại mà các chip nhớ giữ lại sau khi mất điện. Trên một máy chủ ảo, tình huống khác biệt về bản chất chứ không chỉ về mức độ. Bộ nhớ của kernel trên máy bạn là một vùng thuộc bộ nhớ của máy chủ vật lý. Hypervisor có thể truy cập vào đó theo đúng định nghĩa, vì chính việc truy cập được vào đó là cách hypervisor đã cấp phát nó cho bạn ngay từ đầu. Ba thao tác hoàn toàn bình thường có thể đọc được nó:
- Di chuyển trực tiếp (live migration). Việc chuyển một máy ảo đang chạy giữa các máy chủ vật lý sẽ sao chép bộ nhớ của nó trong khi nó vẫn đang hoạt động. Đây là một tính năng — đó là cách một máy chủ vật lý được bảo trì mà không cần khởi động lại máy của bạn — và khóa chủ của bạn nằm trong những trang bộ nhớ đang được sao chép đó.
- Bản chụp có bao gồm cả bộ nhớ. Một bản chụp chỉ-ổ-đĩa của một volume mà bạn tự mã hóa chỉ chứa dữ liệu đã mã hóa và không gì khác. Một bản chụp cho phép máy tiếp tục chạy đúng y hệt nơi nó đã dừng lại thì có chứa cả khóa, vì khóa chính là một phần của cái gọi là “đúng y hệt nơi nó đã dừng lại”.
- Trích xuất bộ nhớ (memory dump). Bộ nhớ của máy khách bạn nằm bên trong không gian địa chỉ của một tiến trình trên máy chủ vật lý. Đọc bộ nhớ của tiến trình đó là một thao tác gỡ lỗi thông thường, và công cụ để làm việc đó đã có sẵn trong bộ công cụ ảo hóa chứ không cần phải lén đưa vào.
Không điều nào trong số đó khẳng định rằng nhà cung cấp của bạn thực sự làm vậy. Nó chỉ khẳng định rằng các hành động này không cần bất kỳ sự hợp tác nào từ phía bạn, không để lại dấu vết nào mà bạn có thể nhìn thấy, và không thể phân biệt được với việc bảo trì nền tảng thông thường. Đó là thuộc tính duy nhất đáng được đưa vào một mô hình mối đe dọa: không phải ai đó đang làm gì, mà là họ có khả năng làm gì mà bạn không hề hay biết. Cùng một lập luận đó, ở một tầng xa hơn, là lý do vì sao registry và proxy đứng trước bạn cũng phải nằm trong cùng danh sách với máy chủ vật lý.
Ranh giới cần nhớ: mã hóa ổ đĩa bảo vệ bạn trước mọi thứ nằm dưới thời điểm volume được mở khóa — một ổ đĩa rời khỏi tòa nhà trong khi dữ liệu vẫn còn trên đó — và không bảo vệ trước bất cứ điều gì nằm trên thời điểm đó.
Nằm trên ranh giới đó: hypervisor và bất kỳ ai đang giữ thông tin xác thực của nó, bất kỳ ai có được shell trên máy đang chạy của bạn, và mọi bản sao lưu rời đi mà không được mã hóa. Đây là ba trong bốn cách nhiều khả năng nhất khiến dữ liệu của bạn thực sự lọt ra ngoài.
Vấn đề khởi động lại, và lối tắt triệt tiêu chính nó
Một ổ đĩa gốc được mã hóa phải được mở khóa trước khi hệ thống khởi động đủ xa để chấp nhận một kết nối SSH. Trên một laptop, bạn gõ cụm mật khẩu ngay tại bàn phím. Trên một máy cách xa hai nghìn ki-lô-mét, trong một tòa nhà bạn chưa từng bước chân vào, không có bàn phím nào bạn có thể chạm tới vào đúng lúc cần. Mọi câu trả lời khả thi cho điều đó đều là một sự đánh đổi — và một trong bốn cách dưới đây hoàn toàn không phải là một sự đánh đổi, mà chỉ là cách tạo cảm giác đã đánh đổi.
| Phương pháp | Khởi động lại không cần người can thiệp | Chặn được ổ đĩa bị đánh cắp | Cái giá phải trả |
|---|---|---|---|
| SSH vào ảnh khởi động | Không | Có | Một máy chủ SSH tối giản bên trong initramfs cho phép bạn kết nối và gõ cụm mật khẩu. Máy vẫn ở trạng thái ngừng hoạt động cho đến khi có người thức và có thể liên lạc được. Đây là lựa chọn trung thực, và cái giá phải trả là có thật: một lần khởi động lại vào bốn giờ sáng là một lần gián đoạn dịch vụ cho đến khi có ai đó nhận ra. |
| Khóa gắn với mạng | Có | Một phần | Máy lấy khóa mở của nó khi khởi động từ một máy chủ bạn vận hành ở nơi khác, và bạn có thể từ chối cấp khóa cho một máy đã bị di chuyển hoặc mà bạn không phải là người khởi động lại. Máy chủ khóa đó phải luôn hoạt động, và phải đặt ở nơi mà cùng một lệnh không thể vươn tới — nếu không, bạn chỉ đang chia khóa ra hai cánh cửa nhưng dùng chung một ổ khóa. |
| Tệp khóa trong ảnh khởi động | Có | Không | Khóa nằm trong initramfs, initramfs nằm trên một phân vùng khởi động chưa mã hóa, và phân vùng khởi động đó nằm trên chính ổ đĩa bạn đang muốn bảo vệ. Ai lấy được ổ đĩa cũng lấy luôn khóa theo nó. Cấu hình này rất phổ biến, khởi động rất suôn sẻ, và không bảo vệ được trước bất cứ điều gì. |
| Niêm phong vào TPM | Có | Một phần | Trên phần cứng do bạn sở hữu, một chip bảo mật thật chỉ nhả khóa ra cho một chuỗi khởi động chưa bị thay đổi. Trên một máy chủ ảo, chip đó được giả lập bởi chính máy chủ vật lý, nên việc niêm phong khóa vào đó lại trao khóa cho chính bên mà bạn đang cố giấu nó. |
Hàng thứ ba đáng để nhìn kỹ hơn. Đó là nơi bạn kết thúc khi yêu cầu được viết ra chỉ đơn giản là ổ đĩa phải được mã hóa mà không ai hỏi để làm gì. Cuộc kiểm toán vẫn đạt. Thiết bị khối thực sự được mã hóa. Nhưng khóa lại đi cùng trên cùng một miếng kim loại, nằm trong một tệp mà một recovery shell sẽ đọc được chỉ trong khoảng bốn giây.
Đây cũng là khác biệt thực tế rõ ràng nhất giữa một máy ảo đi thuê và một máy chủ do chính bạn sở hữu. Trên phần cứng riêng, giao diện quản lý ngoài băng thông cho bạn một console sống sót qua cả một lần khởi động lại, nên hàng đầu tiên không còn là một lần gián đoạn dịch vụ nữa mà chỉ còn là một lần gián đoạn hai phút — và vấn đề chip giả lập ở hàng thứ tư cũng biến mất, vì chip lúc này được hàn thẳng vào bo mạch chứ không phải được viết bằng phần mềm bởi chính bên mà bạn đang phòng vệ.
Mã hóa toàn bộ ổ đĩa thực sự mang lại điều gì
Cùng một câu hỏi, được đặt ra theo tám cách khác nhau. Cột quan trọng nhất là cột cuối cùng, vì ở mọi hàng mà mã hóa không giúp được gì, luôn có một thứ khác giúp được — và gọi tên được thứ đó chính là toàn bộ giá trị của bài tập này.
| Kịch bản | Mã hóa có giúp ích | Điều gì thực sự quyết định |
|---|---|---|
| Một ổ đĩa ngừng sử dụng, được bán lại hoặc trả về theo bảo hành | Có | Không có gì khác bao phủ được trường hợp này. Ổ đĩa rời khỏi trung tâm dữ liệu liên tục, việc xóa sạch dữ liệu là cả một quy trình, và quy trình thì thất bại trong âm thầm. Đây chính là kịch bản mà mã hóa toàn bộ ổ đĩa được phát minh ra để đối phó, và trước kịch bản này nó hoạt động đúng như quảng cáo. |
| Máy bị tắt nguồn và ổ đĩa bị tháo ra | Có | Cùng một sự bảo vệ với cùng một ranh giới, và ranh giới đó chính là từ tắt. Một máy bị lấy đi trong khi vẫn đang chạy là một máy bị lấy đi trong trạng thái đã mở khóa, với các ổ đĩa đang mở và khóa vẫn còn hiện diện. |
| Một bản sao lưu nằm ở một nơi khác | Một phần | Mã hóa trên volume gốc không giúp được gì cho một bản sao của dữ liệu. Điều quyết định là liệu bản sao lưu đó có được mã hóa trước khi nó rời đi hay không, với một khóa không được lưu trên chính máy đang được sao lưu. |
| Nền tảng tạo một bản chụp | Một phần | Một bản chụp chỉ-ổ-đĩa của một volume mà bạn tự mã hóa là dữ liệu đã mã hóa, vô dụng với bất kỳ ai không có cụm mật khẩu của bạn. Một bản chụp ghi lại cả trạng thái bộ nhớ thì cũng ghi lại luôn cả khóa. Cả hai đều được gọi chung là bản chụp. |
| Ai đó có được shell trên máy đang chạy | Không | Volume lúc này đã mở sẵn, và kẻ xâm nhập đọc tệp chứ không đọc khối dữ liệu thô. Việc vá lỗi, nguyên tắc đặc quyền tối thiểu, và thông tin đăng nhập không bị dùng lại giữa các dịch vụ mới là thứ quyết định hàng này, còn mã hóa không đóng góp gì cho nó cả. |
| Bên vận hành máy chủ vật lý, hoặc bất kỳ ai đang nắm quyền truy cập của bên đó | Không | Chỉ loại mã hóa mà khóa của nó hoàn toàn không bao giờ đi vào máy mới chặn được điều này. Mã hóa bộ nhớ ở tầng phần cứng là ngoại lệ duy nhất, và nó bị tắt theo mặc định ở khắp mọi nơi, điều này sẽ được nói tới ở phần tiếp theo. |
| Một lệnh được tống đạt đến nhà cung cấp | Một phần | Thẩm quyền tài phán quyết định ai được phép yêu cầu và với căn cứ nào; mã hóa quyết định câu trả lời đó có thể chứa những gì. Lập trường đã công bố của chính chúng tôi gồm hai câu tách biệt, và cả hai đều quan trọng: chúng tôi không giữ khóa của khách hàng và không thể cung cấp chúng, và một volume chưa mã hóa trên một máy chủ ảo vẫn đòi hỏi một lệnh nêu đích danh dịch vụ đó. |
| Bạn phải công bố một vi phạm dữ liệu | Một phần | Nếu người dùng của bạn ở EU, Điều 32 của GDPR nêu đích danh mã hóa trong số các biện pháp được kỳ vọng ở bạn, và Điều 34 miễn nghĩa vụ thông báo cho các cá nhân liên quan — không bao giờ miễn cho cơ quan giám sát — khi dữ liệu đã bị làm cho không thể đọc được. Việc điều đó có áp dụng hay không phụ thuộc hoàn toàn vào việc khóa nằm ở đâu vào thời điểm dữ liệu rời đi. |
Trên ổ đĩa: điều gì sống sót trước một máy chủ vật lý thù địch
Mọi điều nói đến từ đầu đến giờ chỉ liên quan đến một tầng dừng lại ở thiết bị khối. Có ba thứ nằm trên tầng đó, và cùng với nhau, chúng là câu trả lời duy nhất cho hàng thứ năm, thứ sáu và thứ bảy của bảng trên.
Mã hóa ở phía trên ứng dụng, không phải ở bên dưới nó
Mã hóa ở cấp trường dữ liệu nghĩa là ứng dụng mã hóa một giá trị trước khi nó đến cơ sở dữ liệu, và giải mã lại sau khi đọc nó về. Một bản trích xuất cơ sở dữ liệu chỉ cho ra dữ liệu đã mã hóa, bất kể ai lấy được bản trích xuất đó và bằng con đường nào. Cái giá phải trả là khả năng tìm kiếm hoặc lập chỉ mục trên các cột đã mã hóa, đó là lý do vì sao nó chỉ nên áp dụng cho một số ít trường xứng đáng — nội dung tin nhắn, tài liệu tải lên, token của bên thứ ba — chứ không phải cho mọi thứ. Đích đến cuối cùng của con đường đó là mã hóa đầu cuối: khóa thuộc về người dùng, máy chủ không bao giờ giữ dữ liệu ở dạng chưa mã hóa, và một máy chủ vật lý thù địch không lấy được gì vì ở đó không có gì để lấy. Đây là kiến trúc duy nhất trên trang này thực sự không quan tâm ai đang vận hành phần cứng, và đó là một quyết định về sản phẩm từ rất lâu trước khi nó trở thành một quyết định về hạ tầng.
Sao lưu là một quyết định riêng, không phải một hệ quả
Cách phổ biến nhất khiến dữ liệu rời khỏi một máy đã mã hóa là qua một bản sao lưu. Một bản chụp được đẩy lên object storage, một bản trích xuất cơ sở dữ liệu đồng bộ sang một nhà cung cấp thứ hai, một bản lưu trữ được tải xuống một máy trạm — không cái nào trong số đó thừa hưởng bất cứ điều gì từ volume mà chúng xuất phát. Hãy mã hóa ngay tại thời điểm dữ liệu được ghi vào bản sao lưu, với một khóa được giữ ở một nơi mà chính máy đó không thể chạm tới, để một máy chủ đã bị xâm phạm không thể giải mã lại lịch sử của chính nó. Sau đó hãy khôi phục thử một bản, trên một máy khác, trước khi bạn thực sự cần đến nó: một bản sao lưu đã mã hóa mà bạn không thể mở ra là một cách gọn gàng bất thường để mất tất cả cùng một lúc. Một bản sao ở một quốc gia khác cũng là một bản sao chịu một bộ quy tắc khác, tức là một thẩm quyền tài phán thứ hai mà bạn đã chọn mà không hề nhận ra.
Mã hóa bộ nhớ, và vì sao bạn nhiều khả năng chưa có nó
Trạng thái mà không ai mã hóa vẫn có một lời giải ở tầng phần cứng. Các phần mở rộng điện toán bảo mật (confidential computing) — SEV-SNP của AMD, TDX của Intel — mã hóa bộ nhớ và trạng thái thanh ghi của máy khách bằng một khóa do một bộ xử lý bảo mật riêng biệt nắm giữ, chứ không phải hypervisor, nên một máy chủ vật lý có trích xuất bộ nhớ cũng chỉ nhận lại được dữ liệu đã mã hóa. Đây là công nghệ có thật và đang được triển khai. Nhưng phạm vi của nó cũng hẹp: SEV-SNP đòi hỏi chip EPYC thế hệ thứ ba trở lên, máy chủ vật lý phải được cấu hình riêng cho việc đó một cách có chủ đích, và máy khách phải chứng thực rằng mình đã có được nó. Gần như không có máy chủ ảo phổ thông nào cung cấp tính năng này, và không có nhà cung cấp nào cung cấp nó một cách âm thầm. Hãy mặc định là bạn không có nó, trừ khi một nhà cung cấp xác nhận bằng văn bản rằng bạn có, và có thể cho bạn biết cách tự kiểm chứng việc chứng thực đó.
Một cấu hình trung thực về giới hạn của chính nó
Tất cả những điều này không kết thúc ở thôi khỏi cần làm. Nó kết thúc ở một cấu hình mà bạn có thể nói to giới hạn của nó ra mà không phải chùn tay.
- Viết ra đúng một kịch bản mà bạn đang phòng vệ (5 phút). Một ổ đĩa ngừng sử dụng, một máy bị thu giữ trong khi đang chạy, một máy chủ vật lý thù địch, một lệnh của tòa án, một vi phạm dữ liệu bạn buộc phải công bố. Chúng có những câu trả lời khác nhau, và một cấu hình nhắm đến cả năm kịch bản cùng lúc chắc chắn sẽ không đạt được kịch bản nào trong số đó.
- Đặt việc mã hóa ở nơi khóa của bạn thực sự nằm (quyết định). Nếu nhà cung cấp giữ khóa, bạn chỉ mua được sự bảo vệ trước việc một ổ đĩa rời khỏi tòa nhà, và không gì hơn thế. Nếu bạn muốn nhiều hơn thế, volume phải được mở khóa từ bên trong máy khách, do chính bạn thực hiện, bằng một thứ mà nền tảng đó không bao giờ nhìn thấy.
- Mã hóa volume dữ liệu thay vì volume gốc (thiết lập). Một volume gốc được mã hóa nghĩa là mọi lần khởi động lại đều phải chờ bạn. Một volume mã hóa riêng chứa thư mục cơ sở dữ liệu, các tệp tải lên và các thông tin bí mật cho phép máy tự khởi động lại một mình, trong khi phần nhạy cảm vẫn đóng cho đến khi bạn mở nó ra. Đây là sự thỏa hiệp mà phần lớn các nền tảng nhỏ nên thực hiện, và gần như không ai viết nó ra thành văn bản.
- Không bao giờ để tệp khóa trên phân vùng khởi động chưa mã hóa (nguyên tắc). Nếu máy khởi động không cần người can thiệp mà không có máy chủ khóa và không có console, thì khóa chắc chắn nằm trên ổ đĩa; không có khả năng thứ ba nào khác. Đó là một sự đánh đổi ổn thỏa khi một ổ đĩa bị đánh cắp thực sự là toàn bộ mô hình mối đe dọa của bạn, và là sự tự lừa dối bản thân trong mọi trường hợp còn lại.
- Mã hóa các bản sao lưu ngay tại thời điểm ghi, với một khóa được giữ ở nơi khác (thiết lập). Sau đó hãy khôi phục thử một bản lên một máy khác, vào một ngày khi không có gì đang gấp gáp.
- Nói ra bằng một câu duy nhất những gì bạn đã bao phủ được (5 phút). Đại loại như: một kẻ tấn công rút ổ đĩa này ra khỏi rack sẽ không lấy được gì, còn bất kỳ ai có quyền root trên máy đang chạy hoặc trên máy chủ vật lý của nó sẽ lấy được tất cả. Nếu câu đó khiến bạn khó chịu khi viết ra, đó là vì nó đúng.
Hai trong sáu điều đó là quyết định, còn bốn điều là cấu hình kỹ thuật. Các quyết định tốn một buổi chiều, cấu hình kỹ thuật tốn một giờ, và một giờ đó chẳng có giá trị gì nếu thiếu buổi chiều kia. Làm chúng theo thứ tự ngược lại chính là cách người ta rơi vào hàng thứ ba của bảng đầu tiên, với một cỗ máy vượt qua được kiểm toán nhưng chẳng bảo vệ được ai cả.
Bạn đang phòng vệ trước kịch bản nào là một câu hỏi về mô hình hóa mối đe dọa trước khi nó là một câu hỏi về mã hóa, và phiên bản một giờ của bài tập đó gần như tự sinh ra câu trả lời ở bước sáu như một sản phẩm phụ. Nếu câu trả lời hóa ra là một lệnh của tòa án chứ không phải một ổ đĩa, thì tầng quyết định kết quả hoàn toàn không nằm trên ổ đĩa của bạn — mà là luật của ai vươn tới được nhà cung cấp của bạn, và cách kiểm tra điều đó trước khi bạn tin vào nó.
Được viết bởi các kỹ sư vận hành nền tảng, và được xem lại hôm nay. Nếu có điều gì ở đây sai hoặc đã lỗi thời, có thể phản ánh từ bảng điều khiển — đó cũng là nơi khoảng một nửa những điều này đến từ.