H3C Firewall 添加/删除ACL规则
自己动手,丰衣足食。
自己动手,丰衣足食。
roundcubemail是一个不错的webmail,十分轻量,安装配置十分简单,比horde简单多了。
因为使用debian源安装horde会默认使用apache,所以改用pear方式安装horde
安装
1 | # apt-get install courier-imap courier-authlib-mysql |
配置
编辑/etc/courier/authdaemonrc
1 | ... |
编辑/etc/courier/authmysqlrc,内容如下:
1 | MYSQL_SERVER localhost |
SSL/TLS加密
未启用SSL/TLS加密时,客户端与imap服务器的所有通讯都是以明文传输的,包括认证用户名和密码。因为如果需要安全的imap服务,则需要启用SSL/TLS加密。
安装courier-imap-ssl
1 | # apt-get install courier-imap-ssl |
安装过程中为会localhost自签一对证书,放置在/etc/courier/imapd.pem文件中,如果正式使用,最好还是去申请CA签署的证书。
为imap服务的域名imap.openwares.net生成自签证书:
编辑/etc/courier/imapd.cnf:
1 | CN=imap.openwares.net #CN为Canonical Name缩写 |
删除掉安装时为localhost自签的证书
1 | # rm -f /etc/courier/imapd.pem |
重新为imap.openwares.net生成证书
1 | # mkimapdcert |
重新启动ssl imapd
1 | # /etc/init.d/courier-imap-ssl restart |
将未加密imap服务删除
1 | # /etc/init.d/courier-imap stop |
未启用SSL/TLS加密的imapd使用知名端口143,启用加密后imapd使用知名端口993。
===
[erq]
SASL基础配置
postfix支持SASL认证,可以使用Cyrus SASL或Dovecot SASL实现,通常使用Cyrus SASL。
因为postfix链接了libsasl库,所以是直接通过函数调用的方式与Cyrus SASL通信,因此无需saslauthd守护程序的支持。
认证配置文件的名字为smtpd.conf,其中smtpd由postfix传递给Cyrus SASL库,cyrus添加后缀.conf。cyrus会先搜索/usr/lib/sasl2/目录查找smtpd.conf,如果找到则不继续查找。debian发行版此配置文件的路径为/etc/postfix/sasl/smtpd.conf
Cyrus SASL支持多种认证方式,通过saslauthd守护程序支持/etc/shadow,PAM和IMAP server,然后通过插件机制(叫做auxiliary property plugins)支持其他认证方式。
auxprop插件有如下几个:
下面的配置文件/etc/postfix/sasl/smtpd.conf使用sql插件:
1 | pwcheck_method: auxprop |
其中:
sql_hostnames - 指定localhost则通过UNIX-domain socket连接到mysql,如果指定127.0.0.1则通过tcp连接mysql
为了启用sasl认证,必须在/etc/postfix/main.cf中指定:
smtpd_sasl_auth_enable = yes
reload postfix,测试一下sasl auth
1 | $ telnet localhost 25 |
也可以通过saslauthd + PAM + pam_mysql的方式来使用mysql数据库存储账户,可以支持密码加密。
有些客户端不能正确的识别AUTH,在main.cf中添加如下指令来支持这些客户端:
broken_sasl_auth_clients = yes
SMTP认证策略
有以下几个认证策略用于限制SASL的认证机制:
未加密STML会话
默认的认证策略是允许SASL匿名认证之外的所有其他认证机制,在main.cf中:
smtpd_sasl_security_options = noanonymous
加密SMTP会话(TLS)
在加密的SMTP会话中有一个单独的参数控制认证策略,一般在main.cf中如下设置:
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
如果只有在TLS加密的前提下才提供AUTH认证,可以在main.cf中添加:
smtpd_tls_auth_only = yes
SASL授权
客户端通过SASL认证后,postfix给于客户适当的授权
中继授权
通过在中继策略中添加permit_sasl_authenticated选项,postfix允许认证的客户端向本域之外的远程其他域收件人发送邮件。
/etc/postfix/main.cf中:
1 | # postfix 2.0 and later |
注意:postfix版本2.9.6,main.cf中设置smtpd_relay_restrictions参数,重新加载postfix时会提示:
postconf: warning: /etc/postfix/main.cf: unused parameter: smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,因为2.10及以下版本需要使用smtpd_recipient_restrictions参数
拒绝未认证的客户端
main.cf配置文件中添加:
1 | smtpd_delay_reject = yes |
注意:这样设置可能会导致拒绝接受其他smtp投递过来的信件。
发送者地址授权
如果没有SMTP认证,SMTP客户端可以使用MAIL FROM命令随意指定信封上的发件者邮件地址,因为smtp服务器不只知道smtp客户的用户名。
使用SASL认证之后,postfix可以通过维护一张信封地址和认证用户之间的映射表就可以控制smtp用户只能使用自己拥有的信封地址来发送邮件。
/etc/postfix/main.cf:
1 | smtpd_sender_login_maps = hash:/etc/postfix/controlled_envelope_senders |
/etc/postfix/controlled_envelope_senders:
1 | # envelope sender owners (SASL login names) |
SASL其他选项
每帐号控制
postfix可以通过sasl用户名来实现每个账户的单独控制。通常用于保留(HOLD)或拒绝(REJECT)存在问题帐号的邮件。
/etc/postfix/main.cf:
1 | smtpd_recipient_restrictions = |
/etc/postfix/sasl_access:
1 | # Use this when smtpd_sasl_local_domain is empty. |
默认认证域
为没有域名部分的SASL登录名添加域名,比如登录名为john,替换为john@example.com
/etc/postfix/main.cf:
smtpd_sasl_local_domain = example.com
隐藏sasl认证
可以为部分客户或网络隐藏SASL认证,因为有些不需要认证的客户如果发现服务提供SASL认证能力,那么他们会试图去认证,但客户端有没有提供认证信息,这样客户就一直处于认证失败状态。
/etc/postfix/main.cf:
smtpd_sasl_exceptions_networks = !192.0.2.171/32, 192.0.2.0/24
添加sasl登录名到邮件头
在发送邮件的头部Received字段添加SASL认证登录名
===
[erq]
电子邮件系统结构图
图片来自网络
基本概念
电子邮件系统有几个基本的概念:
通常这些代理角色分的并不是很清楚,也不太容易区分。经常一个程序实现多个代理角色。对这几个代理角色更详尽的描述见这里。
一封电子邮件在各个代理之间的流动大体是这样的:
MUA → MSA → MTA → … → MTA → MDA → MRA → MUA
安装
基本配置
postfix主配置文件有两个/etc/postfix/main.cf和master.cf
main.cf
1 | myhostname = mail.openwares.net #指定主机名 |
理解虚拟域
postfix有两种域,一种是本地域, 另一种就是虚拟域。
本地域:
本地域一般包括postfix运行的机器上的主机名和ip地址,main.cf中用mydestination指名本地域。本地域上的所有用户都有对应的unix账户。如果采用mbox邮箱格式,则用户的邮箱是/var/mail目录下的用户名同名文件,如果采用Maildir邮箱格式,比如在main.cf中设置home_mailbox = Maildir/,则用户的邮箱就是用户主目录的Maildir目录。
虚拟域:
除了本地域之外,postfix还可以管理其他域,这就是虚拟域。虚拟域分为两种,一种是虚拟别名域,另一种是虚拟邮箱域。
一个域要么是本地域,要么是虚拟域;一个虚拟域要么是虚拟别名域,要么是虚拟邮箱域。也就是本地域,虚拟别名域,虚拟邮箱域是互斥的。
那么一个postfix邮件系统要添加一个额外的域,有这么几种选择,几个实例如下:
1 | virtual_alias_domains = example.com |
也可以将虚拟别名域上的用户映射到远程账户,只是作为转发之用。
1 | virtual_mailbox_domains = example.com |
1 | postmaster@example.com postmaster #虚拟邮箱域用户映射到本地unix用户 |
postfix支持丰富的查找表类型, hash,ldap,mysql等,一般使用数据库比较方便。
虚拟邮箱域mysql数据库配置
这里使用mysql数据库来设置openwares.net虚拟邮箱域
创建数据库
1 | mysql> CREATE DATABASE mail; |
创建postfix配置文件
/etc/postfix/mysql_virtual_mailboxes.cf
1 | user = postfix |
query语句从user表动态构建出用户对应的Maildir目录,格式为domain.tld/username/
/etc/postfix/main.cf中添加:
1 | virtual_mailbox_domains = openwares.net |
创建虚拟邮箱文件夹的所有者
1 | # groupadd -g 5000 vmail |
在users表里添加用户
1 | mysql> insert into users values ('test@openwares.net', 'password'); |
就可以使用test@openwares.net邮箱了。
别名设置
/etc/aliases为postfix的本地别名数据库,可以为本地收件人重定向邮件,这种重定向由本地交付代理(local delivery agent)处理。可以添加一个重定向将root重定向到自己的用户,从而所有的系统邮件都会发给你。比如在文件中添加如下行:
1 | root: yourname |
修改/etc/aliases之后,需要执行命令
1 | # newaliases |
使修改生效。
TLS加密
如果不开启TLS,则邮件客户端与服务器之间是明文传输的,包括邮件内容和smtp认证的用户名和密码都容易被中间节点截获。因此如果需要更安全的电子邮件系统,则需要为postfix配置TLS加密。
启用TLS,需要为服务器创建私钥和数字证书(签名的公钥),公私钥必须是PEM格式,并且私钥不能添加passphrase。
数字证书需要受信任的证书颁发机构(CA)签发才被别人认可,虽然自签也能使用,但不一定为大多数的客户端所支持。
当前免费的CA机构有CACert和StartSSL,但被支持的程度还都不高,CACert在开源世界得到广泛支持。
生成自签X.509证书
1 | $ cd /etc/postfix |
一般使用RSA证书就可以了。有了证书后,在main.cf中添加如下设置:
1 | smtpd_tls_cert_file = /etc/postfix/smtpd.cert #证书 |
通常来讲未机密服务和加密服务使用不同的端口号,比如http使用80,https使用443。smtp使用25,smtps使用465。
但是使用两个端口有些太浪费了,smtp支持STARTSSL,也就是先在25端口上连接,需要加密连接服务时,可以通过STARTSSL将普通连接升级到SSL加密连接。
SMTP最初是设计来传输(transfer)邮件而不是提交(submission)邮件的,因此又有了另一个端口587用于消息提交(message submission)。MSA(Mail Submmission Agent)使用这个端口向MTA(Mail Tansfer Agent)提交邮件。
postfix也可以通过配置直接使用465端口提供加密连接,而不是使用STARTSSL。部分客户端依赖于这种方式,但这种方式是不鼓励使用的。
postfix使用wrapper来支持smtps。
配额quota
可以使用VDA添加配额支持,需要给postfix打补丁。
UPDATE(01/24/2014):
在user表中添加一个用户帐号后,用户的虚拟邮箱目录是尚未建立的,只有当用户收到第一封邮件时,postfix才会为用户建立maildir目录。之后才能使用imap登录用户邮箱,否则imap会有错误提示:
Jan 24 10:33:29 www imapd-ssl: xxx@openwares.net: No such file or directory
所以新增邮箱用户后,立马向其发送一个welcome邮件吧。
参考:
Postfix Basic Configuration
Postfix Virtual Domain Hosting Howto
Postfix Lookup Table Overview
Virtual Users And Domains With Postfix, Courier, MySQL And SquirrelMail (Ubuntu 12.04 LTS)
Postfix TLS Support
SSL vs TLS vs STARTTLS
===
[erq]
抽时间写个MyBatis Generator plugin,生成selectBySampleSelective接口和相应的xml select元素。selectBySampleSelective方法使用一个样本实体记录,通过对sample样本存在的字段与表相应字段做相等比较来检索表记录。虽然selectByExample方法完全可以满足要求,但selectByExample实在太重量级了。