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

תיעול 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, כמו גם גישה ממערכות אחרות.