BinaryVision

הצפנת דו-שיח בין מחשבים בעזרת IPSec

מאת בתאריך 14/08/12, תחת כללי

הפרוטוקול IPSec תוכנן תחילה עבור IPv6, אך עד מהרה הומר עבור IPv4 גם כן. הפרוטוקול דואג לאשש את זהות הלוקחים חלק בדו-שיח וכן הצפנה של התקשורת בין הצדדים. הדוגמה של היום תהיה פשוטה, הצפנת דו-שיח Host-to-Host בעזרת מפתח א-סמטרי.

בדוגמה שלי יהיה שימוש במחשב א' עם הכתובת 192.168.1.1 ומחשב ב' עם הכתובת 192.168.2.2, מבחינה טופולוגית הם מחשבים שונים ברשתות שונות, אך הם מסוגלים ליצור קשר ישיר אחד עם השני. המטרה היא להצפין את הדו-שיח בין שני המחשבים.

192.168.1.0/24            Internet           192.168.2.0/24
192.168.1.1                                  192.168.2.2
מחשב ב                                               מחשב א


אנחנו נעשה שימוש במערכת הפעלה לינוקס (אובונטו וארץ'), ובחבילה openswan שנמצאת במנהל חבילות של ההפצה (בארץ' נמצא ב-AUR). כמו-כן צריך תמיכה של הקרנל במודלים הנצרכים על ידי התוכנה (אובונטו וארץ' תומכים במודלים הללו מהקופסה).

בשלב הראשון אנחנו צריכים לוודא כי הפורטים 500 ו-4500 נגישים, בעזרת הפורטים האלה מתבצעת החלפת המפתחות בין הצדדים, במחשב א':

/sbin/iptables -A INPUT -p udp -s 192.168.2.2 -d 192.168.1.1 -m state --state NEW \
-m multiport --dport 500,4500 -j ACCEPT

במחשב ב':

/sbin/iptables -A INPUT -p udp -s 192.168.1.1 -d 192.168.2.2 -m state --state NEW \
-m multiport --dport 500,4500 -j ACCEPT

לאחר מכן אנחנו צריכים ליצור מפתחות RSA (מפתח פומבי ומפתח פרטי) במחשב א' וב' נריץ:

ipsec rsasigkey --verbose 1024 > /root/ipsec.keys.tmp

במחשב א' תוכן הקובץ הוא:

	# RSA 1024 bits   CompA   Tue Aug 14 20:08:39 2012
	# for signatures only, UNSAFE FOR ENCRYPTION
	#pubkey=0sAQNot8i2xjQAvKkJVUv9K6lnFtIEFGwQYtW0PLgM4uJoQL88V1S7BuXeLRODDv3AQ0MyOMbiqn3mipfrT1oTdj7f9Rk3K1RdLtsl/jQ2dFseKV5nfLfafOgxuY+qYgmk0PSOKRwoelvtJG9ANWiEvGCsbnlzZpJhB2Bh7e2A7xFmRw==
	Modulus: 0x68b7c8b6c63400bca909554bfd2ba96716d204146c1062d5b43cb80ce2e26840bf3c5754bb06e5de2d13830efdc043433238c6e2aa7de68a97eb4f5a13763edff519372b545d2edb25fe3436745b1e295e677cb7da7ce831b98faa6209a4d0f48e291c287a5bed246f40356884bc60ac6e7973669261076061eded80ef116647
	PublicExponent: 0x03
	# everything after this point is secret
	PrivateExponent: 0x1173f6c92108aaca1c2c38e1ff8746e683cdab58bcad65ce48b4c9577b25bc0aca8a0e8e1f2bd0fa5cd895d7d4f5608b3309767b1c6a51171951e28f033e5fcfc756fe243eeac73669bc5451832257aa19f5301d8b3cee1ad4fc5e6e8bdcfd7858e1a0ea5980b1cd53e2ed32730c11355d5a3ab5053474cd94402c9682364cf3
	Prime1: 0xb4b980773c51f58a94cd0980620fcd77cce08d37307ea5fcc2dfb9f95138fcfeec2f26e2462bdc224ec86a1e9314aec7d95dbea9b0cff08f0a9d63198c02e4e9
	Prime2: 0x9455c1da9e8a8e0a16c730ccff7d42b4f5c7cecf6690ad93f8c5b9d1713de3238cb02fc81b2be63229263c1b3f5f4aa464fe547ec25659ffddcf7ee055c8b3af
	Exponent1: 0x787baafa2836a3b1b888b100415fde4fddeb08cf75a9c3fdd73fd150e0d0a8a9f2ca19ec2ec7e816df3046bf0cb874853b93d471208aa05f5c68ecbbb2ac989b
	Exponent2: 0x62e3d691bf07095c0f2f75ddffa8d7234e85348a446073b7fb2e7be0f6294217b3201fdabcc7eecc1b6ed2bcd4ea31c2edfee2ff2c3991553e8a54958e85cd1f
	Coefficient: 0x8eccf013f8052824f6db56487575a1fab3a8de2e10ed5fd108bc19146f7496f418fd9424ed53cd639fa466fafea72b33f018415e25cb8fba0455cc8b7633e2fc

במחשב ב':

	# RSA 1024 bits   CompB   Tue Aug 14 20:09:40 2012
	# for signatures only, UNSAFE FOR ENCRYPTION
	#pubkey=0sAQOfY6ESZ4XYotcY8np7DR+3fgRKzwFSgNWOIW0P2d7NryZBkJrisWQL1gw3ZhGf+2wtYGidl1NU9Er74pEwl1f380WsSSPTGg2IqOyDKYqdRWoHQfaNiRUN0Dl8qXsV66oHaO53NvEzu4/deWpVMbEevJMV3IpKu7t5/1jxq7Bc3Q==
	Modulus: 0x9f63a1126785d8a2d718f27a7b0d1fb77e044acf015280d58e216d0fd9decdaf2641909ae2b1640bd60c3766119ffb6c2d60689d975354f44afbe291309757f7f345ac4923d31a0d88a8ec83298a9d456a0741f68d89150dd0397ca97b15ebaa0768ee7736f133bb8fdd796a5531b11ebc9315dc8a4abbbb79ff58f1abb05cdd
	PublicExponent: 0x03
	# everything after this point is secret
	PrivateExponent: 0x03cb83d5c5832fd31d80980f1b4f8cf215493ebbc92ca18b2e0cfc80609daf905c56e4f77f4d5dcf8518abfc55c0c2f04a39270ff15138e13ebcdaba506520920e6d88096e2e10096bc24b42d9fa0a93d081045881402ff003cc75464bce572a0222608eaca7658887f308c971359c08c465032ca4ad57c5f1fa828ae83eff0b
	Prime1: 0xdae4dce6ac88118821a9fa12596d1e7acd9f67f52e73a1f2a9a0d7c29fbe06c6ed72eae8b645f8cd3321dd7e14f705f8fa61a59db470bbd5ae49e3dc71c75acd
	Prime2: 0xba687dd663bc66f9b91e99790d17c28a673d237c2a8d95ba870d675e6b7d97fec0522c262d3492880edc2adfad6f11b5899eeaebd169996c189c0a4b1f932a51
	Exponent1: 0x91ede899c85ab65ac11bfc0c3b9e1451de6a454e1ef7c14c7115e52c6a7eaf2f48f74745ced95088ccc13e540dfa03fb51966e6922f5d28e74314292f684e733
	Exponent2: 0x7c45a93997d2ef5126146650b3652c5c44d36cfd71b3b92704b39a3ef253baa9d58c1d6ec8cdb7055f3d71ea739f6123b1149c9d36466648106806dcbfb7718b
	Coefficient: 0x9fc9a455e664146615d857902d4c3afb105f11865180a152d41ab886bc62a4af81db9409eda16ba93e4ec9928fa7ce80d24397253d10a5b981f8309078fbe1eb

כפי שניתן לראות הקובץ מורכב מהמפתח הפרטי (מתחיל ב-#pubkey=) והמפתח הפרטי (מופיע לאחר האזהרה # everything after this point is secret). עכשיו נותר לנו להגדיר את השרת מפתחות ואת המפתחות עצמן. נגדיר את הקובץ /etc/ipsec.conf בכל מחשב. מחשב א':

config setup
	nat_traversal=no
	oe=off
	protostack=netkey

conn compAB
	left=192.168.1.1
	right=192.168.2.2
	auto=add
        authby=rsasig
        leftrsasigkey=0sAQNot8i2xjQAvKkJVUv9K6lnFtIEFGwQYtW0PLgM4uJoQL88V1S7BuXeLRODDv3AQ0MyOMbiqn3mipfrT1oTdj7f9Rk3K1RdLtsl/jQ2dFseKV5nfLfafOgxuY+qYgmk0PSOKRwoelvtJG9ANWiEvGCsbnlzZpJhB2Bh7e2A7xFmRw==
	rightrsasigkey=0sAQOfY6ESZ4XYotcY8np7DR+3fgRKzwFSgNWOIW0P2d7NryZBkJrisWQL1gw3ZhGf+2wtYGidl1NU9Er74pEwl1f380WsSSPTGg2IqOyDKYqdRWoHQfaNiRUN0Dl8qXsV66oHaO53NvEzu4/deWpVMbEevJMV3IpKu7t5/1jxq7Bc3Q==
	ike=aes
	esp=aes

יש לשים לב למספר פרטים, left מתייחס למחשב המקומי, לכן ב-left נכתוב את הכתובת המקומית ב-leftsasigkey את המפתח הפומבי המקומי. right מתייחס למחשב האחר, לכן ב-right נכתוב את הכתובת של מחשב ב' וב-rightsasigkey את המפתח הפומבי שלו. נחזור על אותו תהליך (עם היפוך בתפקידים) עם מחשב ב':

config setup
	nat_traversal=no
	oe=off
	protostack=netkey

conn compBA
	left=192.168.2.2
	right=192.168.1.1
	auto=add
        authby=rsasig
        leftrsasigkey=0sAQOfY6ESZ4XYotcY8np7DR+3fgRKzwFSgNWOIW0P2d7NryZBkJrisWQL1gw3ZhGf+2wtYGidl1NU9Er74pEwl1f380WsSSPTGg2IqOyDKYqdRWoHQfaNiRUN0Dl8qXsV66oHaO53NvEzu4/deWpVMbEevJMV3IpKu7t5/1jxq7Bc3Q==
	rightrsasigkey=0sAQNot8i2xjQAvKkJVUv9K6lnFtIEFGwQYtW0PLgM4uJoQL88V1S7BuXeLRODDv3AQ0MyOMbiqn3mipfrT1oTdj7f9Rk3K1RdLtsl/jQ2dFseKV5nfLfafOgxuY+qYgmk0PSOKRwoelvtJG9ANWiEvGCsbnlzZpJhB2Bh7e2A7xFmRw==
	ike=aes
	esp=aes

עכשיו אנחנו צריכים להגדיר את המפתח הפרטי בכל צד, שימו לב שהמפתח יהיה כתוב ב-clear text בקובץ לכן יש לוודא כי רק למנהל מערכת יש הרשאת\כתיבה קריאה אל הקובץ. נערוך את הקובץ /etc/ipsec.secrets במחשב א':

192.168.1.1 192.168.2.2 : RSA {
	PrivateExponent: 0x1173f6c92108aaca1c2c38e1ff8746e683cdab58bcad65ce48b4c9577b25bc0aca8a0e8e1f2bd0fa5cd895d7d4f5608b3309767b1c6a51171951e28f033e5fcfc756fe243eeac73669bc5451832257aa19f5301d8b3cee1ad4fc5e6e8bdcfd7858e1a0ea5980b1cd53e2ed32730c11355d5a3ab5053474cd94402c9682364cf3
	Prime1: 0xb4b980773c51f58a94cd0980620fcd77cce08d37307ea5fcc2dfb9f95138fcfeec2f26e2462bdc224ec86a1e9314aec7d95dbea9b0cff08f0a9d63198c02e4e9
	Prime2: 0x9455c1da9e8a8e0a16c730ccff7d42b4f5c7cecf6690ad93f8c5b9d1713de3238cb02fc81b2be63229263c1b3f5f4aa464fe547ec25659ffddcf7ee055c8b3af
	Exponent1: 0x787baafa2836a3b1b888b100415fde4fddeb08cf75a9c3fdd73fd150e0d0a8a9f2ca19ec2ec7e816df3046bf0cb874853b93d471208aa05f5c68ecbbb2ac989b
	Exponent2: 0x62e3d691bf07095c0f2f75ddffa8d7234e85348a446073b7fb2e7be0f6294217b3201fdabcc7eecc1b6ed2bcd4ea31c2edfee2ff2c3991553e8a54958e85cd1f
	Coefficient: 0x8eccf013f8052824f6db56487575a1fab3a8de2e10ed5fd108bc19146f7496f418fd9424ed53cd639fa466fafea72b33f018415e25cb8fba0455cc8b7633e2fc
	}

נחזור על התהליך עם מחשב ב':

192.168.2.2 192.168.1.1 : RSA {
	PrivateExponent: 0x03cb83d5c5832fd31d80980f1b4f8cf215493ebbc92ca18b2e0cfc80609daf905c56e4f77f4d5dcf8518abfc55c0c2f04a39270ff15138e13ebcdaba506520920e6d88096e2e10096bc24b42d9fa0a93d081045881402ff003cc75464bce572a0222608eaca7658887f308c971359c08c465032ca4ad57c5f1fa828ae83eff0b
	Prime1: 0xdae4dce6ac88118821a9fa12596d1e7acd9f67f52e73a1f2a9a0d7c29fbe06c6ed72eae8b645f8cd3321dd7e14f705f8fa61a59db470bbd5ae49e3dc71c75acd
	Prime2: 0xba687dd663bc66f9b91e99790d17c28a673d237c2a8d95ba870d675e6b7d97fec0522c262d3492880edc2adfad6f11b5899eeaebd169996c189c0a4b1f932a51
	Exponent1: 0x91ede899c85ab65ac11bfc0c3b9e1451de6a454e1ef7c14c7115e52c6a7eaf2f48f74745ced95088ccc13e540dfa03fb51966e6922f5d28e74314292f684e733
	Exponent2: 0x7c45a93997d2ef5126146650b3652c5c44d36cfd71b3b92704b39a3ef253baa9d58c1d6ec8cdb7055f3d71ea739f6123b1149c9d36466648106806dcbfb7718b
	Coefficient: 0x9fc9a455e664146615d857902d4c3afb105f11865180a152d41ab886bc62a4af81db9409eda16ba93e4ec9928fa7ce80d24397253d10a5b981f8309078fbe1eb
	}

לסיום נותר לנו לאתחל את השירות בכל מחשב, ולאתחל את הדו-שיח המוצפן באחד מהמחשבים:

/etc/init.d/ipsec restart
ipsec auto --up compAB

בכדי לבדוק אם הדו-שיח מוצפן, אנחנו נאזין על האמצעי עם tcpdump ונשלח 'פינג' אל המחשב השני, אנחנו נראה ב-tcpdump את הפרוטוקול ESP כחלק מהדו-שיח בין המחשבים:

ping 192.168.2.2
tcpdump -i eth0

מקורות:
http://www.faqs.org/docs/securing/chap25sec205.html
http://wiki.debian.org/HowTo/openswan

:, , , ,
2 תגובות:
  1. Fate

    איזה תעבורה זה מצפין? כל דבר מעל Ethernet?
    או שיש לו פרוטוקולים מסויימים שהוא יודע לנתב?

  2. iTK98

    ההצפנה היא ברמת ה-IP layer. יש שני מצבים, Transport Mode ו-Tunnel Mode, כאשר השני הוא ברירת המחדל (בלינוקס בכל אופן). המצב הראשון מצפין אך ורק את ה-payload (דאטה) ואפשרי להגדיר פורטים מסויימים שאליהם ה-payload יהיה מוצפן (בחלונות). במצב השני יש גם כן הצפנה של ה-header, ולמעשה יש תעלה מוצפנת בין הצדדים כאשר כל התקשורת IP מוצפנת בניהם.

השאר תגובה

מחפש משהו?

תשתמש בטופס למטה כדי לחפש באתר: