SSH (Secure Socket Shell)

Mar 12, 2022

I: SSH là gì?

SSH, hoặc được gọi là Secure Shell, là một giao thức điều khiển từ xa cho phép người dùng kiểm soát và chỉnh sửa server từ xa qua Internet. Dịch vụ được tạo ra nhằm thay thế cho trình Telnet vốn không có mã hóa và sử dụng kỹ thuật cryptographic để đảm bảo tất cả giao tiếp gửi tới và gửi từ server từ xa diễn ra trong tình trạng mã hóa. Nó cung cấp thuật toán để chứng thực người dùng từ xa, chuyển input từ client tới host, và relay kết quả trả về tới khách hàng.

  • Là một giao thức mạng(network protocol): tập hợp các quy tắc chuẩn cho phép hai hoặc nhiều thực thể trong một hệ thống trao đổi thông tin, dữ liệu. Một số giao thức mạng có kể đến như: FTP(truyền file), HTTP/HTTPS(duyệt web), SMTP(gửi thư), …
  • Thuộc tầng 4 - tầng ứng dụng của mô hình TCP/IP

II: SSH được dùng để làm gì?

Ssh cho phép người dùng kiểm soát và chỉnh sửa server từ xa qua Internet

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

Hoạt động của giao thức ssh có thể được chia làm 3 giai đoạn:

1: Bước đầu tiên là khởi tạo 1 kết nối SSH, chính là tạo ra 1 kênh giao tiếp bảo mật giữa server và client.

Khi khởi tạo 1 TCP connection tới 1 port ở server, Client sẽ nhận được một số thông tin:

  • Server cho Client biết định danh của mình bằng RSA Public Key trên Server. Mọi Client kết nối tới Server đều nhận được RSA Public Key giống nhau.
  • Server Key. Server Key này được tái tạo theo mỗi khoảng thời gian nhất định.
  • 1 chuỗi 8 bytes ngẫu nhiên được gọi là checkbytes. Sau này Client sẽ sử dụng chuỗi này để hồi đáp lại cho Server.
  • Cuối cùng, Server cấp cho Client biết toàn bộ các phương thức xác thực, mã hóa mà Server hỗ trợ.

Nếu phiên bản Protocol của Server phù hợp với Client thì kết nối được tiếp tục. Ngay sau khi Client tiếp tục kết nối, Server - Client sẽ chuyển đổi sang "Binary Packet Protocol". Bộ giao thức này có thể chứa package độ dài 32bits. Từ giờ Client và Server sẽ giao tiếp bằng bộ giao thức này.

2: Bởi chủ thể khởi tạo kết nối là Client nên ở bước đầu này Client sẽ phải xác thực Server. Sau khi Client xác định được định danh của Server 1 kết nối bảo mật đối xứng được hình thành giữa 2 bên.

Sau khi hoàn tất việc thiết lập phiên làm việc bảo mật. (trao đổi  khoá, định danh), quá trình trao đổi dữ liệu diễn ra thông qua một bước trung gian đó là mã hoả/giải mã. Điều đó có nghĩa là dữ liệu gửi/nhận trên đường truyền đến được mã hoá và giải mã theo cơ chế đã thoả thuận trước giữa máy chủ và máy khách.

Server cho Client biết định danh của mình bằng rsa public key trên server. Key này được tạo ra sử dụng openssh. Nếu đây là lần đầu tiên Client kết nối tới Server thì Client sẽ nhận được 1 cảnh báo, nếu chấp nhận thì rsa public key của server sẽ được lưu vào known_hosts file. Kể từ nay về sau Client xác nhận server này là 1 server đã biết và không còn cảnh báo nữa. Mọi Client connect tới Server đều nhận được rsa public key này giống nhau.

Cuối cùng, Server cấp cho Client biết toàn bộ các phương thức bảo mật, mã hóa mà Server hỗ trợ

Dựa vào danh sách các phương thức mã hóa mà Server hỗ trợ, Client tạo ra 1 symmetric key ngẫu nhiên và gửi cho server. Key này sẽ được sử dụng để mã hóa và giải mã hóa trong toàn bộ quá trình giao tiếp giữa 2 bên, đây còn được gọi là session key, session key sẽ được mã hóa dựa vào rsa public key của server cũng như Server key (được thay đổi theo thời gian). Sau khi gửi session key nếu nhận được hồi âm từ phía Server thì client đã xác thực được Server

3: Server xác thực Client ( ở bước trước mới chỉ có Client định danh được Server - hay nói cách khác mới chỉ có Server đảm bảo tin tưởng khi đứng từ phía Client )

Để Server có thể chứng thực được Client có nhiều phương pháp, trong đó có 2 phương án sau là phổ biến nhất:

  • Password Authentication: Đây là phương pháp phổ biến và đơn giản nhất. Remote server yêu cầu Client cung cấp định danh cũng như mật khẩu.
  • Public Key Authentication: Authenticate bằng Public key.

Đối với Public Key Authentication: Client sẽ gửi cho Server 1 request public rsa key của mình cũng như chi tiết về thuật toán mã hóa nó sử dụng, Server lấy public key bên trong file authorized_keys ứng với Client đang kết nối và mã hóa 1 chuỗi 256 bits sử dụng key này gửi tới cho Client, chuỗi này nhằm mục đích thử thách xem Client có khả năng giải mã hóa hay không. Client nhận chuỗi này, sử dụng rsa private key của mình để giải mã hóa, sau đó gửi kết quả trả lại cho Server. Tất nhiên trước đó chuỗi được kết hợp với session key và hash để đảm bảo gói tin chuyển đi được an toàn. Sau khi Server nhận được chuỗi hash, nó sẽ hash chuỗi ban đầu nó sinh ra và so sánh, Nếu Match , tất nhiên Client đã được xác định. Server và client đã có 1 kết nối an toàn và có thể trao đổi thông tin

Trên đây là cách bước thiết lập được kết nối ssh. Sau đó là quá trình trao đổi dữ liệu. Dữ liệu được mã hóa bằng thuật toán đã định trước, gọi chung là Ciphers. Các ciphers này có thể thấy trong file config ssh: cat /etc/ssh/ssh_config

IV: Một số các thuật toán mã hóa mà SSH sử dụng

1: Symmetrical encryption (Thuật toán khóa đối xứng)

Là dạng mã hóa sử dụng secret(khóa bí mật) key ở cả hai chiều mã hóa và giải mã tin nhắn bởi cả host và client. Bất kỳ ai nắm được khóa này đều có thể giải mã được tin nhắn giữa quá trình trao đổi.

2: Asymmetrical encryption (Thuật toán khóa bất đối xứng)

Không giống với symmetrical encryption, asymmetrical encryption sử dụng 2 khóa khác nhau để mã hóa và giải mã. 2 khóa này được gọi là public key và private key. Mỗi key chỉ làm một chức năng là encrypt(mã hóa) hoặc decrypt (giải mã). Thuật toán này được ứng dụng rất rộng rãi điển hình là việc Bitcoin, 1 loại tiền kỹ thuật số dựa trên công nghệ Blockchain. Khi bạn có public key của người khác, có thể chuyển tiền cho người đó và cách duy nhất xác định chủ của một tài khoản chính là dựa trên private key.

3: Hashing

  • Thuật toán băm chắc hẳn không xa lạ gì. Bản chất hashing tạo ra 1 giá trị duy nhất từ giá trị ban đầu. Tuy không có cách nào truy ngược lại giá trị ban đầu đó, nhưng ngược lại rất dễ dàng để có thể so khớp giá trị ban đầu với giá trị được tạo ra.
  • SSH sử dụng hashing để xác định tính toàn vẹn dữ liệu của gói tin.
  • Ứng dụng điển hình là việc sử dụng hash để băm mật khẩu. Ngoài ra hiện đang được sử dụng bởi Blockchain để định danh các khối khi mà khối sau chứa giá trị băm của khối trước

V: Các lệnh cơ bản của ssh

Sử dụng SSH để login với password

Đối với trường hợp login thông thường ta có thể sử dụng lệnh:

miichi:~$ ssh username@host_ip

hoặc

miichi:~$ ssh username@domain

Sử dụng cặp khóa

Bước đầu tiên là tạo ra cặp khóa (generate key), sử dụng lệnh

miichi:~$ ssh-keygen

Thêm public-key vào server: quá trình này là việc đưa public của máy khách vào trong  known_hosts của server

miichi:~$ ssh-copy-id -i ~/.ssh/your-key.pub username@host
miichi:~$ ssh your-username@host

Sau khi thêm khóa xong ta có thể ssh đến server mà không cần dùng mật khẩu.

Các mẹo khi sử dụng SSH

Config SSH

Ta có thể ssh nhanh tới server thông qua câu lệnh ngắn hơn

Sửa file cấu hình:

miichi:~$ nano ~/.ssh/config

Nội dung:

Host host_shortcut

Hostname 192.168.1.100

User root

Port 4444

Sử dụng:

miichi:~$ ssh host_shortcut

Chạy lệnh trên máy Remote

miichi:~$ ssh user@myserver "lệnh-cần-chạy ... "

có thể thêm cờ “-f” để điền mật khẩu nếu cần

xem thêm về các cờ trong ssh https://linuxcommand.org/lc3_man_pages/ssh1.html

một người a dạy cho mình rằng ta có thể viết 1 file script các câu lệnh, sau đó ssh chạy file này để deploy nhanh code lên server.

Mount (gắn) thư mục máy Remote vào Local với SSHFS

Cài đặt SSHFS trên Ubuntu

miichi:~$ apt install sshfs

Gắn thư mục /home/data/ trên server vào /mydata/ trên local

miichi:~$ sshfs user@remoteserver:/home/data/ /mydata/

Remote Port Forwarding

Là một loại ssh tunnel, cho phép chuyển lưu lượng truy cập từ cổng được chỉ định trên remote server tới cổng được chỉ định trên máy đích. Ví dụ như bạn muốn truy cập host:8000 của server thông qua localhost:8080 trên máy của bạn

Truy cập vào remote server. Chạy lệnh :

miichi:~$ sudo vi /etc/ssh/sshd_config

Giải thích thêm: file sshd_config config các cấu hình cách mà máy khách khác kết nối với máy hiện tại, còn ssh_config config các cấu hình khi kết nối đến server khách

Tìm đến config GatewayPorts đổi giá trị của nó thành yes

GatewayPorts yes

Tiếp theo. Ở máy local bạn thực hiện lệnh:

miichi:~$ ssh -N -R remote_port:local_address:local_port username@remote_host


Thanks for reading!!!

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.