烹茶细论

FreeRadius + 802.1x/WPA + OpenLDAP wifi登录使用个人帐号

公司wifi链接使用的是WAP2加密,多人共用一个密码的形式,这样无线的安全性及管理都不是很适合企业。
要求:

遇到的问题:

EAP-TTLS vs. PEAP

  • In most cases you will have the MD5 or CRYPT hashes stored in userPassword attribute. If so you will have to use EAP-TTLS with PAP inner tunnel authentication
  • If you have NT/LM hashes stored because you e.g. use LDAP as backend to Samba you can use either EAP-TTLS with MSCHAPv2 inner tunnel authentication (this is the default) or EAP-PEAP
  • If you have passwords in plain text stored in userPassword you can use whatever authentication method you want ie. EAP-TTLS, EAP-PEAP or EAP-MD5.
  • userPassword 是使用MD5或者CRYPT加密的,只能构使用EAP-TTLS PAP去验证密码,而PAP验证模式在debug模式下面密码都是明文显示的,安全性似乎并不好
  • 使用EAP-PEAP MSCHAPv2 认证方式的话安全性会比较高,但是需要ldap支持NT/LM 所以ldap需要添加samba支持,使用过samba结合openldap的应该会了解
  • 本文使用的是第二种认证模式,使用ldap的sambaNTPassword属性去验证密码是否正确,这和userPassword的属于两个属性了。所以我写了一个网页修改密码的时候将两个都修改,不知道前辈们你们搭建的需不需要这么麻烦。有更好的解决方案求提供思路,email:zgssheng@163.com
    wifi1

wifi2

wifi3

radius配置

1、安装freeradius

install freeradius freeradius-utils freeradius-ldap```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
查看是否安装以及安装版本
[css][root@localhost raddb]# radiusd -v
radiusd: FreeRADIUS Version 2.1.12[/css]
2、主配置文件 radius.conf
打开log信息,将auth设置成yes, 便于查看错误信息和
``` bash
log {
destination = files
file = ${logdir}/radius.log
syslog_facility = daemon
auth = yes
auth_badpass = yes
auth_goodpass = no
}

3、radius认证模块配置
配置文件都存放在/etc/raddb/modules/这个目录下面
修改ldap 和ldap.rpmsave这两个文件,修改成下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
ldap {
server = "ldap.s.XXXX.com"
access_attr = "uid"
basedn = "dc=XXXX,dc=com"
filter = "(uid=%{%{Stripped-User-Name}:-%{User-Name}})"
##基本就是修改前面四行,下面的按照原来的就可以
ldap_connections_number = 5
timeout = 4
timelimit = 3
net_timeout = 1
tls {
start_tls = no
}
dictionary_mapping = ${confdir}/ldap.attrmap
edir_account_policy_check = no
keepalive {
# LDAP_OPT_X_KEEPALIVE_IDLE
idle = 60
# LDAP_OPT_X_KEEPALIVE_PROBES
probes = 3
# LDAP_OPT_X_KEEPALIVE_INTERVAL
interval = 3
}
}

4、修改clients.conf
客户端认证的网段和密钥

1
2
3
4
5
client 192.168.0.0/22 {
secret = testing123
require_message_authenticator = no
}

5、修改/etc/raddb/sites-enabled/default 和inner-tunnel
取消ldap的注释

6、修改/etc/raddb/eap.conf

1
default_eap_type = peap

7、修改/etc/raddb/ldap.attrmap 加入下面几行使得ldap能够使用samba的密码认证

1
2
3
4
5
6
checkItem LM-Password sambaLMPassword
checkItem NT-Password sambaNTPassword
replyItem Extreme-Security-Profile radiusExtremeSecurityProfile
replyItem Extreme-Netlogin-Vlan-Tag radiusExtremeNetloginVlanTag
replyItem Extreme-Netlogin-Extended-Vlan radiusExtremeNetloginExtendedVlan
checkItem Cleartext-Password userPassword

LDAP配置

修改openldap结构
1、ldap需要加入对radius的支持,

1
cp /usr/local/share/doc/freeradius/examples/openldap.schema /etc/openldap/schema/radius.schema

加入samba.schema 因为我使用了sambaNTPassword来验证
安装samba 使用find查找 samba.schema,copy到/etc/openldap/schema/

在/etc/openldap/schema/radius.schema 文件后添加下面内容,让radiusUserPassword继承userPassword的特性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
objectclass
( 1.3.6.1.4.1.3317.4.3.2.1
NAME 'radiusprofile'
SUP top AUXILIARY
DESC ''
MUST cn
MAY ( radiusArapFeatures $ radiusArapSecurity $ radiusArapZoneAccess $
radiusAuthType $ radiusCallbackId $ radiusCallbackNumber $
radiusCalledStationId $ radiusCallingStationId $ radiusClass $
radiusClientIPAddress $ radiusFilterId $ radiusFramedAppleTalkLink $
radiusFramedAppleTalkNetwork $ radiusFramedAppleTalkZone $
radiusFramedCompression $ radiusFramedIPAddress $
radiusFramedIPNetmask $ radiusFramedIPXNetwork $
radiusFramedMTU $ radiusFramedProtocol $
radiusCheckItem $ radiusReplyItem $
radiusFramedRoute $ radiusFramedRouting $ radiusIdleTimeout $
radiusGroupName $ radiusHint $ radiusHuntgroupName $
radiusLoginIPHost $ radiusLoginLATGroup $ radiusLoginLATNode $
radiusLoginLATPort $ radiusLoginLATService $ radiusLoginService $
radiusLoginTCPPort $ radiusLoginTime $ radiusPasswordRetry $
radiusPortLimit $ radiusPrompt $ radiusProxyToRealm $
radiusRealm $ radiusReplicateToRealm $ radiusServiceType $
radiusSessionTimeout $ radiusStripUserName $
radiusTerminationAction $ radiusTunnelClientEndpoint $
radiusProfileDn $
radiusSimultaneousUse $ radiusTunnelAssignmentId $
radiusTunnelMediumType $ radiusTunnelPassword $
radiusTunnelPreference $
radiusTunnelPrivateGroupId $ radiusTunnelServerEndpoint $
radiusTunnelType $ radiusUserCategory $ radiusVSA $
radiusExpiration $ dialupAccess $ radiusNASIpAddress $
radiusReplyMessage)
)
objectclass
( 1.3.6.1.4.1.3317.4.3.2.2
NAME 'radiusObjectProfile'
SUP top STRUCTURAL
DESC 'A Container Objectclass to be used for creating radius profile object'
MUST cn
MAY ( uid $ userPassword $ description )
)

2、修改openldap主配置文件,加载radius.schema文件
在include 的后面加上下面一句

1
2
include /etc/openldap/schema/radius.schema
include /etc/openldap/schema/samba.schema

3、修改ldap帐号信息

打开radius debug模式

#radiusd -X

设置路由
密码是上面的testing123
端口是默认:1812

用手机或者是电脑测试wifi连接是否正常

修改ldap sambaNTPassword属性和userPassword思路是一样的,给出部分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
/*
链接服务器。返回值是用户的全部信息
*/
function LDAP_MSG($user){
$ldap_host = "192.168.1.XX"; //ldap服务器IP
$ldap_port = 389;
$base_dn = "dc=zdworks,dc=com";
$connect = ldap_connect( $ldap_host, $ldap_port);
if(!$connect){
$msg = "无法连接LDAP服务器";
}else{
ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($connect, LDAP_OPT_REFERRALS, 0);
$uid=sprintf("uid=%s","$user");
$search=ldap_search($connect,$base_dn,$uid);
return ldap_get_entries($connect,$search);
}
}
//获取用户的dn title等 $con可以是LDAP支持的所有属性
function Get_LDAP($user,$con){
$dn=LDAP_MSG($user);
for ($i=0; $i<$dn["count"]; $i++){
return $dn[$i][$con];
}
}
//用户登录验证
function login($user,$passwd){
$conn=ldap_connect("192.168.1.XX:389");
$user_dn = Get_LDAP($user,"dn");
$dd=ldap_bind($conn,$user_dn,$passwd);
if($dd){
return true;
}else return false;
ldap_close($conn);
}
//nt hash 密码加密
function NTLMHash($Input) {
$Input=iconv('UTF-8','UTF-16LE',$Input);
$MD4Hash=bin2hex(mhash(MHASH_MD4,$Input));
$NTLMHash=strtoupper($MD4Hash);
return($NTLMHash);
}
//修改wifi密码
function LDAP_Conn($change_user,$passwd){
$conn=ldap_connect("192.168.1.XX:389");
$dd=ldap_bind($conn,"cn=root,dc=XXXX,dc=com","passwd");
if($dd){
$val = NTLMHash($passwd);
$values["sambaNTPassword"][0] = $val;
$DN = Get_LDAP($change_user,"dn");
$a= ldap_mod_replace($conn,$DN,$values);
if($a)
return true;
else
return false;
}
else return false;
ldap_close($conn);
}