一个Python脚本,让OpenVPN使用postfix邮箱帐号进行身份认证

这几天配置OpenVPN,使用了用户名密码的身份认证方式,借助已有的postfix邮箱帐号,省去了再为每个人设置用户名密码的麻烦。

原理很简单,OpenVPN服务器配置里有这样一句:

auth-user-pass-verify /etc/openvpn/auth-postfix-mailbox.py via-env

就是说要用/etc/openvpn/auth-postfix-mailbox.py这个脚本来验证用户名和密码。用户名和密码如何传递给它呢?via-env,环境变量。

脚本如下:

  1. #!/usr/bin/env python
  2.  
  3. import os
  4. import sys
  5. from MySQLdb import *
  6. import md5crypt
  7.  
  8. def auth(username, password):
  9.   conn = connect (host = 'localhost',
  10.                   user = 'dbuser',
  11.                   passwd = 'dbpasswd',
  12.                   db = 'postfix')
  13.   cursor = conn.cursor()
  14.   cursor.execute("""
  15.       select password from mailbox
  16.       where username=%s
  17.       and active=1
  18.     """, (username))
  19.   row = cursor.fetchone()
  20.   if row == None:
  21.     return 1
  22.   crypt = md5crypt.md5crypt(password, row[0])
  23.   cursor.execute("""
  24.       select * from mailbox
  25.       where username=%s
  26.       and password=%s
  27.       and active=1
  28.    """, (username,crypt))
  29.   row = cursor.fetchone()
  30.   cursor.close()
  31.   conn.close()
  32.   if row == None:
  33.     return 1
  34.   return 0
  35.  
  36. def main():
  37.   status = 0
  38.   try:
  39.     username = os.environ['username']
  40.     password = os.environ['password']
  41.     status = auth(username, password)
  42.   except:
  43.     sys.exit(1)
  44.  
  45.   sys.exit(status)
  46.  
  47. if __name__ == "__main__":
  48.   main()

由于postfix使用md5认证,所以需要用md5crypt这个模块,从这里可以下载到。

postfix和postgrey问题

公司的邮件服务器收不到外来邮件了,日志里有这样的错误:

554 Service unavailable; Client host [xxx.xxx.xxx.xxx] blocked using relays.ordb.org; ordb.org was shut down on December 18, 2006. Please remove from your mailserver.;

对应main.cf里的配置是这样的:

smtpd_client_restrictions = permit_mynetworks, warn_if_reject reject_rbl_client sbl.spamhaus.org, warn_if_reject reject_rbl_client relays.ordb.org, warn_if_reject reject_rbl_client blackholes.easynet.nl, warn_if_reject reject_rbl_client dnsbl.njabl.org

改成只保留smtpd_client_restrictions = permit_mynetworks, 又有新信息出现:

postfix/smtpd[16212]: warning: problem talking to server 127.0.0.1:60000: Connection timed out

127.0.0.1:60000是postgrey工作的端口,用ps和netstat 发现postgrey进程还在,但top命令发现它占用了99%的CPU,而且用/etc/init.d/postgrey stop停不掉,只好kill掉,并改postfix里相应的设置,去掉postgrey检查:

smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks,permit_sasl_authenticated, reject_non_fqdn_recipient,reject_unauth_destination, check_policy_service inet:127.0.0.1:60000,permit

重启postfix,邮件可以收到了。再恢复smtpd_client_restrictions的配置,去掉relays.ordb.org检查,邮件可以收到。顺便搞清楚了warn_if_reject的含义:有它在时并不真正的拒绝邮件。

postgrey的问题还没找到解决办法,不知道为什么会hang在那里,暂时不用它了。

==== 2008-05-14 ====
补充: 将Berkeley DB由原来的4.3升级到4.4以后,postgrey正常了。
搜索到的相关信息:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=441069

https://bugs.edge.launchpad.net/ubuntu/gutsy/+source/db4.4/+bug/153996

Xfce 字体问题

昨天为了使用笔记本(T43, ATI Mobility Radeon X300显卡)的VGA OUT功能,改用了ATI的驱动(xorg-driver-fglrx),字体变小了,虽然在User Interface和Window Manager里设置了字体,但有些地方的字体还是很小,尤其是ThunderBird的邮件正文,中文字都要缩成一团了。

Google到了一个方法,就是修改~/.config/xfce4/Xft.xrdb这个文件,在里面加上这句

Xft.dpi: 96

再看User Interface的Font设置,发现里面也有DPI的设置,呵呵。

今晚折腾久违了的weblog

很久没上来了,终于想要记下点东西了。

顺手升级了wordpress到2.5.1,用dreamhost的one click install,很方便。但访问升级页面时,得到了错误:
“Cannot redeclare is_tag()”

这里找到了原因,是ultimate-tag-warrior.php重复定义了is_tag()函数。

K2主题也升级到了最新版,很多东西都需要重新调整,慢慢弄吧。

今天新加了一个分类“Symbian”,准备把自己使用Symbian程序(都是开源或者freeware)的心得记一下,呵呵,注意不是编程心得哈。

升级到Ubuntu 8.04

五一假期用了一晚时间升级了笔记本电脑上装的Ubuntu,注意到一些变化:
1. 启动过程中如果检查硬盘不会显示纯终端界面了
2. 登录xfce后无线网自动连接,不用再输入keyring的密码,很方便
3. Firefox 升级到3.0
4. 中文字体显示效果似乎比以前好了

升级后原来的vmware-player不能用啦,按照这里的说明即可解决。