שנים רבות שפחדתי מ-Sendmail, באמת. הסתכלתם פעם בקובץ קונפיגורציה שלו? אם אתם אמיצים, פתחו את הקובץ sendmail.cf (משאיר לכם כתרגיל למצוא את המיקום שלו), וראו אם אתם מצליחים להבין איזה כמה שורות קונפיגורציה שם. לא, הא? טוב, אתם לא לבד, 99.999% מאוכלוסיית העולם אינה מסוגלת לקרוא את הקובץ. אבל אל דאגה, לעזרתנו באה שפת המאקרואים m4, למי שלא מכיר, תגידו שלום ל-sendmail.mc, מכיל רק כמה שורות, קצת יותר נהירות, שבעזרתם בונה המפענח (m4) את sendmail.cf.
יופי, עכשיו שהבהרנו את הנושא הזה, בוא ונסתכל על אחד מהמאפיינים של Sendmail שעושה אותו כלי מצויין (למרות שכיום, חביב עלי יותר postfix), מפות. לא, לא מפות שולחן, אלא שימוש בקבצי מיפוי כדי להכניס גמישות ושליטה של מנהל הרשת על Sendmail מחוץ ל-sendmail.cf. לדוגמא, Sendmail מאפשר לנתב דואר נכנס לשרת אחר, או דואר מאימייל אחד למשתמש אחר.
הכל טוב ויפה כאשר יש שרת אחד לנהל. מה קורה כאשר יש 10? 20? (קיימות מערכות כאלו ואף גדולות יותר) אנחנו צריכים מקום מרכזי שיחזיק את כל המידע הזה בצורה מרוכזת, כדי שדואר אשר נכנס בכל אחד מהשרתים יקבל את אותו "הטיפול". להצלתנו מגיע כמובן LDAP הפרוטוקול ו-OpenLDAP השרת.
למי שחי מתחת לאדמה בשנים האחרונות ולא שם לב, LDAP הפך להיות ה"סכין צבאית שוויצרית" (Swiss Army Knife, נשמע יותר טוב באנגלית, תודו) של אנשי ה-IT. אם פעם היה מחזיק רק משתמשים או כתובות, היום הוא כבר "יודע" להחזיק מידע כמו מפות של Sendmail/Postfix, מידע DNS-י, משתמשים, קבוצות, automounts ומה לא… במקרה שלנו, נרתם שרת ה-LDAP כדי להחזיק מפות של Sendmail. לא רע בכלל בשביל פרוטוקול צעיר (יחסית, בערך מ-1993).
LDAP (או Light Weight Directory Access) תוכנן כפרוטוקול שנועד להחזיק מידע היררכי בצורה יעילה ומהירה לגישה, וזה בדיוק מה שהוא עושה פה בעבור Sendmail.
על הנושא של התקנת, קינפוג ותחזוקת שרת OpenLDAP לא אדבר, כי הוא חורג מגבולות הבלוג הזה שמטרתו: שירת הלל ל-LDAP. בכל מקרה, אז איך אנו גורמים ל-Sendmail לדבר עם שרת LDAP? ואיך אנו גורמים לו לשאול את השאלות הנכונות? בואו ואספר לכם.
בתור התחלה, נצטרך להגיד לשרת ה-LDAP כיצד לבנות רשומות שיבין Sendmail, איך עושים את זה? במילה אחת - sendmail.schema. סכמה היא קובץ המגדיר סוגי אוביקטים, סוג המידע שבכל אוביקט ואת היחס ביניהם. ניתן למצוא את הסכמה בקבצי המקור של Sendmail או ברוב ההפצות כיום. את הסכמה יש לשים בספריית הסכמות של OpenLDAP (בד"כ /etc/openldap/schema) ולהוסיפה לקובץ הקונפיגורציה של OpenLDAP:
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/sendmail.schema
שלב הבא במסענו לארץ LDAP, יהיה יצירת המפות כדי ש-Sendmail יוכל לגשת אליהם, ניצור את ה-DN הבסיסי ומתחתיו את המיפויים. בדוגמא הבאה ניצור מפה מסוג virtusertable:
# cat > ldap-virtuser
dn: sendmailMTAMapName=virtuser, dc=example, dc=com
objectClass: sendmailMTA
objectClass: sendmailMTAMap
sendmailMTACluster: example.com
sendmailMTAMapName: virtuser
dn: sendmailMTAKey=user@example.com, sendmailMTAMapName=virtuser, dc=example, dc=com
objectClass: sendmailMTA
objectClass: sendmailMTAMap
objectClass: sendmailMTAMapObject
sendmailMTAMapName: virtuser
sendmailMTACluster: example.com
sendmailMTAKey: user@example.com
sendmailMTAMapValue: user-example
כדי להוסיף את המפה נצטרך להשתמש בכלי ldapadd של OpenLDAP:
# ldapadd -D cn=manager,dc=example,dc=com -b dc=example,dc=com -W -x < ldap-virtuser
מצויין! יש לנו רשומה בשרת ה-LDAP שממפה את user@example.com למשתמש user-example.
שלב אחרון במזימה שלנו הוא קינפוג Sendmail שידע לחפש בשרת ה-LDAP, על מנת לעשות זאת, נצטרך להכניס כמה שינויים ותוספות ב-sendmail.mc חפשו את השורה
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
והחליפו אותה בשורות הבאות:
define(`confLDAP_DEFAULT_SPEC', ` -h ldserver -b dc=example,dc=com')
define(`confLDAP_CLUSTER', `examplecom')
FEATURE(`virtusertable', `LDAP')
הערה: עוד מידע על האפשרויות של confLDAP_DEFAULT_SPEC בכתובת הבאה
כדי לצור sendmail.cf חדש, נשתמש במפענח m4:
m4 sendmail.mc > sendmai..cf
זהו, פשוט לא? אתחול זריז ל-Sendmail ואנחנו מוכנים לבדוק אם הכל עובד כמו שאנו מקווים. נבצע בדיקת מיפוי, ונראה שאכן המשתמש ממופה כמו שצריך:
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> /map virtuser user@example.com
map_lookup: virtuser (user@example.com) returns user-example (0)
מושלם! ביקשנו מ-Sendmail לפענח בעבורנו, מתוך המפה virtuser לאיזה משתמש מופנה הדואר בעבור הכתובת user@example.com, והתשובה הנכונה לא אחרה להגיע לאחר שאילתה קטנה לשרת ה-LDAP
אז נכון, Sendmail הוא יצור מאיים, LDAP הוא פרוטוקול שנראה מסובך, אבל השילוב בין השתיים יכול להביא לניהול נוח וגמיש בהרבה של שרתי Sendmail. תודו שאתם מופתעים מכמה שזה היה פשוט.