Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25881642
  • 博文数量: 271
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 3358
  • 用 户 组: 普通用户
  • 注册时间: 2007-11-12 15:28
文章分类

全部博文(271)

文章存档

2010年(71)

2009年(164)

2008年(36)

我的朋友

分类:

2009-04-12 14:35:03

文档选项
将打印机的版面设置成横向打印模式

将此页作为电子邮件发送

将此页作为电子邮件发送

未显示需要 JavaScript 的文档选项


许英杰 (), UNIX 技术支持工程师, 国际商业机器科技(深圳)有限公司

2008 年 9 月 04 日

Sendmail 是在 UNIX/Linux 平台下被广泛应用的 E-mail 邮件服务器,作为一种免费软件,它的稳定性和可移植性,一直就受到广大系统管理员的青睐。另外一方面,它也有一个重要缺点就是安全性较差。Internet 用户的要求比较高,所以系统管理员应当足够重视这方面。而最主要的修补手段就是从 Sendmail 官方网站 () 下载并编译安装最新稳定版本(目前的版本是 v8.14.3)。本文主要介绍如何在 AIX 平台上编译安装 Sendmail 以及相关的技巧与排错。

Sendmail 软件是在 UNIX/Linux 平台下被广泛应用的邮件服务器系统,如在 IBM AIX 平台下的 bos.net.tcp.client 文件集就已经内置包括了 Sendmail v8.11.6p2(AIX 5.2), Sendmail v8.13.4 (AIX 5.3)。但是另外一方面 Sendmail 的安全性较差,由于邮件系统需要处理的是外部发送来的各种各样的信息,甚至包含一些恶意数据,然而 Sendmail 在大多数系统中都是以 root 身份运行,一旦出现问题,就会对系统安全造成严重影响。所以对于 Sendmail 的安全问题必须得到 UNIX 系统管理员的重视,而最主要的修补手段就是安装新版本的 Sendmail。

由于 IBM 并不提供编译过后的 bff 或者 rpm for AIX 的 Sendmail 安装包,通过对 AIX 的 Technology Level 及 Service Pack 的升级也不会提高其内置 Sendmail 的版本。所以我们只能自行从 Sendmail 官方网站 () 下载并编译安装最新稳定版本(目前的版本是 v8.14.3)





回页首


为了在 AIX 平台下成功编译 Sendmail 源码,我们必须先准备好编译器以及相应 AIX 环境参数。在 IBM 平台下有两种编 C++ 译器,一种是需要付费购买的 XLC 或者 VAC,另外一种就是免费的开源 GCC g++ 编译器。本文中就采用这种免费的 GCC 编译器来安装 Sendmail。注意:以下安装操作都在 root 系统管理员用户下完成。

GCC g++ 编译器:

AIX 5.2 平台:pware.gcc-g++.4.2.4.0.bff.gz

下载地址:

AIX 5.3 平台:pware53.gcc-g++.4.2.4.0.bff.gz

下载地址:

Sendmail v8.14.3 软件:sendmail.8.14.3.tar.gz

下载地址:ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.14.3.tar.gz

采用 FTP 或者其它方式把这些软件包传到拟安装 Sendmail 的主机上,如 /tmp/sendmail 目录下,并且使用相关命令进行解压:

# gunzip -d pware.gcc-g++.4.2.4.0.bff.gz (AIX 5.2)
# gunzip -d pware53.gcc-g++.4.2.4.0.bff.gz (AIX 5.3)
# gunzip -d sendmail.8.14.3.tar.gz
# tar -xvf sendmail.8.14.3.tar

自从 Sendmail v8.12.0 以后,Sendmail 的编译安装、后台进程运行都需要一个专用组和用户名:smmsp。(AIX 5.3 内置版本是 v8.13.4,但是它并没有使用 smmsp 用户)

使用 smitty group 和 smitty user 命令分别创建名为 smmsp 的组和 smmsp 的用户,smmsp 用户属于 smmsp 组。由于该用户仅用于 Sendmail 后台服务进程使用,且为了安全起见,系统管理员可以把“User can LOGIN”和“User can LOGIN REMOTELY(rsh,tn,rlogin)”设置为 false,禁止有人使用该用户 ID 直接登陆系统。以下为使用 SMIT 创建用户的实例。

 Add a User

Type or select values in entry fields.
Press Enter AFTER making all desired changes.
 
[TOP] [Entry Fields]
* User NAME [smmsp]
 User ID [] #
 ADMINISTRATIVE USER? false +
 Primary GROUP [smmsp] +
 Group SET [staff,smmsp] +
 ADMINISTRATIVE GROUPS [] +
 ROLES [] +
 Another user can SU TO USER? true +
 SU GROUPS [ALL] +
 HOME directory [/home/smmsp]
 Initial PROGRAM []
 User INFORMATION [This user is belong to Sendmail.]
 EXPIRATION date (MMDDhhmmyy) [0]
 Is this user ACCOUNT LOCKED? false +
 User can LOGIN? false +
 User can LOGIN REMOTELY(rsh,tn,rlogin)? false +
 Allowed LOGIN TIMES []
 Number of FAILED LOGINS before [0] #
 user account is locked 
 Login AUTHENTICATION GRAMMAR [compat]
 Valid TTYs [ALL]
 Days to WARN USER before password expires [0] #
 Password CHECK METHODS []
 Password DICTIONARY FILES []
 NUMBER OF PASSWORDS before reuse [0] #
 WEEKS before password reuse [0] #
 Weeks between password EXPIRATION and LOCKOUT [-1] 
 Password MAX. AGE [0] #
 Password MIN. AGE [0] #
[MORE...22] 
 
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image 
Esc+9=Shell Esc+0=Exit Enter=Do 

另外要把 /etc/passwd 中 smmsp 中这行的“*”改成“!”,使其激活该用户 ID,如下:

# cat /etc/passwd |grep smmsp
smmsp:!:207:205:This user is belong to Sendmail.:/home/smmsp:/usr/bin/ksh

由于 GCC g++ 编译器默认安装路径在 /opt,所以需要适当调整 /opt 文件系统的大小,使其保证空余空间大于 256MB。

另外备份 AIX 原内置 Sendmail 相关文件:

# mkdir /tmp/sendmail/bak # 创建备份目录
# cp -R /usr/sbin/sendmail /tmp/sendmail/bak
# cp -pR /etc/mail /tmp/sendmail/bak





回页首


进入 GCC g++ bff 安装包的目录,直接通过 smitty installp 进行安装,在这里不做过多叙述。

然后修改相关环境变量,如果系统管理员以后仍然要使用该编译器,可以把该信息加入到 /etc/profile 文件内。

# export PATH=$PATH:/usr/local/bin
# export LIBPATH=$LIBPATH:/usr/local/lib
# export MANPATH=$MANPATH:/usr/local/man

# cd /tmp/sendmail/sendmail-8.14.3 # 这个目录由 sendmail v8.14.3 解压后产生

# cd devtools/OS

# chmod +w AIX.5.3 # 如果是 AIX 5.2 平台请修改“AIX .5.2”文件的属性

# vi AIX.5.3 # 如果是 AIX 5.2 平台请编辑“AIX .5.2”文件

# 修改这一行 : “define(`confCC', `/usr/vac/bin/xlc')”为 :
define(`confCC', `gcc')

保存退出。

# cd ../.. # 回到 sendmail-8.14.3 解压后目录 .
# sh Build # 开始编译,在编译过程中请注意请忽略类似以下错误提示 :

……( 省略 )
Making dependencies in /tmp/sendmail/sendmail-8.14.3/obj.AIX.5.3.7.PPC/vacation
 rm -f sm_os.h
 ln -f -s ../../include/sm/os/sm_os_aix.h sm_os.h
 for i in vacation.c ; do gcc -M -E -I. -I../../sendmail -I../../include 
 -DNDBM -DNIS -DMAP_REGEX -D_AIX5=50300 -DNOT_SENDMAIL $i > /dev/null; 
 cat `basename $i .c`.u >> Makefile ; rm -f `basename $i .c`.u ; done;
cat: cannot open vacation.u
make: The error code from the last command is 2.

Stop.

# mkdir /var/spool/clientmqueue # 如果这个目录不存在请手动创建它

# chown -R smmsp:smmsp /var/spool/clientmqueue

# chmod 770 /var/spool/clientmqueue

# sh Build install # 继续编译安装

在编译的最后阶段您可以看到如输出信息,表示安装已经成功 :

…… ( 省略 )
Making all in:
/tmp/sendmail/sendmail-8.14.3/vacation
Configuration: pfx=, os=AIX, rel=5.3.7, rbase=5, rroot=5.3, arch=PPC, sfx=, 
 variant=optimized
Making in /tmp/sendmail/sendmail-8.14.3/obj.AIX.5.3.7.PPC/vacation
 /usr/ucb/install -c -o bin -g bin -m 555 vacation /usr/bin
 /usr/ucb/install -c -o bin -g bin -m 444 vacation.0 /usr/share/man/cat1/vacation.1
Target "install" is up to date.

由于 AIX 平台原已内置安装 Sendmail 软件并且成为了后台服务,所以在编译安装新版本以后必须要重启这个服务:

  1. 重新启动 Sendmail 后台服务
    stopsrc -s sendmail
    startsrc -s sendmail -a "-bd -q30m"
  2. 检查当前系统中 Sendmail 的运行状态
    ps -ef |grep sendmail # 检查 Sendmail 相关进程
    sendmail -d0 # 查看 Sendmail 当前版本和相关信息
    正常情况下您可以看到如下信息:
    [xyztest:root:/tmp/sendmail/sendmail-8.14.3:] sendmail -d0
    Version 8.14.3
     Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7
     NAMED_BIND NDBM NETINET NETUNIX NIS PIPELINING SCANF XDEBUG
    
    ============ SYSTEM IDENTITY (after readcf) ============
     (short domain name) $w = xyztest
     (canonical domain name) $j = xyztest.test.ibm.com
     (subdomain name) $m = test.ibm.com
     (node name) $k = xyztest
    ========================================================
    

    表示您已经成功地安装了 Sendmail v8.14.3

  3. 简单测试:发送新邮件
    创建一个供测试用临时文件,名为 test1,并且使用该命令发送出去:
    uuencode test1 test1 |mail -s test1 your_mail_address # “your_mail_address”为您自己的邮箱地址


    如果 Sendmail 安装运行正常,稍等片刻,在您的邮箱中就可以收到该邮件了。
    另外您还可以使用这个命令发送邮件:mail -v your_mail_address,您可以看到如下非常详细的邮件发送信息:

    xuyingj@cn.ibm.com... Connecting to [127.0.0.1] via relay...
    220 testforme ESMTP Sendmail Wed, 25 Jun 2008 04:20:06 -0500
    >>> EHLO testforme
    250-testforme Hello localhost [127.0.0.1], pleased to meet you
    250-ENHANCEDSTATUSCODES
    250-EXPN
    250-VERB
    250-8BITMIME
    250-SIZE
    250-DSN
    250-ONEX
    250-ETRN
    250-XUSR
    250 HELP
    >>> VERB
    250 2.0.0 Verbose mode
    >>> MAIL From: SIZE=151
    250 2.1.0 ... Sender ok
    >>> RCPT To:
    250 2.1.5 ... Recipient ok
    >>> DATA
    354 Enter mail, end with "." on a line by itself
    >>> .
    050 ... Connecting to d23av04.au.ibm.com. via esmtp...
    050 220 d23av04.au.ibm.com ESMTP Sendmail 8.12.11.20060308/8.12.11; 
     Wed, 25 Jun 2008 19:15:43 +1000
    050 >>> EHLO testforme
    050 250-d23av04.au.ibm.com Hello ciganim.xxxtest.ibm.com [xx.xxx.xxx.xx], 
    pleased to meet you
    050 250-ENHANCEDSTATUSCODES
    050 250-PIPELINING
    050 250-8BITMIME
    050 250-SIZE 20000000
    050 250-DSN
    050 250-ETRN
    050 250-AUTH CRAM-MD5
    050 250-STARTTLS
    050 250-DELIVERBY
    050 250 HELP
    050 >>> MAIL From: SIZE=406
    050 250 2.1.0 ... Sender ok
    050 >>> RCPT To:
    050 250 2.1.5 ... Recipient ok
    050 >>> DATA
    050 354 Enter mail, end with "." on a line by itself
    050 >>> .
    050 250 2.0.0 m5P9Fhid017367 Message accepted for delivery
    050 ... Sent (m5P9Fhid017367 Message accepted for delivery)
    250 2.0.0 m5P9K6B503810 Message accepted for delivery
    xuyingj@cn.ibm.com... Sent (m5P9K6B503810 Message accepted for delivery)
    Closing connection to [127.0.0.1]
    >>> QUIT
    050 Closing connection to d23av04.au.ibm.com.
    050 >>> QUIT
    050 221 2.0.0 d23av04.au.ibm.com closing connection
    221 2.0.0 testforme closing connection
    





回页首


  1. 注意 DNS 域名解析服务器的配置:smitty namerslv,如果没有 DNS 域名服务,Sendmail 将无法正确解析邮件地址的域名也就无法发送电子邮件。
  2. 注意相关文件的配置:Sendmail 后台服务是否在系统开机时自动启动:/etc/rc.tcpip,如下:
    ……( 省略 )
    # Start up the sendmail daemon.
    #
    # Sendmail will automatically build the configuration and alias
    # data bases the first time it is invoked. You may wish to update
    # the alias source file /usr/lib/aliases with local information,
    # and then rebuild the alias data base by issuing the command
    # "/usr/lib/sendmail -bi" or "/usr/ucb/newaliases".
    #
    # When the configuration or alias data bases are changed, the
    # sendmail daemon can be made to rebuild and re-read them by
    # issuing the command "kill -1 `cat /etc/sendmail.pid`" or, if
    # SRC was used to start the daemon, "refresh -s sendmail".
    #
    # The "qpi", or queue processing interval, determines how
    # frequently the daemon processes the message queue.
    #
    qpi=30m # 30 minute interval
    #
    start /usr/lib/sendmail "$src_running" "-bd -q${qpi}" # 请注意这一行开头并没有注释符“#”
     则表示系统开机自动在后台启用 Sendmail。
    

  3. 如果启用针对 Sendmail 的日志监控,还要注意 /etc/syslog.conf 的配置,并且确认邮件日志文件保存在 /var/spool/mqueue:“/var/spool/mqueue/syslog”.
  4. 在 AIX 平台下,虽然编译成功,但是系统资源控制器经常报告 Sendmail 服务处于“inoperative”状态,如何处理?
    # ps -ef |grep sendmail # 找出“sendmail: accepting connections”这行对应的 PID。
    # kill xxxxxxx # 杀掉“sendmail: accepting connections”进程
    # chssys -s sendmail -f 9 -n 15 -S -a "-bd"
    # startsrc -s sendmail -a "-bd -q30m"
  5. 当使用“mail -v”命令发送邮件的时候,Sendmail 需要等待较长时间才有处理和响应信息,如下:
    # mail -v ql 
    Subject: test 
    Just a test 
    . 
    Cc: 
    WARNING: The local host name (testserver) does not have a domain; 
    fix $j in config file
    ql... Connecting to local... 
    ql... Sent
    

    如何处理这种情况?
    这种错误是由于 /etc/mail/sendmail.cf 文件中域名配置错误引起的。如果您的系统使用的是空域名,既没有域名,您可以采用如下方法解决:

    # vi /etc/hosts
    ipaddress hostname hostname. # 即在主机名后面再加一个点“.”

  6. 如何在 AIX 系统中重新编译 sendmail.cf 文件?
    有时候需要自定义 Sendmail 邮件功能或者 sendmail.cf 文件被损坏的情况下,就需要重建其 sendmail.cf 文件。下面介绍重建方法和步骤:
    # cp /usr/samples/tcpip/sendmail/cf/aixsample.mc \
    /tmp/sendmail/sendmail-8.14.3/cf/cf/aix5.mc # 由于 Sendmail 源码包中并没有包含 AIX 平台的 MC 文件,因此我们需要从当前 AIX 系统中拷贝 MC 文件到存放 Sendmail 安装源码包的 cf/cf 目录下。
    # vi /tmp/sendmail/sendmail-8.14.3/cf/cf/aix5.mc # 修改其 MC 文件内容,去掉不需要的功能模块,如果没有什么特殊应用可以参考如下实例:
    divert(0)dnl
    OSTYPE(aix5)dnl
    FEATURE(genericstable)dnl
    FEATURE(mailertable)dnl
    FEATURE(allmasquerade)dnl
    DOMAIN(generic)dnl
    define(`confSMTP_LOGIN_MSG', `$j Sendmail $b')
    MAILER(local)dnl
    MAILER(smtp)dnl
    MAILER(uucp)
    

    # m4 ../m4/cf.m4 aix5.mc > /tmp/sendmail/mysendmail.cf # 开始编译 sendmail.cf 文件
    # cp /tmp/sendmail/mysendmail.cf /etc/sendmail.cf # 复制该文件到系统 /etc 目录下





回页首


本文为读者简单介绍了在 AIX 平台下如何进行 GCC g++ 编译器的安装配置、Sendmail v8.14.3 的编译安装,以及相关需要注意的地方。对于 Sendmail 的功能细节,以及 sendmail.cf 的深入配置,本文没有提及,读者有兴趣的话可以参考下面的资源列表

阅读(2282) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~