Bài số 1: Thiết lập IPSec cơ chế transport

Với sơ đồ kết nối mạng như hình vẽ trên, cần thiết lập IPSec trên các máy C0 và C2 để dòng dữ liệu giữa 2 trạm này được bảo mật. Các dòng dữ liệu khác (ví dụ như giữa C0 và C1 hay giữa C1 và C2) vẫn hoạt động bình thường trong chế độ không bảo mật. Các bước thực hiện bao gồm:

  • Cài đặt IPSec trên C0 và C2, chuẩn bị khóa cho các thuật toán mã hóa.
  • Tạo cơ sở dữ liệu chính sách bảo mật (SPD) và liên kết bảo mật (SAD) trên C0 và C2.
  • Chạy thử hệ thống và theo dõi, so sánh các dòng dữ liệu bảo mật & không bảo mật.

Bước 1: Tạo khóa cho kết nối giữa C0 và C2

Các trạm C0 và C2 tham gia vào các kênh truyền bảo mật nên cần cài đặt ipsec-tools:

[root@C0 ~]# yum install ipsec-tools
Loaded plugins: fastestmirror
Setting up Install Process
Loading mirror speeds from cached hostfile
. . .
Install       1 Package(s)

Total download size: 397 k
Installed size: 1.0 M
Is this ok [y/N]: y
Downloading Packages:
ipsec-tools-0.8.2-2.el6.x86_64.rpm                                                           | 397 kB     00:01    
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Installing : ipsec-tools-0.8.2-2.el6.x86_64                                                                   1/1
Verifying  : ipsec-tools-0.8.2-2.el6.x86_64                                                                   1/1

Installed:
ipsec-tools.x86_64 0:0.8.2-2.el6                                                                                 

Complete!

Sử dụng ddxxd để tạo các khóa phục vụ các giao thức IPSec. Nếu không thấy xxd trong hệ thống thì cài đặt nó từ gói ứng dụng vim-common:

# yum install vim-common

Tạo 2 khóa 128bit (16 byte) để phục vụ kết nối AH giữa C0 và C2:

[root@C0 ~]# dd if=/dev/random count=16 bs=1| xxd -ps
16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.000296672 s, 53.9 kB/s
7f2b48773d91866ea7ec5ba9c05ddacd

[root@C0 ~]# dd if=/dev/random count=16 bs=1| xxd -ps
16+0 records in
16+0 records out
16 bytes (16 B) copied, 0.000103954 s, 154 kB/s
de223910095d4f6de8e9f9167c7fc87e

Tạo 2 khóa 192bit (24 byte) để phục vụ kết nối ESP giữa C0 và C2:

[root@C0 ~]# dd if=/dev/random count=24 bs=1| xxd -ps
dd98016473998a2bf5ed57cf1969b02370abaa47a05b5a5b
24+0 records in
24+0 records out
24 bytes (24 B) copied, 0.000799779 s, 30.0 kB/s

[root@C0 ~]# dd if=/dev/random count=24 bs=1| xxd -ps
2ffe65b464153efbca53a24a75fcf2a9ff574ae9952e8b87
24+0 records in
24+0 records out
24 bytes (24 B) copied, 0.00104469 s, 23.0 kB/s

Bước 2: Thiết lập cơ sở dữ liệu SPD và SAD

Trong bước này, 2 khóa 128bit và 2 khóa 192bit vừa được tạo ra sẽ được sử dụng để tạo các cơ sở dữ liệu SPD và SADB trên các máy trạm C0 và C2 với phần mềm netkey (nằm trong gói ipsec-tools). Tạo các file cấu hình /etc/netkey.conf trên C0 và C2:

[root@C0 ~]# cat /etc/setkey.conf 
#!/usr/sbin/setkey -f

# Configuration for 192.168.0.7

# Flush the SAD and SPD
flush;
spdflush;

# Attention: Use this keys only for testing purposes!
# Generate your own keys!

# AH SAs using 128 bit long keys
add 192.168.0.7 192.168.2.7 ah 0x200 -A hmac-md5
0x7f2b48773d91866ea7ec5ba9c05ddacd;
add 192.168.2.7 192.168.0.7 ah 0x300 -A hmac-md5
0xde223910095d4f6de8e9f9167c7fc87e;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.0.7 192.168.2.7 esp 0x201 -E 3des-cbc
0xdd98016473998a2bf5ed57cf1969b02370abaa47a05b5a5b;
add 192.168.2.7 192.168.0.7 esp 0x301 -E 3des-cbc
0x2ffe65b464153efbca53a24a75fcf2a9ff574ae9952e8b87;

# Security policies
spdadd 192.168.0.7 192.168.2.7 any -P out ipsec
           esp/transport//require
           ah/transport//require;

spdadd 192.168.2.7 192.168.0.7 any -P in ipsec
           esp/transport//require
           ah/transport//require;


[root@C2 ~]# cat /etc/setkey.conf 
#!/usr/sbin/setkey -f

# Configuration for 192.168.2.7

# Flush the SAD and SPD
flush;
spdflush;

# Attention: Use this keys only for testing purposes!
# Generate your own keys!

# AH SAs using 128 bit long keys
add 192.168.0.7 192.168.2.7 ah 0x200 -A hmac-md5
0x7f2b48773d91866ea7ec5ba9c05ddacd;
add 192.168.2.7 192.168.0.7 ah 0x300 -A hmac-md5
0xde223910095d4f6de8e9f9167c7fc87e;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.0.7 192.168.2.7 esp 0x201 -E 3des-cbc
0xdd98016473998a2bf5ed57cf1969b02370abaa47a05b5a5b;
add 192.168.2.7 192.168.0.7 esp 0x301 -E 3des-cbc
0x2ffe65b464153efbca53a24a75fcf2a9ff574ae9952e8b87;

# Security policies
spdadd 192.168.0.7 192.168.2.7 any -P in ipsec
           esp/transport//require
           ah/transport//require;

spdadd 192.168.2.7 192.168.0.7 any -P out ipsec
           esp/transport//require
           ah/transport//require;
			 

Một số lưu ý:

  • Lệnh flushspdflush của setkey dùng để xóa toàn bộ cơ sở dữ liệu SP và SA.
  • Các lệnh add dùng để thêm các bản ghi SA vào cơ sở dữ liệu SAD. Trên 2 máy trạm C0 và C2, các SA phục vụ kết nối dữ liệu giữa C0 và C2 phải giống nhau nên có thể copy phần này giữa 2 file cấu hình.
  • Khi copy các khóa đã tạo vào các lệnh add này, cần thêm 0x ở đầu.
  • Các lệnh spdadd để thêm các bản ghi SP vào cơ sở dữ liệu. Tương tự như các SA, SP trên C0 và C2 gần giống nhau. Điểm khác biệt duy nhất là chiều của dòng dữ liệu (in/out) đối nghịch nhau.

Trên từng máy trạm C0 và C2, chạy setkey với các file cấu hình vừa tạo để thiết lập các bản ghi trong cơ sở dữ liệu SAD và SPD. Nếu không có lỗi xảy ra, có thể sử dụng setkey với tham số -D hoặc -DP để hiển thị cơ sở dữ liệu SAD và SPD. Kiểm tra kết quả hiển thị cơ sở dữ liệu xem các thông số thiết lập đã chính xác chưa:

[root@C2 ~]# setkey -f /etc/setkey.conf 
[root@C2 ~]# setkey -D
192.168.2.7 192.168.0.7 
	esp mode=transport spi=769(0x00000301) reqid=0(0x00000000)
	E: 3des-cbc  2ffe65b4 64153efb ca53a24a 75fcf2a9 ff574ae9 952e8b87
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 02:24:03 2016	current: Aug  6 02:24:07 2016
	diff: 4(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=1 pid=4266 refcnt=0
192.168.0.7 192.168.2.7 
	esp mode=transport spi=513(0x00000201) reqid=0(0x00000000)
	E: 3des-cbc  dd980164 73998a2b f5ed57cf 1969b023 70abaa47 a05b5a5b
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 02:24:03 2016	current: Aug  6 02:24:07 2016
	diff: 4(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=2 pid=4266 refcnt=0
192.168.2.7 192.168.0.7 
	ah mode=transport spi=768(0x00000300) reqid=0(0x00000000)
	A: hmac-md5  de223910 095d4f6d e8e9f916 7c7fc87e
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 02:24:03 2016	current: Aug  6 02:24:07 2016
	diff: 4(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=3 pid=4266 refcnt=0
192.168.0.7 192.168.2.7 
	ah mode=transport spi=512(0x00000200) reqid=0(0x00000000)
	A: hmac-md5  7f2b4877 3d91866e a7ec5ba9 c05ddacd
	seq=0x00000000 replay=0 flags=0x00000000 state=mature 
	created: Aug  6 02:24:03 2016	current: Aug  6 02:24:07 2016
	diff: 4(s)	hard: 0(s)	soft: 0(s)
	last:                     	hard: 0(s)	soft: 0(s)
	current: 0(bytes)	hard: 0(bytes)	soft: 0(bytes)
	allocated: 0	hard: 0	soft: 0
	sadb_seq=0 pid=4266 refcnt=0
[root@C2 ~]# setkey -DP
192.168.2.7[any] 192.168.0.7[any] 255
	out prio def ipsec
	esp/transport//require
	ah/transport//require
	created: Aug  6 02:24:03 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=65 seq=1 pid=4267
	refcnt=1
192.168.0.7[any] 192.168.2.7[any] 255
	fwd prio def ipsec
	esp/transport//require
	ah/transport//require
	created: Aug  6 02:24:03 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=58 seq=2 pid=4267
	refcnt=1
192.168.0.7[any] 192.168.2.7[any] 255
	in prio def ipsec
	esp/transport//require
	ah/transport//require
	created: Aug  6 02:24:03 2016  lastused:                     
	lifetime: 0(s) validtime: 0(s)
	spid=48 seq=0 pid=4267
	refcnt=1
			 

Bước 3: Kiểm tra các dòng dữ liệu

Sử dụng ping để tạo dòng dữ liệu ICMP đi và về giữa C0 với C2. Có thể thấy kết quả lệnh ping không có gì thay đổi, vẫn giống như khi không thiết lập IPSec:

[root@C0 ~]# ping 192.168.2.7
PING 192.168.2.7 (192.168.2.7) 56(84) bytes of data.
64 bytes from 192.168.2.7: icmp_seq=1 ttl=62 time=2.29 ms
64 bytes from 192.168.2.7: icmp_seq=2 ttl=62 time=1.90 ms
64 bytes from 192.168.2.7: icmp_seq=3 ttl=62 time=1.75 ms
^C
--- 192.168.2.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2418ms
rtt min/avg/max/mdev = 1.752/1.984/2.294/0.230 ms

Dùng công cụ Wireshark bắt gói tin giữa 2 trạm C0&C2, có thể thấy không có gói tin ICMP nào được gửi giữa 2 trạm. Thay vào đó là các gói tin ESP với phần dữ liệu bị mã hóa (chính là các gói tin ICMP). Các giá trị SPI trong header của ESP và AH khớp với các giá trị SPI trong cơ sở dữ liệu hiển thị ở bước 2.


Giữ nguyên thiết lập IPSec trên C0 và C2, thực hiện các lệnh ping từ C0 đến C1 hoặc C2 đến C1 và bắt gói tin bằng Wireshark, sẽ lại thấy xuất hiện các gói tin ICMP không được mã hóa. Như vậy có nghĩa là các thiết lập cơ sở dữ liệu SPD và SAD trên C0 và C2 chỉ có tác dụng với dòng dữ liệu được trao đổi giữa 2 trạm này. Các dòng dữ liệu khác được xử lý như bình thường, không có bảo mật.

[root@C2 ~]# ping 192.168.1.7
PING 192.168.1.7 (192.168.1.7) 56(84) bytes of data.
64 bytes from 192.168.1.7: icmp_seq=1 ttl=62 time=3.28 ms
64 bytes from 192.168.1.7: icmp_seq=2 ttl=62 time=2.14 ms
64 bytes from 192.168.1.7: icmp_seq=3 ttl=63 time=1.19 ms
^C
--- 192.168.1.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2258ms
rtt min/avg/max/mdev = 1.197/2.208/3.280/0.852 ms