Open×××整合OpenLDAP(上)
http://blog.sina.com.cn/s/blog_92dc41ea0101qxrr.html
Openvpn2.2.2安装
操作系统:RHEL6.3最小安装,eth0:172.16.5.38,eth1:172.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) 初始化PKI(Public 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目录下生成1024位RSA私钥ca.key和ca.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目录下生成1024位RSA服务器密钥server.key、server.crt和server.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.0] # cp keys/* /etc/openvpn/
如果创建备用的Open×××服务器,对用户来说,共用一个ca证书避免切换麻烦的话,就把刚才复制的密钥复制到备用服务器上去,备用服务器不用上边1)2)3)三步操作了。
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 nobody和group 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、安装与配置httpd和php:
yum -y install httpd php php-ldap unzip
chkconfig httpd on
2、下载phpldapadmin
1)cd /var/www/html/
2)wget
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 tun,server 10.8.0.0 255.255.255.0时,客户端的用户都是windows,由于windows 的TAP驱动使用30位的掩码,即消耗4个IP地址,除了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 server的IP。
为了便于比较测试,本文在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