2. Tác nhân chuyển thư Mail Transfer Agents (MTAs)
2.1.3 Định tuyến mail dùng LDAP
Chức năng định tuyến mail LDAP của Sendmail có thể được mô tả như là một LDAP virtusertable. Đây là một dạng miền xác định của alsiasing, hỗ trợ trên miền ảo. Nó cung cấp quy tắc để viết lại địa chỉ nhận hoặc tái định tuyến mail tới các host thích hợp. Dòng sau đây sẽ định tuyến mail có địa chỉ đến joe@foo.com đến host somehost.foo.com:
joe@foo.com somehost.foo.com
Dưới sự cấu hình mặc định của nó, ldap_routing sử dụng inetLocalMailRecipient lớp đối tượng phụ trợ được định nghĩa trong Internet-Draft draft-lachman-laser-ldap-mail-routing-xx.txt. Một phiên bản của bản nháp này được bao gồm với nguồn phân phối OpenLDAP. Không có một yêu cầu nào cho lớp đối tượng
mailLocalAddress mailHost
mailRoutingAddress
OpenLDAP chứa định nghĩa của đối inetLocalMailRecipient và liên kết các thuộc tính trong misc.schema. Bạn phải bao gồm file này trong slapd.conf và khởi động lại OpenLDAP trước khi bạn có thể hỗ trợ tính năng ldap_routing của Sendmail.
## Support the inetLocalMailRecipient object. include /usr/local/etc/openldap/schema/misc.schema
Để kích hoạt định tuyến mail LDAP, ta thêm các định nghĩa tính năng sau vào sendmail.mc:
FEATURE(`ldap_routing´)
Để định nghĩa miền định tuyến đơn, Sendmail cung cấp LDAPROUTE_DOMAIN m4 macro. Việc cấu hình cho server của bạn đòi hỏi bạn thêm dòng này vào file nguồn sendmail.mc
LDAPROUTE_DOMAIN(`plainjoe.org´)
Như đã đề cập trước đây, ldap_routing dùng lớp đối tượng inetLocalMailRecipient. Nó có thể dùng một lược đồ thay thế bằng cách xác định tính năng ldap_routing:
FEATURE(`ldap_routing´,mailHost,mailRoutingAddress,bounce,detail)
mailHost và mailRoutingAddress là dòng cấu hình kết nối LDAP; mặc định là:
ldap -1 -T TMPF -v mailHost -k (&(objectClass=inetLocalMailRecipient) (mailLocalAddress=%0)) Nó cũng có thể có mặc định là ldap -1 -T TMPF -v mailRoutingAddress -k (&(objectClass=inetLocalMailRecipient) (mailLocalAddress=%0))
Lọc tìm kiếm là thuộc tính kết quả có thể được định nghĩa lại nếu được yêu cầu. Cả thông số bounce và
detail xác định hành động nếu việc tra cứu không trả về một thông tin định tuyến nào. Hành vi mặc định là chấp nhận địa chỉ không xác định được bởi tìm kiếm LDAP.
Tìm kiếm mặc định được dùng bởi ldap_routing không định nghĩa server LDAP, cũng như không có chứa hậu tố tìm kiếm. Tùy chọn confLDAP_DEFAULT_SPEC có thể được dùng để chỉ định mặc định cho tất cả các truy vấp LDAP của Sendmail (map, aliase, lớp, định tuyến mail).
define(`confLDAP_DEFAULT_SPEC´, `-h ldap.plainjoe.org -b ou=people,dc=plainjoe,dc=org´)dnl
Điều này là hoàn toàn tương thích với cấu hình được sử dụng để laays các mail aliase từ thư mục. Tùy chọn ALIAS_FILE sử dụng hậu tố cơ bản của nó (-b)
Với 3 thuộc tính tùy chọn trong lớp đối tượng inetLocalMailRecipient, Sendmail có 6 trường hợp định tuyến.
Table 7-5. Possible results from an ldap_routing search mailHost value
mailRoutingAddress value Result
A local host Exists
A local host Does not exist
Mail được chuyển cho địa chỉ ban đầu của host địa phương A remote host
Exists
Mail được chuyển tới mailRoutingAddress tại mailHost. A remote host
Does not exist
Mail được chuyển tiếp tới địa chỉ ban đầu ở mailHost. D
es not exist Exists
Người nhận được viết lại đến mailRoutingAddress và chuyển cho host địa phương. Does not exist
Does not exist
Mail được gởi tới tới địa chỉ ban đầu hoặc bị trả lại.
Ở đây bạn mở rộng mục người dùng ban đầu trong cây con ou=people. Bạn có thể tạo ra một ou mới
ou=sendmail. Tuy nhiên, thêm thông tin định tuyến mail cho một mục của user nghĩa là khi tài khoản của user đã bị xóa, thông tin định tuyến mail cũng bị xóa theo.
Ở đây, thuộc tính mailLocalAddress và mailHost làm cho địa chỉ đến kcarter@plainjoe.org bị chuyển tiếp tới host được chỉ định bởi mail.engr.plainjoe.org:
dn: uid=kristi,ou=people,dc=plainjoe,dc=org objectclass: inetOrgPerson objectclass: posixAccount objectclass: inetLocalMailRecipient cn: Kristi Carter sn: Carter mail: kcarter@plainjoe.org mailLocalAddress: kcarter@plainjoe.org mailHost: mail.engr.plainjoe.org
< . . . remaining attributes not shown . . . >
Ví dụ sau đây thêm thuộc tính mailRoutingAddress. Với thuộc tính này, tất cả các mail tới địa chỉ
kcarter@plainjoe.org được chuyển tiếp tới host được đặt tên bởi MX record cho mail.engr.plainjoe.org,
nhưng chỉ sau khi địa chỉ người nhận được viết lại đến kristi@engr.plainjoe.org:
dn: uid=kristi,ou=people,dc=plainjoe,dc=org objectclass: inetOrgPerson objectclass: posixAccount objectclass: inetLocalMailRecipient cn: Kristi Carter sn: Carter mail: kcarter@plainjoe.org mailLocalAddress: kcarter@plainjoe.org mailHost: mail.engr.plainjoe.org mailRoutingAddress: kristi@engr.plainjoe.org
Các công việc viết lại này có thể được xác nhận bằng cách thiết lập chế độ kiểm tra của Sendmail:
$ /usr/sbin/sendmail -bt > /parse kcarter@plainjoe.org
< . . . intervening ruleset output deleted . . . > mailer relay, host mail.engr.plainjoe.org, user kristi@engr.plainjoe.org
Đầu ra này chỉ rằng mail nhận được ở kcarter@plainjoe.org sẽ được chuyển tiếp tới host mail.engr.plainjoe.org sau khi viết lại địa chỉ người nhận là kristi@engr.plainjoe.org.
Thuộc tính mailLocalAddress có thể được sử dụng để chỉ định rằng tất cả mail cho 1 domain phải được chuyển tiếp cho host khác. Đoạn code sau sẽ chuyển tất cả các mail đến miền @plainjoe.org tới host hq.plainjoe.org:
dn: o=plainjoe.org,ou=people,dc=plainjoe,dc=org objectclass: organization
objectclass: inetLocalMailRecipient o: plainjoe.org
description: plainjoe.org mail domain mailLocalAddress: @plainjoe.org mailHost: hq.plainjoe.org
2.2Postfix
Tiếp theo ta sẽ nói tới Postfix. MTA này có thể thay thế Sendmail vì nó có:
• Tính năng và interface tương thích với Sendmail.
• Việc cấu hình đơn giản.
• Bảo mật tốt hơn.
Giả sử rằng thư viện khách hàng OpenLDAP 2 đã được cài đặt trong thư mục /usr/local/lib/, đoạn lệnh
sau sẽ refresh tất cả:
$ cd postfix-1.1.2/ $ make tidy
$ make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" \ > AUXLIBS="-L/usr/local/lib -lldap -llber"
$ make
$ /bin/su -c "make install"
Postfix có 6 bảng, trong đó có thể được lưu trữ tại bất kỳ phương tiện thông tin báo cáo bởi postconf -m Bảng 7-6 giới thiệu mỗi bảng của postfix và chỉ ra chương trình lõi nào hoạt động như khách hàng chính của bảng.
Table 7-6. Postfix tables and associated core programs
Table Description programCore
Access Cung cấp thông tin về message nào được chấp nhận hoặc từ chối dựa trên người gửi, host, network, v.v.. smtpd
phương.
Canonical Cung cấp thông tin về địa chỉ địa phương hay không. cleanup
Relocated Cung cấp thông tin về “người dùng đã chuyển sang chỗ mới” trong thư trả về. qmgr
Transport Cung cấp thông tin về cách gửi và host chuyển tiếp cho domain. trivial-rewrite Virtual Cung cấp thông tin được sử dụng để chuyển hướng người dùng địa phương
hoặc không địa phương hoặc domain. cleanup
Phần còn lại chỉ làm cách nào để cấu hình một server Postfix để lấy aliases địa phương thông qua truy vấn LDAP. Chúng ta sẽ bắt đầu thảo luận từ tập tin cấu hình sau đây, main.cf.
## /etc/postfix/main.cf
## Postfix configuration file for the plainjoe.org SMTP server. ## Written by <jerry@plainjoe.org> ## Host/domain information myhostname = garion.plainjoe.org mydomain = plainjoe.org myorigin = plainjoe.org ## Who is local?
mydestination = localhost $myhostname
## Who do we accept mail relaying from? mynetworks = 192.168.1.0/24 127.0.0.0/8 ## Program locations command_directory = /usr/sbin daemon_directory = /usr/libexec/postfix queue_directory = /var/spool/postfix mail_owner = postfix
## Sendmail-compatible mail spool directory mail_spool_directory = /var/spool/mail
Như đã nói ở trên, một mục aliase sẽ nối một username địa phương tới một địa chỉ email, địa chỉ này có thể là một user khác hoặc là một user của một hệ thống khác. Trong lược đồ LDAP của bạn, một user địa phương được đại diện bởi thuộc tính uid của lớp đối tượng posixAccount. Mục aliase được đại diện bởi thuộc tính mail của lớp đối tượng inetOrgPerson.
Đây là một nội dung LDIF đặc trưng cho một tài khoản user có một email aliase. Mail cho tài khoản này (tải khoản khách) được chuyển tiếp tới miền jerry@plainjoe.org:
## User account including a mail alias dn: uid=guest1,ou=People,dc=plainjoe,dc=org uid: guest1 cn: Guest Account objectClass: posixAccount objectClass: inetOrgPerson userPassword: {CRYPT}Fd8nE1RtCh5G6 loginShell: /bin/bash
gidNumber: 1000
homeDirectory: /home/guest1 gecos: Guest Account sn: Account
mail: jerry@plainjoe.org
Để thông tin cho Postfix daemons rằng nó phải đọc các aliase kết nối từ thư mục LDAP, thêm dòng sau vào main.cf:
alias_maps = ldap:ldapalias
Sau khi chỉ định rằng Postfix phải tra cứu thông tin aliase từ thư mục bạn phải định nghĩa vài thông số để chỉ Postfix cách tìm kiếm trong thư mục. Cài đặt phổ biến là tên server LDAP (server_host), cơ sở tìm kiếm (search_base), the vùng tìm kiếm (scope), lọc tìm kiếm (query_filter), và kết quả giá trị thuộc tính trả về (result_attribute). Thêm các định nghĩa này vào main.cf:
## Parameters for LDAP alias map ldapalias_server_host = localhost
ldapalias_search_base = ou=people,dc=plainjoe,dc=org ldapalias_scope = sub
ldapalias_query_filter = (uid=%s) ldapalias_result_attribute = mail
Bạn có thể kiểm tra bảng tra cứu aliase bằng cách dùng postmap(1) dùng để xác minh rằng mail gởi tới user guest1 sẽ được chuyển tiếp tới tài khoản mail jerry@plainjoe.org:
$ postmap -q guest1 ldap:ldapalias jerry@plainjoe.org
Đoạn trích sau chỉ ra rằng message sẽ được chuyển tới guest1@garion.plainjoe.org. Tuy nhiên, message sau đó sẽ được chuyển đến jerry@plainjoe.org, như đã được chỉ định bởi giá trị của thuộc tính mail cho tài khoản guest1:
Return-Path: <root@plainjoe.org> Delivered-To: jerry@plainjoe.org
Received: from XXX.XXX.XXX.XXX ([ XXX.XXX.XXX.XXX ] helo=garion.plainjoe.org) by gamma.jumpserver.net with esmtp (Exim 3.36 #1)
id 18M1Sc-0003tj-00
for jerry@plainjoe.org; Wed, 11 Dec 2002 01:39:14 -0600 Received: by garion.plainjoe.org (Postfix)
id 15CA23FB62; Tue, 10 Dec 2002 11:40:23 -0600 (CST) Delivered-To: guest1@garion.plainjoe.org
Received: by garion.plainjoe.org (Postfix, from userid 0) id F042E3FB69; Tue, 10 Dec 2002 12:40:22 -0500 (EST) To: guest1@garion.plainjoe.org
Subject: testing Postfix/LDAP lookups
Message-Id: <20021210174022.F042E3FB69@garion.plainjoe.org> Date: Tue, 10 Dec 2002 12:40:22 -0500 (EST)
From: root@plainjoe.org (root)
Table 7-7 liệt kê danh sách đầy đr của tất cả thông số Postfix LDAP, và cả giá trị mặc định của chúng.
Table 7-7. Postfix LDAP parameters Parameter
Default Description
yes
Xác định yêu cầu ràng buộc LDAP được ban hành trước khi thực hiện truy vấn. Có thể là yes or no.
bind_dn
""
DN được
dùng khi kết nối tới thư mục LDAP
bind_pw
""
Mật khẩu trắng dùng khi kết nối tới thư mục bằng cách dùng giá trị bind_dn.
cache no
Quyết định cho phép bộ nhớ đệm của máy phía khách hàng được enable của kết quả tìm kiếm LDAP.
cache_expiry
30 seconds
Xác định thời gian chờ bộ nhớ cache hết hạn, khi cache=yes.
cache_size
32 KB
Xác định kích cỡ của LDAP cache, khi cache=yes.
dereference 0
Điều khiển Postfix có tham chiếu aliase khi tìm thư mục hay không, giá trị 0 (không bao giờ), 1(khi tìm), 2(khi tìm được đối tượng), 3 (luôn luôn).
domain none
Một danh sách (có thể là bảng tra cứu) của tên miền bị hạn chế khi thực hiện truy vấn.
query_filter
(mailacceptinggeneralid=%s)
Bộ lọc tìm kiếm.
result_attribute maildrop
Giá trị thuộc tính, kết quả của query_filter.
scope sub
Vùng tìm kiếm sub, base, or one.
search_base none
DN hậu tố tìm kiếm cơ bản truy vấn
server_host localhost
Hostname của server LDAP mà truy vấn phải gửi. Giá trị định dạng: hostname[:port][,hostname[:port], . . . ].
server_port 389
none
Cho phép admin xác định thuộc tính trả về DN từ tìm kiếm. Nếu giá trị này được trình bày trong phần trả về của tìm kiếm, một truy vấn khác được ban hành dùng các DN trả về như là search_base.
timeout
10 seconds
Thời gian tối đa tìm kiếm
2.3Exim.
Như Sendmail và Postfix, Exim hỗ trợ rất nhiều loại tập tin và cơ sở dữ liệu tra cứu, như là mySQL, Berkeley DBM, và LDAP. Trong định dạng mặc định của nó, Exim Makefile chỉ hỗ trợ việc tìm kiếm tuyến tính trong tập tin (lsearch) và cơ sở dữ liệu tra cứu (dbm). Để kích hoạt tra cứu LDAP, phải set
Table 7-8. Exim LDAP-related Makefile variables
Variable Description
LOOKUP_LDAP Biến này phải được set thành yes để bao gồm hỗ trợ tra cứu LDAP trong nhị phân
exim