标签 wifidog服务器 下的文章

wifidog无线认证RADIUS 配置指南

RADIUS 是通信网络中负责认证、鉴权、计费的服务节点。它通常和各种网络接入服务节点相连,如路由器、交换机、RAS、等各种网络接入服务器(NAS)。由于 RADIUS 和各种网络接入服务器是通过标准 RFC 协议进行连接交互,所以 RADIUS 和各种网络接入服务器的配置方法也非常相似,下面就以 WinRadius 和 3COM 公司的 RS 1500 进行举例说明。
出于安全性考虑,每个网络接入服务器(NAS)通常和两个 RADIUS 相连接,这两个 RADIUS 处于主备份关系,即 primary 和 secondary。网络接入服务器(NAS)和 RADIUS 之间的接口有两个:认证(accounting)接口、计费(authentication)接口。每个接口的配置参数主要都是:RADIUS IP、port、secret 三个。secret 是安全配置参数,只要网络接入服务器(NAS) 和 RADIUS 相同即可。
网络接入服务器(NAS)通常采用 Telnet 方式进行配置,您只需在 Windows、Linux/Unix 下运行 telnet 命令就可以启动 Telnet 连接,等连接到网络接入服务器(NAS)后,您只需输入相应的配置命令即可,例如:

  • 关闭 RADIUS 命令:disable accounting、disable authentication remote。
  • 打开 RADIUS 命令:enable accounting、enable authentication remote。
  • 配置 RADIUS 命令:set accounting、set authentication。
    主要配置参数为:
    primary_port
    primary_secret <"secret_string">
    primary_server [IP_address or host_name]
    retransmissions
    secondary_port
    secondary_secret <"secret string">
    secondary_server [IP_address or host_name]
    timeout [number_seconds]
  • 调试 RADIUS 命令:show accounting、show accounting settings、show
    authentication、show authentication settings

RADIUS 服务器的配置主要是 port、secret 两个。如果您的 RADIUS 服务器和多个网络接入服务器(NAS),而不同网络接入服务器(NAS)又使用了不同的 secret,这时您需要为每个网络接入服务器(NAS)指定对应的 secret,即在 WinRadius 的"配置/多重密钥"中指定即可。
另外,大多数网络接入服务器(NAS)都有简单的认证功能。但是几乎全部商用网络接入都需要配置 RADIUS 服务器来实现复杂的认证、鉴权、计费功能。

本文章由 http://www.wifidog.pro/2015/03/27/wifidog%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97.html 整理编辑,转载请注明出处

wifidog服务器搭建建立免费的RADIUS认证服务器

RADIUS认证服务器(Remote Authentication Dial In User Service,远程用户拨号认证系统)是目前应用最广泛的AAA协议(AAA=authentication、Authorization、Accounting,即认证、授权、计费)。AAA协议的典型操作是验证用户名和密码是否合法(认证),分配IP地址(授权),登记上线/下线时间(计费),电信业窄带/宽带拨号都使用大型RADIUS认证服务器。而随着网络安全需求提高,中小企业的局域网集中用户认证,特别是使用VPDN专网的也逐渐需要建立自己的认证服务器以管理拨号用户。这些用户不需要使用昂贵的专业系统,采用PC服务器和Linux系统的Freeradius+MySQL可靠地实现。本文着重介绍RADIUS系统在VPDN拨号二次认证中的应用。

Freeradius的安装

  笔者采用FC4 for x86_64系统上的freeradius-1.1.2,在中档PC服务器上运行,系统运行稳定可靠。Linux FC4自带Freeradius和MySQL,不过实测不理想。FC4 MySQL对中文支持不好,而freeradius则仅支持其自带MySQL。所以,在编译MySQL时要加入选项“--with-charset=gb2312”以支持中文字符编码。编译Freeradius时可使用缺省选项。在64位Linux系统上编译前配置时需要加入选项“—with-snmp=no”,因为与库文件snmp相关的库对64位支持有问题,最新的FC7也许没有这些问题。Freeradius提供了MySQL建库脚本——db-MySQL.sql,不过建nas库有1个语法错误,将“id int(10) DEFAULT ‘0’;”中的“DEFAULT ‘0’”去掉即可正常建立Radius库。

Freeradius的设置

  简单少数用户可使用Freeradius缺省的users文件配置用户,根据文件制定的规则和用户工作。安装完毕后启动Radius服务:/usr/loca

  l/sbin/radiusd –X。本机运行radtest test test localhost 0 testing123发认证请求,得到回应表示Radius服务器工作正常。

  Radius服务器缺省使用/usr/local/etc/raddb/users文件工件认证,简单易行,但仅适用于少数用户。如果管理几十个或更多用户,应使用数据库,对于少于一万用户而言,MySQL是合适选择。

MySQL认证的设置

  在配置文件radiusd.conf中,在authorize{}和accountingt{}设置中去掉sql前注释符。在sql.conf中设置MySQL的连接信息,用户/密码和地址,本机用localhost即可。www.linuxidc.com还需要在users中对DEFAULT用户做如下设置:Auth-Type = Local,Fall-Through = 1。这样,才可正确使用MySQL进行认证。

  在MySQL中设置用户的规则与users文件用户设置有对应关系。Radius认证是以Attribute = Value的形式提供认证和应答消息。在users文件中,与用户名位于同一行,以“,”分隔的各个属性是认证请求必须提供而且需要验证的属性。下面各行属性如IP地址等加入应答包中。在MySQL中不分组情况下,只要在radcheck表中加入密码,在radreply中加入应答信息如IP地址即可。

  实际使用时,往往使用username@domain形式用户进行认证。用文件方式时,可以通过设置剥离域名,只建立username认证即可。需要在radiusd.conf中加入一项realm domain { format=suffix… }域说明,并在proxy.conf中realm DEFAULT使用LOCAL认证。用MySQL认证时,缺省的sql.conf中使用带域名的全名进行认证。使用剥离域名的用户认证,注释掉缺省的sql_user_name = "%{User-Name}",开放原来注释掉的sql_user_name = "%{Stripped-User-Name:-%{User-Name:-DEFAULT}}"定义语句,则优先使用剥离域名的用户名进行认证。表中用户名一项只需写用户名即可,不需要域名。

  最后,打开防火墙是必要的。缺省Radius认证服务器使用UDP 1812端口认证,UDP1813端口计费,应该开放UDP包的进出。

Iptables –A OUTPUT –p udp –d 192.168.10.3 --sport 1812 –j ACCEPT

  Iptables –A INPUT –p udp –s 192.168.10.3 --dport 1812 –j ACCEPT

  其中192.168.10.3是认证客户端的地址,通常是LNS路由器,同理开放UDP 1813计费端口。

  CISCO路由器的设置

  CISCO 路由器是经典的RADIUS客户端,在VPDN拨号系统中LNS作为二次认证客户端。在clie

  nts.conf中定义客户端IP地址和共享密钥。对单网口的低级路由器来说,客户端的IP地址就是网口IP。对于中高级路由器来说,路由器缺省使用第一个网口IP作为客户端源IP,如果是不可路由的内网地址,则客户端无法收到认证应答包。要指定IP,使用如下语句:

  ip radius source-interface FastEthernet0/1

  其中FastEthernet0/1的IP指定作为认证客户端的源地址。一般做法是在VPDN-GROUP定义中使用source-ip 语句指定IP,不过重启路由器后必须重新设置RADIUS服务器才能生效。

  另一个关于CISCO设置是使用多个认证服务器。中高档路由器通常可支持不同的拨号接入。不同拨号接入使用不同的认证服务器。CISCO中使用不同的server-group实现。

  aaa authorization network aaa-radius1 start-stop group radius1

  aaa authorization network aaa-radius2 start-stop group radius2

  也可根据需要定义authentication/accounting使用的server-group。

  在每个接入的PPP Virtual-Template模板中,ppp可选择不同的server-group进行AAA认证。

  interface Virtual-Template1

  ppp authorization aaa-radius1

  ……

  interface Virtual-Template2

  ppp authorization aaa-radius2

  ……

  这样实现一个路由器作为多个使用不同RADIUS服务器的拨号LNS路由器功能。

  用户物理绑定的实现

  实现用户物理绑定,特定用户只能在特定的电话号码或端口号上发起连接才能认证成功,可以大大提高认证安全性。在窄带系统中,LAC在拨入接入服务器LAC进行一次认证时,就向RADIUS服务器提供主叫号码,二次认证时该属性就被提交给RADIUS服务器。如电话号码为1234567,用户拨号,请求中包含属性Calling-Station-Id = "1234567"。为了实现主叫号码绑定,首先在radiusd.conf配置文件中起用对主叫号码的检查,即checkval {}中的内容。在使用users文件认证时,在用户名定义的同一行内加入Calling-Station-Id = "1234567"即可。使用MySQL认证时,在radcheck表中加入“Calling-Station-Id,”+=”,”1234567””这条记录即可。

  对于ADSL宽带来说,不能使用电话号码绑定。不同宽带设备可提供不同的绑定方式。其实现要点也是必须在发出认证请求中包含其物理端口或其它物理信息,Radius服务器在字典定义该属性,在users文件或MySQL中加入约束值即可。

本文章由 http://www.wifidog.pro/2015/03/26/wifidog%E6%9C%8D%E5%8A%A1%E5%99%A8.html 整理编辑,转载请注明出处

wifidog认证服务器令牌结构

Token,一般模式
目前连接令牌都是弱实体,直接保存在连接表格里。一些利害关系人喜欢向连接添加特性(限时,稳定性令牌等等)来支持不同的无线社区模式。为了不搬起石头砸自己的脚,我们需要一个数据模式来解决连接处理和重新使用的问题,不只是它退化的情况。
以下是进行此操作的第一部分草稿。

数据模式

  • Token_templates
  • Token_template_id
  • Token_template_network(注:Server-wide令牌不予以支持,但代码会查找你同步的网络的令牌)
  • Token_template_creation_date
  • Token_max_incoming_bytes 如:允许覆盖带宽
  • Token_max_outgoing_bytes 如:允许覆盖带宽
  • Token_max_total_data 如:允许覆盖带宽
  • Token_max_connection_duration: 如:允许限制单独连接的长度
  • Token_max_usage_duration: 如:允许以小时计算出售访问(只有在使用时开始计算)
  • Token_max_wall_clock_duration: 如:允许出售日执照,周执照或月执照(当令牌第一次使用时开始计算)
  • Token_max_age: 如:允许在期满之前设置最长时限(当令牌被发布时开始计算)
  • Token_is _reusable:当期满时创建的令牌还可以重新使用吗?(能常情况下是可以的)

Tokens_template_valid_nodes(遗憾的是,酒店向他们的客户出售24小时访问权,我们考虑到他们的网络也许包括不只一个节点。如果令牌不准进入表格,它就会在网络的任何位置被认为是有效的)

  • Token_template_id
  • Token_valid_at_node

Token_lots:

  • Token_lot_id
  • Tonken_lot_comment:关于lot的自由形态评论
  • Token_lot_creation_date

Lot是被同时发布的令牌组,例如预付卡。
Token_status

  • Token_status
  • Tokens
  • Token_id
  • Token_template_id
  • Token_status:
  • Token_lot_id:参考token_lots
  • Token_creation_date(与连接起始时间不同)
  • Token_issuer:系统里的用户。为所创建令牌负责的用户(不必与使用者一致)
  • Token_owner:可以使用此令牌的用户(如果为空那就可以是任何人)

当建立连接时,token_templates表格中的数值连同网络策略或节点策略一同被使用,目的是用来计算连接表格里的max_data_transfer和expiration_date。这个计算比较贵,但是一旦完成,所有服务器所需要做的validate max_data_transfer和expiration_data几乎都是免费的。

连接(已存在表格中新的或重新定义的字段)

  • Connection_status(被删除了,现在应在token_status中查找)
  • Token_id 现在参考token table
  • Max_total_bytes(token_max_data_transfer—SUM(为此令牌的所有连接传送数据))
  • Max_incoming_bytes 同上
  • Max_outgoing_bytes 同上
  • Expiration_date(MIN(NOW+token_max_connection_duration,NOW+token_max_total_duration-SUM(为此令牌的所有连接传送数据),token_expiration_date))
  • Logout_reason 解释是什么导至连接关闭

如何运作,构思

告诉我我是否错了,但这就是我具体如何看待令牌结构的。
有了这个新的令牌结构,令牌本身在连接进程和管理上发挥的作用远比现在要大。
目前,认证服务器将用户作为是连接的中心点。用户是一个实体,拥有用户名和密码,这代表了一个物理上的人。在无用户模式下这个概念是无效的。例如一个splash_only网络只有一个用户,SPLASH_ONLY_USER并且每个用户之间并没有多少差别,也不能从滥用控制机制获益等等。此外,为此,当目前用户是splash-only用户时,代码需要添加特例脚本。
Token2.0中,令牌将会扮演现在用户的角色:代表物理人来连接到网络,然而用户将仅仅是一个认证方案。
以下是服务器端在登录进程中是如何运作的

  1. 可选的 显示登录页面
  2. 可选的 用户输入他的认证信息(用户/执照,访问代码,NIP,当日密码)
  3. 基于成功认证
      为令牌目的获取认证信息(例如splash-only节点的user_id,代替SPLAHS_ONLY_USER id的应该是MAC地址)
      用此用户/MAC来删除连接
      目前用户已拥有可再用的有效的令牌吗?
        是的,使用此令牌
        没有,此用户可以获得新令牌吗?
          是的,创新一个新令牌并使用
          不能,此用户无法连接,告诉他原因和应该如何操作(滥用违规控制,需要购买新令牌等等)
      为此令牌创建新连接
      根据网络策略为此连接计算数据
      将令牌返回网关

需要以下所有支持:

  • 欢迎页面个性化的简单方法(登录界面:用户/执照,访问代码,路径选择等等)
  • 增加网络/节点管理界面来管理它允许的连接/令牌类型。也许我们想要splash-only节点,用户名/密码和/或访问代码节点的混合网络,对吗?
  • 改变会话对象(并引用它),这样才能引用现在被称为令牌的对象。
  • 编写大量的代码来支持所有一切!(执行是自然而然的事)

本文章由 http://www.wifidog.pro/2015/03/16/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BB%A4%E7%89%8C%E7%BB%93%E6%9E%84.html 整理编辑,转载请注明出处

wifidog 认证服务器如何授权和使用用户配置文件

创建配置文件
1.创建必要的内容类型过滤器
这些数据类型在配置文件中可能会用到。
每个内容类型过滤器的格式是标准陈列:在内容类型执行的一组函数。格式是array(array(callback_funct, array(callback_funct_parameters))
注意的是callback_funct表示对象已被验证,所以它没有静态的classname。
例如:获取文档子类别的Simple内容类型,陈列应为

array(array('isSimpleContent'), array('isContentType',array(array('File'))) ); 

注意的是第二个callback:isContentType,用了单参数。当$criteria_array指定callback参数为列表,将“File”传到“isContentType”应该写成array(array('File'))。
你也许至少需要以下过滤器:

**Avatars**
array ( 
  array ( 
    'isContentType', array ( 
      array ( 
       'Avatar', 
      ), 
    ), 
  ), 
) 

**Hyperlink only**
array ( 
  array ( 
    'isExactContentType', array ( 
      array ( 
        'HyperLink', 
      ), 
    ), 
  ), 
) 

**SimpleLangstring only**
array ( 
  array ( 
    'isExactContentType', array ( 
      array ( 
        'TrivialLangstring', 
      ), 
    ), 
  ), 
) 

**SimplePictures** 
array ( 
  array ( 
    'isContentType', array ( 
      array ( 
        'SimplePicture', 
      ), 
    ), 
  ), 
) 

**SimpleString only**
array ( 
  array ( 
    'isExactContentType', array ( 
      array ( 
        'SimpleString', 
      ), 
    ), 
  ), 
) 

2 创建配置文件模版
包括配置文件的字段列表,当用户进行编辑,其它用户浏览时可见的选项标签。
3 将配置文件模版与网络进行关联
4 编辑你自己的配置文件进行测试

数据模型
Network_has_profile_templates
  - Network_id:每个profile_field只有一个网络
  - Profile_template_id:配置文件模版id
  - Is_invisible boolean:用户是否希望用匿名模式

Profile_templates
  - Profile_template_id guuid:配置文件id
  - Creation_date timestamp

Profile_template_fields
基本上是用户可以进行填充的数据字段列表。被管理员用来指定用户配置文件中可得的字段。
   - Display_label content_id:配置文件显示界面的字段标签。Content id必须可本地化,最好是个图片。
   - Admin_label content_id:用户编辑界面的字段标签。
   - Content_filter filter_id:用来列出指定内容类型的过滤器。这些内容类型允许被此配置文件字段的用户当作函数来进行记录。
   - UI代码应该保存在ContentTypeFilter类别当中。
   - Order:配置文件中字段显示的顺序
   - Semantic_id text:用户不可见。这字段有两个作用:
     1.最终用于允许输出配置文件的微格式和XML算法。
     2.一些semantic_id函数对于wifidog是有特殊意义的。例如配置文件中存在foaf:img的元素,它将用来在在线用户列表中显示用户的自定义头像。用来指定网络配置文件字段的管理界面必须列出所有对wifidog有特殊意义的semantic_id函数。

User_has_profiles
用配置文件连接用户表格
   - User_id:用户id
   - Profile_id:配置文件id
   - Is_invisible Boolean:用户是否希望用匿名模式

Profiles
从技术上讲,我们应该直接在user_profile_fields连接用户表格,但这不可取。配置文件和user_has_profiles tables被替换的原因是:
 1.允许在用户创建自己的配置文件前添加用户协议。
 2.允许更便捷的保存非数据元素,例如可视模式,是否其它用户可以发送用户短信息等等。
 3.如果用户需要,允许每个网络都有一个配置文件。
  - Profile_id guuid:配置文件id
  - Creation_date timestamp

Profile_fields
由终端用户输入的配置文件函数。
  - Content_id:当前连接的数据
  - Last_modified timestamp:起初不会被应用,因为它要求每个内容类型要有调节器和processAdminUI并反馈数据是否被正确修改。这实际上并不困难并且如果我们想衡量用户如何使用和更新他们的配置文件的话,这点都是最基本的。

ContentTypeFilter
ContentTypeFilter已存在并且应用在内容管理器的一些部分。基本上它会在每个备用ContentType以静态的方式用自己的参数启用函数引用。一些Content类的函数也是因为这个被指定的。当它非常灵活的运转时,从代码指定过滤器是唯一的方法。我们需要UI和数据表示法,这会很困难但并非不可能。困难点有:
  - 列举可得的滤函数
  - 解决已存在的过滤器由于代码中的滤函数丢失导致失效,从过滤器永久删除字段。
  - 在callback函数参数输入的界面,它以能够让PHP在不使用eval()的情况下

本文章由 http://www.wifidog.pro/2015/03/13/wifidog%E8%AE%A4%E8%AF%81%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html 整理编辑,转载请注明出处