APP下载

Linux环境下基于LDAP验证的高校校园网OpenVPN应用方案设计

2014-05-11

上饶师范学院学报 2014年3期
关键词:用户名配置文件网卡

(泉州经贸职业技术学院 信息技术系,福建 泉州 362000)

VPN是一种基于隧道技术、加解密技术、密钥管理与身份验证等多种技术,通过公共传输通道构建的虚拟专用网络。利用VPN隧道可以实现远程用户通过公共网络访问内网资源,并能够保证数据的安全传输。目前,多数高校为了满足校园网用户能够通过Internet访问校内私有资源以及实现远程办公等需求,大多购买VPN硬件设备以实现搭建远程访问VPN,极大地方便师生在校外访问内部资源。OpenVPN作为一种目前主流且应用广泛、基于SSL的开源VPN技术,可用于创建虚拟专用网络加密通道,其具有强大、高度可配置的优越性能以及较强的网络穿透力、安全性和稳定性,并且支持Windows、Linux等众多平台的应用,实现在不增加VPN硬件设备的情况下,在连接公网的点与站点、站点与站点之间构建一条虚拟通道,并可保证数据传输的安全性,故OpenVPN同样也可适用于搭建高校校园远程访问VPN。同时,由于LDAP目录服务可用于实现大量数据的快速查询,且具有跨平台的特性,通常可与校园网多种应用相结合以实现用户的身份认证。OpenVPN与OpenLDAP均作为目前主流的优秀跨平台开源软件,二者结合可广泛应用于校园网远程访问的多种场景,并且OpenVPN客户端软件除了支持Windows、Linux和MAC系统等多种平台的应用外,还支持目前常见的智能手机系统等其他移动设备终端,故本方案在搭建校园远程访问VPN方面具有较好的应用前景。

1 OpenVPN技术原理

OpenVPN软件集成了虚拟网卡设备、TCP/IP网络技术、路由技术以及SSL数据传输加密等多种技术,允许参与建立VPN的连接双方使用预共享私钥、第三方数字证书或者用户名/密码进行身份验证,该软件应用SSL V3/TLS V1协议,大量使用了OpenSSL加密库,可通过TLS/SSL加密以保证数据传输的安全。

OpenVPN技术核心是虚拟网卡。虚拟网卡是OpenVPN实现SSL VPN功能的关键,其使用TUN/TAP驱动程序,提供了通用TUN/TAP两种类型虚拟网络接口,分别支持路由和桥接两种运行模式。OpenVPN驱动部分实现了网卡处理和字符设备,利用网卡驱动处理网络数据,可以接收来自TCP/IP协议栈的数据包并发送或者将接收到的数据包传给协议栈处理;利用字符设备完成与应用层的数据交互,实现将数据包在内核与用户空间传送,模拟物理链路的数据接收和发送[1]。在OpenVPN的使用过程中要求必须修改路由表。当远程用户连接OpenVPN服务程序时,应用程序发送数据,则系统会通过路由机制将数据发送到虚拟网卡,由字符设备读取数据并送至应用层,最后通过物理网卡完成数据发送;OpenVPN服务程序可通过物理网卡接收到数据,由字符设备将数据传至虚拟网卡,最后通过网络堆栈将数据传给上层应用程序。

2 基于OpenLDAP认证的高校校园网OpenVPN应用方案构建

利用开源软件OpenVPN和OpenLDAP搭建高校远程访问VPN的网络拓扑如图1所示,二者均为Client/Server架构,本方案的实现是基于CentOS 5.6平台,采用软件分别为OpenVPN 2.0.9和OpenLDAP 2.3.43稳定版本。为了保证在Internet上的通信安全,VPN服务器与客户端可进行相互间的身份认证,本方案的VPN客户端采用证书方式认证VPN服务器;VPN服务器则要求客户端提供用户名和密码以实现远程连接用户的身份认证,具体实现过程为:远程客户端利用VPN隧道连接至校园网OpenVPN服务器,并将用户名与密码的认证信息加密后提交至OpenVPN服务器,此时OpenVPN服务器作为OpenLDAP目录服务器的客户端,通过比较来自VPN客户端的认证信息与OpenLDAP服务器事先存放的所有允许连接OpenVPN服务器的用户信息以实现认证。当远程VPN用户认证成功之后,通过检查OpenVPN服务器的本地授权文件以决定是否允许远程用户访问校内资源,从而实现远程连接用户的认证与授权。

图1 高校校园远程访问VPN拓扑结构

2.1 OpenVPN服务器的部署

由于OpenVPN需要对通过VPN隧道的数据进行压缩以提高传输速度,所以应先编译安装LZO压缩模块,接着进行OpenVPN服务软件包的编译安装。首先修改OpenVPN安装路径下的vars文件的相关变量值,然后构建PKI证书及交换密钥协议文件dh1024.pem,这里分别创建CA证书文件及其私钥文件、OpenVPN服务器证书文件及私钥文件,最后配置OpenVPN服务器。本例中创建服务器配置文件ljl-vpn.conf,其基本内容如下:

local 192.168.100.2 //设置OpenVPN监听所使用的本地网卡IP

port 52115 //设置OpenVPN监听端口

proto tcp

dev tun //设置OpenVPN服务器使用路由模式

ca /etc/OpenVPN/keys/ca.crt

cert /etc/OpenVPN/keys/server.crt

key /etc/OpenVPN/keys/server.key

//以上分别指定CA证书、服务器证书及私钥文件

dh /etc/OpenVPN/keys/dh1024.pem //指定DH参数,用于增强OpenVPN安全性

server 10.8.0.0 255.255.255.0

//OpenVPN成功连接之后,VPN服务器动态分配给VPN客户端的地址范围

push “route 192.168.100.0 255.255.255.0"

//在VPN客户端本地生成VPN服务器所在内网网段路由

……

完成以上配置之后,需要编辑内核参数配置文件etc/sysctl.conf,设置net.ipv4.ip forward=1,并执行sysctl -p命令使之生效,以实现开启服务器的内核转发功能,最后通过以下命令启动VPN服务:

#/usr/local/sbin/OpenVPN --config /etc/OpenVPN/ljl-vpn.conf &

2.2 OpenVPN客户端的基本配置

考虑到校园网用户基本都是使用Windows客户端,所以选择安装与当前OpenVPN服务器版本相匹配的Windows平台客户端软件,之后将/etc/OpenVPN文件夹下的OpenVPN客户端配置文件client.conf与服务器创建的CA证书ca.crt复制至C:Program FilesOpenVPNconfig文件夹,然后编辑修改OpenVPN客户端配置文件client.conf,这里将其更名为适用于Windows平台下扩展名为.ovpn的文件c-ljl.ovpn,其主要配置如下:

client

dev tun

proto tcp

remote 100.0.0.1 52115

//指定连接校园网防火墙外网IP及端口,将会映射到VPN服务器的本地IP及端口

ca ca.crt //指定CA证书文件

2.3 配置OpenLDAP服务器及客户端

OpenLDAP是一种提供LDAP轻量级目录访问协议的跨平台开源软件,目录中的信息是按照树状结构进行存储的,具有高效的查询速度,能够适应大并发数的查询请求[2],在校园网中搭建OpenLDAP服务通常用于实现用户的身份认证,可以在内网的另一Linux主机上进行OpenLDAP的安装、配置与管理,这里主要用于实现VPN用户的认证。首先配置/etc/hosts文件,此处设置LDAP域名为“qzjmc.cn”,对应IP为192.168.100.3,然后进行OpenLDAP服务器的安装与配置,接下来针对OpenLDAP主配置文件slapd.conf中以suffix、rootdn开头的行做如下修改:

suffix “dc=qzjmc,dc=cn" //指定要搜索的后缀

rootdn “cn=admin,dc=qzjmc,dc=cn" //指定管理员dn路径

复制/etc/OpenLDAP目录下的数据库配置文件DB CONFIG.example至/var/lib/ldap目录并将其改名为DB CONFIG。在完成以上配置之后,首先启动LDAP服务,接着进行OpenLDAP数据库的初始化工作。本例实现直接迁移系统用户数据至目录服务数据库中作为LDAP用户,将/usr/share/OpenLDAP/migration下的migrate common.ph文件进行如下修改:

$DEFAULT MAIL DOMAIN = “qzjmc.cn";

$DEFAULT BASE = “dc=qzjmc,dc=cn";

通过执行以下命令进行系统用户迁移,即向LDAP数据库添加用户信息:

# /usr/share/OpenLDAP/migration/migrate base.pl > base.ldif

# /usr/share/OpenLDAP/migration/migrate passwd.pl /etc/passwd > passwd.ldif

# /usr/share/OpenLDAP/migration/migrate group.pl /etc/group > group.ldif

#ldapadd -W -x -H ldap://127.0.0.1 -D “cn=admin,dc=qzjmc,dc=cn"-f base.ldif

#ldapadd -W -x -H ldap://127.0.0.1 -D “cn=admin,dc=qzjmc,dc=cn"-f passwd.ldif

#ldapadd -W -x -H ldap://127.0.0.1 -D “cn=admin,dc=qzjmc,dc=cn"-f group.ldif

由于本方案中的OpenVPN服务器同时也作为OpenLDAP客户端,所以可直接在OpenVPN服务器上安装OpenLDAP客户端软件,然后执行authconfig-tui命令,显示如图2所示的界面进行配置。

图2 OpenLDAP客户端配置界面

选中图中标出的各个选项,并在“LDAP Settings"对话框设置LDAP服务器域名为“ldap://qzjmc.cn",Base DN为“dc=qzjmc,dc=cn"。完成OpenLDAP客户端配置之后,远程VPN用户即可拨号连接OpenVPN服务器,该服务器作为OpenLDAP客户端需要查询OpenLDAP服务器上允许连接VPN的用户信息,以实现远程连接VPN用户的身份验证,此时应分别在OpenLDAP服务器及客户端的防火墙上开放LDAP服务所使用的端口。在VPN用户连接的整个过程,可以通过查看OpenLDAP客户端的系统登录信息日志以实现用户登录故障的排查。

2.4 OpenVPN远程拨入用户的认证与访问授权

为了实现OpenVPN服务器以用户名/密码的方式对于远程拨入用户的身份认证,本例在OpenVPN服务器配置文件中加入以下三行命令:

auth-user-pass-verify /etc/OpenVPN/check credit.py via-file

client-cert-not-required

username-as-common-name

其中OpenVPN服务器参数auth-user-pass-verify用于指定Web认证的方式,这里调用自定义的Python脚本文件check credit.py实现通过LDAP认证;参数client-cert-not-required表示不请求客户端的CA证书认证而直接使用用户名/密码的方式认证;username-as-common-name参数指定使用客户提供的username作为Common Name。

远程OpenVPN客户端若只使用用户名/密码的方式进行认证,必须在其配置文件中注释掉指定客户端证书与密钥的两行内容,即为客户端不使用证书认证,并在其末尾添加“auth-user-pass”一行。

本方案通过创建Python脚本读取LDAP数据库实现认证,并且配合OpenVPN服务器本地文件进行登录访问的授权控制。由于Python脚本含有内置的LDAP函数,故可直接连接LDAP服务器,check credit.py脚本文件用于接收OpenVPN客户端传过来的用户名与密码,并与OpenLDAP服务器目录数据库中存放的LDAP用户信息进行比对,从而实现用户认证,当认证成功之后再通过检查本地授权文件实现控制哪些用户能够连接登录OpenVPN服务器并允许访问内网资源。

在OpenVPN服务器的/etc/OpenVPN目录下创建Python脚本文件check credit.py,其主要代码如下:

#!/usr/bin/python

......

import ldap //导入内置的LDAP函数

# settings for ldap 设置LDAP连接的地址及搜索路径

ldap uri = “ldap://192.168.100.3:389"

ldap starttls = True

ldap dn = “dc=qzjmc,dc=cn"

auth filename = “/etc/OpenVPN/grant-users.conf"

//指定本地授权文件,用于实现控制已通过认证的用户是否具有访问内网资源的权限

def get users(fpath): //获取OpenVPN服务器本地授权文件中的用户列表

fp = open(fpath, “rb")

lines = fp.readlines()

fp.close()

users = {}

for line in lines:

line = line.strip()

if len(line) <= 0 or line.startswith(‘#'):

!continue

users[line] = True

return users

def get credits(fpath): //获取远程VPN客户端提交的用户名与密码

fp = open(fpath, “rb")

lines = fp.readlines()

fp.close()

assert len(lines)>=2, “invalid credit file"

username = lines[0].strip()

password = lines[1].strip()

return (username, password)

def check credits(username, password):

//检查并验证远程VPN连接用户是否在LDAP目录数据库中,以实现用户认证

passed = False

ldap.set option(ldap.OPT PROTOCOL VERSION, ldap.VERSION3)

l = ldap.initialize(ldap uri)

if ldap starttls:

l.start tls s()

try:

l.simple bind s(ldap dn % (username,), password)

passed = True

except ldap.INVALID CREDENTIALS, e:

logging.error(“username/password failed verifying")

l.unbind()

return passed

def main(argv):

credit fpath = argv[1]

(username,password) = get credits(credit fpath)

if check credits(username, password):

users = get users(auth filename)

if not username in users: //判断已认证用户是否在授权访问用户列表中

logging.error(“user ‘%s' not authorized to access" % username)

return 1 //返回1表示拒绝连接访问

logging.info(“access of user ‘%s' granted" % username)

return 0 //返回0表示授权连接访问

else:

logging.error(“access of user ‘%s' denied" % username)

return 1

......

在OpenVPN服务器的/etc/OpenVPN目录下创建本地授权文件grant-users.conf,并将允许授权访问的VPN用户名添加至该文件,以上的Python脚本文件通过读取本地授权文件,检查已通过认证的用户是否也出现在该授权文件的用户列表中,若存在的话则返回值为0,表示已认证用户允许授权连接访问;否则返回值为1,则表示未被授权访问。

2.5 配置OpenVPN远程拨入用户访问内网主机

在完成OpenVPN服务器与客户端的配置之后,必须在VPN通信双方的主机及校园网防火墙网关上分别开放OpenVPN连接所使用的端口,本例为TCP的52115端口,并且应在校园网防火墙上配置OpenVPN服务器映射的公网IP及端口,这里映射为防火墙外网卡IP及TCP的52115端口,然后便可在VPN客户端上运行OpenVPN GUI程序,通过利用映射的公网IP及连接端口并输入用户名与密码进行拨号连接,在成功认证并授权建立访问连接之后,OpenVPN服务器便会增加一块名为tun0的虚拟网卡,其IP为之前服务器配置文件ljl-vpn..conf中server字段指定的属于10.8.0.0网段的IP地址10.8.0.1,同时VPN服务器给客户端分配一个同属于10.8.0.0网段的IP地址10.8.0.6,此时VPN客户端可以Ping通VPN服务器的tun0虚拟网卡IP及本地网卡IP,但无法访问与OpenVPN服务器在同一网段的其他内网主机,可以通过配置VPN服务器所在的Linux主机IPtables防火墙的SNAT源地址转换功能,使得所有访问VPN服务器所在内网主机的请求数据包的源IP地址重新映射为VPN服务器的本地IP,则远程VPN客户端便可在成功建立VPN连接之后使用校园网私有IP地址访问OpenVPN服务器所在内网网段的主机。OpenVPN服务器的IPtables防火墙SNAT功能配置命令为:

#/sbin/iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth1 -j SNAT --to-source 192.168.100.2

以上IPtables命令实现在NAT链中添加一条SNAT转换规则,其中-o eth1代表VPN服务器本地网卡,其IP地址为192.168.100.2。

3 OpenVPN与OpenLDAP服务的安全管理

3.1 OpenVPN的用户访问控制

目前OpenVPN主要使用两种用户访问控制方法,分别为包过滤机制与IPtables防火墙机制[3]。通过OpenVPN内建的包过滤机制,可以实现对访问者进行细粒度的访问控制。针对每一用户建立相应的包过滤策略文件或添加默认的过滤文件,可以限制VPN客户端对OpenVPN服务器所在的内部网络中指定子网或IP的主机访问。另外,也可以通过配置IPtables防火墙实现VPN用户的访问控制,给拨入OpenVPN服务器的不同用户分配不同的访问权限,即首先为不同的OpenVPN拨入用户分配不同的IP地址,然后编写IPtables策略对不同的IP控制不同的访问。通过IPtables规则可以实现针对VPN用户的IP地址、被访问资源的IP地址以及所开启的端口服务进行访问限制[4](P370)。

3.2 OpenLDAP服务的安全加密通信与目录数据访问控制

OpenLDAP服务器与客户端之间默认使用明文进行通信,包括发送的用户认证信息,OpenLDAP支持TLS加密[5](P203),可以将LDAP协议与SSL协议相结合即为实现LDAPS服务。通过利用openssl软件构建PKI证书实现OpenLDAP服务器与客户端之间的身份认证,也可配置双方支持使用SSL安全通信。另外,为了防止针对LDAP目录数据的非法访问或篡改等越权操作[6](P77),通常可以在OpenLDAP服务器主配置文件slapd.conf中使用ACL功能的access语句实现控制用户是否具有读取、写入、创建及删除条目的授权权限。

4 结语

相对于PPTP VPN、L2TP VPN和IPSec VPN等其他VPN技术而言,OpenVPN提供了一种经济、可行且具有较高安全性与稳定性的远程SSL VPN解决方案,其具有较强的网络穿透力,并且可实现基于用户和IP地址的细粒度访问控制。利用OpenVPN技术实现点到站点的远程连接访问,并通过配合OpenLDAP进行VPN拨入用户的认证与访问授权,可以较好地解决校园网用户通过Internet访问校内私有资源的需求。另外,OpenVPN也可用于搭建经由Internet连接的多个不同校区内网之间的站点到站点VPN,下一步研究重点是利用OpenVPN实现各校区间如同在同一局域网内部,可以使用私有IP地址的方式进行内部资源共享及相互访问。

参考文献:

[1] 林圣东,陈小惠,赵瑞卿. 基于OpenVPN 的Lan-to-Lan VPN的设计与实现[J]. 电子测试,2012,(4):88.

[2]李吉勇. 基于OpenLDAP 的校园网统一身份认证设计[J]. 电脑编程技巧与维护,2012,(14):112.

[3]金宝龙. Linux 下OpenVPN 的两种用户访问控制方法[J]. 电脑知识与技术 2013,9(11):25-55.

[4]陶利军.构建虚拟专用通道-OpenVPN服务器详解与架设指南(基于Linux)[M]. 北京:清华大学出版社,2013.

[5]曹江华,林捷. RedHat Enterprise 6.0服务器构建[M]. 北京:电子工业出版社,2012.

[6]李晨光. Linux企业应用案例精解[M]. 北京:清华大学出版社,2012.

猜你喜欢

用户名配置文件网卡
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
《护士进修杂志》投稿程序
互不干涉混用Chromium Edge
Server 2016网卡组合模式
基于Zookeeper的配置管理中心设计与实现
忘记ESXi主机root密码怎么办
为View桌面准备父虚拟机
机智的快递员
挑战Killer网卡Realtek网游专用Dragon网卡