הצפנת דו-שיח בין מחשבים בעזרת IPSec
מאת iTK98 בתאריך 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
15/08/12 בשעה 21:21
איזה תעבורה זה מצפין? כל דבר מעל Ethernet?
או שיש לו פרוטוקולים מסויימים שהוא יודע לנתב?
16/08/12 בשעה 1:39
ההצפנה היא ברמת ה-IP layer. יש שני מצבים, Transport Mode ו-Tunnel Mode, כאשר השני הוא ברירת המחדל (בלינוקס בכל אופן). המצב הראשון מצפין אך ורק את ה-payload (דאטה) ואפשרי להגדיר פורטים מסויימים שאליהם ה-payload יהיה מוצפן (בחלונות). במצב השני יש גם כן הצפנה של ה-header, ולמעשה יש תעלה מוצפנת בין הצדדים כאשר כל התקשורת IP מוצפנת בניהם.