הקשחת מערכת LINUX
ובכן, בהשוואה למערכות הפעלה אחרות, אין כל ספק כי Linux הינה מערכת הפעלה מאובטחת יותר יחסית ל-Windows, למשל. כידוע או לא, לב ליבה של ה- Linux מורכב מהגרעין (קרנל – Kernel) ואוסף כלים שמרכיבים בעצם את מערכת ההפעלה – ביחד הם מרכיבים את ה"משטח" עליו רצים תוכנות וכלים. קרנל המערכת מבוסס קוד-פתוח (כמו גם רוב כלי אבטחת המידע הקיימים כיום), מה שמאפשר לחבר'ה כמוני וכמוך לזהות חולשות, להתריע ולתקן. בנוסף, מספר גדול וגדל של תוספי אבטחה ("פיצ'רים") מוטמעים בקרנל ושינויים חיוניים בקוד הקרנל מתבצעים מדי יום. Linux מעניקה יכולת מרשימה על בקרת הגישות (מי "שולט" על מי, אילו משאבים משתמש יכול לגשת ועוד). אז, איפה הסיכונים פה?
כמו שספרה של ג'ניפר טרייג מצהיר: "השטן נמצא בפרטים הקטנים" – כאן התשובה. אבטחת המערכת תלויה באופן רוחבי בתצורת (הגדרות) אלמנטים ברובד המערכתי והאפליקטיבי. Linux והקרנל הינם רכיבים מורכבים מאוד ולעתים קרובות – קשה להגדירם באופן "ידני". אבטחת מידע ב-Linux לעולם לא סטטית. ככל שתשתמשו במערכת – כך רמת אבטחתו תרד; שינוי תפעול של פונקציות מסוימות עלול לחשוף את המערכת לאיומים מצד חולשות חדשות המתגלות מדי יום כנגד תוכנות ושירותי מערכת. אם זה לא מספיק – המון הפצות (Distribution) מגיעות עם תוכנות ותצורות מוגדרות מראש התלויות בידע של המפיץ ובמטרת ההפצה (יש הפצות שמכוונות למשתמשים ביתיים, למנהלי מערכת, חוקרי פשעי מחשב ועוד…).
התקנת הפצת המערכת
אם באבטחת מידע עסקינן, התקנת מערכת Linux (הפצה מסוימת) בברירת מחדלה – הינה צעד לא חכם במיוחד; תוכנות רבות ולעתים לא מתאימות – מותקנות, משתמשים לא נחוצים – נוצרים, ואם לא די בכך – החלטות תצורה שגויות מתקבלות.
החלטות תצורה
כמעט בכל מהלך התקנה של הפצת Linux כזו או אחרת – תישאלו לגבי תצורת המערכת. בד"כ אלו שאלות חיוניות וחשובות לגבי אבטחת המערכת שלכם. להלן כמה מהמלצותיי:
- אם תישאלו להזין סיסמה למשתמש root – תמיד תבחרו בסיסמה חזקה [לינק].
- צרו משתמש בנוסף למשתמש root – והזינו סיסמה שתהיה לכל הפחות – סבירה.
- אם תישאלו במהלך ההתקנה על התקנת חומת אש ואפשרות ל- SELinux – אשרו והתקינו.
- למרות שכיום זהו ברירת מחדל – לאפשר הצפנת סיסמאות (MD5) ו-Shadowing.
מינימליזם כדרך חיים
התקינו רק מה שאתם צריכים. אם הפצה מסוימת מציעה אפשרות להתקנה מינימלית או מוגדרת אישית – בחרו באחת האפשרויות הנ"ל. כאמור, ככל שמותקנות תוכנות (או packages ליתר דיוק), כך סביר שהמערכת תהיה חשופה לחולשות. אם כך וברצונכם להבטיח התקנת מערכת מאובטחת באופן מרבי ביותר, אני ממליץ להסיר את ה-packages הבאים:
- משחקים.
- שרתים (או שירותי רשת).
- דימונים (daemons) ושירותים נוספים.
- תוכנות וכלים סטייל "אופיס".
- כלים ותוכנות להדפסה.
- בסיסי נתונים.
- X-Windows (שרת ממשק גרפי) וסוגיו (Gnome/KDE).
מערכת Linux פרודוקטיבית אינה צריכה להכיל ממשק גרפי. X-Windows הינה חבילה ענקית המכילה מספר גדול של רכיבים ולהם היסטוריה של חולשות שהתגלו. בשונה מ-Windows, כל הגדרה במערכת יכולה להיעשות דרך ממשק שורת פקודה ( command line ).
הקפידו להתקין את הגרסה העדכנית ביותר של אותה הפצה, אם התקבל לידיכם גרסה ישנה – אין להתחבר לאינטרנט עד שמתקינים את כל ה-patches וה-fixes הקיימים עת ההתקנה. תקראו לי פרנואיד, אבל באבטחת מידע כמו באבטחת מידע – התזמון הוא פקטור קריטי; אם התקנתם מערכת ישנה, קיים פער של זמן עד השלמת התקנת כל העדכונים וה-patches החיוניים. בזמן זה, עת אתם מחוברים לאינטרנט והמערכת לא מעודכנת – מספיק כי תוקף "יתפוס" אתכם בעת סריקתו כדי לנצל חולשות ידועות.
בנוסף, עת סיום הורדת ההפצה, יש להבטיח את שלמותה; השוואת חתימת ה-MD5 תבטיח כי הקובץ שירד לא שונה, והוא זה שבאמת התכוונו להוריד. אמחיש בקצרה: נניח כי ברצוננו להוריד את קובץ ההתקנה של הפצת Debian, תחילה, אוודה כי אני מוריד את הגרסה העדכנית ביותר המתאימה לארכיטקטורת המעבד שלי ולנפח זיכרון ה-RAMבמחשבי (64 ביט לזיכרון בנפח 4GB ומעלה). מאתר ההפצה של Debian, אגיע לכתובת הבאה:http://cdimage.debian.org/debian-cd/current/amd64/iso-cd/ .
לאחר הורדת הקובץ, אכנס ל-MD5SUMS ואבדוק (בעזרת תוכנה כגון WinMD5) או פקודת md5sum בלינוקס אם החתימה של הקובץ תואמת לזו המוצגת ב-MD5SUMS:
אבטחת ה- Boot Loaders
תוקף הנגיש פיזית למערכת שלכם יכול בקלות לעקוף את מנגנוני האבטחה הפנימיים של המערכת (במיוחד בבקרות כניסה של שם משתמש וסיסמא). בנוסף, הוא יכול לבצע אתחול (אם אין הגנה על ה-BIOS) או לשנות את תצורת האתחול של המערכת ואת תהליך ה-init (המגדיר אילו שירותים, פקודות וכלים ירוצו בעת האתחול). תוקפים המסוגלים לאתחל את המערכת יוצרים שתי בעיות גדולות: האחת היא האפשרויות הרבות שמערכת Linux מעניקה לאלו המסוגלים לאתחל אותה. השנייה היא מניעת שירות ע"י אתחול לא רצוי.
רוב הפצות ה-Linux עושות שימוש באחד משני ה-Boot loaders : ה-LILO (Linux loader, פעם היה loader ברירת המחדל של Linux) ו-Grub (החליף את ה-LILO וכיום הוא ברירת המחדל ברוב הפצות ה-Linux). Boot Loaders נטענים אחרי פעולת ה-BIOS של המחשב ומעניקים שליטה על בחירת הקרנל הרצוי ובקרה על ה- Boot images. בעת עדכון קרנל, ה-Boot loader יציג את כל גרסאות הקרנל שהותקנו – כולל אלו שאינם מעודכנים. בכללי, מומלץ שלא יהיו הרבה גרסאות קרנל מותקנות – במיוחד לא גרסאות ישנות. לכן, מומלץ להסיר את אותן גרסאות מרשימת הקרנלים ב-Boot loader
Grub מכילה פיצ'רים רבים יותר מ-LILO, מעודכנת יותר ולכן גם מאובטחת יותר. למרות זאת, ברירת המחדל של Grub היא לאפשר לכולם לאתחל את המערכת במצב Single-user mode או לשנות פרמטרי אתחול שונים. בשונה מ-LILO, Grub יכולה להתמודד עם אירועים מסוג זה ע"י בקרת גישה מבוססת סיסמה (מוצפנת SHA512).
הגנת Grub ע"י סיסמה
1) הזינו את הפקודה הבאה: grub-mkpasswd-pbkdf2 , הזינו סיסמא והעתיקו את הפלט המוצפן.
2) ערכו את הקובץ /etc/grub.d/40_custom וצרו שתי שורות:
שירותי אתחול, Init וסדר האתחול
אציג בטבלה את שירותי האתחול במערכת (מתאימה ברובה ל-Debian אך גם רוב הפצות ה-Linux עושות שימוש בשירותים דומים)
שירותי אתחול, Init וסדר האתחול
אציג בטבלה את שירותי האתחול במערכת (מתאימה ברובה ל-Debian אך גם רוב הפצות ה-Linux עושות שימוש בשירותים דומים)
שם השירות | תיאור | מומלץ להסיר? |
acpid | יישום תקן ACPI להגדרת התקנים וניהול צריכת חשמל | לא |
anacron | בדומה ל-cron, רק שההנחה היא כי המחשב לא פועל באופן רצוף – כלומר, משמש מחשבים שלא פועלים 24 שעות ביום ומעניק יכולת בקרה לביצוע משימות הנשלטות ע"י cron בתדירות יומית, שבועית או חודשית. | כן – במחשבים שאינם שרתים. |
apmd | דור קודם של יישום ACPI ומותקן בד"כ במחשבים ישנים. אם הותקן acpid – מומלץ להסירו. | כן |
auditd | The Linux Audit daemon. אחראי לכתיבת רשומות ביקורת (או הערכה) של המערכת. | לא להסיר. מומלץ להגדירו. |
atd | כן | |
autofs | Automount | כן |
crond | שירות cron | לא |
cups | פונקציות מדפסת | כן |
functions | פונקציות לסקריפטים מבוססי shell-script | לא |
gpm | תמיכת עכבר ליישומי טקסט | כן |
irda | תמיכה ל-IrDA | כן |
isdn | תמיכה ל-ISDN | כן |
keytable | מיפוי מקלדת | לא |
kudzu | זיהוי חומרה | כן |
lpd | שירות lpd למדפסות | כן |
netfs | Mount network file systems | כן |
nfslock | נעילת שירותי ה-NFS | כן |
ntpd | שירות שעון מבוסס רשת | לא |
pcmcia | תמיכה ל-PCMCIA | כן |
portmap | תמיכה לחיבורי RPC | כן |
random | לכידת אירועים אקראיים | לא |
rawdevices | הקצאת התקנים | כן |
rhnsd | שירות הרשת של Red hat | כן |
snmpd | שירות SNMP | כן |
sshd | שירות SSH | לא |
winbind | תמיכה ל-Samba | כן |
xfs | X font server | כן |
ypbind | NIS/YP client support | כן |
מסך התחברות (Login Screen)
מסך ההתחברות הינו הדבר הראשון שמשתמשי המערכת (או התוקפים) רואים עת הם מתחברים למערכת. כחלק ממדיניות אבטחת המידע שלכם, יש להציג למשתמשים מספר אזהרות והנחיות לפני התחברותם. דוגמה לכך תהיה:
- אזהרה בדבר חיבור לא מורשה למערכת.
- כחלק מעקרון "אבטחה באמצעות עמימות" (Security Through Obscurity), יש להבטיח כי גרסת מערכת ההפעלה תוסתר, סוג הפצת המערכת וכמו כן גם גרסת הקרנל. בברירת המחדל, רוב מערכות ההפעלה יציגו את הנ"ל. חשוב מאוד לתקן זאת.
- יש לוודא כי מסך ההתחברות יהיה "נקי" ויאפס טקסטים ופקודות שנכתבו לפני יציאה מהמערכת.
איך נעשה את זה?
יש לערוך את קובץ /etc/issue.net ו-/etc/issue . הקבצים הנ"ל יוצגו בעת התחברות המשתמש לטרמינל.
תחילה, יש לוודא כי מסך ההתחברות יהיה נקי. הזנת פקודת clear אל תוך קובץ ה-/etc/issue ו-/etc/issue.net – תעשה את העבודה:
root@maor-debian:/home/maor# clear > /etc/issue.net
כעת, נוסיף הודעת אזהרה לפני ההתחברות. כאמור, הטקסט מוזן לקובצי ה-issue. דוגמה להודעה:
לאחר אימות המשתמש והתחברות למערכת, יוצג ה-/etc/motd (Message Of The Day) . גם הוא קובץ טקסט המאפשר להציג אזהרות, נהלים והנחיות למשתמשים שהתחברו בהצלחה למערכת.
ננעל את הקבצים הנ"ל כך שלא יהיו ניתנים לשינוי:
root@maor-debian:/# chown root:root /etc/issue.net /etc/issue /etc/motd
root@maor-debian:/# chmod 0600 /etc/issue.net /etc/issue /etc/motd
משתמשים וקבוצות
נדבך עיקרי באבטחת מערכות הינו אבטחה של נתוני התחברות (קרי שמות משתמש וסיסמאות). מטרתנו כמובן, היא להבטיח כי רק משתמשים מורשים יהיו מסוגלים להתחבר למערכת וכן למנוע מהתוקף גילוי (וניחוש) סיסמאות חלשות.
לינוקס שומרת נתונים אודות משתמשים וקבוצות ב-3 קבצים: /etc/passwd, /etc/shadow, /etc/group .
/etc/passwd מכיל רשימה של כל משתמשי המערכת ומאפיינם:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
מבנה רשומה בנוי כדלקמן:
username:password:UID:GID:comments:Home Directory:Shell
הקשחת שירות ה-SSH
כעת, נקשיח את שרת ה-SSH הנפוץ במערכות linux. תחילה, "נכריח" את השרת להקשיב לכתובת ספציפית אחתולא לכל הכתובות (שכנראה) מוגדרות במערכת. כמובן, נחסום גישת root ישירה כיוון שאנו רוצים שכל משתמש יתחבר דרך חשבונו בלבד (ואם הם צריכים גישת root לפעולות מסוימות – נגדיר su עבורם.
בנוסף, נבטל את האפשרות לאימות ע"י סיסמה – כלומר, הדרך היחידה להתחבר לשרת תהיה ע"פ האימות התקני של פרוטוקול ה-SSH (הווה אומר – מפתחות ציבוריים).
לפרנואידים ממש – נשנה גם את פורט הגישה לפרוטוקול.
שינוי הגדרות שרת ה-SSH מתבצע ע"י עריכת קובץ ההגדרה: /etc/ssh/sshd_config :
# Package generated configuration file # See the sshd(8) manpage for details # What ports, IPs and protocols we listen for Port 2289 #שינוי הפורט # Use these options to restrict which interfaces/protocols sshd will bind to #ListenAddress :: #ListenAddress 0.0.0.0 ListenAddress 192.168.2.10 #הגדרת כתובת ספציפית אחת Protocol 2 # HostKeys for protocol version 2 HostKey /etc/ssh/ssh_host_rsa_key #הגדרת מפתחות ציבוריים של קליינטים HostKey /etc/ssh/ssh_host_dsa_key #Privilege Separation is turned on for security UsePrivilegeSeparation yes # Lifetime and size of ephemeral version 1 server key KeyRegenerationInterval 3600 ServerKeyBits 768 # Logging SyslogFacility AUTH LogLevel INFO # Authentication: LoginGraceTime 120 #PermitRootLogin yes PermitRootLogin no #ביטול התחברות ישירה של חשבון מנהל StrictModes yes RSAAuthentication yes PubkeyAuthentication yes #AuthorizedKeysFile %h/.ssh/authorized_keys # Don't read the user's ~/.rhosts and ~/.shosts files IgnoreRhosts yes # For this to work you will also need host keys in /etc/ssh_known_hosts RhostsRSAAuthentication no # similar for protocol version 2 HostbasedAuthentication no # Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication #IgnoreUserKnownHosts yes # To enable empty passwords, change to yes (NOT RECOMMENDED) PermitEmptyPasswords no # Change to yes to enable challenge-response passwords (beware issues with # some PAM modules and threads) ChallengeResponseAuthentication no # Change to no to disable tunnelled clear text passwords #PasswordAuthentication yes PasswordAuthentication no # Kerberos options #KerberosAuthentication no #KerberosGetAFSToken no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes # GSSAPI options #GSSAPIAuthentication no #GSSAPICleanupCredentials yes # Deactivate port forwarding AllowTcpForwarding no #X11Forwarding yes X11Forwarding no X11DisplayOffset 10 PrintMotd no PrintLastLog yes TCPKeepAlive yes #UseLogin no #MaxStartups 10:30:60 #Banner /etc/issue.net Banner /etc/issue # Allow client to pass locale environment variables AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server UsePAM yes |
הגדרת SUDO
SUDO הינו יישום המעניק גמישות בבקרת הגישה המצויה במערכות לינוקס. היישום "מחליף" את מודל ה-root or nothing ומעניקה למנהל המערכת אפשרות להקצות הרשאת root לפקודות מסוימות במערכת ללא הצורך בסיסמת ה-root. קובץ ההגדרות של SUDO נמצא ב-/etc/sudoers אבל עריכתו חייבת להיעשות באמצעות פקודת ה-visudo.
גישה מלאה
הפעולה הבאה מעניקה הרשאה מלאה – קרי root למשתמש maor, לכן שימו לב למי אתם מעניקים גישה שכזו.
root@maor-debian# visudo
# /etc/sudoers
# User privilege specification
root ALL=(ALL) ALL
maor ALL=(ALL) PASSWD: ALL #זו השורה שהוספנו
|
גישה לפקודה מסוימת
נניח כי המשתמש yosi צריך הרשאה ע"מ להריץ את tcpdump. בואו ניתן לו גישה:
root@maor-debian# visudo
# /etc/sudoers
# User privilege specification
root ALL=(ALL) ALL
yosi ALL=(ALL) PASSWD: /usr/sbin/tcpdump -ni eth0 #זו השורה שהוספנו
|
ביטול אתחול המערכת באמצעות צירוף המקשים CTRL+ALT+DEL
מערכות לינוקס רבות "מקבלות" אות (syscall) לאתחול המערכת עת צירוף המקשים Ctrl+Alt+Del – כן, כמו במערכות MS-DOS. כדי למנוע הפתעות לא נעימות, בואו נחסום אפשרות זו;
תחילה, יש לערוך את /etc/inittab ולשנות את השורות הבאות:
# What to do when CTRL-ALT-DEL is pressed.
#ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
#נוסיף את השורה הבאה במקום זאת שמעל
ca:12345:ctrlaltdel:/usr/bin/logger -s -p auth.notice -t [INIT]
"CTRL+ALT+DEL caught but ignored! This is not a Windows(r) machine."
|
ע"מ להחל את ההגדרות, נריץ את הפקודה: init q .
עדכון המערכ(ו)ת באופן אוטומטי
אוקי, נתקלתי בהרבה מנהלי מערכות שביקשו להקל על עבודתם (ועל עומס אחריותם) בהקשר של עדכון חבילות המערכת. ובכן, אני לא ממליץ על עדכון אוטומטי לחלוטין (update + upgrade) מהסיבה הפשוטה שקיימים עדכונים הדורשים קלט ממנהל המערכת. חרף זאת, נוכל לבצע אוטומטיזציה על החלקים המשעממים.
אז ככה: נחליט כי כל בוקר, בשעה 05:30, המערכת תלקט את העדכונים הקיימים (apt-get update) , תבדוק אילו מהם באמת נדרשים למערכת (apt-show-versions –u) – ותשלח אלייך דוח לתיבת המייל. מה שנשאר לך – מנהל המערכת לעשות הוא לקרוא את המייל, לברור אילו מהעדכונים נחוצים ולבצע את העדכון (apt-get upgrade) בהתאם למדיניות החברה או הארגון .
תחילה, נוסיף את השורה הבאה (כחשבון root) ל-crontab:
root@maor-debian# crontab -e
#### Update the APT database every morning (apt-get update) ####
30 5 * * * apt-get update > /dev/null 2>&1
|
ניצור סקריפט שיתחבר ב-SSH למערכת (שוב, ללא סיסמא אלא ע"י מפתח ציבורי) שיבדוק אילו עדכונים נחוצים למערכת:
#!/bin/bash
#
# update_check.sh
#
# Look for servers needing updates. We trust that apt-get update has already been done.
#
# When Who What
# 2015-08-31 Maor Original version
#
MAORSERVER="maor-debian maor-debian2"
for MAORSERVER in ${MAORSERVER}
do echo ===Available updates for ${MAORSERVER}===
ssh ${MAORSERVER} apt-show-versions -u 2> /dev/null
done
|
ושוב, נוסיף פעולה ל-crontab שתריץ את הסקריפט ותשלח אלייך את הדוח:
#### Checking for available updates ####
0 7 * * * /bin/bash /home/sysop/update_check.sh | /usr/bin/mail -s "Linux
Updates Available on (`/bin/date -R`)" maor@domain.com
|
לסיום, כאמור – מערכות לינוקס הינן מודולריות – הן מורכבות מהרבה יישומים המרכיבים את הפונקציונליות שלה. חשבו על מינימליזם, כמה שפחות שירותים – ככה ייטב. בנוסף, הקפידו לתעד את המערכת. תמיד. הפעולות שהצגתי הן מנדטוריות ובסיסיות למערכות "ריקות", הווה אומר כי לכל שירות (למשל apache) יש פעולות הקשחה נפרדות. אשתדל לכתוב פוסט להקשחה יותר מעמיקה לשירותים נוספים (חשבו defense-in-depth) – אבל עד אז… זכרו כי להבדיל מחלונות, לינוקס רק נותנת לכם את האפשרות ש-"זה לא יקרה".