Tìm kiếm trang web

Định cấu hình xác thực khóa công khai SSH trên Windows


Trong bài viết này, chúng tôi sẽ trình bày cách định cấu hình xác thực SSH trong Windows bằng các khóa RSA hoặc EdDSA. Hãy xem cách tạo cặp khóa công khai và riêng tư trên Windows và định cấu hình máy chủ OpenSSH trên Windows 10/11 hoặc Windows Server 2019/2022 để xác thực dựa trên khóa (không có mật khẩu).

Xác thực dựa trên khóa SSH được sử dụng rộng rãi trong thế giới Linux, nhưng trong Windows, nó mới xuất hiện khá gần đây. Ý tưởng là khóa chung của máy khách được thêm vào máy chủ SSH và khi máy khách cố gắng kết nối với nó, máy chủ sẽ kiểm tra xem máy khách có khóa riêng tương ứng hay không. Bằng cách này, người dùng từ xa có thể xác thực trong Windows mà không cần nhập mật khẩu.

Tạo cặp khóa SSH trên Windows

Bạn phải tạo hai khóa SSH (công khai và riêng tư) trên máy khách mà bạn sẽ sử dụng để kết nối với máy chủ Windows từ xa đang chạy OpenSSH. Khóa riêng được lưu trữ ở phía máy khách (giữ khóa an toàn và không chia sẻ khóa với bất kỳ ai!) và khóa chung được thêm vào tệp authorized_keys trên máy chủ SSH. Để tạo khóa RSA trên máy khách Windows, bạn phải cài đặt máy khách OpenSSH.

Trên Windows 10/11 và Windows Server 2019/2022, ứng dụng khách OpenSSH được cài đặt dưới dạng một tính năng tùy chọn của Windows bằng PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

Trên các phiên bản Windows trước, bạn có thể cài đặt cổng Win32-OpenSSH từ GitHub (xem ví dụ trong bài viết về thiết lập máy chủ SFTP (SSH FTP) trên Windows).

Mở phiên PowerShell tiêu chuẩn (không nâng cao) và tạo một cặp khóa ED25519 bằng lệnh:

ssh-keygen -t ed25519

Theo mặc định, công cụ ssh-keygen tạo các khóa RSA 2048. Hiện tại, nên sử dụng ED25519 thay vì khóa RSA.

Bạn sẽ được nhắc cung cấp mật khẩu để bảo vệ khóa riêng. Nếu bạn chỉ định mật khẩu, bạn sẽ phải nhập mật khẩu đó mỗi khi sử dụng khóa này để xác thực SSH. Tôi đã không nhập cụm mật khẩu (không được khuyến nghị).

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\myuser/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\myuser/.ssh/id_ed25519.
Your public key has been saved in C:\Users\myuser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:xxxxxxxx myuser@computername
The key's randomart image is:
+--[ED25519 256]--+
+----[SHA256]-----+

Ssh-keygen sẽ tạo thư mục .ssh trong hồ sơ của người dùng Windows hiện tại (

%USERPROFILE%\.ssh

) và tạo 2 tệp:

  • id_ed25519

    - khóa riêng (nếu bạn đã tạo khóa RSA, tệp sẽ được đặt tên

    id_rsa

    )

  • id_ed25519.pub

    - khóa công khai (một khóa RSA tương tự được gọi là

    id_rsa.pub

Sau khi các khóa SSH được tạo, bạn có thể thêm khóa riêng của mình vào dịch vụ SSH Agent, dịch vụ này cho phép bạn quản lý các khóa riêng một cách thuận tiện và sử dụng chúng để xác thực.

Dịch vụ SSH Agent có thể lưu trữ khóa riêng tư của bạn và cung cấp chúng trong ngữ cảnh bảo mật của người dùng hiện tại. Chạy dịch vụ ssh-agent và định cấu hình để dịch vụ bắt đầu tự động bằng các lệnh quản lý dịch vụ PowerShell:

set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent

Thêm khóa riêng của bạn vào cơ sở dữ liệu ssh-agent:

ssh-add "C:\Users\youruser\.ssh\id_ed25519"
Identity added: C:\Users\youruser\.ssh\id_ed25519 (youruser@computername)

Hoặc như sau:

ssh-add.exe $ENV:UserProfile\.ssh\id_rsa

OpenSSH: Định cấu hình Xác thực dựa trên Khóa bằng Khóa chung trên Windows

Bây giờ bạn cần sao chép khóa công khai SSH của mình vào máy chủ SSH. Máy chủ SSH trong ví dụ này là một máy Windows 11 từ xa đã cài đặt và định cấu hình dịch vụ OpenSSH.

Bạn có thể xem hướng dẫn đầy đủ “Làm cách nào để định cấu hình máy chủ OpenSSH trên Windows? ”.

Sao chép tệp id_ed25519.pub vào thư mục .ssh trong hồ sơ của người dùng mà bạn sẽ sử dụng để kết nối với máy chủ SSH. Ví dụ: tôi có tài khoản user1 trên thiết bị Windows 11 từ xa của mình, vì vậy tôi cần sao chép khóa vào C:\Users \user1\.ssh uthorized_keys.

Bạn có thể sao chép khóa chung vào máy chủ SSH từ máy khách bằng SCP:

scp C:\Users\youruser\.ssh\id_rsa.pub admin@192.168.1.15:c:\users\admin\.ssh\authorized_keys

Bạn có thể thêm nhiều khóa công khai vào một tệp ủy quyền duy nhất.

Xác thực khóa công khai bị tắt theo mặc định trong máy chủ OpenSSH trên Windows. Bạn có thể kiểm tra điều này trong sshd_config. Cách dễ nhất để lấy danh sách các phương thức xác thực được phép trong OpenSSH là sử dụng lệnh PowerShell sau (Chuỗi chọn được sử dụng tương tự như grep trong PowerShell):

cat "C:\ProgramData\ssh\sshd_config"| Select-String "Authentication"
#PubkeyAuthentication yes
#HostbasedAuthentication no
#HostbasedAuthentication
PasswordAuthentication yes
#GSSAPIAuthentication no

Trong ví dụ này, dòng PubkeyAuthentication bị loại bỏ, điều đó có nghĩa là phương thức xác thực này đã bị tắt. Mở tệp sshd_config bằng notepad và bỏ ghi chú dòng:

Notepad C:\ProgramData\ssh\sshd_config
PubkeyAuthentication yes

Ngoài ra, bạn sẽ phải tắt tùy chọn Chế độ nghiêm ngặt trong tệp cấu hình sshd_config. Theo mặc định, chế độ này được bật và ngăn xác thực dựa trên khóa SSH nếu khóa riêng và khóa chung không được bảo vệ đúng cách. Bỏ ghi chú dòng

#StrictModes yes

và thay đổi nó thành

StrictModes no

Để kết nối với máy chủ từ xa bằng ứng dụng khách SSH gốc, hãy sử dụng lệnh sau:

ssh (username)@(SSH server name or IP address)

Ví dụ:

ssh admin@192.168.1.15

Điều đó có nghĩa là bạn muốn kết nối với máy chủ SSH từ xa có địa chỉ IP 192.168.1.15 trong < tài khoảnuser1. Dịch vụ Đại lý SSH sẽ tự động cố gắng sử dụng khóa riêng của bạn để xác thực trên máy chủ từ xa.

  • Nếu bạn không muốn sử dụng dịch vụ ssh-agent để quản lý khóa SSH, bạn có thể chỉ định đường dẫn đến tệp khóa riêng sẽ được sử dụng để xác thực SSH:

    ssh user1@192.168.1.15 -i "C:\Users\youuser\.ssh\id_ed25519"
  • Để kết nối máy chủ SSH bằng tài khoản người dùng từ miền Active Directory, hãy sử dụng định dạng sau:

    ssh jsmith@a-d.site@192.168.1.15 -i <private_key_absolute_path>

Khi kết nối lần đầu tiên, bạn cần thêm dấu vân tay của khóa máy chủ SSH vào danh sách đáng tin cậy. Nhập có -> Enter.

The authenticity of host '192.168.1.15 (192.168.1.15)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

Ghi nhật ký ETW được sử dụng trong Windows OpenSSH để lưu trữ nhật ký SSH thay vì các tệp văn bản thuần túy. Bạn có thể kiểm tra nhật ký xác thực dựa trên khóa SSH trong Windows Event Viewer (Nhật ký ứng dụng và dịch vụ -> OpenSSH -> Hoạt động).

Nếu kết nối SSH với khóa riêng thành công, sự kiện sau sẽ xuất hiện trong nhật ký OpenSSH:

EventID 4
sshd: Accepted publickey for locadm from 192.168.15.20 port 55772 ssh2: ED25519 SHA256:xxxxxxx

Nếu bạn không thể kết nối với máy chủ SSH bằng khóa riêng của mình và bạn vẫn được nhắc nhập mật khẩu, có khả năng tài khoản người dùng mà bạn đang cố gắng kết nối là thành viên của nhóm quản trị viên Windows cục bộ (nhóm SID là

S-1-5-32-544

). Chúng ta sẽ thảo luận về nó sau.

Ghi nhật ký Windows bằng Khóa SSH Dưới Người dùng Quản trị

OpenSSH sử dụng cài đặt xác thực dựa trên khóa đặc biệt cho tài khoản người dùng quản trị trên Windows.

Bạn cần sử dụng tệp C:\ProgramData\ssh\administrators_authorized_keys thay vì khóa authorized_keys trong hồ sơ người dùng. Thêm khóa SSH công khai của bạn vào tệp văn bản này (vì lý do bảo mật, chỉ nhóm Quản trị viên và HỆ THỐNG mới có quyền đọc tệp này).

Bạn có thể thay đổi quyền NTFS trên tệp bằng:

  • Công cụ icacls:

    icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
  • hoặc sử dụng lệnh ghép ngắn Get-Acl và Set-Acl PowerShell:

    get-acl "$env:programdata\ssh\ssh_host_rsa_key" | set-acl "$env:programdata\ssh\administrators_authorized_keys"

Sau đó, xác thực khóa SSH hoạt động ngay cả khi StrictModes bị tắt.

Để sử dụng tệp ủy quyền_keys từ hồ sơ người dùng và không di chuyển thông tin khóa chung sang tệp administrators_authorized_keys, bạn có thể nhận xét một dòng trong tệp cấu hình OpenSSH (C:\ProgramData\ssh\sshd_config ).

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

Ngoài ra, bạn có thể tắt đăng nhập mật khẩu SSH trong sshd_config:

PasswordAuthentication no

Đừng quên khởi động lại dịch vụ sshd sau khi thực hiện các thay đổi trong sshd_config.

restart-service sshd

Nếu bạn đặt PasswordAuthentication no và định cấu hình xác thực khóa SSH không chính xác, thì sẽ xuất hiện lỗi khi kết nối qua ssh:

user1@192.168.13.15: Permission denied (publickey,keyboard-interactive).

Bạn có thể sử dụng tùy chọn PermitRootLogin trong OpenSSH trên Linux để hạn chế đăng nhập gốc SSH. Lệnh này không áp dụng được trong Windows OpenSSH và bạn phải sử dụng tham số DenyGroups để từ chối đăng nhập ssh trong tài khoản quản trị viên:

DenyGroups Administrators

Vì vậy, bạn đã định cấu hình xác thực SSH trong Windows bằng một cặp khóa. Giờ đây, bạn có thể sử dụng phương pháp xác thực này để truy cập an toàn vào máy chủ từ xa, tự động chuyển tiếp cổng trong đường hầm SSH, chạy tập lệnh và thực hiện các tác vụ tự động hóa khác.

Bài viết liên quan