Open×××整合OpenLDAP(上)

http://blog.sina.com.cn/s/blog_92dc41ea0101qxrr.html

 

Openvpn2.2.2

操作系统:RHEL6.3最小安装,eth0172.16.5.38eth1172.16.5.44

OPEN×××-2.2.2(服务端)

ftp://rpmfind.net/linux/epel/6/i386/openvpn-2.2.2-1.el6.i686.rpm

OPEN×××2.2.2 (Windows客户端):

http://download.pchome.net/internet/tools/download-82504.html

额外软件包需求:

openssl openssl-devel wget gcc openssh-clients(可直接yum install)

pkcs11-helper pkcs11-helper-devel lzo lzo-devel(需要在rpmfind.net上查找并下载)

ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/dag/RPMS/pkcs11-helper-devel-1.08-1.el6.rf.i686.rpm

ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/dag/RPMS/pkcs11-helper-1.08-1.el6.rf.i686.rpm

ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/extras/RPMS/lzo-devel-2.06-1.el6.rfx.i686.rpm

ftp://rpmfind.net/linux/dag/redhat/el6/en/i386/extras/RPMS/lzo-2.06-1.el6.rfx.i686.rpm

[root@ns2 ~]# yum install pkcs11-helper-*lzo*

1、下载并安装openvpn

[root@vpnldap ~]#wget ftp://rpmfind.net/linux/epel/6/i386/openvpn-2.2.2-1.el6.i686.rpm

[root@vpnldap ~]#yum install openvpn-2.2.2-1.el6.i686.rpm

2、配置openvpn服务(服务端)

1) 初始化PKIPublic Key Infrastructure

/usr/share/doc/openvpn-2.2.2/easy-rsa/2.0目录下(有时是 /usr/share/openvpn/easy-rsa/2.0/

目录,找不到时可用find / -name "vars"来查找,修改默认的变量vars

[root@liaosnet.com 2.0] vi vars

修改最后的几行的export的值自定义的值

export KEY_COUNTRY="CN"

export KEY_PROVINCE="GD"

export KEY_CITY="Guangzhou"

export KEY_ORG="kingmed"

export KEY_EMAIL="root@kingmed.com.cn"

export KEY_EMAIL=liuyuhui@kingmed.com.cn

export KEY_CN=kingmed

export KEY_NAME=kingmed

export KEY_OU=kingmed

export PKCS11_MODULE_PATH=kingmed

export PKCS11_PIN=1234

[root@vpnldap 2.0]# ln -s openssl-1.0.0.cnf openssl.cnf

[root@vpnldap 2.0]# . vars

NOTE: If you run ./clean-all, I will be doing a rm -rf on /usr/share/doc/openvpn-2.2.2/easy-rsa/2.0/keys


清除之前的keys

[root@vpnldap 2.0]# ./clean-all


2) 创建CA机构密钥(ca private key)

[root@vpnldap 2.0]# ./build-ca

由于刚配置了默认变量,故一路回车下去即可

完成后,在keys目录下生成1024RSA私钥ca.keyca.crt 两个文件

3) 创建服务器密钥(server key)

[root@vpnldap 2.0]# ./build-key-server server

···省略···

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:aabbccdd

An optional company name []:

Using configuration from /usr/share/doc/openvpn-2.2.2/easy-rsa/2.0/openssl.cnf

Certificate is to be certified until Jan 26 11:42:21 2023 GMT (3650 days)

···省略···

完成后,在keys目录下生成1024RSA服务器密钥server.keyserver.crtserver.csr 三个文件

4) 生成Diffie Hellman参数

[root@vpnldap 2.0]# ./build-dh

完成后,在keys目录下生成dh参数文件dh1024.pem

/usr/share/doc/openvpn-2.2.2/easy-rsa/2.0/keys 目录下的所有文件复制到/etc/openvpn

[root@vpnldap 2.0cp keys/* /etc/openvpn/

如果创建备用的Open×××服务器,对用户来说,共用一个ca证书避免切换麻烦的话,就把刚才复制的密钥复制到备用服务器上去,备用服务器不用上边123)三步操作了。

5) 创建服务端配置文件server.conf

[root@vpnldap ]# cp /usr/share/doc/openvpn-2.2.2/sample-config-files/server.conf/etc/openvpn/

[root@vpnldap ]# grep '^[^#;]' /etc/openvpn/server.conf

script-security 3

port 1194

proto tcp##使用TCP协议是为了能在keepalived中方便对1194端口进行检测

dev tun

ca ca.crt

cert server.crt

key server.key # This file should be kept secret

dh dh1024.pem

server 10.8.0.0 255.255.255.0

#ifconfig-pool-persist ipp.txt##测试期间记忆IP会带来不必要的麻烦

push "route 192.168.0.0 255.255.255.0"

push "route 192.168.4.0 255.255.255.0"

keepalive 10 120

cipher AES-128-CBC # AES

comp-lzo

user nobody

group nobody

persist-key

persist-tun

status openvpn-status.log

log-append openvpn.log

verb 0

mute 20

6) 设置允许IP转发

/etc/openvpn目录下编写openvpn-startup文件,内容如下:

# enable IP forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

使之可执行:

chmod 755 openvpn-startup

7) 防火墙的端口设定

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A FORWARD -d 10.8.0.0/24 -j ACCEPT//允许其他网卡转发给vpn虚拟网络

-A FORWARD -i tun0 -j ACCEPT//允许trun接口转发给其他网卡

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p tcp -m tcp--dport 1194 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 389 -j ACCEPT

-A INPUT -p udp -m udp --dport 389 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

重启防火墙:service iptables restart

启动×××service openvpn start 

最后最重要的一点,就是要在×××服务器所在的局域网网关设备上添加到vpn虚拟网络的路由,否则vpn client无法访问 vpn server所在的局域网,vpn也就失去了意义。

比如对cisco网关,可设定为route 10.8.0.0 255.255.255.0 192.168.0.71

其中192.168.0.71是我的vpn server的网卡的IP地址

3、配置openvpn客户端(windows)

windows下安装openvpn2.2.2,默认的安装目录为:C:\Program Files\Open×××

1) 将服务端/etc/openvpn目录下的ca.crt文件下载到C:\Program Files\Open×××\config目录下

2) 配置client.conf

C:\Program Files\Open×××\sample-config\下的client.ovpn复制到C:\Program Files\Open×××\config目录下,并修改之

client

dev tun

proto tcp

remote vpn.kingmed.com.cn 1194;VIP

remote vpn1.kingmed.com.cn 1194;real IP

remote vpn1.kingmed.com.cn 1194;real IP

resolv-retry infinite

nobind

persist-key

persist-tun

ca ca.crt

auth-user-pass

ns-cert-type server

cipher AES-128-CBC

comp-lzo

verb 3

其他值和服务器端设置相同,但要注意Windows下不能启用user nobodygroup nobody

实际测试连接时,会提示没有管理权限,不能创建日志文件,根据提示信息,在相应目录手工建立log文件夹即可。

 

Open×××整合OpenLDAP(中)

进阶篇:openvpn整合openldap 

配置ldap主服务器

1、安装:yum install openldap*

2、创建管理员密码,尽量使用高强度密码:

slappasswd

:本人输入的密码为aabbccdd保存生成的SSHA密文,后面要用到。

3、cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

grep "^[^#]" /etc/openldap/slapd.conf,确保有以下行:

include /etc/openldap/schema/core.schema

include /etc/openldap/schema/cosine.schema

include /etc/openldap/schema/inetorgperson.schema

include /etc/openldap/schema/nis.schema

allow bind_v2

pidfile /var/run/openldap/slapd.pid

argsfile /var/run/openldap/slapd.args

modulepath /usr/lib/openldap

moduleload syncprov.la

access to dn.subtree="ou=Guangzhou,dc=kingmed,dc=com"

by dn.base="cn=guangzhou,ou=Guangzhou,dc=kingmed,dc=com" write

by * read

access to attrs=shadowLastChange,userPassword

by self write

by * auth

access to *

by * read

database bdb

suffix "dc=kingmed,dc=com"

checkpoint 1024 15

rootdn "cn=Manager,dc=kingmed,dc=com"

rootpw {SSHA}4YNSnvI6n2+n2ZlypW79ieoF9mRANjQb

directory /var/lib/ldap

index objectClass eq,pres

index ou,cn,mail,surname,givenname eq,pres,sub

serverID 123

overlay syncprov

syncrepl rid=001 provider=ldap://192.168.0.72:389 type=refreshAndPersist searchbase="dc=kingmed,dc=com" schemachecking=on bindmethod=simple binddn="cn=Manager,dc=kingmed,dc=com" credentials=aabbccddretry="60 +"

mirrormode on

注意access to attrs=shadowLastChange,userPassword这一条如果放在最前面,则后面的二级管理员无法修改自己管辖区内的用户密码。

4、删除/etc/openldap/slapd.d目录内容,并重新生成配置文件:

rm -rf /etc/openldap/slapd.d/*

slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d

chown -R ldap:ldap/etc/openldap/slapd.d 

另外需要注意的是:若日后变更了slapd.conf文件的内容,则重复上面三行操作。

5、如果想在服务器端运行客户端测试工具,则需修改/etc/openldap/ldap.conf,加入

BASE dc=kingmed,dc=com

6、创建数据库配置文件,从模板产生:

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

7、创建并编辑域结构文件frontend.ldif,输入以下行:

[root@H23A ~]#vi frontend.ldif

dn: dc=kingmed,dc=com

objectClass: top

objectClass: domain

dc: kingmed

dn: ou=Group,dc=kingmed,dc=com

objectClass: top

objectClass: organizationalUnit

ou: Group

因在OpenLDAP里创建用户帐号需要用户组名,所以创建个ou=Group专门放用户的组。

导入资料(slapadd命令会在/var/lib/ldap/目录下产生很多数据库文件

slapadd -v -l frontend.ldif

chown -R ldap:ldap/var/lib/ldap 

如果是用ldapadd 命令导入,则所有者自然都是ldap:ldap

8、启动ldap

/etc/rc.d/init.d/slapd start 

chkconfig slapd on 

配置ldap从服务器

从服务器的安装方法同主服务器,将主配置文件slapd.conf复制到从服务器,修改最后一段serverID123起的内容,要替换为:

serverID 456

overlay syncprov

syncrepl rid=001 provider=ldap://192.168.0.71:389 type=refreshAndPersist searchbase="dc=kingmed,dc=com" schemachecking=on bindmethod=simple binddn="cn=Manager,dc=kingmed,dc=com" credentials=aabbccddretry="60 +"

mirrormode on

再就是导入frontend.ldif文件:slapadd -v -l database.ldif,完毕启动slapd服务。

参考IBM官方网站和个人博客:

http://www.ibm.com/developerworks/cn/linux/l-openldap/

http://blog.chinaunix.net/uid-12380499-id-105548.html

http://iceblood.blog.163.com/blog/static/11331322720125843938486/

附:快速清除数据库、重新导入数据的配置命令

service slapd stop

rm -rf /var/lib/ldap/*

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG

slapadd -v -l frontend.ldif

chown -R ldap:ldap /var/lib/ldap

service slapd start

[root@vpnldap ~]# ldapsearch -x -b 'dc=kingmed,dc=com'//查询kingmed.com

由于命令行操作不直观,所我们一般使用一些第三方工具来管理认证,如phpldapadmin

Phpldapadmin安装与使用

1安装与配置httpdphp

yum -y install httpd php php-ldap unzip

chkconfig httpd on

2下载phpldapadmin

1cd /var/www/html/

2wget 

http://nchc.dl.sourceforge.net/project/phpldapadmin/phpldapadmin-php5/1.2.3/phpldapadmin-1.2.3.zip

3) unzip phpldapadmin-1.2.3.zip

4) mv phpldapadmin-1.2.3vpnldap

注意:如果phpldapadmin是从别的目录复制过来的并且开启了Selinux,就要先用restorecon R /var/www/html恢复该目录下所有文件的安全上下文

3配置phpldapadmin

cd /var/www/html/vpnldap/config

cp config.php.example config.php

修改下列config.php选项(文件最后几段),注意行首不要有空格:

$servers->setValue('server','base',array('dc=kingmed,dc=com')); # line 534

$servers->setValue('login','bind_id','cn=Manager,dc=kingmed,dc=com'); $servers->setValue('login','bind_pass', 'aabbccdd'); 

4开启防火墙:

#iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

#iptables -I INPUT -p tcp -m tcp --dport 389 -j ACCEPT //LDAP 端口

#iptables -I INPUT -p udp -m udp--dport 389 -j ACCEPT //LDAP 端口

#serviceiptables save

5、下载并安装openvpn-auth-ldap 插件:

wget ftp://rpmfind.net/linux/epel/6/i386/openvpn-auth-ldap-2.0.3-6.el6.i686.rpm

yum install openvpn-auth-ldap-2.0.3-6.el6.i686.rpm

修改/etc/openvpn/server.conf,在最后一行添加:

plugin /usr/lib/openvpn/plugin/lib/openvpn-auth-ldap.so /etc/openvpn/auth/ldap.conf

client-cert-not-required 

username-as-common-name#使用客户提供的UserName作为Common Name

修改/etc/openvpn/auth/ldap.conf文件内容如下:

[root@vpnldap auth]# vi ldap.conf 

URL ldap://127.0.0.1

Timeout 15

TLSEnable no

FollowReferrals no

#BaseDN "ou=People,dc=kingmed,dc=com"

BaseDN "dc=kingmed,dc=com"

# SearchFilter "(&(uid=%u)(accountStatus=active))"

//我的数据库中没有accountStatus这个属性,故要取消掉,否则查不到记录

SearchFilter "(uid=%u)"

RequireGroup false

其他可以删除不要了

注意上面的BaseDN "dc=kingmed,dc=com",这样能检索所有子公司的ou了,不然像上一行只能检索People这个ou

防火墙内容如下:

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p vrrp -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -p tcp --dport 80 -j ACCEPT

-A INPUT -p tcp --dport 53 -j ACCEPT

-A INPUT -p udp --dport 53 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 1194 -j ACCEPT

-A INPUT -p tcp -m tcp --dport 389 -j ACCEPT

-A INPUT -p udp -m udp --dport 389 -j ACCEPT

-A FORWARD -d 10.8.0.0/24 -j ACCEPT

-A FORWARD -i tun0 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

 

 

Open×××整合OpenLDAP(下)

进阶篇:×××用户权限控制

一.用户数量问题

当在配置文件中使用dev tunserver 10.8.0.0 255.255.255.0时,客户端的用户都是windows,由于windows TAP驱动使用30位的掩码,即消耗4IP地址,除了10.8.0.0/30×××服务器本身使用外,其余归用户使用,所以可以接入256/4-1=63个用户。如果63个用户还不够用,就将server 10.8.0.0 255.255.255.0 改成 server 10.8.0.0 255.255.0.0,这样可有256*64-1用户。

本篇使用server 10.8.0.0 255.255.0.0这样的配置,相应地,vpn服务器所在网关也要调整路由为route 10.8.0.0 255.255.0.0 172.16.5.44

二.IP地址分配的问题

server.conf文件中加入一行client-config-dir ccd,然后在同目录下新建ccd文件夹,以用户名新建一个文件,比如某用户使用vpnuser1这个帐号登录,那么就在ccd文件夹新建一个vpnuser1文件,输入如下内容:

ifconfig-push 10.8.1.5 10.8.1.6

这样用户连接后就会获得其中的一个IP,另一个IP就是vpn serverIP

为了便于比较测试,本文在ccd目录下创建一个vpnuser2帐号的文件,输入如下内容:

ifconfig-push 10.8.2.5 10.8.2.6

 

 

三.用户访问权限控制的问题

假设允许vpnuser1访问172.16.5.0/24网络,而只允许vpnuser2访问172.16.5.35这台主机,那么在openvpn防火墙上需要做如下配置:

iptables -A FORWARD -d 10.8.0.0/16 -j ACCEPT

iptables -A FORWARD -i tun0 -s 10.8.1.4/30-d 172.16.5.0/24 -j ACCEPT
iptables -A FORWARD -i tun0 -s 10.8.2.4/30-d 172.16.5.35-j ACCEPT

本人全部iptables的配置内容如下:

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

-A INPUT -p udp -m tcp--dport 1194 -j ACCEPT

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -d 10.8.0.0/16 -j ACCEPT

-A FORWARD -i tun0 -s 10.8.1.4/30 -d 172.16.5.0/24 -j ACCEPT

-A FORWARD -i tun0 -s 10.8.2.4/30 -d 172.16.5.35 -j ACCEPT

-A FORWARD -j REJECT --reject-with icmp-host-prohibited