Server

Giao thức Secure Shell (SSH)

SSH là một giao thức mạng được mã hóa bảo mật, nó tạo ra kết nối bảo mật (tạo ra một đường hầm tách biệt với với cách dịch vụ khác để duy trì kết nối riêng tư giữa máy trạm và máy chủ) trên một mạng lưới không bảo mật. SSH cũng được hiểu như ứng dụng dùng để kết nối đăng nhập vào một hệ thống máy tinh bởi người dùng.

ssh

Giao thức SSH được dùng ở rất nhiều nền tảng từ Linux, macOs, Windows với các mục đích như:

  • Đăng nhập vào shell của máy tính từ xa (máy chủ)
  • Thi hành lệnh trên máy kết nối
  • Thiết lập tự động đăng nhập vào server
  • Truyền tải file an toàn
  • Gắn một thư mục ở máy từ xa (máy chủ) vào máy client

Cách tạo ra một dịch vụ SSH và sử dụng kết nối SSH như thế nào?

Cần thực hiện hai việc:

  • Ở máy chủ cần chạy một dịch vụ SSH Server (sẽ dùng OpenSSH) : OpenSSH là phần mềm nguồn mở có sẵn (hoặc dễ dàng cài đặt) trên Linux, macOS. Đối với Windows cũng đã hỗ trợ, như thông tin của Microsoft nó tích hợp sẵn trong Windows (từ năm 2018 - hoặc có thể cài thêm)
  • Một trình Client kết nối đến SSH Server: bản thân OpenSSH cũng là Client để kết nối, hoặc cài thêm rất nhiều công cụ hỗ trợ giao thức này (putty chẳng hạn). Khi kết nối có thể tùy cấu hình từ OpenSSH Server có thể xác thực bằng cách nhập username/password hoặc bằng cặp file public/private key.

Cài đặt SSH Server / SSH Client

Cài OpenSSH Server, SSH Client trong Linux

Một máy Server muốn máy khác kết nối đến nó qua giao thức SSH thì nó phải có dịch vụ SSH (SSH Server) chạy trên hệ thống đó. Đối với các Server Linux như CentOs ... thì SSH Server, SSH Client thường cài đặt sẵn. Nếu chưa cài thì có thể thực hiện như sau:

Với CentOS

yum -y install openssh-server openssh-clients

Với Ubuntu

sudo apt install openssh-client
sudo apt install openssh-server

Cấu hình OpenSSH Server trong Linux

Khi OpenSSH Server cài đặt xong, có thể chỉnh sửa cấu hình của nó trong file: /etc/ssh/sshd_config, ví dụ dùng Vim, nano để chỉnh sửa:

vi /etc/ssh/sshd_config

Một số tham số bạn có thể quan tâm như:

  • Đổi cổng SSH server mặc định là cổng 22, nếu muốn đổi sang cổng khác ví dụ 2222 thì chỉnh tham số
    Port 1235
  • Cho phép user kết nối qua SSH để thiết lập một user có tên ví dụ xtlab và abcuser của hệ thống được phép kết nối qua SSH thì thêm thiết lập
    AllowUsers abcuser xtlab
    Ngược lại là cấm một User nào đó đăng nhập SSH thì dùng:
    DenyUsers abcuser xtlab

Cổng của OpenSSH Server (mặc định là 22) cần đảm bảo đã được mỏ, có thể gõ netstat -lntu xem các cổng đang mở. Nếu chưa mở thì có thể dùng iptables mở cổng, ví dụ cổng xxx cần mở:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport ***** -j ACCEPT
service iptables restart

Sau khi thay đổi thiết lập cho OpenSSH Server khởi động lại OpenSSH bằng lệnh:

sudo service sshd restart

Cài đặt OpenSSH Server (Client) trong Windows (Server hoặc Destop)

Muốn máy chủ Windows Server hỗ trợ kết nối đến nó bằng SSH thì cũng cần cài đặt OpenSSH Server.

1 Tải về OpenSSH Đầu tiên tải OpenSSH Server bản thích hợp với máy chủ về, như file OpenSSH-Win64.zip, giải nén nội dung file đó chứa vào thư mục ví dụ C:/OpenSSH. Nếu là máy Destop thì thư mục này đã có lệnh ssh để bạn kết nối đến SSH Server (có thế cấu hình thêm biến môi trường PATH đến thư mục này). Nếu trên máy Server bạn thực hiện thêm các bước sau để chạy dịch vụ SSH trên Server

2 Cài đặt dịch vụ SSHD và ssh-agent: chạy cmd với quyền Administrator, rồi chuyển vào thư mục chứa SSH bằng lệnh:

cd c:\OpenSSH

Gõ lệnh cài như sau

powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

3 Chạy Dịch vụ SSH, truy cập vào Control Panel > System and Security > Administrative Tools > Services, tìm đến dịch vụ có tên sshd, ssh-agent đặt cho nó sang chế độ khởi động Automatic, rồi chạy nó (Start)

Như vậy là Server Windows đã cài đặt dịch vụ cho phép truy cập đến nó qua SSH với cổng 22, bạn cũng cần dùng FireWall của Windows để mở cổng 22

Cấu hình OpenSSH Server trên Windows giống như trên Linux nhưng file cấu hình là tại C:\OpenSSH\sshd_config_default, mở file này cầu hình sau để có hiệu lực bạn cần Restart lại Service shhd

Thực hiện kết nối tới SSH Server

Giả sử máy Server có cho phép kết nối SSH (đang chạy dịch vụ SSH Server), có địa chỉ IP hoặc tên miền là IP với user là user thì sẽ thực hiện kết nối bằng cách gõ lệnh vào terminal (giao diện dòng lệnh trên Linux, macOS, Windows[cmd, PowerShell ...])

ssh user@IP

Khi yêu cầu nhập password của user thì nhập vào, và kết nối SSH sẽ được thiết lập. Từ đây cho phép nhập cách lệnh mà nó sẽ thi hành trên máy được kết nối đến.

Kết nối từ máy trạm Windows bằng Putty

Trên máy Windows, sau khi cài OpenSSH thì kết nối đến SSH Server tương tự cách lệnh Linux. Tuy nhiên với Windows có thể dùng ứng dụng Putty. Tải về tại: Putty, cài đặt xong chạy Putty nó có giao diện như sau:

Bạn điền thông số vào gồm: điện IP (hoặc tên miền), cổng kết nối. Có thể nhập tên cấu hình ở mục Saved Sessions rồi bấm Save lại để lần sau muốn kết nối chỉ việc chọn tên cấu hình và bấm Load, tránh khỏi thiết lập thông số kết nối từ đầu.

Cấu hình xong bấm vào Open, nhập user và password để thực hiện kết nối. Kết quả là có một giao diện dòng lệnh làm việc trực tiếp với Server.

putty

Chú ý khi bạn kết nối đến Server Windows bằng Putty như trên, nếu có dòng thông báo lỗi:

Server protocol violation: unexpected SSH2_MSG_UNIMPLEMENTED

Thì cấu hình Putty như sau để bỏ lỗi: Từ cửa sổ cấu hình Putty chọn Connection > SSH > Kex, ở bên phải cửa số thấy có khu vực Althorithm selection policy, trong danh sách đó hãy bấm chọn Diffe-Hellman group exchange đang ở đầu danh sách, sau đó bấm vào nút Down để dịch nó xuống vị trí thứ 3. Thực hiện kết nối lại sẽ hết lỗi.

Cơ chế xác thực bằng SSH Key

Ngoài cơ chế xác thức bằng cách nhập mật khẩu như trên còn có cơ chế sử dụng SSH Key để xác thực. Để tạo nên xác thực này cần có hai thứ đó là Private KeyPublic key

  • Public Key khóa chung, là một file text nhưng nó lại lưu ở phía Server, nó dùng để khi Client gửi Private Key (file lưu ở Client) lên để xác thực thì kiểm tra phù hợp giữa Private Key và Public Key này. Nếu phù hợp thì cho kết nối.
  • Private Key khóa riêng, là một file text bên trong nó chứa mã riêng để xác thực (xác thực là kiểm tra sự phù hợp của Private Key và Public Key). Máy khách kết nối với máy chủ phải chỉ ra file này khi kết nối SSH thay vì nhập mật khẩu. Hãy lưu file Private key cận thận, bất kỳ ai có file này có thể thực hiện kết nối đến máy chủ của bạn

Cấu hình để OpenSSH cho phép xác thực qua SSH Key

Mở file cấu hình sshd_config (/etc/ssh/sshd_config trên Linux, C:\OpenSSH\sshd_config_default trên Windows thêm vào dòng

PubkeyAuthentication yes

Sau khi lưu lại, khởi động lại SSH Server bằng lệnh

Service sshd restart
#Trên Windows khởi động lại service có tên sshd

Cũng lưu ý trong file cầu hình này có dòng:

AuthorizedKeysFile .ssh/authorized_keys

Có nghĩa là SSH Server sẽ sử dụng Public Key lưu tại .ssh/authorized_keys, để ý điều này để khi có public key thì tên file phải là authorized_keys lưu ở thư mục .ssh trong thư mục của user!. Ví dụ user là abc thì Public Key phải lưu ở file: /home/abc/.ssh/authorized_keys, tương tự trên Windows đó là %homepath%/.ssh/authorized_keys (như n:\Users\abc\.ssh\authorized_keys)

Tiếp theo làm thế nào để có được các KEY này!

Tạo SSH Key (Public/Private)

Có nhiều cách để có được SSH Key (cặp Private KeyPublic Key). Miễn là sau khi có căp file này thì file Public Key lưu ở vị trí phù hợp tại Server (xem trên), còn Private key dùng ở máy khách để kết nối. Dưới đây là một cách có được cặp file này (dùng lệnh ssh-keygen của OpenSSH):

Mở terminate (trên Linux, macOS hoặc cmd trên Windows) rồi gõ dòng lệnh:

ssh-keygen -t rsa

Khi nó hỏi nhập tên file để lưu Private Key, hãy nhấn Enter để giữ gợi ý mặc định lưu tại ~/.ssh/id_rsa. ~ là thư mục gốc của user, nhu vậy nó sẽ tự tạo ra thư mục .ssh trong thư mục gốc của user (~) và lưu Private Key trong đó. Khi nó hỏi nhập mã passphrase bạn cũng có thể bỏ qua không cần thiết phải tạo (nếu tạo sau này mỗi khi đăng nhập sẽ phải nhập mã này). Cuối cùng nhấn Enter để sinh ra tiếp Public key

sshkey

Kết quả lệnh trên bạn đã có:

  • Private Key chứa trong file ~/.ssh/id_rsa, hãy lấy file này về lưu lại cẩn thận, nó được dùng để SSH client kết nối đến Server
  • Public Key chứa trong file ~/.ssh/id_rsa.pub, hãy copy nội dung bên trong file này chép nguyên vẹn vào file ~/.ssh/authorized_keys để SSH Server dùng được. Hoặc nhanh chóng là copy một bản id_rsa.pub thành file mới tên authorized_keys bằng lệnh:
    cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

    Sau khi có file authorized_keys có thể xóa id_rsa.pub

Lưu ý trên Server Windows (hoặc Windows Destop)

Khi chạy lệnh ssh-keygen cần vào thư mục C:\OpenSHH là nơi cài đặt OpenSSH

Cách phát sinh SSH Key giống hệt trên Linux, các file kết quả lưu tại %homepath%\.ssh\. Với %homepath% là thư mục gốc của User, ví dụ như bạn đang đăng nhập với User là Administrator thì %homepath%C:\Users\Administrator\

  • Private Key chứa trong file %homepath%/.ssh/id_rsa, hãy lấy file này về lưu lại cẩn thận, nó được dùng để SSH client kết nối đến Server
  • Public Key chứa trong file %homepath%/.ssh/id_rsa.pub, đổi tên file này thành %homepath%/.ssh/authorized_keys

Sử dụng SSH Key để kết nối

Bạn có được file Private Key (id_rsa), hãy lưu file này ở một thư mục nào đó trong máy. Ví dụ c:\mysshkey\id_rsa hoặc với máy trạm macOS, Linux (Ubuntu) lưu ở đường dẫn bất kỳ như /home/mysshkey/id_rsa

Giờ làm sao để SSH Client biết mà sử dụng Private Key này, hãy mở file /etc/ssh/ssh_config (Linux, macOS), trên Windows thì tại %homepath%/.ssh/ssh_config (VD: c:\Users\abc\.ssh\ssh_config - nếu file chưa có thì tạo mới)

Trong file này thêm vào đoạn cấu hình dạng như sau:

Host IP
    IdentityFile "/home/mysshkey/id_rsa"
Trên Windows
Host IP
    IdentityFile  "c:\Users\abc\.ssh\ssh_config"

Trong đó IP là địa chỉ IP máy chủ hoặc domain. Giờ khi bạn thực hiện kết nối đến SSH Server từ dòng lệnh

ssh user@IP

Thì nó tự động sử dụng cơ chế xác thực này mà không dùng đến cách nhập Password nữa. Nhiều dịch vụ, công cụ sẽ sử dụng cách này giúp cho bạn có được kết nối tự động thi cần các dịch vụ SSH, bạn có thể tham khảo thêm Thiết lập kết nối SSH đến GitHub, hoặc gắn một ổ đĩa Server vào máy macOS bằng SSH xem thêm Fuse macOS ...

Lỗi hay gặp không kết nối được SSH KEY: thường là lưu file public key ở Server ở các thư mục không được chmod phù hợp

Nếu user có tên là abc, thì chmod phù hợp là:

/home/abc                               700
/home/abc/.ssh                          700
/home/abc/.ssh/authorized_keys          600

Sử dụng SSH Key với Putty

File Private Key (id_rsa) bạn lưu vào máy trạm có thể dùng được với nhiều ứng dụng cần kết nối SSH, tuy nhiên với Putty vì có sự không tương thích giữa OpenSSH key và Putty key nên trước khi sử dụng cần chuyển đổi cho tương thích với Putty.

1 Tải về PuttyGen tại PuttyGen, sau đó chạy file tải về nó có giao diện dạng:

putty

2 Giả sử file Private Key id_rsa bạn tải về lưu tại C:\MySSH\id_rsa, ở giao diện trên bạn bấm vào Load, chỉ đến file id_rsa. Sau đó bấm vào Save Private Key, lưu nó thành file mới ví dụ: C:\MySSH\id_rsa.ppk

3 Thực hiện kết nối Putty. Chạy Putty thiết lập IP, cổng kết nối như bình thường. Tiếp theo bấm vào mục Connection > SSH > Auth, nhìn bên phải bấm vào Browse ..., chọn đến file Private Key: C:\MySSH\id_rsa.ppk. Cuối cùng là Open để kết nối mà không dùng đến Password

Đăng ký theo dõi ủng hộ kênh