Thứ tư, 22/10/2014 | 00:00 GMT+7

Hiểu quá trình mã hóa và kết nối SSH

SSH, hoặc shell an toàn, là một giao thức an toàn và là cách phổ biến nhất để quản trị các server từ xa một cách an toàn. Sử dụng một số công nghệ mã hóa, SSH cung cấp một cơ chế để cài đặt một kết nối được bảo mật bằng mật mã giữa hai bên, xác thực từng bên với bên kia, đồng thời chuyển các lệnh và xuất qua lại.

Trong các hướng dẫn khác, ta đã thảo luận về cách cấu hình quyền truy cập dựa trên SSH key , cách kết nối bằng SSHmột số mẹo và thủ thuật SSH .

Trong hướng dẫn này, ta sẽ xem xét các kỹ thuật mã hóa cơ bản mà SSH sử dụng và các phương pháp nó sử dụng để cài đặt các kết nối an toàn. Thông tin này có thể hữu ích để hiểu các lớp mã hóa khác nhau và các bước khác nhau cần thiết để tạo kết nối và xác thực cả hai bên.

Mã hóa đối xứng, Mã hóa không đối xứng và băm

Để đảm bảo việc truyền tải thông tin, SSH sử dụng một số loại kỹ thuật thao tác dữ liệu khác nhau tại các điểm khác nhau trong giao dịch. Chúng bao gồm các dạng mã hóa đối xứng, mã hóa không đối xứng và băm.

Mã hóa đối xứng

Mối quan hệ của các thành phần mã hóa và giải mã dữ liệu xác định xem một schemas mã hóa là đối xứng hay không đối xứng.

Mã hóa đối xứng là một loại mã hóa trong đó một khóa được dùng để mã hóa các tin nhắn cho bên đối diện và cũng để giải mã các tin nhắn nhận được từ người tham gia khác. Điều này nghĩa là bất kỳ ai nắm giữ key đều có thể mã hóa và giải mã tin nhắn cho bất kỳ ai khác đang giữ key .

Loại schemas mã hóa này thường được gọi là mã hóa “bí mật chia sẻ” hoặc mã hóa “khóa bí mật”. Thường chỉ có một khóa duy nhất được sử dụng cho tất cả các hoạt động hoặc một cặp khóa mà ở đó mối quan hệ dễ dàng phát hiện và việc lấy ra khóa đối diện là điều không cần thiết.

Các khóa đối xứng được SSH sử dụng để mã hóa toàn bộ kết nối. Trái ngược với những gì một số user giả định, các cặp khóa bất đối xứng công khai / riêng tư có thể được tạo chỉ được sử dụng để xác thực, không phải để mã hóa kết nối. Mã hóa đối xứng cho phép xác thực password thậm chí được bảo vệ chống lại sự theo dõi.

Máy khách và server đều đóng góp vào việc cài đặt khóa này và kết quả là bí mật không bao giờ được các bên ngoài biết. Khóa bí mật được tạo thông qua một quy trình được gọi là thuật toán trao đổi khóa. Việc trao đổi này dẫn đến việc cả server và client đều đến cùng một khóa một cách độc lập bằng cách chia sẻ một số phần dữ liệu công khai nhất định và thao tác chúng với một số dữ liệu bí mật nhất định. Quá trình này được giải thích chi tiết hơn ở phần sau.

Khóa mã hóa đối xứng được tạo bởi quy trình này dựa trên phiên và tạo thành mã hóa thực tế cho dữ liệu được gửi giữa server và client . Khi điều này được cài đặt , phần còn lại của dữ liệu phải được mã hóa bằng bí mật được chia sẻ này. Điều này được thực hiện trước khi xác thực khách hàng.

SSH có thể được cấu hình để sử dụng nhiều hệ thống mật mã đối xứng khác nhau, bao gồm AES, Blowfish, 3DES, CAST128 và Arcfour. Server và client đều có thể quyết định danh sách các mật mã được hỗ trợ của họ, được sắp xếp theo sở thích.Tùy chọn đầu tiên từ danh sách của khách hàng có sẵn trên server được sử dụng làm thuật toán mật mã theo cả hai hướng.

Trên Ubuntu 14.04, cả client và server đều được mặc định như sau: aes128-ctr , aes192-ctr , aes256-ctr , arcfour256 , arcfour128 , aes128-gcm@openssh.com , aes256-gcm@openssh.com , chacha20-poly1305@openssh.com , chacha20-poly1305@openssh.com aes128-cbc , blowfish-cbc , cast128-cbc , aes192-cbc , aes256-cbc , arcfour .

Điều này nghĩa là nếu hai máy Ubuntu 14.04 đang kết nối với nhau (không overrides mật mã mặc định thông qua các tùy chọn cấu hình), chúng sẽ luôn sử dụng mật mã aes128-ctr để mã hóa kết nối của bạn .

Mã hóa không đối xứng

Mã hóa không đối xứng khác với mã hóa đối xứng ở chỗ để gửi dữ liệu theo một hướng, cần có hai khóa liên kết. Một trong những khóa này được gọi là khóa cá nhân , trong khi khóa còn lại được gọi là khóa công khai .

Khóa công khai có thể được chia sẻ miễn phí với bất kỳ bên nào. Nó được liên kết với khóa được ghép nối của nó, nhưng private key không thể bắt nguồn từ public key . Mối quan hệ toán học giữa public key và private key cho phép public key mã hóa các thông điệp mà chỉ có thể được giải mã bằng private key . Đây là khả năng một chiều, nghĩa là public key không có khả năng giải mã các thông điệp mà nó viết, cũng như không thể giải mã bất cứ thứ gì mà private key có thể gửi cho nó.

Khóa riêng tư phải được giữ bí mật hoàn toàn và không bao giờ được chia sẻ với bên khác. Đây là yêu cầu quan trọng để mô hình public key hoạt động. Khóa riêng tư là thành phần duy nhất có khả năng giải mã các tin nhắn đã được mã hóa bằng public key được liên kết. Nhờ thực tế này, bất kỳ thực thể nào có khả năng giải mã các thông báo này đều chứng tỏ rằng họ đang kiểm soát private key .

SSH sử dụng mã hóa không đối xứng ở một số nơi khác nhau. Trong quá trình trao đổi khóa ban đầu được sử dụng để cài đặt mã hóa đối xứng (được sử dụng để mã hóa phiên), mã hóa không đối xứng được sử dụng. Trong giai đoạn này, cả hai bên tạo ra các cặp khóa tạm thời và trao đổi public key để tạo ra bí mật được chia sẻ sẽ được sử dụng cho mã hóa đối xứng.

Việc sử dụng mã hóa không đối xứng với SSH được thảo luận nhiều hơn đến từ xác thực dựa trên SSH key . Các cặp SSH key được dùng để xác thực client với server . Máy khách tạo một cặp khóa và sau đó tải public key lên bất kỳ server từ xa nào mà nó muốn truy cập. Điều này được đặt trong một file được gọi là authorized_keys ~/.ssh trong thư ~/.ssh trong thư ~/.ssh chính của account user trên server từ xa.

Sau khi mã hóa đối xứng được cài đặt để bảo mật thông tin liên lạc giữa server và client , client phải xác thực để được phép truy cập. Server có thể sử dụng public key trong file này để mã hóa thông báo thách thức tới client . Nếu khách hàng có thể chứng minh rằng nó có thể giải mã thông báo này, nó đã chứng minh rằng nó sở hữu private key liên quan. Sau đó server có thể cài đặt môi trường cho client .

Băm

Một hình thức thao tác dữ liệu khác mà SSH tận dụng là băm mật mã.Hàm băm mật mã là các phương pháp tạo “chữ ký” hoặc bản tóm tắt ngắn gọn của một tập hợp thông tin. Các thuộc tính phân biệt chính của chúng là chúng không bao giờ có ý nghĩa bị đảo ngược, chúng hầu như không thể gây ảnh hưởng có thể đoán trước được và chúng thực tế là duy nhất.

Sử dụng cùng một hàm băm và thông báo sẽ tạo ra cùng một hàm băm; sửa đổi bất kỳ phần nào của dữ liệu sẽ tạo ra một hàm băm hoàn toàn khác. User sẽ không thể tạo ra thông báo root từ một hàm băm nhất định, nhưng họ sẽ có thể biết liệu một thông báo nhất định có tạo ra một hàm băm nhất định hay không.

Với những đặc tính này, hàm băm chủ yếu được sử dụng cho mục đích toàn vẹn dữ liệu và để xác minh tính xác thực của giao tiếp. Việc sử dụng chính trong SSH là với HMAC hoặc mã xác thực tin nhắn dựa trên băm. Chúng được sử dụng đảm bảo rằng văn bản tin nhắn nhận được là nguyên vẹn và không bị sửa đổi.

Là một phần của thỏa thuận mã hóa đối xứng được nêu ở trên, một thuật toán mã xác thực tin nhắn (MAC) được chọn. Thuật toán được chọn bằng cách làm việc thông qua danh sách các lựa chọn MAC được chấp nhận của khách hàng. Cái đầu tiên trong danh sách này mà server hỗ trợ sẽ được sử dụng.

Mỗi tin nhắn được gửi đi sau khi thương lượng mã hóa phải chứa MAC để bên kia có thể xác minh tính toàn vẹn của gói tin. MAC được tính toán từ bí mật được chia sẻ đối xứng, số thứ tự gói của tin nhắn và nội dung tin nhắn thực tế.

Bản thân MAC được gửi ra ngoài vùng được mã hóa đối xứng như là 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ã hóa dữ liệu này trước tiên, sau đó tính MAC.

SSH hoạt động như thế nào?

Bạn có thể đã hiểu cơ bản về cách hoạt động của SSH. Giao thức SSH sử dụng mô hình client - server để xác thực hai bên và mã hóa dữ liệu giữa chúng.

Thành phần server lắng nghe trên một cổng được chỉ định cho các kết nối. Nó chịu trách nhiệm đàm phán kết nối an toàn, xác thực bên kết nối và tạo ra môi trường chính xác nếu thông tin đăng nhập được chấp nhận.

Máy khách chịu trách nhiệm bắt đầu bắt tay TCP ban đầu với server , thương lượng kết nối an toàn, xác minh danh tính của server trùng với thông tin đã ghi trước đó và cung cấp thông tin đăng nhập để xác thực.

Một phiên SSH được cài đặt trong hai giai đoạn riêng biệt. Đầu tiên là đồng ý và cài đặt mã hóa để bảo vệ thông tin liên lạc trong tương lai. Giai đoạn thứ hai là xác thực user và khám phá xem có nên cấp quyền truy cập vào server hay không.

Thương lượng mã hóa cho phiên

Khi kết nối TCP được thực hiện bởi một client , server sẽ phản hồi với các version giao thức mà nó hỗ trợ. Nếu client có thể trùng với một trong các version giao thức được chấp nhận, kết nối sẽ tiếp tục. Server cũng cung cấp khóa server công cộng của nó, client có thể sử dụng để kiểm tra xem đây có phải là server dự kiến hay không.

Đến đây, cả hai bên thương lượng khóa phiên bằng cách sử dụng version của một thứ gọi là thuật toán Diffie-Hellman. Thuật toán này (và các biến thể của nó) giúp mỗi bên có thể kết hợp dữ liệu riêng tư của họ với dữ liệu công khai từ hệ thống khác để tạo ra một khóa phiên bí mật giống hệt nhau.

Khóa phiên sẽ được sử dụng để mã hóa toàn bộ phiên. Các cặp khóa public key và private key được sử dụng cho phần này của quy trình hoàn toàn tách biệt với các SSH key được sử dụng để xác thực client với server .

Cơ sở của quy trình này cho Diffie-Hellman cổ điển là:

  1. Cả hai bên đồng ý về một số nguyên tố lớn, sẽ đóng role là giá trị hạt giống.
  2. Cả hai bên đồng ý về một trình tạo mã hóa (thường là AES), sẽ được sử dụng để thao tác các giá trị theo cách được định nghĩa .
  3. Một cách độc lập, mỗi bên đưa ra một số nguyên tố khác được giữ bí mật với bên kia. Số này được sử dụng làm private key cho tương tác này (khác với SSH key riêng được sử dụng để xác thực).
  4. Khóa riêng tư được tạo, trình tạo mã hóa và số nguyên tố dùng chung được sử dụng để tạo public key có nguồn root từ private key nhưng có thể được chia sẻ với bên kia.
  5. Sau đó, cả hai người tham gia trao đổi public key đã tạo của họ.
  6. Thực thể nhận sử dụng private key của họ, public key của bên kia và số nguyên tố dùng chung ban đầu để tính khóa bí mật được chia sẻ. Mặc dù điều này được tính toán một cách độc lập bởi mỗi bên, sử dụng các private key và public key khác nhau, nó sẽ dẫn đến cùng một khóa bí mật được chia sẻ.
  7. Sau đó, bí mật được chia sẻ được sử dụng để mã hóa tất cả các thông tin liên lạc sau đó.

Mã hóa bí mật được chia sẻ được sử dụng cho phần còn lại của kết nối được gọi là giao thức gói binary . Quá trình trên cho phép mỗi bên tham gia bình đẳng vào việc tạo ra bí mật được chia sẻ, không cho phép một đầu kiểm soát bí mật. Nó cũng hoàn thành nhiệm vụ tạo ra một bí mật được chia sẻ giống hệt nhau mà không cần phải gửi thông tin đó qua các kênh không an toàn.

Bí mật được tạo ra là một khóa đối xứng, nghĩa là cùng một khóa được sử dụng để mã hóa một thông điệp được dùng để giải mã nó ở phía bên kia. Mục đích của việc này là gói tất cả các liên lạc tiếp theo trong một tunnel được mã hóa mà người ngoài không thể giải mã được.

Sau khi mã hóa phiên được cài đặt , giai đoạn xác thực user bắt đầu.

Xác thực Quyền truy cập của User vào Server

Giai đoạn tiếp theo liên quan đến việc xác thực user và quyết định quyền truy cập. Có một số phương pháp khác nhau được dùng để xác thực, dựa trên những gì server chấp nhận.

Đơn giản nhất có lẽ là xác thực bằng password , trong đó server chỉ cần nhắc khách hàng nhập password của account mà họ đang cố gắng đăng nhập. Mật khẩu được gửi thông qua mã hóa thương lượng, vì vậy nó được bảo mật khỏi các bên bên ngoài.

Mặc dù password sẽ được mã hóa, nhưng phương pháp này thường không được khuyến khích do những hạn chế về độ phức tạp của password . Tập lệnh tự động có thể phá password có độ dài bình thường rất dễ dàng so với các phương pháp xác thực khác.

Giải pháp thay thế phổ biến nhất và được đề xuất là sử dụng cặp SSH key . Các cặp SSH key là khóa không đối xứng, nghĩa là hai khóa liên kết phục vụ các chức năng khác nhau.

Khóa công khai được sử dụng để mã hóa dữ liệu chỉ có thể được giải mã bằng private key .Khóa công khai có thể được chia sẻ tự do, bởi vì, mặc dù nó có thể mã hóa cho private key , nhưng không có phương pháp nào lấy được private key từ public key .

Việc xác thực bằng cặp SSH key bắt đầu sau khi mã hóa đối xứng đã được cài đặt như được mô tả trong phần trước. Quy trình xảy ra như thế này:

  1. 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 xác thực tới server .
  2. Server kiểm tra file authorized_keys của account mà client đang cố gắng đăng nhập để lấy ID khóa.
  3. Nếu tìm thấy public key có ID phù hợp trong file , server sẽ tạo một số ngẫu nhiên và sử dụng public key để mã hóa số đó.
  4. Server sẽ gửi cho client thông điệp được mã hóa này.
  5. Nếu khách hàng thực sự có private key được liên kết, nó sẽ có thể giải mã tin nhắn bằng khóa đó, tiết lộ số ban đầu.
  6. Máy khách kết hợp số được giải mã với khóa phiên chia sẻ đang được sử dụng để mã hóa giao tiếp và tính toán băm MD5 của giá trị này.
  7. Sau đó client sẽ gửi lại mã băm MD5 này cho server như một câu trả lời cho thông điệp số được mã hóa.
  8. Server sử dụng cùng một khóa phiên được chia sẻ và số ban đầu mà nó đã gửi cho client để tự tính giá trị MD5. Nó so sánh phép tính của chính nó với phép tính mà khách hàng đã gửi lại. Nếu hai giá trị này khớp nhau, điều đó chứng tỏ rằng client đang sở hữu private key và client đã được xác thực.

Như bạn thấy , sự bất đối xứng của các khóa cho phép server mã hóa các thông báo tới client bằng public key . Sau đó, khách hàng có thể chứng minh rằng nó giữ private key bằng cách giải mã thông điệp một cách chính xác. Hai loại mã hóa được sử dụng (bí mật được chia sẻ đối xứng và public key không đối xứng) đều có thể tận dụng các điểm mạnh cụ thể của chúng trong mô hình này.

Kết luận

Tìm hiểu về các bước thương lượng kết nối và các lớp mã hóa đang hoạt động trong SSH có thể giúp bạn hiểu rõ hơn điều gì đang xảy ra khi bạn đăng nhập vào một server từ xa. Hy vọng rằng bây giờ bạn đã có ý tưởng tốt hơn về mối quan hệ giữa các thành phần và thuật toán khác nhau, đồng thời hiểu cách tất cả các phần này trùng với nhau.


Tags:

Các tin liên quan