摘要: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格式閱讀原文。)