SSH (Secure Shell) là một giao thức bảo mật quan trọng và được sử dụng rộng rãi để quản trị máy chủ từ xa. Nhờ ứng dụng công nghệ mã hóa tiên tiến, SSH đảm bảo kết nối an toàn giữa client và server, cung cấp cơ chế xác thực mạnh mẽ và bảo vệ dữ liệu truyền tải khỏi các cuộc tấn công mạng.
Trong bài viết này, DataOnline cùng với các bạn sẽ khám phá các kỹ thuật mã hóa cốt lõi mà SSH áp dụng, cùng với các phương thức thiết lập kết nối an toàn. Việc hiểu rõ những cơ chế này sẽ giúp bạn nắm vững cách SSH bảo vệ dữ liệu và cách triển khai xác thực hai chiều một cách hiệu quả.
Hiểu về mã hoá đối xứng, mã hoá bất đối xứng và hàm băm
Để bảo mật quá trình truyền tải thông tin, SSH sử dụng nhiều kỹ thuật xử lý dữ liệu khác nhau ở các điểm khác nhau của giao dịch. Các kỹ thuật này bao gồm mã hoá đối xứng, mã hoá bất đối xứng và hàm băm.
Mã hoá đối xứng
Mối quan hệ giữa các thành phần dùng để mã hoá và giải mã dữ liệu quyết định liệu một hệ thống mã hoá có đối xứng hay bất đối xứng.
Mã hoá đối xứng là kiểu mã hoá trong đó một khóa được sử dụng để mã hoá tin nhắn gửi đến bên kia và cũng để giải mã các tin nhắn nhận được từ đối phương. Điều này có nghĩa là bất kỳ ai nắm giữ khóa đó đều có thể mã hoá và giải mã tin nhắn của nhau.
Kiểu mã hoá này thường được gọi là mã hoá “bí mật chung” hoặc “mã hoá khóa bí mật”. Thông thường chỉ có một khóa được sử dụng cho mọi thao tác, hoặc đôi khi là một cặp khóa mà mối quan hệ giữa chúng dễ dàng xác định và việc suy ra khóa đối ngược trở nên đơn giản.
SSH sử dụng khóa đối xứng để mã hoá toàn bộ phiên kết nối. Khác với suy đoán của một số người dùng, các cặp khóa bất đối xứng (Public Key và Private Key) chỉ được tạo ra để xác thực, không phải để mã hoá kết nối. Mã hoá đối xứng cho phép cả việc xác thực mật khẩu cũng được bảo vệ khỏi việc nghe lén.
Cả máy khách và máy chủ đều đóng góp vào quá trình thiết lập khóa này, và bí mật kết quả này không bao giờ được bên ngoài biết. Khóa bí mật được tạo ra thông qua một quy trình gọi là thuật toán trao đổi khóa. Quá trình này sẽ được giải thích chi tiết hơn ở phần sau.
Khóa mã hoá đối xứng tạo ra theo quy trình này là phiên (session-based) và chính là cơ sở mã hoá cho dữ liệu được truyền giữa máy chủ và máy khách. Sau khi khóa này được thiết lập, mọi dữ liệu sau đó sẽ được mã hoá bằng bí mật chung này, và điều đó được thực hiện trước khi xác thực người dùng.
SSH có thể được cấu hình để sử dụng nhiều hệ thống mã hoá đối xứng khác nhau, bao gồm Advanced Encryption Standard (AES), Blowfish, 3DES, CAST128 và Arcfour. Máy khách và máy chủ sẽ quyết định danh sách các cipher mà chúng hỗ trợ, được sắp xếp theo thứ tự ưu tiên. Tùy chọn đầu tiên trong danh sách của máy khách mà máy chủ cũng hỗ trợ sẽ được sử dụng làm thuật toán mã hoá cho cả hai chiều.
Trên Ubuntu 20.04, cả máy khách và máy chủ mặc định như sau:
-
aes128-ctr
-
aes192-ctr
-
aes256-ctr
Điều này có nghĩa là nếu hai máy Ubuntu 20.04 kết nối với nhau (không ghi đè các tùy chọn cấu hình), chúng sẽ luôn sử dụng cipher chacha20-poly1305@openssh.com
để mã hoá kết nối.
Mã hoá bất đối xứng
Mã hoá bất đối xứng khác với mã hoá đối xứng ở chỗ, để gửi dữ liệu theo một chiều, cần có hai khóa liên quan đến nhau. Một trong những khóa này được gọi là private key, trong khi khóa kia được gọi là public key.
Public key có thể được chia sẻ tự do với bất kỳ bên nào. Nó được liên kết với khóa ghép đôi của nó, nhưng private key thì không thể được suy ra từ public key. Mối quan hệ toán học giữa public key và private key cho phép public key được sử dụng để mã hoá tin nhắn mà chỉ có thể giải mã bởi private key. Đây là khả năng một chiều, có nghĩa là public key không thể giải mã những gì nó mã hoá, cũng như không thể giải mã bất kỳ dữ liệu nào mà private key gửi đi.
Private key phải được giữ bí mật hoàn toàn và không bao giờ được chia sẻ với bất kỳ bên nào khác. Đây là yêu cầu quan trọng để nguyên tắc public key hoạt động. Private key là thành phần duy nhất có khả năng giải mã các tin nhắn được mã hoá bằng public key liên kết. Nhờ đó, bất kỳ thực thể nào có khả năng giải mã các tin nhắn này đều chứng tỏ rằng họ đang nắm giữ private key.
SSH sử dụng mã hoá bất đối xứng ở một số nơi khác nhau. Trong quá trình trao đổi khóa ban đầu để thiết lập mã hoá đối xứng (dùng để mã hoá phiên), mã hoá bất đối xứng được sử dụng. Ở giai đoạn này, cả hai bên tạo ra cặp khóa tạm thời và trao đổi public key để tạo ra bí mật chung dùng cho mã hoá đối xứng.
Việc sử dụng mã hoá bất đối xứng với SSH được biết đến nhiều nhất khi nói đến xác thực bằng SSH key. Các cặp SSH key có thể được sử dụng để xác thực máy khách với máy chủ. Máy khách tạo ra cặp khóa, sau đó tải public key lên bất kỳ máy chủ từ xa nào mà họ muốn truy cập. Public key này được đặt trong file authorized_keys bên trong thư mục ~/.ssh của tài khoản người dùng trên máy chủ từ xa.
Sau khi mã hoá đối xứng được thiết lập để bảo vệ giao tiếp giữa máy chủ và máy khách, máy khách phải xác thực để được cấp quyền truy cập. Máy chủ có thể sử dụng public key trong file này để mã hoá một thông điệp thử thách gửi cho máy khách. Nếu máy khách chứng minh được rằng họ có thể giải mã thông điệp này, điều đó cho thấy họ nắm giữ private key tương ứng. Sau đó, máy chủ sẽ thiết lập môi trường làm việc cho máy khách.
Hàm băm
Một hình thức xử lý dữ liệu khác mà SSH sử dụng là hàm băm mật mã. Các hàm băm mật mã là phương pháp tạo ra một “chữ ký” hoặc tóm tắt ngắn gọn của một tập thông tin. Đặc điểm nổi bật của chúng là chúng không được thiết kế để đảo ngược, hầu như không thể bị thao túng một cách dự đoán được, và gần như là duy nhất.
Sử dụng cùng một hàm băm và thông điệp sẽ tạo ra cùng một giá trị băm; thay đổi bất kỳ phần nào của dữ liệu sẽ tạo ra một giá trị băm hoàn toàn khác. Người dùng không thể khôi phục lại thông điệp gốc từ một giá trị băm cho trước, nhưng họ có thể kiểm tra xem một thông điệp nhất định có tạo ra giá trị băm nào đó không.
Nhờ những thuộc tính này, hàm băm chủ yếu được sử dụng để kiểm tra tính toàn vẹn của dữ liệu và xác minh tính xác thực của giao tiếp. Trong SSH, hàm băm được sử dụng chủ yếu với HMAC, hay mã xác thực thông điệp dựa trên hàm băm. Điều này giúp đảm bảo rằng nội dung tin nhắn nhận được không bị thay đổi hay chỉnh sửa.
Trong quá trình thương lượng mã hoá đối xứng đã nêu ở trên, một thuật toán MAC (message authentication code) sẽ được chọn. Thuật toán này được chọn dựa trên danh sách các lựa chọn MAC mà máy khách chấp nhận. Lựa chọn đầu tiên trong danh sách mà máy chủ hỗ trợ sẽ được sử dụng.
Mỗi tin nhắn được gửi sau khi thương lượng mã hoá phải bao gồm một MAC để bên nhận có thể kiểm tra tính toàn vẹn của gói tin. MAC được tính dựa trên bí mật chung đối xứng, số thứ tự của gói tin và nội dung tin nhắn thực tế. MAC được gửi bên ngoài vùng đã được mã hoá đối xứng như phần cuối cùng của gói tin. Các nhà nghiên cứu thường khuyến nghị phương pháp mã hoá dữ liệu trước, sau đó mới tính MAC.
Hiểu cách SSH hoạt động
Có thể bạn đã có một hiểu biết cơ bản về cách SSH hoạt động. Giao thức SSH sử dụng mô hình máy khách-máy chủ để xác thực hai bên và mã hoá dữ liệu giữa chúng.
Thành phần máy chủ lắng nghe trên một cổng được chỉ định để nhận kết nối. Nó có trách nhiệm thương lượng kết nối an toàn, xác thực bên kết nối và khởi tạo môi trường làm việc nếu thông tin xác thực được chấp nhận.
Máy khách chịu trách nhiệm bắt đầu quá trình bắt tay giao thức truyền tải (TCP) với máy chủ, thương lượng kết nối an toàn, kiểm tra xem danh tính của máy chủ có khớp với thông tin đã được ghi nhận trước đó hay không, và cung cấp thông tin xác thực.
Một phiên SSH được thiết lập qua hai giai đoạn riêng biệt. Giai đoạn đầu tiên là thống nhất và thiết lập mã hoá để bảo vệ các giao tiếp sau này. Giai đoạn thứ hai là xác thực người dùng và quyết định xem có nên cấp quyền truy cập vào máy chủ hay không.
Thương lượng mã hoá cho phiên kết nối
Khi một kết nối TCP được thiết lập bởi máy khách, máy chủ phản hồi với các phiên bản giao thức mà nó hỗ trợ. Nếu máy khách có thể khớp với một trong những phiên bản chấp nhận được, kết nối sẽ được tiếp tục. Máy chủ cũng cung cấp public host key của nó, mà máy khách có thể sử dụng để kiểm tra xem đây có phải là máy chủ mà họ dự định kết nối hay không.
Tại thời điểm này, cả hai bên sẽ thương lượng một khóa phiên sử dụng phiên bản của thuật toán Diffie-Hellman. Thuật toán này (và các biến thể của nó) cho phép mỗi bên kết hợp dữ liệu riêng của mình với dữ liệu công khai từ hệ thống bên kia để tạo ra cùng một khóa phiên bí mật.
Khóa phiên này sẽ được sử dụng để mã hoá toàn bộ phiên làm việc. Các cặp public/private key sử dụng cho phần này hoàn toàn tách biệt với các SSH keys dùng để xác thực máy khách với máy chủ.
Cơ sở của quy trình Diffie-Hellman cổ điển là:
-
Cả hai bên cùng đồng ý về một số nguyên tố lớn, được sử dụng làm giá trị hạt giống.
-
Cả hai bên cùng đồng ý về một bộ tạo mã hoá (thông thường là AES) được sử dụng để xử lý các giá trị theo một cách định sẵn.
-
Mỗi bên độc lập tạo ra một số nguyên tố riêng được giữ bí mật, được sử dụng làm private key cho giao dịch này (không phải là private SSH key dùng cho xác thực).
-
Private key vừa tạo, bộ tạo mã và số nguyên tố chung được sử dụng để tạo ra một public key được suy ra từ private key, và public key này có thể được chia sẻ với bên kia.
-
Cả hai bên sau đó trao đổi public key vừa tạo.
-
Bên nhận sử dụng private key của chính nó, public key của bên kia, và số nguyên tố chung ban đầu để tính toán ra một khóa bí mật chung. Dù được tính toán độc lập bởi mỗi bên với các khóa đối ngược nhau, nhưng kết quả sẽ là cùng một khóa bí mật.
-
Khóa bí mật chung sau đó được sử dụng để mã hoá toàn bộ giao tiếp tiếp theo.
Quá trình này cho phép cả hai bên tham gia bình đẳng trong việc tạo ra khóa chung, không để bên nào kiểm soát toàn bộ bí mật đó. Nó cũng đạt được mục tiêu tạo ra một khóa chung giống nhau mà không bao giờ phải gửi thông tin đó qua các kênh không an toàn.
Khóa bí mật được tạo ra là khóa đối xứng, có nghĩa là cùng một khóa được sử dụng để mã hoá và giải mã tin nhắn. Mục đích của việc này là để bao gói toàn bộ giao tiếp sau đó trong một “hầm” mã hoá mà không ai ngoài được giải mã.
Sau khi mã hoá phiên làm việc được thiết lập, bước tiếp theo là giai đoạn xác thực người dùng.
Xác thực quyền truy cập của người dùng vào máy chủ
Bước tiếp theo liên quan đến việc xác thực người dùng và quyết định cấp quyền truy cập. Có một số phương pháp xác thực dựa trên những gì máy chủ chấp nhận.
Phương pháp chung là xác thực bằng mật khẩu, khi máy chủ yêu cầu máy khách nhập mật khẩu của tài khoản mà họ đang cố gắng đăng nhập. Mật khẩu được truyền qua kênh đã được mã hoá nên nó được bảo vệ khỏi bên ngoài.
Mặc dù mật khẩu được mã hoá, phương pháp này thường không được khuyến nghị do giới hạn về độ phức tạp của mật khẩu. Các script tự động có thể dễ dàng bẻ khóa mật khẩu thông thường so với các phương pháp xác thực khác.
Phương án thay thế phổ biến và được khuyến nghị là sử dụng cặp SSH key. Các cặp SSH key là các khóa bất đối xứng, nghĩa là hai khóa liên quan có chức năng khác nhau.
Public key được dùng để mã hoá dữ liệu mà chỉ có thể giải mã bằng private key. Public key có thể được chia sẻ tự do, vì dù nó có thể mã hoá dữ liệu cho private key, nhưng không có cách nào suy ra private key từ public key.
Quá trình xác thực sử dụng SSH key bắt đầu sau khi mã hoá đối xứng đã được thiết lập như đã mô tả ở phần trước. Quy trình diễn ra như sau:
-
Máy khách bắt đầu bằng cách gửi một ID cho cặp khóa mà nó muốn dùng để xác thực đến máy chủ.
-
Máy chủ kiểm tra file authorized_keys của tài khoản mà máy khách đang cố đăng nhập để tìm ID của khóa.
-
Nếu tìm thấy public key có ID khớp, máy chủ sẽ tạo ra một số ngẫu nhiên và dùng public key đó để mã hoá số đó.
-
Máy chủ gửi thông điệp được mã hoá này cho máy khách.
-
Nếu máy khách thực sự có private key liên kết, nó sẽ giải mã thông điệp và khôi phục số ban đầu.
-
Máy khách sau đó kết hợp số đã giải mã với khóa phiên chung (được dùng để mã hoá giao tiếp) và tính toán giá trị MD5 của kết quả. MD5 là thuật toán tạo giá trị băm 128-bit.
-
Máy khách gửi giá trị MD5 này trở lại máy chủ như là đáp án cho thông điệp mã hoá.
-
Máy chủ sử dụng khóa phiên chung và số ban đầu để tự tính toán giá trị MD5, sau đó so sánh với giá trị nhận được từ máy khách. Nếu hai giá trị trùng khớp, điều đó chứng tỏ máy khách đang nắm giữ private key tương ứng và được xác thực.
Tóm lại, tính bất đối xứng của các khóa cho phép máy chủ mã hoá thông điệp gửi tới máy khách bằng public key, trong khi máy khách chứng minh rằng họ nắm giữ private key bằng cách giải mã thông điệp đó. Hai loại mã hoá được sử dụng (bí mật chung đối xứng và cặp public/private key bất đối xứng) đều phát huy những ưu điểm riêng của chúng trong mô hình này.
Kết luận
Việc tìm hiểu quy trình thương lượng kết nối và các lớp mã hoá trong SSH sẽ giúp bạn nắm bắt rõ ràng hơn quá trình đăng nhập vào máy chủ từ xa. Nhờ đó, bạn có thể dễ dàng nhận diện mối liên hệ giữa các thành phần và thuật toán bảo mật, cũng như hiểu được cách chúng phối hợp để đảm bảo an toàn cho kết nối.