ארכיון תגיות: SSH

תיעול VNC על SSH

המגרעה הגדולה ביותר של VNC היא בנושא האבטחה. בניגוד למערכות אחרות, האימות מול VNC מתבצע עם סיסמה שנשלחת ללא הצפנה. הפתרון הפשוט ביותר הוא לדרוש אישור על הפעלת ההשתלטות מהמשתמש שנמצא ליד המשתמש הנשלט, אך כאשר בלינוקס עסקינן המצב קצת שונה לאור העובדה שההשתלטות לא תהיה בהכרח על שולחן העבודה של המשתמש הפעיל אלא תשמש להרמת סביבת עבודה נפרדת בדומה ל־Terminal Services של Microsoft Windows.

ל־VNC ישנן מספר תוכנות לקוח שמוסיפות הצפנה לפרוטוקול, אך לא תמיד בגירסה החופשית. לכל אחת מהן סטנדרטים משלה להצפנת התעבורה ואבטחת הקישור, והדבר יוצר מצב של חוסר תאימות בין תוכנה אחת לאחרת. רק לפני מספר ימים קרה לי שלא הצלחתי לתקשר מול אדם שמשתמש ב־UltraVNC מהסיבה הפשוטה ששם כברירת מחדל נדרש אימות מול ה־NTLM של ווינדוס, מה שלא נתמך כלל בתוכנת הלקוח הרגילה.

משתמשי לינוקס רבים נעזרים ב־OpenSSH כדי לבצע אימות הקישור ולספק הצפנה ברמה נאותה. OpenSSH מגיע עם מרבית הפצות של לינוקס וזמין במאגרים של האחרות, כך שמדובר פה בפתרון סביר בהחלט. לרוב אין שימוש ב־sshd על תחנות ווינדוס, אבל כאשר מתקשרים מול תחנת לינוקס ניתן ואף מומלץ להיעזר בהצפנה של ה־ssh שנמצא בצד המרוחק.

הגדרת חשבון ייעודי

SSH עושה שימוש במערכת המשתמשים של לינוקס; משמעות הדבר שנצטרך להגדיר סיסמה עבור ההתחברות של לקוח ה־SSH על התחנה שלנו, בהנחה ואיננו מעוניינים שהמשתמש המרוחק יתחבר לתחנה עם שם המשתמש שלנו (הדבר איננו דרוש כאשר מדובר במשתמש שמעוניין לעבוד על שולחן העבודה שלו מרחוק).

$ sudo adduser support
Adding user `support' ...
Enter new UNIX password: Pa55W0RD
Retype new UNIX password: Pa55W0RD
Is the information correct? [y/N] y

לאחר מכן, יש לנו על המחשב חשבון מיוחד לצרכי תמיכה. אם נרצה להגביל את השימוש בחשבון זה, נוכל לעשות זאת באמצעות ההגדרה של החשבון ככזה שלא ניתן לקבל שרותי shell באמצעותו (ובכך גם נחסום את השימוש שלו בתור שרת scp/sftp). כדי לעשות זאת נחליף את ה־shell של המשתמש למשהו אחר מ־bash.

בעיקרון ניתן להכניס כל תוכנה בתור ה־shell של המשתמש. למשל, אם נשים fortune, יופיע טקסט כלשהו לאחר ההתחברות. פקודה כמו cat תאפשר הצגה של הטקסט הנקלט, ופקודה בסגנון false תדאג לנתק את המשתמש מיד לאחר שהוא מתחבר.

$ sudo chsh support -s /bin/false

שימו לב: ניתן להריץ דרך SSH אפליקציות חיצוניות כאשר מדובר בתוכנת shell (מועבר הפרמטר ‪-c <command>‬). כדאי לוודא שהתוכנה שאנו מגדירים בתור shell לא כוללת במקרה יכולות הרצה של תוכנות חיצוניות. בנוסף, דבר זה עשוי למנוע התחברות למערכת הקבצים באמצעות scp או sftp.

יצירת הקשר

כדאי להתחבר לשרת המרוחק אנו צריכים להגדיר את הצינור דרכו יועברו הנתונים. בקצרה, נעשה זאת באמצעות הרצת הפקודה הבאה במחשב הלקוח –

ssh support@example.com -L 2202:127.0.0.1:5900 -nNT

הפרמטר ‎-L מגדיר את החיבור; מפורט 2202 מקומית במחשב שלנו, אל פורט 5900 במחשב היעד. הניתוב מתבצע מקומית במחשב אליו אנו מתחברים, כך ש־127.0.0.1 מהווה במקרה הזה את השרת המרוחק. (למעוניינים – לפני זמן מה כתבתי בהרחבה על ניתוב פורטים ב־SSH)

הפרמטר ‎-nNT אומר לתוכנה לא לנתב את הקלט של stdin אל ‎/dev/null ‏(‪-n‬),לא להריץ את ה־shell ‏(‪-N‬), ולא להקצות שירותי מסוף לקישור (‪-T‬), כך שאנחנו מסיימים עם שירותי ניתוב פורטים בלבד.

ההתחברות

לאחר שיש לנו ניתוב פעיל, כל מה שנותר לנו לעשות הוא להריץ את תוכנת הלקוח של VNC על המחשב המקומי, ולהתחבר לפורט המנותב.

vncviewer 127.0.0.1:2202

אם על השרת רצה תוכנת VNC, נתבקש להזין סיסמה להתחברות לממשק הגרפי, ומיד לאחר מכן נוכל לראות את שולחן העבודה המרוחק.

למרות שגם SSH וגם VNC הם רכיבים סטנדרטיים במערכות Linux, חשוב לזכור כי לשילוב בניהם יש מגבלויות מסוימות. SSH מיועד עבור משתמשים מאומתים ולא עבור משתמשים מזדמנים. יכולת ניתוב הפורטים של SSH חזקה מאד, וברגע שגישה למערכת כזו מגיעה לידים זרות אנו למעשה מאפשרים להם גישה מלאה לתוך הרשת הפנימית שלנו, ללא שום יכולות בקרה ושליטה מקומיות מספקות. בהמשך אציג פתרונות נוספים לשימוש ב־VNC, כמו גם גישה ממערכות אחרות.

גישה לרשתות מוגבלות באמצעות SSH

אחד הדברים הנחמדים ב־openssh הוא שאפשר לעשות עם התוכנה הרבה יותר מאשר להתחבר למסופים מרוחקים. באמצעות SSH באפשרותנו לתעל תעבורה מרשת האינטרנט לתוך רשת מוגבלת ולהיפך, ולעקוף כל הגנה שאנשים שמים לנו בדרך.

בעבר כתבתי פוסט ארוך על פעולות שאפשר לעשות באמצעות SSH, ולא הזכרתי שהמערכת מאפשרת גם להיכנס לתוך רשתות מוגבלות מבחוץ באמצעות הפעלה של המערכת בכיוון ההפוך. ולמה אני כותב את כל זה? מהסיבה שמ' (השם המלא שמור במערכת. הקישור לא) הכריחה אותי לכתוב על זה.

נניח שברשותנו מכונה אחת שנמצאת ברשת מוגנת, ומכונה נוספת שנמצאת מחוץ לאותה הרשת. במרבית המקרים נוכל להיכנס להגדרות ציוד התקשורת ולאפשר גישה כלשהי לתוך אותה הרשת, אך במידה ואין באפשרותנו לעשות זאת אנו נקלע לקשיים. פה נכנס לעזרתנו SSH.

ל־OpenSSH ישנם שני מצבי פעולה עיקריים בכל הקשור לשימוש במשאבי רשתות מוגבלות גישה – גישה לרשת המוגבלת מבחוץ, כאשר השרת שמריץ את sshd נמצא בתוך הרשת המוגבלת אך ניתן להתחבר אליו מבחוץ (אזור מפורז), ופעולה הפוכה של נתינת הרשאות גישה לרשת באמצעות מכונה מבפנים שמתחברת למכונה שנמצאת מחוץ לרשת.

כאשר מדובר על שימוש בסיסי אנחנו עושים זאת באמצעות ניתוב פורטים מסויימים בין המחשבים השונים ברשת. האפשרויות המתקדמות יותר עוסקות בניתוב שתי רשתות LAN דרך קישור מאובטח של OpenSSH, ויוצרות קשיי אבטחה ממשיים מהסיבה שמנהל הרשת שחסומה באמצעות חומת האש יתקשה לשלוט בתעבורה שמגיעה מכיוון הרשת האחרת, אם בכלל תהיה לו אפשרות לעשות זאת.

הדבר הפשוט ביותר שאנו נרצה לעשות הוא גישה לרשת הפנימית מבחוץ. אנחנו מעוניינים להתחבר לשרת שנמצא ברשת המוגנת (שרותי דוא"ל לצורך העניין), אך לא יכולים להתחבר אליו ישירות. לצורך העניין נדאג מראש לשרת SSH שנמצא בתוך הרשת המוגנת בשילוב של Firewall שיאפשר תקשורת נכנסת לשרת. לאחר הזדהות מול ה־SSH נוכל להגדיר פורט שינתב תקשורת מהמחשב שלנו לשרת המרוחק.

נריץ על המחשב שלנו את הפקודה הבאה:

$ ssh tomer@shell.example.net -L 1100:mail.example.net:110

בצורה כזו נוכל להתחבר לשרת הדואר המרוחק (במקרה הזה POP3) באמצעות גישה לפורט 1100 על המחשב שלנו.

מה שעושה הפקודה הזו היא לפתוח פורט על המחשב שלנו (מעל 1024 בהנחה והתוכנה לא הופעלה תחת root), שנוכל להתחבר דרכו לשירות הדואר שלנו עם שכבת האבטחה של SSH. במידה ונרצה לאפשר גם למחשבים אחרים להתחבר לשירות הזה דרכנו, נציין את הממשק המקומי של כרטיס הרשת הנבחר –

$ ssh tomer@shell.example.net -L 10.0.0.1:1100:mail.example.net:110

זהירות! ברגע שאנחנו מאפשרים גישה לאחרים לשירות שנמצא על רשת סגורה, אנחנו למעשה חושפים את השירות לעולם החיצון. לא בטוח שמנהל הרשת שלכם ישמח אם תעשו את זה. כמו כן, אסור לשכוח כי כל התעבורה לשרת המאובטח עוברת למעשה דרכנו, ומזוהה עם הפרטים שלנו; כשירצו לבוא למישהו בטענות – אנחנו נהיה הראשונים.

במקרים מסויימים אין לנו הרשאות להגדיר שירותים בתוך הרשת הממוגנת, ואנחנו צריכים להיכנס אליה מבחוץ. גם זה אפשרי עם SSH בהנחה ונוכל להפעיל את התוכנה ממחשב שנמצא בתוך אותה רשת. בתוך הרשת נריץ את הפקודה הבאה –

$ ssh tomer@home.example.com -R 2202:127.0.0.1:5900

כאשר מופעלת הפקודה הזו על עמדה כלשהי ברשת המוגנת היא תתקשר למחשב שנמצא מחוץ לרשת שלנו, ותגדיר עליו מיפוי בין פורט 2202 במחשב המרוחק לפורט 5900 (vnc-server) במחשב שלנו (127.0.0.1) שנמצא בתוך הרשת המוגנת. בצורה כזו נוכל לאפשר לאדם שיושב במחשב המרוחק להתחבר לשירותים שמותקנים על העמדה שלנו ואינם נגישים מבחוץ. מאחר ויוזם התקשורת הוא מחשב שנמצא בתוך הרשת המאובטחת התקשורת לא נחסמת על־ידי חומת האש.

בדרך דומה ניתן להרים עורקי תקשורת מאובטחים גם לשירותים אחרים בתוך הרשת הפנימית. למשל, ניתן לקשר את שירות הדואר הפנימי שלנו למחשב שנגיש מבחוץ, מבלי שיש לנו שום פתח כניסה לרשת הפנימית מבחוץ או שרת SSH שרץ על מחשב כלשהו ברשת המאובטחת.

שימושים להקמת ערוצי תקשורת מאובטחים: גישה לשירותים שאינם נגישים למשתמשים ברשת הארגונית, מתן גישה לשירותים מקומיים למשתמשים מרוחקים, עקיפה של חסימות תכנים ואתרים, מתן שכבת אבטחה לשירותים שאינם כוללים אמצעי הצפנה מובנים.

ניתוב פורטים באמצעות SSH איננו נחוץ כאשר אין צורך בהצפנת נתונים, אימות המשתמש שמתחבר לפורט המנותב ובמקרים בהם קיים פתרון פשוט יותר למשימה (למשל שימוש בשרת FTP מקומי במקום ביכולות העברת הקבצים המובנות של SSH).

גישה מאובטחת לתחנות לינוקס מרוחקות

לכל מערכת הפעלה יש את הכלים שלה לגישה מרחוק. בחלונות יש את ה־WMI שנגיש דרך כלי ה־Computer Management למשל, את rconsole (זמין ב־Windows Resource Kits) שמספק שרותי מסוף מרוחק, את SMB שמאפשר גישה לתיקיות משותפות מרוחקות, ובלינוקס יש את SSH.

SSH, או ליתר דיוק OpenSSH הוא כלי פשוט שמספק שרותי מסוף בדומה ל־telnet שהיה בשימוש בעבר, אך בצורה מאובטחת. השימוש העיקרי של התוכנה הוא לניהול תחנות מרוחקות באמצעות שורת הפקודה, אך התוכנה חזקה ומאפשרת מספר דברים נוספים.

התקנה

במרבית המקרים התוכנה מותקנת ומופעלת כברירת מחדל, וניתן לוודא זאת על־ידי הרצת הפקודה הבאה וקבלת פלט תקין. במידה ומתברר כי התוכנה איננה מופעלת, כדאי לנסות להתקין חבילה בשם ssh-server על המחשב.

$ whereis sshd
sshd: /usr/sbin/sshd /usr/share/man/man8/sshd.8.gz

התחברות לתחנה מרוחקת

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

במידה ונרצה להתחבר עם שם המשתמש הנוכחי, יש צורך לציין רק את שם השרת או כתובתו, ובמידה ונרצה להתחבר בשם משתמש אחר נציין את שמו בתבנית של username@servername.example.net.

$ ssh tomer.example.net
The authenticity of host 'tomer.example.net (192.168.1.1)' can't be established.
RSA key fingerprint is 1f:b9:83:2c:12:bf:98:0d:aa:5c:0f:a8:bb:29:70:d8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'tomer.example.net' (RSA) to the list of known hosts.
tomer@tomer.example.net's password:
tomer@tomer.example.net$

העברת קבצים

SSH אמנם מיועד לספק שרותי מסוף, אך התוכנה מאפשרת הרבה יותר מכך. scp ו־sftp אלו הן שתי תוכנות שמתלבשות על חיבור ה־ssh ומאפשרות העברת קבצים בין המחשב המקומי לשרת המרוחק.

scp

scp היא פקודה בתצורה דומה לשל פקודת העתקת הקבצים cp, עם הבדל פעוט – היא יכולה להעביר את הקבצים מהמחשב המקומי לשרת.

שליחת קובץ לשרת המרוחק:
$ scp dummyfile.txt tomer@tomer.example.net:/home/tomer/temp/
tomer@tomer.example.net's password:
dummyfile.txt 100% 0 0.0KB/s 00:00

משיכת קובץ למחשב המקומי ושינוי שמו:
$ scp tomer.example.net:~/temp/dummyfile.txt new.txt
tomer@tomer.example.net's password:
dummyfile.txt 100% 0 0.0KB/s 00:00

sftp

sftp היא תוכנה דומה לתוכנת לקוח ftp רגילה, שלמעשה רוכבת על־גבי התשתית המאובטחת של ssh. הפקודות דומות לאלו המשמשות לעבודה מול שרתי ftp, ולהבדיל מ־scp כאן ערוץ התקשורת נשאר פתוח לאחר ביצוע הפקודה ומתאים יותר להעברת מספר קבצים ללא הרמת תקשורת נפרדת לכל פעולה.

$ sftp tomer.example.net
Connecting to tomer.example.net...
tomer@tomer.example.net's password:
sftp> cd temp
sftp> put dummyfile.txt
Uploading dummyfile.txt to /home/tomer/temp/dummyfile.txt
dummyfile.txt 100% 0 0.0KB/s 00:00
sftp> put dummyfile.txt anotherfile.txt
Uploading dummyfile.txt to /home/tomer/temp/anotherfile.txt
dummyfile.txt 100% 0 0.0KB/s 00:00
sftp> get anotherfile.txt yetanotherfile.txt
Fetching /home/tomer/temp/anotherfile.txt to yetanotherfile.txt
sftp> exit
$

הפעלת פקודות מרחוק

לעיתים אנו מעוניינים להריץ פקודות באופן אוטומטי מרחוק, לצרכי תחזוקה או שימוש שוטף. ssh יכול לעשות זאת בקלות:
$ ssh tomer@tomer.example.net fortune
tomer@tomer.example.net's password:
Your present plans will be successful.

(fortune היא תוכנה שמציגה טקסט אקראי בכל הרצה)

הזדהות באמצעות מפתח ציבורי

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

יצירת מפתחות אישיים חדשים

כדי להשתמש בתעודות דיגיטליות של SSH יש צורך ליצור קובץ מפתחות. ניתן לעשות זאת באמצעות הפקודה ssh-keygen. חשוב מאד לעשות זאת רק בפעם הראשונה, מאחר ואחרת התוכנה תמחק את קובץ המפתחות הקיים ובכך נאבד את יכולת ההתקשרות מול שרתים אחרים.
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/tomer/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/tomer/.ssh/id_rsa.
Your public key has been saved in /home/tomer/.ssh/id_rsa.pub.
The key fingerprint is:
d2:b8:0f:7d:c2:f7:53:85:21:c0:4b:00:70:75:ef:fa tomer@home.example.net

שימוש במפתחות

הפקודה ssh-keygen יוצרת שני קבצים, id_rsa ו־id_rsa.pub (או id_dsa/id_dsa.pub במידה והשתמשנו באלגוריתם dsa). יש לשמור על קבצים אלו במקום בטוח, שכן הם יכולים לאפשר לאחרים לגשת לשרתים אליהם יש לנו גישה, ומחיקתם תגרום לאיבוד יכולת הגישה לשרתים.

כדי להוסיף אישור הזדהות לשרת, יש צורך להעתיק את קובץ המפתחות הציבורי לשרת לתוך הקובץ ~/.ssh/authorized_keys בשרת.
$ scp id_rsa.pub tomer.example.net:/home/tomer/.ssh/authorized_keys
tomer@tomer.example.net's password:
id_rsa.pub 100% 404 0.4KB/s 00:00

אם הכל הולך כשורה השרת יאפשר הזדהות באמצעות המפתח החל מהכניסה הבאה.

tomer@tomer:~/.ssh$ ssh tomer@tomer.example.net
Linux tomer.example.net 2.6.17-11-386 #2 Thu Feb 1 19:50:13 UTC 2007 i686
tomer@tomer.example.net:~$

כדי לחסוך את הצורך בהזנת הצופן בכל התחברות לשרת, ניתן להיעזר ב־ssh-agent שישמור את הצפנים בזיכרון. בעיקרון מומלץ לא להשתמש במילת צופן ריקה כי אז כל אדם שיצליח לשים ידו על המפתח הפרטי שלנו יקבל גישה לכל השרתים שבאחריותנו.

שימוש ב־SSH לקבלת שירותים מרשת מאובטחת

SSH יכול לשמש גם כפתרון גישה לשרתים שאינם מאובטחים. נניח כי במקום העבודה קיים שרת דוא"ל מסוג POP3 שאיננו נגיש מהרשת החצונית, ושרת נפרד עם שירות SSH שניתן לניהול מרחוק. ניתן באמצעות SSH להקים ערוץ תקשורת מאובטח בין המחשב שלנו לשרת ה־SSH, ודרכו לעבור לשרת הדואר הפנימי.

$ ssh -L 1234:mail.example.net tomer@shell.example.net
בצורה כזו, נוכל להתחבר באמצעות לקוח דוא"ל סטנדרטי לשרת דוא"ל על־גבי ערוץ תקשורת מאובטח בנינו לבין הרשת הארגונית, כאשר פורט 1234 במחשב שלנו (localhost:1234) למעשה מקושר לשרת הדואר המרוחק. גישה לפורט המקושר (1234 במקרה שלנו) תהיה זמינה רק למחשב המקומי כל עוד לא צויין הפרמטר ‎-g‏.

שימוש שכיח לקישורי SSH מאובטחים הוא להשתמש בתוכנת vnc לצורך קבלת שרותי עבודה מרחוק, והצפנת התעבורה באמצעות ssh.

לקוחות ssh נוספים

בווינדוס אין תוכנת לקוח ssh כברירת מחדל, אך זה איננו אומר כי אין תוכנות שיכולות לבצע את העבודה בצורה טובה.

  • PuTTY היא תוכנה חלונאית שיכולה להתחבר לשרתי ssh (וגם כוללת תוכנת telnet אם מישהו באמת צריך), וכוללת גם מספר תוכנות מבוססות שורת הפקודה נוספות. לתוכנה קיים היסב גם ללינוקס, אך אין יתרון ממשי ללקוח זה בלינוקס.
  • WinSCP היא תוכנה גרפית לגישה לקבצים מרוחקים באמצעות scp/sftp. חלונות בלבד.
  • במערכת לינוקס כמעט לכל סביבת עבודה קיימות יכולות גישה לשרתי SSH ללא התקנת תוספות מיוחדות. למשל, לפתיחת קובץ לעריכה עם gedit כל שנתבקש לעשות הוא לציין את מיקום הקובץ המרוחק בפרוטוקול ssh.$ gedit ssh://tomer:/tmp/dummyfile.txt