<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">

<channel>
	<title>wolfg&#039;s Weblog &#187; openvpn</title>
	<atom:link href="http://guoyong.org/tag/openvpn/feed" rel="self" type="application/rss+xml" />
	<link>http://guoyong.org</link>
	<description>wolfg&#039;s journey with open source, linux, programming, sysadm ...</description>
	<lastBuildDate>Thu, 04 Aug 2011 15:02:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.5/cn/</creativeCommons:license>		<item>
		<title>一个Python脚本，让OpenVPN使用postfix邮箱帐号进行身份认证</title>
		<link>http://guoyong.org/2008/05/14/359</link>
		<comments>http://guoyong.org/2008/05/14/359#comments</comments>
		<pubDate>Wed, 14 May 2008 13:27:36 +0000</pubDate>
		<dc:creator>wolfg</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[md5crypt]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[openvpn]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://guoyong.org/?p=359</guid>
		<description><![CDATA[这几天配置OpenVPN，使用了用户名密码的身份认证方式，借助已有的postfix邮箱帐号，省去了再为每个人设置用户名密码的麻烦。 原理很简单，OpenVPN服务器配置里有这样一句： auth-user-pass-verify /etc/openvpn/auth-postfix-mailbox.py via-env 就是说要用/etc/openvpn/auth-postfix-mailbox.py这个脚本来验证用户名和密码。用户名和密码如何传递给它呢？via-env，环境变量。 脚本如下： #!/usr/bin/env python &#160; import&#160;os import&#160;sys from&#160;MySQLdb import * import&#160;md5crypt &#160; def&#160;auth(username, password): &#160; conn = connect&#160;(host = 'localhost', &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; user = 'dbuser', &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; passwd = 'dbpasswd', &#160; &#160; &#160; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>这几天配置OpenVPN，使用了用户名密码的身份认证方式，借助已有的postfix邮箱帐号，省去了再为每个人设置用户名密码的麻烦。</p>
<p>原理很简单，OpenVPN服务器配置里有这样一句：</p>
<div class="hl-surround"><div class="hl-main">auth-user-pass-verify /etc/openvpn/auth-postfix-mailbox.py via-env</div></div>
<p>就是说要用/etc/openvpn/auth-postfix-mailbox.py这个脚本来验证用户名和密码。用户名和密码如何传递给它呢？via-env，环境变量。</p>
<p>脚本如下：</p>
<div class="hl-surround"><ol class="hl-main ln-show" title="Double click to hide line number." ondblclick = "linenumber(this)"><li class="hl-firstline"><span style="color: #ffa500;">#!/usr/bin/env python</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">os</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">sys</span></li>
<li><span style="color: Green;">from</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">MySQLdb</span><span style="color: Gray;"> </span><span style="color: Green;">import</span><span style="color: Gray;"> *</span></li>
<li><span style="color: Green;">import</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">md5crypt</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">auth</span><span style="color: Olive;">(</span><span style="color: Blue;">username</span><span style="color: Gray;">, </span><span style="color: Blue;">password</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">conn</span><span style="color: Gray;"> = </span><span style="color: Blue;">connect</span><span style="color: Gray;">&nbsp;</span><span style="color: Olive;">(</span><span style="color: Blue;">host</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">localhost</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">user</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">dbuser</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">passwd</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">dbpasswd</span><span style="color: #8b0000;">'</span><span style="color: Gray;">,</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: Blue;">db</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">postfix</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">cursor</span><span style="color: Gray;"> = </span><span style="color: Blue;">conn</span><span style="color: Gray;">.</span><span style="color: Blue;">cursor</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">cursor</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;&quot;&quot;</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; select password from mailbox </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; where username=%s</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; and active=1</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; </span><span style="color: #8b0000;">&quot;&quot;&quot;</span><span style="color: Gray;">, </span><span style="color: Olive;">(</span><span style="color: Blue;">username</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">row</span><span style="color: Gray;"> = </span><span style="color: Blue;">cursor</span><span style="color: Gray;">.</span><span style="color: Blue;">fetchone</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">row</span><span style="color: Gray;"> == </span><span style="color: Green;">None</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">1</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">crypt</span><span style="color: Gray;"> = </span><span style="color: Blue;">md5crypt</span><span style="color: Gray;">.</span><span style="color: Blue;">md5crypt</span><span style="color: Olive;">(</span><span style="color: Blue;">password</span><span style="color: Gray;">, </span><span style="color: Blue;">row</span><span style="color: Olive;">[</span><span style="color: Maroon;">0</span><span style="color: Olive;">])</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">cursor</span><span style="color: Gray;">.</span><span style="color: Blue;">execute</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;&quot;&quot;</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; select * from mailbox</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; where username=%s </span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; and password=%s</span></li>
<li><span style="color: Red;">&nbsp; &nbsp; &nbsp; and active=1</span></li>
<li><span style="color: Red;">&nbsp;&nbsp; </span><span style="color: #8b0000;">&quot;&quot;&quot;</span><span style="color: Gray;">, </span><span style="color: Olive;">(</span><span style="color: Blue;">username</span><span style="color: Gray;">,</span><span style="color: Blue;">crypt</span><span style="color: Olive;">))</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">row</span><span style="color: Gray;"> = </span><span style="color: Blue;">cursor</span><span style="color: Gray;">.</span><span style="color: Blue;">fetchone</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">cursor</span><span style="color: Gray;">.</span><span style="color: Blue;">close</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">conn</span><span style="color: Gray;">.</span><span style="color: Blue;">close</span><span style="color: Olive;">()</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">row</span><span style="color: Gray;"> == </span><span style="color: Green;">None</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">1</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;">&nbsp;</span><span style="color: Maroon;">0</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">def</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">main</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">status</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">try</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">username</span><span style="color: Gray;"> = </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">environ</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">username</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">password</span><span style="color: Gray;"> = </span><span style="color: Blue;">os</span><span style="color: Gray;">.</span><span style="color: Blue;">environ</span><span style="color: Olive;">[</span><span style="color: #8b0000;">'</span><span style="color: Red;">password</span><span style="color: #8b0000;">'</span><span style="color: Olive;">]</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">status</span><span style="color: Gray;"> = </span><span style="color: Blue;">auth</span><span style="color: Olive;">(</span><span style="color: Blue;">username</span><span style="color: Gray;">, </span><span style="color: Blue;">password</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Green;">except</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; &nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">sys</span><span style="color: Gray;">.</span><span style="color: Blue;">exit</span><span style="color: Olive;">(</span><span style="color: Blue;">status</span><span style="color: Olive;">)</span></li>
<li><span style="color: Gray;">&nbsp;</span></li>
<li><span style="color: Green;">if</span><span style="color: Gray;">&nbsp;</span><span style="color: Blue;">__name__</span><span style="color: Gray;"> == </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">__main__</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">:</span></li>
<li><span style="color: Gray;">&nbsp; </span><span style="color: Blue;">main</span><span style="color: Olive;">()</span></li></ol></div>
<p>由于postfix使用md5认证，所以需要用md5crypt这个模块，从<a href="http://www.sabren.net/code/python/crypt/md5crypt.py">这里</a>可以下载到。</p>
]]></content:encoded>
			<wfw:commentRss>http://guoyong.org/2008/05/14/359/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

