论文部分内容阅读
摘要:SIP协议是应用层会话控制协议,具有简单、可扩展和分布式的特点。LDAP目录作为一种非关系型数据库,可以简化查询的步骤,PAM就是在应用程序和下层的认证模块之间加入一个抽象层,使得上层应用和底层认证相互独立。文章提出了通过LDAP目录与PAM结合来实现SIP服务器的认证方案,并利用pam_ldap模块实现了SIP服务器的LDAP认证。
关键词:SIP;PAM;LINUX;LDAP
0引言
SIP(Session Inidation Protoc01)是1ETF制定的面向Intemet会议和电话的信令协议。该协议是一个基于文本的、用于多方多媒体通信的应用层控制协议,独立于底层传输协议TCP/UDP/SCTP,用于建立、修改和终止IP网上的双方或多方多媒体会话。SIP系统由用户代理、SIP代理服务器、重定向服务器、SIP注册服务器等4部分组成。在设计SIP服务器中,对于SIP用户代理的认证和管理是一个非常重要的问题。目前,通用的解决办法是在SIP代理服务器端采用数据库来专门存储用户数据。SIP服务器需要DBMS的支持,因此需要对每一个数据库服务器进行单独的设计,难以与现有用户资料库进行整合,从而增大了管理成本。在基于SIP的远程医疗系统中,为了解决这一问题,提出了LDAP来进行认证的机制。
1 LDAP目录数据库与PAM认证模块及其系统框架
LDAP(Lightweight Directory Access Protoc01)——轻量级目录访问协议是一种基于X.500标准的、跨平台的目录服务,得到了业界的广泛认可。LDAP目录是一种非关系型数据库,可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表等。把LDAP目录作为系统集成中的一个重要环节,可以简化查询,甚至连主要的数据源都可以放在任何地方。
PAM(P1uggable Authentication Modules.)——可插入式认证模块,最初是Sun公司为其Solaris操作系统开发的安全认证架构,该模块采用一种用于将各种底层认证模块与上层应用无缝集成的安全机制。PAM的核心就是在应用程序和下层的认证模块之间加入一个抽象层,使得上层应用独立于底层认证。这种与上层平台和算法的独立性使得我们可以部署各种各样的安全机制,而不需要修改任何应用层代码。该模块具有认证管理、账号管理、会话管理和密码管理等功能。PAM通过提供一些DLL和API,将应用程序和所需的认证方式分开,使管理员能够灵活选择认证方式而无需更改应用程序。
本系统主要由SIP用户代理、SIP服务器和LDAP服务器等3部分组成。SIP服务器具有双重功能,一是通过SIP协议实现SIP客户端间的通信,二是实现LDAP客户端与LDAP服务器端的通信(执行实际的认证工作)。该系统的工作机制如图l所示。
2认证系统实现方案
2.1配置LDAP服务器
LDAP服务器用于存储用户的各种信息,是LDAP认证系统中的重要元素。OpenLDAP是最通用的一种LDAP服务器软件。openLDAP服务器的配置文件如下:
(1)建立Linux用户账号
使用UltraEdit建立一个文本文件,文件名称myusers.1ist内容如下:
userl 1111111
user2 1111111
l
userl0 1111111
注意:第一个字段为使用者名称;第二个字段为预设密码,中间必须用空格隔开。然后使用文本编辑建立另外一个文本文件,文件名称add_users.sh,内容如下:
#t/bin/bash
for i jn’awk‘{print$1)t users.Iist、do
useradd$i
grep"\<$i\>"users.1ist I awk'f.print$2)。Ipasswd-stdin$i
done
建立Linux用户账号:
#chmod 775 add-usem.sh
#./add-usem.sh
(2)修改缺省配置文件:/etc/openladp/slapd.conf
database baogxm
suffix"dc=fulingshiyuan,dc=com”一条记录所属区域
rootdn“cn=Admin,dc=fulingshiyuan,dc=com”
rootpw 6666666#定义LDAP根管理员的密码
(3)将原有Linux账号转为LDIF文件
原有Linux服务器上有userl-userl0这些使用者账号,密码均为]llllll。下面是转换的步骤:
#cdlusdsharel fulingshiyuan/migmtion#转换文件的目录#
#vi migrate_common.ph
$DEFAULT_MAIL_DOMAIN=“fulingshiyuan.com”:
Default base
$DEFAULT_BASE=“dc=fulingshiyuan。dc=COrn”:
#./migmte_passwd.plletclpasswd>1worktmp/user.Id.f
#./migrate_group.plletclgroup>1worktmp/group.Idif
(4)建立fulingshiyuan.1dif,ou_people.1dif,ou_group.Idif三个文件
#cat e fulingshiyuan.Idif
dn:dc=fulingshiyuan,dc=com
dc:fulingshiyuan
objectClass:dcObject
objectClass:organizationalUnit
ou:fulingshiyuan.com
#cat ou_people.ldif
dn:ou=people,dc=fulingshiyuan,dc=com
objectclass:organizationalunit
ou:people
#cat ou_group.1dif
dn:ou=group,dc=fulingshiyuan,dc=com
objectclass:organizationalunit
ou:group
(5)转换原有Linux账号至OpenLDAP服务器上
#slapadd-vl fulingshiyuan.Idif
added:"dc=fulingshiyuan,dc=corn"(.00000001)
#slapadd-vl ou_people.Idif
added:"ou。people,dc=fulingshiyuan,dc=com"(、00000002) #Slapaddwl ou_group.1dif
added:"ou=group,dc=fulingshiyuan,dc=com"(、00000043)
#slapadd-vl user.ldif
#slapaddovl group.Idif
(6)启动本地LDAP服务器
在RedHat9下,该命令为/etc/rc.d/init.d/ldap start。
(7)初始化LDAP数据库
若以上配置文件正确无误,则可使用命令/etc/rc.d/init.d/Idap或/etchnit.d/ldap启动LDAP服务器。之后,就可以向LDAP数据库中添加用户数据了。
2.2配置PAM_LDAP模块
虽然多数的Linux中自带了PAM,但为了让PAM能够更好地支持LDAP认证,必须下载软件包PAM_LDAP。PAM库可通过本地的系统配置文件/etc/pam.conf目录下的一些配置文件来设置,而模块则以动态可加载目标文件的形式保存在/usr/lib/security目录中。具体配置如下:
(1)在/etc/pam.conf文件中配置如下:
siD auth requiredlusdliblsecuritylpam_ldap.so
siD account requiredlusrlliblsecuritylpam_ldap.so
sip代表服务的名称;auth和account分别代表认证模块和记账模块;控制标志required表明当某个模块返回—个失败响应时,认证失败,但是PAM将继续处理其他模块;pam_ldap.so指定了可插入认证模块的路径。
(2)编辑/etc/openldap/ldap.conf配置文件,使LDAP客户端能够读该文件的内容,并与服务器端进行联系。在/etc/openldap/ldap.conf文件中配置如下:
host 210.41.35.200
//定义LDAP服务器,可以用主机名或IP地址
base=dc:fulingshiyuan.dc=edu
//定义要查询的目录的根
2.3 SIP服务器的PAM认证实现方案
PAM框架提供了一系列接口与上层应用程序通信。具体接口如下:
管理性接口每组PAM事务从pam_start()开始,结束于pam_end()函数。接口pam_get_item()和pam set item()用来读写与PAM事务有关的状态信息。pam_auth()用来进行认证。pam_acct_mgmt()检查受鉴别的用户所持账户是否有权登录系统,以及该账户是否已过期等。同时,pam_str()可用于输出PAM接口的出错信息。
程序与模块间的通讯接口在应用程序初始化期间,某些诸如用户名之类的数据可以通过pare_start()将其存放在PAM接口层中,以备将来底层模块使用。另外,底层模块还可以使用pam_putenv()向应用程序传递特定的环境变量,应用程序利用pam_getenv()和pam_getenvlist()读取这些变量。
用户与模块间的通讯接口pam_start()函数可以通过会话式的回调函数,让底层模块通过它们读写模块相关的认证信息,比如以应用程序所规定的方式提示用户输入口令。
模块间通讯接口尽管各模块是独立的,但是它们仍然能够通过pare_get_item()和pam_set_item0接口共享某些与认证会话有关的公用信息,诸如用户名、服务名、口令等。此外,这些API还可以用于在调用pam_start()后,让应用程序修改状态信息。
读写模块状态信息的接口接口pam_g~dma()和pam set_data()用以按照PAM句柄要求访问和更新特定模块的信息。此外,还可以在这些模块后附加一个清除数据函数,以便当调用pam_end()时清除现场。
具体流程如下:
(1)程序开始。
(2)如果pam_start()调用成功,则转向第3步,否则第6步。
(3)如果pam_auth()调用成功,则转向第4步,否则第6步。
(4)如果pam_acct_mgnt()调用成功,则转向第5步,否则第6步。
(5)如果pam_end()调用成功,则执行retval=0,否则第7步。
(6)retval=l
(7)返回,程序结束。
部分核心代码如下:
struct pam_conv convstn={
misc_conv,/*built in conversation function*/
NULL}:
lnl Authenticate(const char*uname){
pam_handlej*hPAM=NULL;/*Handle for use with a¨PAM
functions*/
intrslt=0:
inl retval=-1:
rslt=pam_start(”sip",uname,&convstn,&hPAM);
/*The first parameter is the service name used in pam.conf*/
if(rslt!=PAM_SUCCESS){retumretval;)
rslt=pam_auth(hPAM,0);/*authenticate the user*/
if(rslt!=PAM_SUCCESS){return retval;)
rslt=pam_acct_mgmt(hPAM,0);/*does the user have access*/
if(rslt!=PAM_SUCCESS){return renal;)
if(pam_end(hPAM,rslt)!=PAM_SUCCESS)(
printf(“PAM cleanup failed.”);
return retval;
}
return O:
}
3结束语
构建SIP服务器是利用SIP协议实现可视化远程医疗会诊系统的第一步,目前已实现,在此基础上利用PAM提供的接口函数,使用pam_ldap模块实现了SIP服务器的LDAP认证M。实践证明,该方法与现有用户资料库整合,极大地降低了系统的管理成本,具有很好的可扩展性。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)
关键词:SIP;PAM;LINUX;LDAP
0引言
SIP(Session Inidation Protoc01)是1ETF制定的面向Intemet会议和电话的信令协议。该协议是一个基于文本的、用于多方多媒体通信的应用层控制协议,独立于底层传输协议TCP/UDP/SCTP,用于建立、修改和终止IP网上的双方或多方多媒体会话。SIP系统由用户代理、SIP代理服务器、重定向服务器、SIP注册服务器等4部分组成。在设计SIP服务器中,对于SIP用户代理的认证和管理是一个非常重要的问题。目前,通用的解决办法是在SIP代理服务器端采用数据库来专门存储用户数据。SIP服务器需要DBMS的支持,因此需要对每一个数据库服务器进行单独的设计,难以与现有用户资料库进行整合,从而增大了管理成本。在基于SIP的远程医疗系统中,为了解决这一问题,提出了LDAP来进行认证的机制。
1 LDAP目录数据库与PAM认证模块及其系统框架
LDAP(Lightweight Directory Access Protoc01)——轻量级目录访问协议是一种基于X.500标准的、跨平台的目录服务,得到了业界的广泛认可。LDAP目录是一种非关系型数据库,可以存储各种类型的数据:电子邮件地址、邮件路由信息、人力资源数据、公用密匙、联系人列表等。把LDAP目录作为系统集成中的一个重要环节,可以简化查询,甚至连主要的数据源都可以放在任何地方。
PAM(P1uggable Authentication Modules.)——可插入式认证模块,最初是Sun公司为其Solaris操作系统开发的安全认证架构,该模块采用一种用于将各种底层认证模块与上层应用无缝集成的安全机制。PAM的核心就是在应用程序和下层的认证模块之间加入一个抽象层,使得上层应用独立于底层认证。这种与上层平台和算法的独立性使得我们可以部署各种各样的安全机制,而不需要修改任何应用层代码。该模块具有认证管理、账号管理、会话管理和密码管理等功能。PAM通过提供一些DLL和API,将应用程序和所需的认证方式分开,使管理员能够灵活选择认证方式而无需更改应用程序。
本系统主要由SIP用户代理、SIP服务器和LDAP服务器等3部分组成。SIP服务器具有双重功能,一是通过SIP协议实现SIP客户端间的通信,二是实现LDAP客户端与LDAP服务器端的通信(执行实际的认证工作)。该系统的工作机制如图l所示。
2认证系统实现方案
2.1配置LDAP服务器
LDAP服务器用于存储用户的各种信息,是LDAP认证系统中的重要元素。OpenLDAP是最通用的一种LDAP服务器软件。openLDAP服务器的配置文件如下:
(1)建立Linux用户账号
使用UltraEdit建立一个文本文件,文件名称myusers.1ist内容如下:
userl 1111111
user2 1111111
l
userl0 1111111
注意:第一个字段为使用者名称;第二个字段为预设密码,中间必须用空格隔开。然后使用文本编辑建立另外一个文本文件,文件名称add_users.sh,内容如下:
#t/bin/bash
for i jn’awk‘{print$1)t users.Iist、do
useradd$i
grep"\<$i\>"users.1ist I awk'f.print$2)。Ipasswd-stdin$i
done
建立Linux用户账号:
#chmod 775 add-usem.sh
#./add-usem.sh
(2)修改缺省配置文件:/etc/openladp/slapd.conf
database baogxm
suffix"dc=fulingshiyuan,dc=com”一条记录所属区域
rootdn“cn=Admin,dc=fulingshiyuan,dc=com”
rootpw 6666666#定义LDAP根管理员的密码
(3)将原有Linux账号转为LDIF文件
原有Linux服务器上有userl-userl0这些使用者账号,密码均为]llllll。下面是转换的步骤:
#cdlusdsharel fulingshiyuan/migmtion#转换文件的目录#
#vi migrate_common.ph
$DEFAULT_MAIL_DOMAIN=“fulingshiyuan.com”:
Default base
$DEFAULT_BASE=“dc=fulingshiyuan。dc=COrn”:
#./migmte_passwd.plletclpasswd>1worktmp/user.Id.f
#./migrate_group.plletclgroup>1worktmp/group.Idif
(4)建立fulingshiyuan.1dif,ou_people.1dif,ou_group.Idif三个文件
#cat e fulingshiyuan.Idif
dn:dc=fulingshiyuan,dc=com
dc:fulingshiyuan
objectClass:dcObject
objectClass:organizationalUnit
ou:fulingshiyuan.com
#cat ou_people.ldif
dn:ou=people,dc=fulingshiyuan,dc=com
objectclass:organizationalunit
ou:people
#cat ou_group.1dif
dn:ou=group,dc=fulingshiyuan,dc=com
objectclass:organizationalunit
ou:group
(5)转换原有Linux账号至OpenLDAP服务器上
#slapadd-vl fulingshiyuan.Idif
added:"dc=fulingshiyuan,dc=corn"(.00000001)
#slapadd-vl ou_people.Idif
added:"ou。people,dc=fulingshiyuan,dc=com"(、00000002) #Slapaddwl ou_group.1dif
added:"ou=group,dc=fulingshiyuan,dc=com"(、00000043)
#slapadd-vl user.ldif
#slapaddovl group.Idif
(6)启动本地LDAP服务器
在RedHat9下,该命令为/etc/rc.d/init.d/ldap start。
(7)初始化LDAP数据库
若以上配置文件正确无误,则可使用命令/etc/rc.d/init.d/Idap或/etchnit.d/ldap启动LDAP服务器。之后,就可以向LDAP数据库中添加用户数据了。
2.2配置PAM_LDAP模块
虽然多数的Linux中自带了PAM,但为了让PAM能够更好地支持LDAP认证,必须下载软件包PAM_LDAP。PAM库可通过本地的系统配置文件/etc/pam.conf目录下的一些配置文件来设置,而模块则以动态可加载目标文件的形式保存在/usr/lib/security目录中。具体配置如下:
(1)在/etc/pam.conf文件中配置如下:
siD auth requiredlusdliblsecuritylpam_ldap.so
siD account requiredlusrlliblsecuritylpam_ldap.so
sip代表服务的名称;auth和account分别代表认证模块和记账模块;控制标志required表明当某个模块返回—个失败响应时,认证失败,但是PAM将继续处理其他模块;pam_ldap.so指定了可插入认证模块的路径。
(2)编辑/etc/openldap/ldap.conf配置文件,使LDAP客户端能够读该文件的内容,并与服务器端进行联系。在/etc/openldap/ldap.conf文件中配置如下:
host 210.41.35.200
//定义LDAP服务器,可以用主机名或IP地址
base=dc:fulingshiyuan.dc=edu
//定义要查询的目录的根
2.3 SIP服务器的PAM认证实现方案
PAM框架提供了一系列接口与上层应用程序通信。具体接口如下:
管理性接口每组PAM事务从pam_start()开始,结束于pam_end()函数。接口pam_get_item()和pam set item()用来读写与PAM事务有关的状态信息。pam_auth()用来进行认证。pam_acct_mgmt()检查受鉴别的用户所持账户是否有权登录系统,以及该账户是否已过期等。同时,pam_str()可用于输出PAM接口的出错信息。
程序与模块间的通讯接口在应用程序初始化期间,某些诸如用户名之类的数据可以通过pare_start()将其存放在PAM接口层中,以备将来底层模块使用。另外,底层模块还可以使用pam_putenv()向应用程序传递特定的环境变量,应用程序利用pam_getenv()和pam_getenvlist()读取这些变量。
用户与模块间的通讯接口pam_start()函数可以通过会话式的回调函数,让底层模块通过它们读写模块相关的认证信息,比如以应用程序所规定的方式提示用户输入口令。
模块间通讯接口尽管各模块是独立的,但是它们仍然能够通过pare_get_item()和pam_set_item0接口共享某些与认证会话有关的公用信息,诸如用户名、服务名、口令等。此外,这些API还可以用于在调用pam_start()后,让应用程序修改状态信息。
读写模块状态信息的接口接口pam_g~dma()和pam set_data()用以按照PAM句柄要求访问和更新特定模块的信息。此外,还可以在这些模块后附加一个清除数据函数,以便当调用pam_end()时清除现场。
具体流程如下:
(1)程序开始。
(2)如果pam_start()调用成功,则转向第3步,否则第6步。
(3)如果pam_auth()调用成功,则转向第4步,否则第6步。
(4)如果pam_acct_mgnt()调用成功,则转向第5步,否则第6步。
(5)如果pam_end()调用成功,则执行retval=0,否则第7步。
(6)retval=l
(7)返回,程序结束。
部分核心代码如下:
struct pam_conv convstn={
misc_conv,/*built in conversation function*/
NULL}:
lnl Authenticate(const char*uname){
pam_handlej*hPAM=NULL;/*Handle for use with a¨PAM
functions*/
intrslt=0:
inl retval=-1:
rslt=pam_start(”sip",uname,&convstn,&hPAM);
/*The first parameter is the service name used in pam.conf*/
if(rslt!=PAM_SUCCESS){retumretval;)
rslt=pam_auth(hPAM,0);/*authenticate the user*/
if(rslt!=PAM_SUCCESS){return retval;)
rslt=pam_acct_mgmt(hPAM,0);/*does the user have access*/
if(rslt!=PAM_SUCCESS){return renal;)
if(pam_end(hPAM,rslt)!=PAM_SUCCESS)(
printf(“PAM cleanup failed.”);
return retval;
}
return O:
}
3结束语
构建SIP服务器是利用SIP协议实现可视化远程医疗会诊系统的第一步,目前已实现,在此基础上利用PAM提供的接口函数,使用pam_ldap模块实现了SIP服务器的LDAP认证M。实践证明,该方法与现有用户资料库整合,极大地降低了系统的管理成本,具有很好的可扩展性。
(注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。)