Tải bản đầy đủ (.docx) (55 trang)

TÌM HIỂU VÀ CẤU HÌNH DỊCH VỤ SSH TRÊN LINUX

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (604.71 KB, 55 trang )

HỌC VIỆN KỸ THUẬT MẬT MÃ
KHOA AN TOÀN THÔNG TIN

ĐỀ TÀI

TÌM HIỂU VÀ CẤU HÌNH DỊCH VỤ
SSH TRÊN LINUX

Sinh viên thực hiện:
Lê Văn Vũ
Nguyễn Thị Thu Hiền
Vũ Xuân Huy
Trần Nhật Trường
Lớp:

AT8B

1


Mục Lục

2


KÝ TỰ VIẾT TẮT
Ký tự

Ý nghĩa

AES



Advanced Encryption Standard: tiêu chẩn mã hóa tiên tiến.

ARCFOU

RC4 (Rivest Cipher 4)

CA

Certificate Authority

CRC

Cyclic Redundancy Check

DES

Data Encryption Standard : tiêu chuẩn mã hóa dữ liệu.

DNS

Domain Name System: hệ thông tên miền.

DSA

Digital Signature Algorithm: giải thuật ký số.

DSS

Decision Support System


R

ECDSA
HĐH
IETF
IMAP
MD5

Elliptic Curve Digital Signature Algorithm : Giải thuật chữ ký số
trên đường cong elliptic.
Hệ Điều Hành
Internet Engineering Task Force
Internet Message Access Protocol :Giao thức truy nhập Thông báo
Internet.
Message-Digest algorithm 5

MITM

Man-in-the-middle attack: tấn công xen giữa.

NIS

Network Information Service: Dịch vụ thông tin Mạng.

NIST
NNTP
NSA
RIPEMD


National Institute of Standards and Technology: Viện tiêu chuẩn
và Công nghệ Quốc gia.
Network News Transfer Protocol: Giao thức chuyển tin trong
mạng máy tính.
National Security Agency: Cơ quan An ninh Quốc gia Hoa Kỳ/Cục
An ninh Trung ương.
Integrity Primitives Evaluation Message Digest

RSADSI

RSA Data Security: Bảo mật dữ liệu RSA

SSH/SFT

SSH File Transfer Protoco: Giao thức truyền tệp tin.

P

3


DANH MỤC HÌNH ẢNH

4


DANH MỤC BẢNG

5



LỜI MỞ ĐẦU
Ngày nay rất nhiều người dùng có nhiều tài khoản máy tính. Và nhu cầu kết nối
giữa chúng cũng gia tăng. Ví dụ như bạn muốn sao chép một file giữa hai máy thông
qua mạng, đăng nhập vào một tài khoản ở xa từ một máy khác, hoặc truyền dòng lệnh
đến một máy tính ở xa để thực hiện. có nhiều chương trình khác nhau đã tồn tại để
phục vụ cho những mục đích đó như FTP và RCP để truyền file, TELNET và RLOGIN
để đăng nhập từ xa, và RSH để thực hiện lệnh từ xa.
Trên rất nhiều hệ thống, chương trình ứng dụng “telnet” còn được dùng trong
những phiên giao dịch tương tác TCP ở dạng sơ đẳng (interactive raw – TCP sessions),
và còn được dùng để thông nối với những dịch vụ trên các máy chủ POP3, mà không
cần đến những trình khách chuyên dụng. Tuy nhiên, tồn tại một vấn đề là nếu bạn
truyền một file nhạy cảm thông qua Internet, có khả năng một kẻ xấu có thể chặn lại và
đọc dữ liệu. Thậm chí, nếu bạn đăng nhập vào một máy tính từ xa khác bằng việc sử
dụng một chương trình như telnet username và password của bạn có thể bị lộ khi chúng
được truyền trên mạng. Có một cách giải quyết kinh tế và hiệu quả đó là, sử dụng giao
thức SSH.
Bản báo cáo nhóm thực hiện trình bày SSH là gì? Và nội dung của bạn báo cáo
sẽ giúp bạn hiểu tại sao giao thức này lại có thể giải quyết được vấn đề đã nêu ở trên.
Cấu trúc báo cáo gồm hai chương:

- Chương 1: Giới thiệu về giao thức SSH, sẽ giúp bạn biết giao thức SSH là gì?.
- Chương 2: Trình bày cách cấu hình, cài đặt để sử dụng giao thức này.
Để đảm bảo đưa ra cái nhìn tổng quan và dễ hiểu nhất về giao thức SSH, nên
còn những kiến thức khác, chuyên sâu hơn về giao thức SSH mà bản báo cáo chưa nêu
ra được. Và do thời gian cũng như những hạn chế mà báo cáo không tránh khỏi thiếu
sót, mong thầy cô và các bạn đóng góp và thông cảm.
Cuối cùng, nhóm hy vọng bản báo cáo sẽ là tài liệu hữu ích giúp bạn có thể hiểu
hơn về một giao thức mạng an toàn.


6


CHƯƠNG I: TÌM HIỂU SSH
1.1. Giới thiệu SSH
SSH (Secure Shell) là một giao thức mạng dùng để thiết lập kết nối mạng một
cách bảo mật. SSH hoạt động ở lớp ứng dụng trong mô hình phân lớp TCP/IP. Các
công cụ sử dụng SSH (như là OpenSSH, …) cung cấp cho người dùng cách thức để
thiết lập kết nối mạng được mã hoá để tạo một kênh kết nối bí mật.
SSH là một chương trình tương tác giữa servers và clients có sử dụng cơ chế mã
hoá. Mỗi khi dữ liệu được gửi bởi một máy tính vào mạng, SSH tự động mã hoá nó.
Khi dữ liệu được nhận vào, SSH tự động giải mã nó. Kết quả là việc mã hoá được thực
hiện trong suốt: người dùng có thể làm việc bình thường, không biết rằng việc truyền
thông của họ đã được mã hoá an toàn trên mạng. SSH được phát minh bởi một công ty
tư nhân. SSH chủ yếu sử dụng trên HĐH Unix/ Linux hơn là các server nền tảng
Windows.
Giao thức SSH bao gồm:xác thực, mã hóa và toàn vẹn dữ liệu truyền trên mạng,
như hình bên dưới.

Hình 1.

Xác thực, mã hóa và toàn vẹn

7


1.2. Lịch sử phát triển
SSH1 và giao thức SSH-1 được trình bày năm 1995 bởi Tatu Ylõnen, một nhà
nghiên cứu ở trường đại học kĩ thuật Helsinki của Phần Lan. Sau khi mạng trường đại
học của ông ta là nạn nhân của một cuộc tấn công đánh cắp password vào đầu năm đó.

Tháng 7 năm 1995, SSH1 được phát hành rộng rãi dưới dạng một phần mềm miễn phí
có source code, cho phép mọi người sao chép và sử dụng mà không thu phí. Vào cuối
năm đó, ước tính có khoảng 20.000 người dùng trên 50 quốc gia đã sử dụng SSH1, và
mỗi ngày Ylõnen nhận 150 mail yêu cầu hỗ trợ. Để đáp lại, Ylõnen đã thành lập SSH
Communications Security (SCS, ) vào tháng 12 năm 1995 để duy
trì, thương nghiệp hoá và tiếp tục phát triển SSH. Cũng trong năm 1995, Ylõnen soạn
thảo giao thức SSH-1 còn gọi là Internet Engineering Task Force (IETF), nó diễn tả
hoạt động cơ bản của phần mềm SSH1 trên thực tế. Nó là một giao thức có phần quảng
cáo nhưng còn một số lỗi và giới hạn nhưng rất phổ biến. Năm 1996, SCS giới thiệu
một phiên bản mới đó là phiên bản chính của giao thức, SSH 2.0 hay SSH-2, phiên bản
này được kết hợp chặt chẽ những thu
1ật toán mới và không hợp với SSH-1. Trong
lúc đó, IETF thành lập một nhóm làm việc gọi là SECSH (Secure Shell) để chuẩn hoá
giao thức và chỉ đạo sự phát triển của nó trên lợi ích chung. Nhóm làm việc SECSH đã
trình bày bản phác thảo Internet đầu tiên đối với giao thức SSH-2 vào tháng 2 năm
1997. Năm 1998, SCS phát hành sản phẩm phần mềm “SSH Secure Shell” (SSH2),
dựa trên giao thức SSH-2. Tuy nhiên, SSH2 không thay thế SSH1 trong một số lĩnh
vực, có 2 lí do. Thứ nhất, SSH2 không có một số tiện ích, các đặc điểm có ích và cấu
hình tuỳ chọn như SSH1. Thứ hai, SSH2 có nhiều giới hạn về việc đăng kí. Bản chính
SSH1 đã có sẵn miễn phí từ Ylõnen và trường đại học kĩ thuật Helsinki. Phiên bản mới
hơn của SSH1 từ SCS vẫn có sẵn miễn phí cho hầu hết người dùng, thậm chí cả cấu
hình thương mại cũng miễn phí chỉ cần phần mềm đó không được trực tiếp bán cho
việc thu lợi nhuận hoặc được tặng như là một dịch vụ cho khách hàng. Vì thế, tuy
SSH2 đã xuất hiện, nhưng hầu hết những người đang sử dụng SSH1 đều nhận ra vài ưu
điểm của SSH1 so với SSH2 và tiếp tục sử dụng SSH1, ba năm sau khi SSH2 ra đời thì
SSH1 vẫn là phiên bản được sử dụng phổ biến trên Internet và vượt qua cả SSH2 là
giao thức tốt hơn và bảo mật hơn. Tuy nhiên, SSH2 cũng có hai sự phát triển hưa hẹn,
đó là một bản nới lỏng của SSH2 bản quyền và sự xuất hiện SSH-2 bổ sung. Năm
2000, SCS mở rộng SSH2 bản quyền để cho phép sử dụng khi làm việc riêng lẻ đối với
các tổ chức hoạt động phi lợi nhuận. Nó cũng được mở rộng cho phép dùng miễn phí

8


đối với Linux, NetBSD, FreeBSD và hệ điều hành OpenBSD. Cùng thời gian đó,
OpenSSH () đã được phát triển nổi bật như là một SSH bổ
sung, được phát triển dưới hoạt động của dự án OpenBSD () và
miễn phí sẵn bên dưới OpenBSD có đăng kí. OpenSH hỗ trợ cả SSH-1 và SSH-2 trong
một chương trình. Tuy OpenSSH được phát triển trên nền OpenBSD nhưng nó cũng
hoạt động được trên Linux, Solais, AIX và những hệ điều hành khác. Mặc dù
OpenSSH tương đối mới và không có vài đặc điểm có trong SSH1 và SSH2 nhưng nó
đang trên đà phát triển nhanh chóng và hứa hẹn trở thành bản SSH chính thức.
1.3. Các đặc điểm của SSH
Các đặc điểm chính của giao thức SSH là:
- Tính bí mật (Privacy) : dữ liệu được mã hóa, chỉ hiển thị với người dùng định danh,
còn lại sẽ là khó hiểu.
- Tính toàn vẹn (Integrity) : đảm bảo dữ liệu không bị biến đổi, nếu một bên thức ba
chụp và sửa đổi dữ liệu của bạn trong quá trình chuyển thì SSH sẽ phát hiện thực tế
này.
- Chứng minh xác thực (Authentication) nghĩa là bằng chứng để nhận dạng bên gửi và
bên nhận. Nếu bạn cố gắng đăng nhập vào một tài khoản trên một máy tính từ xa, SSH
yêu cầu bằng chứng kỹ thuật số nhận dạng bạn. Nếu vượt qua tất cả các bài kiểm tra,
bạn có thể đăng nhập, nếu không bác bỏ yêu cầu.
- Giấy phép (Authorization) :dùng để điều khiển truy cập đến tài khoản.
- Chuyển tiếp (Forwarding) hoặc tạo đường hầm (Tunneling) để mã hoá những
phiên khác dựa trên giao thức TCP/IP.
- Cổng giao tiếp là 22.

Thuật ngữ:
- ssh: client.
- sshd:server.

- Nếu sshd không hoạt động thì client không thể kế nối đến server bằng ssh.
1.3.1.
Tính bí mật (Privacy)
Tính bí mật có nghĩa là bảo vệ dữ liệu không bị phơi bày. Mạng máy tính bình
thường không bảo đảm tính bí mật, bất cứ ai truy cập đến phần cứng của mạng hoặc
đến những host kết nối với mạng đều có thể sẽ đọc được tất cả dữ liệu đi qua mạng.
Mặc dù mạng chuyển mạch hiện đại đã giảm những vấn đề này trong mạng vùng cục
bộ nhưng nó vẫn còn một vấn đề nghiêm trọng đó là mật khẩu dễ bị những kẻ xấu đánh
cắp.
SSH cung cấp tính bí mật bằng việc mã hoá dữ liệu đi qua mạng. Đó là việc mã
hoá hai đầu dựa trên khoá ngẫu nhiên (sinh ra để phục vụ cho một phiên kết nối và
9


được huỷ đi khi phiên kết nối thành công). SSH hỗ trợ nhiều thuật toán mã hoá đối với
phiên dữ liệu, đó là những thuật toán mã hoá chuẩn như: AES, ARCFOUR, Blowfish,
Twofish, IDEA, DES và triple-DES (3DES).
1.3.2.
Tính toàn vẹn (Integrity)
Tính toàn vẹn nghĩa là bảo đảm dữ liệu được truyền từ một đầu này đến đầu kia
của mạng không bị thay đổi. Giao thức SSH sử dụng phương pháp kiểm tra toàn vẹn
mật mã, phương pháp này kiểm tra cả việc dữ liệu có bị biến đổi và dữ liệu đến có
đúng là do đầu kia gửi hay không. Nó sử dụng thuật toán băm khoá là MD5 và SHA-1.
1.3.3.
Chứng minh xác thực (Authentication)
Chứng minh xác thực là kiểm tra định danh của ai đó để xác định chính xác
đúng là người đó hay không. Mỗi kết nối SSH bao gồm hai việc xác thực: client kiểm
tra định danh của SSH server (server authentication) và server kiểm tra định danh của
người sử dụng yêu cầu truy cập (user authentication). Server authentication chắc chắn
rằng SSH server là chính xác và không phải là kẻ lừa đảo để đề phòng kẻ tấn công lại

gửi kết nối mạng đến một máy khác. Server authentication cũng bảo vệ việc bị kẻ xấu
ngồi ở giữa hai bên, lừa gạt cả hai bên, nghĩa là kẻ xấu sẽ nói với server nó là client và
nói với client nó là server để đọc được dữ liệu trao đổi giữa hai bên. User
authentication theo truyền thống là làm việc với mật khẩu. Để xác thực định danh của
bạn, bạn phải đưa ra mật khẩu, và nó dễ bị lấy cắp. Thêm nữa, để dễ nhớ một mật khẩu,
người ta thường đặt nó ngắn và có ý nghĩa nào đó nên dễ bị kẻ xấu đoán ra. Đối với
mật khẩu dài hơn thì người ta thường chọn những từ hoặc câu trong ngôn ngữ bẩm sinh
nên cũng dễ bị bẻ khoá.
SSH hỗ trợ xác thực bằng mật khẩu, mã hoá mật khẩu khi nó truyền đi trên
mạng. Đây là sự cải thiện rất lớn so với những giao thức truy cập từ xa thông thường
khác (Telnet, FTP) mà chúng gửi mật khẩu qua mạng dưới dạng clear text. Tuy nhiên,
việc chứng thực như thế vẫn chỉ là chứng thực mật khẩu đơn giản, vì thế SSH cung cấp
cơ chế mạnh hơn và dễ sử dụng hơn: mỗi user có nhiều chữ kí khoá công khai (peruser public-key signature) và một cải tiến rlogin-style xác thực với định danh host
được kiểm tra bằng khoá công khai. Hơn nữa, những bản bổ sung khác nhau của SSH
hỗ trợ vài hệ thống khác bao gồm Kerberos, RSA, mật khẩu S/Key one-time và PAM.
Một SSH client và SSH server đàm phán với nhau để xác định cơ chế xác thực sẽ sử
dụng dựa trên cấu hình của chúng và một server thậm chí có thể yêu cầu nhiều kiểu xác
thực.
Có hai phương pháp xác thực chủ yếu:
• Dựa trên khóa công khai
10


1.3.4.

• Dựa trên mật khẩu

Cấp giấy phép
Việc cấp giấy phép có tác dụng quyết định ai đó có thể hoặc không thể làm gì
đó. Nó diễn ra sau khi xác thực, bởi vì bạn không thể chấp nhận một ai đó có quyền gì

khi chưa biết đó là ai. SSH server có nhiều cách khác nhau để giới hạn hành động của
client. Truy cập đến phiên đăng nhập tác động lẫn nhau như TCP port và X Window
forwarding, key agent forwarding, … có thể tất cả đều được điều khiển mặc dù không
phải tất các đặc điểm đều có sẵn trên tất cả các bản bổ sung SSH,và chúng không luôn
luôn tống quát hoặc linh hoạt như bạn ý muốn. Giấy phép có thể được điều khiển tại
một mức server rộng (ví dụ: /etc/ssh/sshd_config file đối với OpenSSH) hoặc theo tài
khoản phụ thuộc vào phương thức xác thực sử dụng.
1.3.5.
Chuyển tiếp (Forwarding) hoặc tạo đường hầm (tunneling)
Chuyển tiếp hoặc tạo đường hầm là tóm lược dịch vụ dựa trên TCP khác như là
Telnet hoặc IMAP trong một phiên SSH mang lại hiệu quả bảo mật của SSH đến với
các dịch vụ dựa trên TCP khác. Ví dụ, một kết nối Telnet bình thường truyền username,
password của bạn và phiên đăng nhập của bạn ở dạng clear text. Bằng cách chuyển tiếp
telnet thông qua SSH, tất cả dữ liệu sẽ tự động được mã hoá và kiểm tra định danh và
bạn có thể xác nhận dùng SSH tin cậy.

Hình 2.

SSH Forwarding
11


TCP port forwarding:
SSH dùng TCP/IP làm cơ chế truyền, thường dùng port 22 trên máy server khi
nó mã hoá và giải mã lưu lượng đi trên mạng. Ở đây chúng ta nói đến một đặc điểm mã
hoá và giải mã lưu lựơng TCP/IP thuộc về ứng dụng khác, trên cổng TCP khác dùng
SSH. Tiến trình này gọi là port forwarding, nó có tính trong suốt cao và khá mạnh.
Telnet, SMTP, NNTP, IMAP và những giao thức không an toàn khác chạy TCP có thể
được bảo đảm bằng việc chuyển tiếp kết nối thông qua SSH. Port forwarding đôi khi
được gọi là tunneling bởi vì kết nối SSH cung cấp một “đường hầm” xuyên qua để kết

nối TCP khác có thể đi qua.
Giả sử bạn có một máy H ở nhà đang chạy IMAP và bạn muốn kết nối đến một
IMAP server trên máy S để đọc và gửi mail. Bình thường thì việc kết nối này không
đảm bảo an toàn, tài khoản và mật khẩu mail của bạn được truyền đi dưới dạng clear
text giữa chương trình mail của bạn và server. Đối với SSH port forwarding, bạn có thể
định tuyến lại trong suốt kết nối IMAP ( tìm cổng TCP 143 trên server S) để truyền đi
thông qua SSH, mã hoá bảo đảm dữ liệu truyền đi trên kết nối. Máy IMAP server phải
chạy một SSH server cho port forwarding để cung cấp việc bảo đảm đó. Tuy nhiên,
SSH port forwarding chỉ hoạt động trên giao thức TCP và không làm việc được trên
các giao thức khác như UDP hay AppleTalk forwarding là một hệ thống window phổ
biến đối với các trạm làm việc Unix, một trong những đặc điểm tốt nhất của nó là tính
trong suốt. Sử dụng X bạn có thể chạy ứng dụng X từ xa để mở các cửa sổ của chúng
trên màn hình hiển thị cục bộ của bạn và Agent forwarding SSH client có thể làm việc
với một SSH agent trên cùng một máy. Sử dụng một đặc trưng gọi là agent forwarding,
client cũng có thể liên lạc với các agent trên những máy từ xa. Điều thuận lợi là nó cho
phép client trên nhiều máy làm việc với một agent và có thể tránh vấn đề liên quan đến
tường lửa.

Hình 3.

SSH Tunneling

SSH Port Forwarding
Có 3 loại SSH port forwarding là:
12









Local port forwarding: là dạng kết nối từ phía SSH client được chuyển tiếp qua
SSH server, rồi đi đến host/server đích.
Remote port forwarding: kết nối từ phía SSH server được chuyển tiếp qua SSH
client, rồi đi đến host/server đích.
Dynamic port forwarding: tương tự “local port forwarding”, kết nối từ phía
SSH client được chuyển tiếp qua SSH server, rồi đến đích tuỳ ý không định trước.

1.3.5.1.

Local port forwarding

Hình 4.

Local Port Forwarding

Mở kết nối ssh tới ssh server với tuỳ chọn “-l port:host:hostport” trong đó



port là cổng ở phía ssh client được chỉ định để mở socket.
host:hostport là socket đích muốn tới (nhìn từ phía ssh server).
Chúng ta sẽ làm rõ hơn vấn đề thông qua ví dụ giả định:






Desktop của bạn A (phía ssh client) có IP 192.168.1.101
Server trung gian B (phía ssh server) có IP 172.16.0.111
Đích muốn đến là web server X, có IP 1.1.1.1, có mở cổng 22/SSH và chỉ chấp
nhận kết nối từ Server B.
Thay cho việc phải SSH từ A lên B, rồi tiếp tục SSH lên đích là server X, chúng
ta có thể mở một “cánh cửa thần kỳ” là một socket ở phía A để lên X như sau:
ssh -L 2222:1.1.1.1:22
Sau khi kết nối thành công, phía host A (SSH Client) sẽ thấy một socket là
127.0.0.1:2222 được mở bởi ssh.
[root@A:~]# netstat -lntp | grep 2222
tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN 10469/ssh

13


Bây giờ đứng từ A chúng ta có thể kết nối ssh lên server X thông qua socket này
như sau:
ssh -p 2222
Trên thực tế, một trường hợp rất thường xuyên áp dụng “local port forwarding”
đó là Mysql tunnelling. Ví dụ từ Desktop A, bạn có thể ssh lên Server B, trên B chạy
Mysql ở cổng 3306 và chỉ chấp nhận kết nối từ local. Vậy một cách đơn giản, để kết
nối Mysql trên B từ A, đó là dùng port forwarding
ssh -L 3307:localhost:3306
Sau khi có kết nối ssh, tiếp theo là dùng lệnh mysql trên A để kết nối đến dịch
vụ Mysql trên server B
mysql -h 127.0.0.1 -P 3307 -uroot -p
Giả sử bạn đồng thời muốn mở socket trên A để các máy khác trong cùng mạng
LAN có thể kết nối được đến Mysql trên B. Chỉ cần thêm tuỳ “-g” trong lệnh ssh, như
sau:
ssh -L 3307:localhost:3306 -g

Bây giờ trên máy A2 trong mạng LAN, có IP 192.168.1.102, bạn kết nối đến
Mysql trên B thông qua A như sau:
ssh -h 192.168.1.101 -P 3307 -uroot –p

14


1.3.5.2.

Remote port forwarding

Hình 5.

Remote port forwarding

Mở kết nối SSH tới SSH server với tuỳ chọn “-r port:host:hostport” trong đó



port là cổng ở phía SSH server được chỉ định để mở socket.
host:hostport là socket đích muốn tới (nhìn từ phía SSH client).
Về mặt logic “remote port forwarding” hoàn toàn tương tự với “local port
forwarding” chỉ thay việc kết nối đi từ SSH client bằng đi từ phía SSH server, thông
qua SSH client để đến server/host đích.
Trên thực tế “remote port forwarding” ít được dùng hơn “local port forwarding”
cũng như “dynamic port forwarding”, một trong những trường hợp ứng dụng của
“remote port forwarding” là “SSH ngược”.
Giả định:







Desktop của bạn A (phía ssh client) có IP 192.168.1.101, từ B không thể
ping/kết nối tới A.
Server trung gian B (phía ssh server) có IP 172.16.0.111, từ A có thể ssh tới B.
Server B2 cùng dải mạng với ssh server B có IP 172.16.0.112
Mục đích: cho phép B ssh ngược về A. Có thể mở rộng thêm bằng việc cho
phép B2 ssh ngược về A thông qua B.
Thực hiện điều này đơn giản bằng các mở một kết nối ssh từ A lên B với tuỳ
chọn “-R”, như sau:
ssh -R 2222:localhost:22
Ở trên B, chúng ta có thể thấy một socket được mở ở cổng 2222
[root@B:~]# netstat -lntp | grep 2222
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 29375/10
Thông qua socket này, từ B chúng ta có thể ssh ngược về A, như sau:
15


ssh root@localhost -p 2222
Để B2 cũng có thể kết nối ssh tới A thông qua B, thì trên cấu hình
/etc/ssh/sshd_config của B phải thêm
GatewayPorts yes
Sau khi thay đổi cấu hình ssh, chúng ta cần khởi động lại dịch vụ ssh và khởi
tạo lại kết nối.
Bây giờ trên B2 chúng ta có thể kết nối tới A, như sau:
[root@B2:~]# ssh -p 2222

1.3.5.3.


Dynamic port forwarding

Mở kết nối ssh tới ssh server với tuỳ chọn “-D port” với port ở đây là cổng ở
phía ssh client được bật lên như socket của SOCKS server. Thông qua SOCKS này
chúng ta có thể đi tới bất kỳ đâu mà ở phía ứng dụng đích đó chỉ biết chúng ta đi ra từ
server B, chứ không hề biết thực sự kết nối được khởi tạo từ A.
ssh -D 2222
Sau khi tạo xong kết nối, chúng ta có thể sử dụng SOCKS này để ra Internet an
toàn, ví dụ có thể cấu hình vào Firefox như hình bên dưới.

Hình 6.

VD cấu hình Firefox
16


Để kiểm tra việc cấu hình và SOCKS có hoạt động đúng, chúng ta có thể đi tới
địa chỉ để kiểm tra IP ra Internet.
1.3.6.
Một hệ thống SSH

Hình 7. Cấu trúc của một hệ thống SSH
SSH có khoảng một bộ 12 thuộc tính riêng lẻ, các thành phần tác động lẫn nhau
cho ra các nét đặc trưng riêng. Ở đây chúng ta qui định một bản tóm tắt tổng quan của
tất cả các thành phần:
Server
Một chương trình cho phép đi vào kết nối SSH với một bộ máy, trình bày xác
thực, cấp phép, … Trong hầu hết SSH bổ sung của Unix thì server thường là sshd.
Client

Một chương trình kết nối đến SSH server và đưa ra yêu cầu như là “log me in”
hoặc “copy this file”. Trong SSH1, SSH2 và OpenSSH, client chủ yếu là ssh và scp.
Session
Một phiên kết nối giữa một client và một server. Nó bắt đầu sau khi client xác
thực thành công đến một server và kết thúc khi kết nối chấm dứt. Session có thể được
tương tác với nhau hoặc có thể là một chuyến riêng.
Key
Một lượng dữ liệu tương đối nhỏ, thông thường từ mười đến một hoặc hai ngàn
bit. Tính hữu ích của việc sử dụng thuật toán ràng buộc khoá hoạt động trong vài cách
để giữ khoá: trong mã hoá, nó chắc chắn rằng chỉ người nào đó giữ khoá (hoặc một ai
có liên quan) có thể giải mã thông điệp, trong xác thực, nó cho phép bạn kiểm tra trễ
rằng người giữ khoá thực sự đã kí hiệu vào thông điệp. Có hai loại khóa: khoá đối
xứng hoặc khoá bí mật và khoá bất đối xứng hoặc khóa công khai. Một khoá bất đối
17


xứng hoặc khoá công khai có hai phần: thành phần công khai và thàn phần bí mật. SSH
đề cập đến 4 kiểu của khoá như phần tóm tắt trong bảng và diễn tả dưới đây.
Name
User key

Lifetime
Persistent

Session
key
Host key

One
session

Persistent

Server ke

One hour

Created by
User

Type Purpose
Publi Identify a user to the server
c
Client (and
Secr Protect communications
server)
et
Administrator
Publi Identify a server/machine
c
Server
Publi Encrypt the session key (SSH1
c
only)
Bảng 1. Các loại khóa thành phần

User key
Là một thực thể tồn tại lâu dài, là khoá bất đối xứng sử dụng bởi client như một
sự chứng minh nhận dạng của user ( một người dùng đơn lẻ có thể có nhiều khoá).
Host key
Là một thực thể tồn tại lâu dài, là khoá bất đối xứng sử dụng bới server như sự

chứng minh nhận dạng của nó, cũng như được dùng bởi client khi chứng minh nhận
dạng host của nó như một phần xác thực đáng tin. Nếu một bộ máy chạy một SSH
server đơn, host key cũng là cái duy nhất để nhận dạng bộ máy đó. Nếu bộ máy chạy
nhiều SSH server, mỗi cái có thể có một host key khác nhau hoặc có thể dùng chung.
Chúng thường bị lộn với server key.
Server key
Tồn tại tạm thời, là khoá bất đối xứng dùng trong giao thức SSH-1. Nó đựợc tái
tạo bởi server theo chu kỳ thường xuyên ( mặc định là mỗi giờ) và bảo vệ session key.
Thường bị lộn với host key. Khoá này thì không bao giờ được lưu trên đĩa và thành
phần bí mật của nó không bao giờ được truyền qua kết nối ở bất cứ dạng nào, nó cung
cấp “perfect forward secrecy” cho phiên SSH-1
Session key
Là một giá trị phát sinh ngẫu nhiên, là khoá đối xứng cho việc mã hoá truyền
thông giữa một SSH client và SSH server. Nó được chia ra làm 2 thành phần cho client
và server trong một loại bảo bật trong suốt quá trình thiết lập kết nối SSH để kẻ xấu
không phát hiện được nó.
Key generator
Một chương trình tạo ra những loại khoá lâu dài ( user key và host key) cho
SSH. SSH1, SSH2 và OpenSSH có chương trình ssh-keygen
Known hosts database
18


Là một chồng host key. Client và server dựa vào cơ sở dữ liệu này để xác thực
lẫn nhau.
Agent
Một chương trình lưu user key trong bộ nhớ. Agent trả lời cho yêu cầu đối với
khoá quan hệ hoạt động như là kí hiệu một giấy xác thực nhưng nó không tự phơi bày
khoá của chúng. Nó là một đặc điểm rất có ích. SSH1, SSH2 và OpenSSH có agent
ssh-agent và chương trình ssh-add để xếp vào và lấy ra khoá được lưu.

Signer
Một chương trình kí hiệu gói chứng thực hostbased.
Random seed
Một dãy dữ liệu ngẫu nhiên đựoc dùng bởi các thành phần SSH để khởi chạy
phần mềm sinh số ngẫu nhiên
Configuration file
Một chồng thiết lập để biến đổi hành vi của một SSH client hoặc SSH server.
Không phải tất cả thành phần đều được đòi hỏi trong một bản bổ sung của SSH. Dĩ
nhiên những server, client và khoá là bắt buộc nhưng nhiều bản bổ sung không có
agent và thậm chí vài bản không có bộ sinh khoá.
1.4. Hai phiên bản SSH
1.4.1.
SSH-1

Hình 8.

1.4.1.1.

Cấu trúc SSH-1

Thiết lập kênh kết nối an toàn

19


Trước khi tương tác có ý nghĩa xảy ra, SSH server và SSH client phải thiết lập
một kết nối an toàn. Điều này cho phép họ: chia sẻ khóa, mật khẩu và dữ liệu với nhau.
Thông tin bên dưới sẽ giải thích làm thế nào mà SSH-1 đảm bảo an toàn của
một kết nói mạng. Thông qua quá trình : bắt đầu từ SSH server và client đồng ý thuật
toán mã hóa rồi tạo ra và chia sẻ một khóa phiên bí mật, thành lập một kết nối an toàn.

B1: client giao tiếp với server .
B2: client và server tiết lộ phiên bản giao thức SSH hỗ trợ.
B3: cả hai chuyển sang giao thức dựa trên gói.
B4: server xác định mình với client và cung cấp các thông số phiên.
B5: client gửi tới server một khóa (phiên) bí mật.
B6: cả hai bên bật mã hóa và hoàn thiện xác thực server.
B6: kết nối an toàn được thiết lập.
Bây giờ thì client và server có thể truyền những tin nhắn đã được mã hóa.

Hình 9.

Thiết lập kết nối an toàn
20


1.4.1.2.

Xác thực client
Khi kết nối an toàn được thiết lập, client cố xác thực chính nó tới server. Các
client có thể thử bất lỳ phương pháp xác thực nào cho tới thành công hoặc thất bại. với
ví dụ năm phương pháp xác thực được định nghĩa bởi giao thức SSH-1,5:
- Kerberos (không phải là tính năng mặc định, nhưng có thể yêu cầu trong thời

-

gian biên dịch).
Rhosts.
RhostsRSA.
Khóa công khai.
Mật khẩu (mật khẩu đăng nhập của host, Kerberos, SecurID, S/Key, v.v.).

F-secure SSHclient với Windows thử theo thứ tự:

- Khóa công khai.
- Mật khẩu.
Biết thứ tự với máy client của bạn giúp chẩn đoán các vấn đề khi thẩm định thất
bại hoặc hành vi bất ngờ.

a. Mật khẩu xác thực
Đây là hình thức xác thực đơn giản nhất. Người dùng chỉ định tên người dùng
(trên các hệ thống Unix/Linux tên người dùng được lưu tại /etc/passwd) và tương ứng
với một mật khẩu. Xác thực như vậy cho phép người sử dụng chỉ có một tập hợp các
thông tin cần thiết để xác thực.
Trong thành phần Client SSH/SFTP xác thực khóa công khai được hỗ trợ thông
qua thuộc tính UserName và PassWord .
Được thông báo về kết quả xác thực
Một khi server được xác thực bởi khách hàng (hoặc xác thực thất bại), sự kiện
này được phát sinh bởi các thành phần client SSH/SFTP. Nếu xác thực thành công, sự
kiện OnAuthenticationSuccess được phát sinh, nếu không thì sự kiện
OnAuthenticationFailure được phát sinh.
Xác thực của server
Chúng ta xem xét cách mà client có thể sử dụng để chứng thực mình khi kết nối
với server. Bất kỳ điều gì về server , client không nên biết server nào đã kể nối.
Không giống như SSL, giao thức SSH thường không hoạt động với bất cứ điều
gì giống như sử dụng được giấy chứng nhận X.509 (mặc dù một số SSH server hỗ trợ
xác thực X.509, chứng chỉ được sử dụng như một container cho các khóa). Điều duy
nhất server có là một cặp khóa. Các server sẽ gửi khóa khóa công khai cho các phần
21


mềm client và client quyết định nếu nó tin cậy khóa. Quá trình xác nhận được thực

hiện bằng cách sử dụng sự kiện OnKeyValidate của các thành phần SSH / SFTP client
của SecureBlackbox. Các client có thể hiển thị hàm băm của khóa của người dùng,
hoặc kiểm tra các cơ sở dữ liệu quan trọng hoặc thực hiện một số hành động khác để
quyết định nếu khoá là hợp lệ.

b. Xác thực khóa công khai
Phương pháp xác thực khóa công khai là phương pháp mà cả client và server
đều cần phải thực hiện. Phương pháp này yêu cầu từng client cần để có một cặp khóa
công khai (cặp khóa được tạo ra bằng cách sử dụng thuật toán mã hóa bất đối xứng
RSA hoặc DSA). Đầu tiên, các client gửi một khóa công khai đến các server. Nếu các
server tìm thấy trong danh sách khóa cho phép, client sẽ mã hóa gói dữ liệu sử dụng
khóa bí mật rồi gửi gói tin kèm khóa công khai đến cho server.
Trong thành phần SSH/ SFTP client xác thực khóa công khai được thực hiện
bằng cách sử dụng class TElSSHMemoryKeyStorage . Class này dùng để lưu trữ các
khóa (đại diện là class TElSSHKey). Ứng dụng này nên đặt một khóa ( trong đó có cả
phần khóa công khai và khóa bí mật ) cho lưu giữ hoặc đính kèm KeyStorage để
ElSSHClient hay thành phần SSH / SFTP khác đi qua thuộc tính KeyStorage của thành
phần này.

c. Xác thực máy chủ tin cậy
Xác thực bằng mật khẩu hoặc khóa công khai yêu cầu khách hàng chứng minh
danh tính của mình bằng việc biết mật khẩu hoặc khóa bí mật riêng biệt cho các tài
khoản đích trên server. Đặc biệt, vị trí của client – những máy đang hoạt động- không
liên quan đến việc chứng thực.
Các thực host tin cậy khác với hai hình thức trên. Thay vì bạn phải chứng minh
danh tính của mình để server tin cậy, xác thực host tin cậy thiết lập mối liên hệ giữa các
máy. Nếu bạn đang đănh nhập như người dùng A trên host A, kết nối đến tài khoản B
trên host B bằng SSH thì SSH server trên host B không kiểm tra định danh của bạn mà
chỉ kiểm tra độ tin cậy của host A, để chắc chắn rằng host A là một host tin cậy. Nó tiếp
tục kiểm tra các kết nối đến từ một chương trình đáng tin cậy trên A, một cài đặt bởi

người quản trị hệ thống sẽ không nói dối về định danh của người dùng A. Nếu vượt
qua hai bài kiểm tra này, server xác thực bạn như người dùng A và thực hiện một ủy
quyền kiểm tra rằng A@A được truy cập vào tài khoản B@B.
Quá trình diễn ra theo từng bước dưới đây:
B1: SSH client yêu cầu một kết nối từ SSH server.
22


B2: SSH server sử dụng dịch vụ đặt tên cục bộ của mình để tìm kiếm một tên
máy chủ cho các địa chỉ nguồn của kết nối mạng lưới client.
B3: SSH server tham khảo quy tắc ủy quyền trong một số file cục bộ, cho thấy
host cụ thể có tin cậy hay không. Nếu phù hợp thì quá trình tiếp tục, nếu không nó bị
lỗi.
B4: các server xác nhận rằng các chương trình từ xa là đáng tin cậy bởi thực
hiện theo quy ước Unix cũ của công đặc quyền.
B5: nếu mội việc suôn sẻ, xác thực thành công.
d. Xác thực Kerberos
SSH1 và OpenSSH hỗ trợ xác thực dựa trên Kerberos còn SSH2 thì không.
Product
SSH1
OpenSS
H

Kerberos
Version
5
4

Ticket
s

Yes
Yes

Password
Authentication
Yes
Yes

AF
S
No
Ye
s
Bảng 2. Hỗ trợ xác thực Kerberos trong SSH

Forwarding
Yes
Only
AFS

with

Trong bảng trên:
Tickets: biểu diễn chuẩn của xác thực Kerberos. Client có một ticket cho
dịch vụ “host” (v5) hoặc “rcmd” (v4) trên server và gửi cho SSH server như một
chứng minh định danh; server xác nhận theo mẫu chuẩn.
Password Authentication: một phần của xác thực máy chủ sử dụng
Ketberos. Thay vì kiểm tra mật khẩu bằng cách sử dụng cơ sở dữ liệu tài khoản
của hệ điều hành, thay vì cố gắng có được các thông tin Kerberos ban đầu cho
người dùng đích (một ticket hoặc một TGT) SSH server còn có các server lưu trữ

TGT cho phiên làm việc để người dùng có quyền truy cập vào nó.
Forwarding: chứng chỉ Kerberos thường chỉ có thể sử dụng khi được ban
hành. Các giao thức Kerberos-5 cho phép người dùng chuyển tiếp thông tin giữa
các máy với nhau, khi đã được chứng thực, tránh lặp lại không cần thiết.
e. Mật khẩu dùng một lần
Xác thực này thuận tiện bởi dễ dàng sử dụng ở bất kỳ nơi nào. Nếu bạn thường
xuyên di chuyển và sử dụng máy tính của nhiều người thì việc sử dụng mật khẩu sẽ
thuận tiện hơn. Nhưng trong trường hợp, bạn muốn đảm bảo an toàn, tránh các hoạt
động tấn công ăn cắp như theo dõi màn hình, chụp bàn phím… thì việc sử dụng mật
khẩu một lần hay hệ thống OTP (one-time password) là lựa chọn hoàn toàn đúng đắn.
Sau đây là một số thuộc tính của hệ thống OTP:
23


- Một danh sách các khóa đã được in sẵn hoặc tính toán khóa tiếp theo với laptop hoặc
PDA của bạn.
- Một small hardware token (credit –card hay key-fob size )với màn hình LCD, hiển thị
mật khẩu ngẫu nhiên.
- Hệ thống hỏi đáp thách thức.
1.4.1.3.
Kiểm tra tính toàn vẹn
Giao thức SSH-1 sử dụng kiểm tra tính toàn vẹn yếu: kiểm tra dư thừa chu kỳ
32b hoặc CRC-32. Điều này chỉ đủ để phát hiện nhưng thay đổi ngẫu nhiên với dữ liệu
mà không ngăn chặn được. Trong thực tế, việc tấn công chèn (insertion attack – được
nói tới trong phần 1.7 ) đặc biệt lợi dụng điểm yếu này của SSH-1. Việc sử dụng các
kiểm tra toàn vẹn CRC-32 là một điểm yếu cố hữu nghiêm trọng trong SSH-1 để giúp
nhắc nhở trong phát triển SSH-2 sử dụng mã hóa mạnh kiểm tra tính toàn vẹn.
1.4.1.4.
Nén dữ liệu
Giao thức SSH-1 hỗ trợ nén dữ liệu cả phiên sử dụng thuật toán “deflate ” của

GNU. Các byte dữ liệu gói được nén riêng rẽ, trong mỗi luồng mà không liên quan đến
ranh giới gói.
Không chỉ cần thiết trong mạng LAN hay liên kết WAN nhanh, nén dữ liệu có
thể cải thiện tốc độ trên các liên kết chậm, như luông modem analog. Nó đặc biệt có lợi
cho chuyển file, forwarding X. Ngoài ra, nén dữ liệu trước khi mã hóa sẽ làm gỉam độ
trễ. Điều này đặc biệt hiệu quả với 3DES, vốn khá chậm.
SSH-1 cũng tương tự như SSH-2 nhưng có một số điểm khác, chúng ta sẽ so
sánh những đặc điểm đó với SSH-2 để hình dung SSH-1:
• non-modular: SSH-1 được định nghĩa như một giao thức nguyên đơn, còn SSH2 được thiết kế modul hoá.
• less negotiation: SSH-1 có nhiều tham số cố định, thực ra, chỉ có kích thước mã
hoá là được thương lượng. Thuật toán nhận dạng, kiểu khoá host, phương thức
trao đổi khoá,…tất cả đều cố định.
• ad hoc naming: SSH-1 không có cú pháp định nghĩa tên linh hoạt như SSH-2 và
không có phần mở rộng bổ sung rõ ràng.
• Single authentication: Quá trình xác thực user của SSH-1 chỉ cho phép một
phương thức hoạt động thành công, Server không thể yêu cầu nhiều phương
thức.
• RhostsRSA authentication: Xác thực RhostsRSA của SSH-1 tương tự như xác
thực dựa trên host về cơ bản là có giới hạn khi sử dụng địa chỉ mạng làm định
danh máy client.
24


• Less flexible remote forwarding: SSH-1 chỉ rõ chuyển tiếp từ xa chỉ trên một
cổng, vì thế không thể đưa nhiều địa chỉ khác nhau đến một server.
• weaker integrity checking: SSH-1 sử dụng phương thức kiểm tra toàn vẹn
không mạnh lắm, đó là thuật toán CRC-32.
• server keys: Tiến trình trao đổi khoá cố định của SSH-1 giao cho một khoá bất
đối xứng gọi là server key, server key là một cặp khoá public/private tạm thời,
sau một giờ lại được phục hồi và sử dụng để cung cấp tính kín đáo chuyển tiếp

cho khoá phiên. Kín đáo chuyển tiếp nghĩa là thậm chí việc bảo mật thời gian
dài như khoá bí mật host hoặc user được thoả hiệp trễ, không dùng mã hoá
phiên SSH trong các bước trước đó, sử dụng một khoá này thì nó không bao giờ
được ghi lên đĩa. Thuật toán Diffe-Hellman dùng trong tất cả quá trình trao đổi
khoá của SSH-2 cung cấp tính bí mật chuyển tiếp bởi chính nó vì thế không cần
server key.
• weak key exchange: Tiến trình trao đổi khoá SSH-1 bảo mật không cao vì chỉ
một mình client chọn khoá phiên và gửi đến server.
1.4.2.
SSH-2
Phần này trình bày về giao thức SSH-2, đặc biệt là sự khác biệt và cải tiến so
với SSH-1 mà không lạp lại các thông tin thông thường với hai giao thức.
Giao thức SSH2, là phiên bản mới nhất và là tập hợp các tiêu chuẩn đề xuất từ
đội đặc nhiệm kĩ thuật Internet (Internet Engineering Task Force - IETF). SSH-2 đươc
thiết kế để mở rộng và modul hoá. Tất cả các giao thức lõi định nghĩa miêu tả các dịch
vụ mà chúng cung cấp và chúng phải phù hợp nhưng cho phép nhiều cơ chế có thể làm
việc, cũng như là một cach để dễ dàng thêm vào một cơ chế mới. Tất cả những tham số
chủ yếu của kết nối SSH đều có thể được thương lượng, bao gồm những thuật toán và
phương thức sử dụng trong:
• Trao đổi khoá phiên
• Xác thực server
• Bảo toàn và bí mật dữ liệu
• Xác thực người dùng
• Nén dữ liệu
Client và Server thương lượng việc sử dụng một thiết lập phổ biến, cho phép
thao tác rộng giữa các phần bổ sung khác nhau. Trong hầu hết các loại, giao thức định
nghĩa ít nhất một phương thức để đẩy mạnh thao tác giữa các phần xa hơn. Nên nhớ
rằng điều này chỉ có nghĩa một việc tuân theo được thực hiện đòi hỏi hỗ trợ phương
thức trong đoạn mã của nó ; bất cứ một phương thức ngoại lệ nào cũng có thể bị tăt bởi
25



×