PAM應(yīng)用開(kāi)發(fā)和內(nèi)部實(shí)現(xiàn)源碼分析
《PAM應(yīng)用開(kāi)發(fā)和內(nèi)部實(shí)現(xiàn)源碼分析》由會(huì)員分享,可在線閱讀,更多相關(guān)《PAM應(yīng)用開(kāi)發(fā)和內(nèi)部實(shí)現(xiàn)源碼分析(12頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、個(gè)人收集整理 僅供參考學(xué)習(xí) PAM 地應(yīng)用開(kāi)發(fā)和內(nèi)部實(shí)現(xiàn)源碼分析 本文主要通過(guò)對(duì) Linux PAM 源代碼進(jìn)行分析 , 闡述了 PAM地內(nèi)部實(shí)現(xiàn)機(jī)制和怎樣在應(yīng)用程序中應(yīng)用 PAM進(jìn)行認(rèn)證 , 以及怎樣開(kāi)發(fā) PAM服務(wù)模塊 . 1 引言 身份認(rèn)證是操作系統(tǒng)安全地重要機(jī)制之一 , 系統(tǒng)通過(guò)認(rèn)證機(jī)制核查用戶地身份證明 , 并作為用戶進(jìn)入系統(tǒng)地判定條件 , 是防止惡意用戶進(jìn)入系統(tǒng)地第一道門(mén)檻 . 近年來(lái)認(rèn)證理論和技術(shù)得到了迅速發(fā)展 , 產(chǎn)生了各種認(rèn)證機(jī)制 , 如口令機(jī) 制 ,RSA, DCE, kerberos 認(rèn)證體制 ,S
2、/Key 和基于智能卡地身份認(rèn)證等 . 然而 , 當(dāng)系 統(tǒng)中引入新地認(rèn)證機(jī)制時(shí) , 一些系統(tǒng)入口登錄服務(wù)如 login, rlogin 和 telnet 等應(yīng)用程序就必須改寫(xiě)以適應(yīng)新地認(rèn)證機(jī)制 . 為了解決這個(gè)問(wèn)題 ,1995 年 Sun公司地 Vipin Samar 和 Charlie Lai 提出了 PAM(Pluggable Authentication Modules), 并將其應(yīng)用在 Solaris 系統(tǒng)上 .PAM框架將應(yīng)用程序與具體地認(rèn)證機(jī)制分離 , 使得系統(tǒng)改變認(rèn)證機(jī)制時(shí) , 不再需要修改采用認(rèn)證機(jī)制地應(yīng)用程序 , 而只要由管理員配置應(yīng)用程序地認(rèn)證服務(wù)模塊 , 極大地提
3、高了認(rèn)證機(jī)制地通用性與靈活 性 . 各種版本操作系統(tǒng) pam實(shí)現(xiàn)原理一樣 , 下面從 PAM地應(yīng)用開(kāi)發(fā)開(kāi)始介 紹 . b5E2RGbCAP 2 PAM地應(yīng)用開(kāi)發(fā) 2.1 PAM 框架概覽 PAM即可插拔認(rèn)證模塊 . 它提供了對(duì)所有服務(wù)進(jìn)行認(rèn)證地中央機(jī)制 , 適用于 login, 遠(yuǎn)程登錄( telnet,rlogin,fsh,ftp, 點(diǎn)對(duì)點(diǎn)協(xié)議( PPP)) ,su 等應(yīng)用程 序中 . 系統(tǒng)管理員通過(guò) PAM配置文件來(lái)制定不同應(yīng)用程序地不同認(rèn)證策略;應(yīng)用程序開(kāi)發(fā)者通過(guò)在服務(wù)程序中使用 PAM API(pam_xxxx( )) 來(lái)實(shí)現(xiàn)對(duì)認(rèn)
4、證方法地調(diào)用;而 PAM服務(wù)模塊地開(kāi)發(fā)者則利用 PAMSPI 來(lái)編寫(xiě)模塊(主要是引出一些函 數(shù) pam_sm_xxxx( ) 供 PAM接口庫(kù)調(diào)用) , 將不同地認(rèn)證機(jī)制加入到系統(tǒng)中; PAM 接口庫(kù)( libpam )則讀取配置文件 , 將應(yīng)用程序和相應(yīng)地 PAM服務(wù)模塊聯(lián)系起 來(lái) .PAM框架結(jié)構(gòu)如圖所示 . p1EanqFDPw 1/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 圖 PAM框架結(jié)構(gòu)圖
5、 其中 ,pamh 是一個(gè) pam_handle 類(lèi)型地結(jié)構(gòu) , 它是一個(gè)非常重要地處理句柄 , 是 PAM與應(yīng)用程序通信地唯一數(shù)據(jù)結(jié)構(gòu) , 也是調(diào)用 PAM接口庫(kù) API 地唯一句柄 .pam_handle 數(shù)據(jù)結(jié)構(gòu)將在下面地源代碼分析一節(jié)地介紹 . DXDiTa9E3d 另外 , 如上圖所示地服務(wù)模塊分 auth (認(rèn)證管理)、 account (賬號(hào)管理)、 session (會(huì)話管理)、 passwd(口令管理)四種類(lèi)型 , 各個(gè)類(lèi)型模塊地作用以及配置文件地四個(gè)組成部分模塊類(lèi)
6、型、 控制標(biāo)志、模塊路徑、 模塊參數(shù)等在很多講PAM地配置管理地文章里都有介紹 , 這里就不再贅述了 . RTCrpUDGiT 2.2 在應(yīng)用程序中使用 PAM認(rèn)證 每個(gè)使用 PAM認(rèn)證地應(yīng)用程序都以 pam_start 開(kāi)始 ,pam_end結(jié)束 .PAM還提供 了 pam_get_item 和 pam_set_item 共享有關(guān)認(rèn)證會(huì)話地某些公共信息 , 例如用戶名 , 服務(wù)名 , 密碼和會(huì)話函數(shù) . 應(yīng)用程序在調(diào)用了 pam_start () 后也能夠用這些 APIs 來(lái)改變狀態(tài)信息 . 實(shí)際做認(rèn)證工作地 API 函數(shù)有六個(gè) (以下將這六個(gè)函數(shù)簡(jiǎn) 稱(chēng)為認(rèn)證
7、 API): 5PCzVD7HxA 認(rèn)證管理 -- 包括 pam_authenticate () 函數(shù)認(rèn)證用戶 ,pam_setcred () 設(shè) 置 , 刷新 , 或銷(xiāo)毀用戶證書(shū) . jLBHrnAILg 賬號(hào)管理 -- 包括 pam_acc_mgmt() 檢查認(rèn)證地用戶是否可以訪問(wèn)他們地賬戶 , 該函數(shù)可以實(shí)現(xiàn)口令有效期 , 訪問(wèn)時(shí)間限制等 . xHAQX74J0X 會(huì)話管理 -- 包括 pam_open_session () 和 pam_close_session () 函數(shù)用來(lái)管理會(huì)話和記賬 . 例如 , 系統(tǒng)可以存儲(chǔ)會(huì)話地全部時(shí)間 . LDAYtRyKfE
8、
口令管理 -- 包括 pam_chauthok () 函數(shù)用來(lái)改變密碼 .
下面看一個(gè)簡(jiǎn)單地 login 模擬程序:
/* 使用 PAM所必需地兩個(gè)頭文件 */
#include
9、t("login", user_name, &pam_conv, &pamh)) != PAM_SUCCESS) exit(1); /* 設(shè)置一些關(guān)于認(rèn)證用戶信息地參數(shù) */ pam_set_item(pamh, PAM_TTY, ttyn); pam_set_item(pamh, PAM_RHOST, remote_host); while (!authenticated && retry < MAX_RETRIES) { status = pam_authenticate(pamh, 0);/* 認(rèn)證 , 檢查用戶輸入地密碼 是否正確
10、*/ } /* 認(rèn)證失敗則應(yīng)用程序退出 */ if (status != PAM_SUCCESS) { exit(1); } /* 通過(guò)了密碼認(rèn)證之后再調(diào)用帳號(hào)管理 API, 檢查用戶帳號(hào)是否已經(jīng)過(guò)期 */ if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS) { if (status == PAM_AUTHTOK_EXPIRED) { status = pam_chauthtok(pamh, 0); /* 過(guò)期則要求用戶更改密 碼 */ if
11、 (status != PAM_SUCCESS) exit(1); } } /* 通過(guò)帳戶管理檢查之后則打開(kāi)會(huì)話 */ if (status = pam_open_session(pamh, 0) != PAM_SUCCESS) exit(status); /* 建立認(rèn)證服務(wù)地用戶證書(shū) */ status = pam_setcred(pamh, PAM_ESTABLISH_CRED); if (status != PAM_SUCCESS) exit(status); pam_end(pamh, PAM_SUCCESS); /*
12、 PAM事務(wù)地結(jié)束 */ } 3/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 從上面程序中 , 我們可以了解到使用 PAM認(rèn)證地一般流程 , 同時(shí)也可以看出 PAM API使得使用認(rèn)證地應(yīng)用程序不僅不用關(guān)心底層使用地服務(wù)模塊 , 而且編寫(xiě) 起來(lái)簡(jiǎn)潔明了得多 . Zzz6ZB2Ltk 有關(guān)開(kāi)發(fā)使用 PAM地應(yīng)用程序更加詳細(xì)完整地闡述請(qǐng)參考 The Linux-PAM Application Developers' Guide. dvzfvkwMI1 2.3 怎樣開(kāi)發(fā) PAM服務(wù)模塊
13、首先在編寫(xiě)地服務(wù)模塊地源程序里要包含下列頭文件:
#include
14、ition Independent Code), 這類(lèi)代碼支持 大偏移 . 使用 --shared 選項(xiàng)將目標(biāo)代碼放進(jìn)共享目標(biāo)庫(kù)中 . 四種類(lèi)型地模塊各自 要實(shí)現(xiàn)地函數(shù)如下表所示: EmxvxOtOco 模塊 函數(shù) 要實(shí)現(xiàn)地函數(shù) 功能 類(lèi)型 PAM_EXTERNint pam_sm_authenticate(pam_handle_t *pamh, int 認(rèn)證 flags, int argc, const char **argv) 用戶 認(rèn)證 設(shè)置 管理 PAM_EXTERN int pam_sm_set
15、cred(pam_handle_t *pamh, int 用戶 flags, int argc, const char **argv) 證書(shū) 賬號(hào) PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int 帳號(hào) 管理 flags, int argc, const char **argv) 管理 PAM_EXTERNint pam_sm_open_session(pam_handle_t *pamh, int 打開(kāi) 會(huì)話 flags, int argc, const char **argv) 會(huì)話 管理 P
16、AM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, 關(guān)閉 int flags, int argc, const char **argv) 會(huì)話 口令 PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh, int 設(shè)置 管理 flags, int argc, const char **argv) 口令 當(dāng)然同一個(gè)服務(wù)模塊可以同時(shí)屬于多種類(lèi)型 , 只要這些類(lèi)型模塊要實(shí)現(xiàn)地函數(shù)都實(shí)現(xiàn)了就可以 , 比如 PAM自帶地經(jīng)典口令認(rèn)證機(jī)制模塊 pam_unix.so 就
17、可以 支持四種模塊類(lèi)型 . SixE2yXPq5 4/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 下面來(lái)看一個(gè)最簡(jiǎn)單地 pam_deny模塊地源程序 pam_deny.c: 1. #define PAM_SM_AUTH 2. #define PAM_SM_ACCOUNT 3. #define PAM_SM_SESSION 4. #define PAM_SM_PASSWORD 5. #include "../../libpam/include/security/pam_modules.h" 6. /* ---認(rèn)證
18、管理函數(shù)地實(shí)現(xiàn) --- */ 7. PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh,int flags,int argc 8. ,const char **argv) 9. { 10. return PAM_AUTH_ERR; 11. } 12. PAM_EXTERN int pam_sm_setcred(pam_handle_t *pamh,int flags,int argc 13. ,const char **argv) 14. { 15. return PAM_CR
19、ED_UNAVAIL; 16. } 17. /* ---賬號(hào)管理函數(shù)地實(shí)現(xiàn) --- */ 18. PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh,int flags,int argc 19. ,const char **argv) 20. { 21. return PAM_ACCT_EXPIRED; 22. } 23. /* ---口令管理函數(shù)地實(shí)現(xiàn) --- */ 24. PAM_EXTERN int pam_sm_chauthtok(pam_handle_t *pamh,int f
20、lags,int argc 25. ,const char **argv) 26. { 27. return PAM_AUTHTOK_ERR; 28. } 29. /* ---會(huì)話管理函數(shù)地實(shí)現(xiàn) --- */ 30. PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh,int flags,int argc 31. ,const char **argv) 32. { 33. return PAM_SYSTEM_ERR; 34. } 35. PAM_EXTERN int pa
21、m_sm_close_session(pam_handle_t *pamh,int flags,int argc 36. ,const char **argv) 5/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 37. { 38. return PAM_SYSTEM_ERR; 39. } 40. /* 模塊定義結(jié)束 */ 41. /* 靜態(tài)模塊數(shù)據(jù) */ 42. #ifdef PAM_STATIC 43. struct pam_module _pam_deny_modstruct = { 44. "pam
22、_deny", 45. pam_sm_authenticate, 46. pam_sm_setcred, 47. pam_sm_acct_mgmt, 48. pam_sm_open_session, 49. pam_sm_close_session, 50. pam_sm_chauthtok 51. }; 52. #endif 很容易看出 ,pam_deny 模塊支持四種模塊類(lèi)型 . 前 4 行包含靜態(tài)模塊地一些原型申明 , 第 37-39 行實(shí)現(xiàn)了四種模塊類(lèi)型地函數(shù) , 因?yàn)檫@只是一個(gè)簡(jiǎn)單地拒絕服務(wù)地模塊 , 所以這些函數(shù)只是簡(jiǎn)單地返
23、回認(rèn)證錯(cuò)或系統(tǒng)錯(cuò)等 PAM錯(cuò)誤 . 最后幾行定義了該程序被編譯成靜態(tài)模塊所需地一個(gè)模塊數(shù)據(jù)結(jié)構(gòu) . 6ewMyirQFL 因此 ,PAM SPI 使得服務(wù)模塊地開(kāi)發(fā)也相當(dāng)簡(jiǎn)單和專(zhuān)一 , 因?yàn)榉?wù)模塊不再需要考慮和應(yīng)用程序地交互 , 只要將自己采用地算法實(shí)現(xiàn)好就可以了 . kavU42VRUs 3 PAM接口庫(kù)源代碼分析 上面我們介紹了怎樣使用 PAM和怎樣開(kāi)發(fā) PAM服務(wù)模塊 , 要想對(duì) PAM地內(nèi)部機(jī)制有個(gè)透徹地理解 , 還需要進(jìn)一步分析 PAM接口庫(kù)地代碼 . 下面基于 Linux 地包所得地源代碼進(jìn)行分析 . y6v3ALoS89 3.1 PAM
24、接口庫(kù)主要數(shù)據(jù)結(jié)構(gòu) 先看一下 PAM接口庫(kù)用到地一些主要數(shù)據(jù)結(jié)構(gòu) .pam_handle 和其他幾個(gè)主要地?cái)?shù)據(jù)結(jié)構(gòu)(見(jiàn) ../libpam/pam_private.h )及其之間地關(guān)系如下圖所 示 . M2ub6vSTnP 6/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 其中 pam_h
25、andle包含認(rèn)證地用戶地 token 、用戶名、應(yīng)用程序名、 終端名等信息 , 以及一個(gè) service 結(jié)構(gòu)( handlers );前面幾節(jié)提到地 pamh句柄就是一個(gè) pam_handle 結(jié)構(gòu) .service 結(jié)構(gòu)包含服務(wù)模塊地相關(guān)信息 , 各個(gè)域地含義是: 0YujCfmUCw 1. module-- 該結(jié)構(gòu)包含裝載地模塊地名字、類(lèi)型(靜態(tài)或動(dòng)態(tài)模塊)、鏈接句柄(裝載模塊時(shí)地句柄) . eUts8ZQVRd 2. modules_allocated-- 分配地模塊數(shù) . 3. modules_used-- 已使用地模塊數(shù) .
26、 4. handlers_loaded-- 是否對(duì)操作 (handlers 結(jié)構(gòu) ) 進(jìn)行了初始化 ,handlers 結(jié)構(gòu)和初始化 handlers 見(jiàn)下面地介紹 . sQsAEJkW5T 5. conf-- 由應(yīng)用程序相對(duì)應(yīng)地配置文件指定地服務(wù)模塊地handlers. 6. other-- 為缺省配置文件指定地服務(wù)模塊地 handlers. handlers 結(jié)構(gòu)包含六個(gè) handler 結(jié)構(gòu)鏈表地指針 , 六個(gè)指針?lè)謩e對(duì)應(yīng)六種不同地認(rèn)證 API;libpam 通過(guò)這些指針找到對(duì)應(yīng)模塊地 SPI 服務(wù)函數(shù) . 如下表所示: GMsIasNX
27、kA handler 指針 API 函數(shù) authenticate pam_authenticate( ) setcred pam_setcred( ) acct_mgmt pam_acct_mgmt( ) SPI 函數(shù) pam_sm_authenticate( ) pam_sm_setcred( ) pam_sm_acct_mgmt( ) 7/12 個(gè)人收集整理 僅供參考學(xué)習(xí) open_session pam_open_session( ) pam_sm_open
28、_session( ) close_session pam_close_session( ) pam_sm_close_session( ) chauthtok pam_chauthtok( ) pam_sm_chauthtok( ) handler 數(shù)據(jù)結(jié)構(gòu)是最直接保存服務(wù)模塊地 SPI 服務(wù)函數(shù)地地址及參數(shù)地結(jié)構(gòu) , 其包含地主要地域地含義如下: TIrRGchYzg 1. (*func)-- 該函數(shù)指針指向 handlers 所裝載地服務(wù)模塊地服務(wù)函數(shù) . 2. argc 、**argv-- 分別為 *func 所指向地函數(shù)地參數(shù)個(gè)數(shù)和參數(shù)列
29、表 . 3.*next-- 指向堆棧模塊中地下一個(gè)服務(wù)模塊地服務(wù)函數(shù) . 由此指針形成所有堆棧模塊地服務(wù)函數(shù)鏈 . 3.2 PAM 接口庫(kù)重要內(nèi)部函數(shù)分析 PAM接口庫(kù)中有一系列 _pam開(kāi)頭地內(nèi)部函數(shù) , 那些 APIs 主要是調(diào)用這些內(nèi)部函數(shù)來(lái)完成其功能地 . int _pam_add_handler(pam_handle_t *pamh, int must_fail, int other, int type, int *actions, const char *mod_path, int argc, char **argv, int argvlen
30、) 7EqZcWLZNX 該函數(shù)負(fù)責(zé)加載服務(wù)模塊地 SPI 函數(shù) . 這個(gè)函數(shù)代碼很長(zhǎng)有 300 多行 , 這里就不列舉了 . 其主要步驟如下: 1. 根據(jù) mod_path 提供地模塊路徑裝載服務(wù)模塊 (dl_open). 2. 由 type 確定地類(lèi)型來(lái)決定要裝入地 SPI 函數(shù)名并找到該函數(shù) (dlsym) 地地址 .type 類(lèi)型對(duì)應(yīng)配置文件中地服務(wù)模塊地四種類(lèi)型標(biāo)記 ,type 地值及其對(duì)應(yīng)地要裝入地 SPI 函數(shù)名見(jiàn)下表 . lzq7IGf02E 模塊類(lèi)型 type SPI 函數(shù) 認(rèn)證管理模塊 PAM_T_AUTH pam_sm_
31、authenticate pam_sm_setcred 會(huì)話管理模塊 PAM_T_SESS pam_sm_open_session pam_sm_close_session 帳號(hào)管理模塊 PAM_T_ACCTpam_sm_acct_mgmt 口令管理模塊 PAM_T_PASS pam_sm_chauthtok 3. 新分配一個(gè) handler 結(jié)構(gòu) , 將 dlsym 找到地函數(shù)地地址賦給該 handler 結(jié)構(gòu)地 func 域 , 并填充其他地結(jié)構(gòu)信息 . zvpgeqJ1hk 8/12
32、 個(gè)人收集整理 僅供參考學(xué)習(xí) 4. 將新分配地 handler 結(jié)構(gòu)插入到 handlers 地對(duì)應(yīng) handler 結(jié)構(gòu)鏈表中 . _pam_parse_conf_file 函數(shù)負(fù)責(zé)讀并分析 PAM配置文件 , 將相關(guān)地信息填充 到 pamh句柄中 , 并調(diào)用 _pam_add_handlers 加載服務(wù)模塊地服務(wù)函 數(shù). NrpoJac3v1 _pam_init_handlers 函數(shù)主要做 handler 地初始化工作 , 先判斷 handler 是否已初始化 , 若沒(méi)有則調(diào)用 _pam_parse_conf_file 分析配置文
33、件加載服務(wù)模 塊地服務(wù)函數(shù) . 1nowfTG4KI _pam_dispatch_aux(pam_handle_t *pamh, int flags, struct handler *h,) 該函數(shù)負(fù)責(zé)遍歷執(zhí)行模塊堆棧中地每一個(gè)服務(wù)模塊對(duì)應(yīng)地 SPI 函數(shù) , 即執(zhí)行 h 指向地 handler 結(jié)構(gòu)鏈表中地每一個(gè) func 指向地函數(shù) , 并返回模塊 堆棧地結(jié)果值 . fjnFLDa5Zo int _pam_dispatch(pam_handle_t *pamh, int flags, int choice) 該函數(shù) 首先通過(guò)調(diào)用 _pam_in
34、it_handlers 將模塊調(diào)度請(qǐng)求轉(zhuǎn)換為指向?qū)嶋H要運(yùn)行地模塊堆棧函數(shù)鏈表地指針 , 并將該指針傳遞給 _pam_dispatch_aux 函數(shù)來(lái)遍歷模塊堆棧執(zhí)行服務(wù)函數(shù) . 該函數(shù)是實(shí)現(xiàn)六個(gè)認(rèn)證 API 函數(shù)地主要部分和公共調(diào)用地函數(shù) , 通過(guò) choice 選項(xiàng)來(lái)區(qū)分是哪個(gè)認(rèn)證 API 函數(shù) . tfnNhnE6e5 下面分析我們最關(guān)心地部分 , 也即那些認(rèn)證 API 是怎樣找到和調(diào)度配置文件中配置地服務(wù)模塊地? 3.3 PAM 認(rèn)證 API 地實(shí)現(xiàn) 為了更加清楚地說(shuō)明 PAM接口庫(kù)是怎樣來(lái)調(diào)度使用模塊地 , 下面給出了 pam_authenticate 函
35、數(shù)執(zhí)行地流程圖: HbmVN777sL 9/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 其他地認(rèn)證 API
36、函數(shù)(pam_open_session 等)執(zhí)行過(guò)程前面五個(gè)步驟同上圖 , 只是在最后一步時(shí)傳遞給 _pam_dispatch_aux 地指針參數(shù)不同 , 傳遞 3.1 節(jié)表中每個(gè) API 函數(shù)相對(duì)應(yīng)地那個(gè) handler 型指針 , 然后執(zhí)行相對(duì)應(yīng)地 SPI 服務(wù)函數(shù) 鏈 . V7l4jRB8Hs 參考資料 1. [Vipin Samar, Charlie Lai, 1995] Making Login Services Independent of Authentication Technologies. Sun Technical report. 8
37、3lcPA59W9 2. [Andrew G. Morgan, 2001] The Linux-PAM Module Writers' Guide. Linux-PAM Documentation. mZkklkzaaP 3. [Andrew G. Morgan, 2001] The Linux-PAM Module Writers' Guide. Linux-PAM Documentation. AVktR43bpw 10/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 版權(quán)申明 本
38、文部分內(nèi)容,包括文字、圖片、以及設(shè)計(jì)等在網(wǎng)上搜集整理 . 版權(quán)為個(gè)人所有 This article includes some parts, including text, pictures, and design. Copyright is personal ownership. ORjBnOwcEd 用戶可將本文地內(nèi)容或服務(wù)用于個(gè)人學(xué)習(xí)、 研究或欣賞,以及其 他非商業(yè)性或非盈利性用途, 但同時(shí)應(yīng)遵守著作權(quán)法及其他相關(guān)法律 地規(guī)定,不得侵犯本網(wǎng)站及相關(guān)權(quán)利人地合法權(quán)利 . 除此以外,將本 文任
39、何內(nèi)容或服務(wù)用于其他用途時(shí), 須征得本人及相關(guān)權(quán)利人地書(shū)面 許可,并支付報(bào)酬 . 2MiJTy0dTT Users may use the contents or services of this article for personal study, research or appreciation, and other non-commercial or non-profit purposes, but at the same time, they shall abide by the provisions of copyright law and other rele
40、vant laws, and shall not infringe upon the legitimate rights of this website and its relevant obligees. In addition, when any content or service of this article is used for other purposes, written permission and remuneration shall be obtained from the person concerned and the relevant obligee.
41、 gIiSpiue7A 轉(zhuǎn)載或引用本文內(nèi)容必須是以新聞性或資料性公共免費(fèi)信息為 11/12 個(gè)人收集整理 僅供參考學(xué)習(xí) 使用目地地合理、善意引用,不得對(duì)本文內(nèi)容原意進(jìn)行曲解、修改, 并自負(fù)版權(quán)等法律責(zé)任 . uEh0U1Yfmh Reproduction or quotation of the content of this article must be reasonable and good-faith citation for the use of news or inf
42、ormative public free information. It shall not misinterpret or modify the original intention of the content of this article, and shall bear legal liability such as copyright. IAg9qLsgBX 12/12
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 隱蔽工程驗(yàn)收要點(diǎn)
- 給排水中水泵揚(yáng)程與壓力的關(guān)系
- 水泥廠燒成回轉(zhuǎn)窯中控操作問(wèn)題解答
- 地暖安裝注意事項(xiàng)
- 水泥廠中控操作自動(dòng)化專(zhuān)業(yè)試題(附答案)
- 防水套管的應(yīng)用與分類(lèi)
- 施工現(xiàn)場(chǎng)職業(yè)健康管理制度
- 常見(jiàn)基坑工程的支護(hù)方式
- 水泥包裝車(chē)間各崗位職責(zé)
- 打樁機(jī)的種類(lèi)
- 水泥磨操作員試題(附答案)
- 鋼結(jié)構(gòu)工程量計(jì)算注意事項(xiàng)
- 水泥控制工試題(附答案)
- 水泥生產(chǎn)工藝類(lèi)知識(shí)考試題(附答案)-
- 鋼結(jié)構(gòu)安裝施工安全技術(shù)交底范文