歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> Linux文化

網絡安全編程技術(一)


UNIX系統為程序員提供了許多子程序,這些子程序可存取各種安全屬性.有
些是信息子程序,返回文件屬性,實際的和有效的UID,GID等信息.有些子程序可
改變文件屬性.UID,GID等有些處理口令文件和小組文件,還有些完成加密和解密.
本文主要討論有關系統子程序,標准C庫子程序的安全,如何寫安全的C程序
並從root的角度介紹程序設計(僅能被root調用的子程序).

1.系統子程序

(1)I/O子程序
*creat():建立一個新文件或重寫一個暫存文件.
需要兩個參數:文件名和存取許可值(8進制方式).如:
creat("/usr/pat/read_write",0666) /* 建立存取許可方式為0666的文件 */
調用此子程序的進程必須要有建立的文件的所在目錄的寫和執行許可,置
給creat()的許可方式變量將被umask()設置的文件建立屏蔽值所修改,新
文件的所有者和小組由有效的UID和GID決定.
返回值為新建文件的文件描述符.
*fstat():見後面的stat().
*open():在C程序內部打開文件.
需要兩個參數:文件路徑名和打開方式(I,O,I&O).
如果調用此子程序的進程沒有對於要打開的文件的正確存取許可(包括文
件路徑上所有目錄分量的搜索許可),將會引起執行失敗.
如果此子程序被調用去打開不存在的文件,除非設置了O_CREAT標志,調用
將不成功.此時,新文件的存取許可作為第三個參數(可被用戶的umask修
改).
當文件被進程打開後再改變該文件或該文件所在目錄的存取許可,不影響
對該文件的I/O操作.
*read():從已由open()打開並用作輸入的文件中讀信息.
它並不關心該文件的存取許可.一旦文件作為輸入打開,即可從該文件中讀
取信息.
*write():輸出信息到已由open()打開並用作輸出的文件中.同read()一樣
它也不關心該文件的存取許可.
(2)進程控制
*exec()族:包括execl(),execv(),execle(),execve(),execlp()和execvp()
可將一可執行模快拷貝到調用進程占有的存貯空間.正被調用進
程執行的程序將不復存在,新程序取代其位置.
這是UNIX系統中一個程序被執行的唯一方式:用將執行的程序復蓋原有的
程序.
安全注意事項:
. 實際的和有效的UID和GID傳遞給由exec()調入的不具有SUID和SGID許
可的程序.
. 如果由exec()調入的程序有SUID和SGID許可,則有效的UID和GID將設
置給該程序的所有者或小組.
. 文件建立屏蔽值將傳遞給新程序.
. 除設了對exec()關閉標志的文件外,所有打開的文件都傳遞給新程序.
用fcntl()子程序可設置對exec()的關閉標志.
*fork():用來建立新進程.其建立的子進程是與調用fork()的進程(父進程)
完全相同的拷貝(除了進程號外)
安全注意事項:
. 子進程將繼承父進程的實際和有效的UID和GID.
. 子進程繼承文件方式建立屏蔽值.
. 所有打開的文件傳給子進程.
*signal():允許進程處理可能發生的意外事件和中斷.
需要兩個參數:信號編號和信號發生時要調用的子程序.
信號編號定義在signal.h中.
信號發生時要調用的子程序可由用戶編寫,也可用系統給的值,如:SIG_IGN
則信號將被忽略,SIG_DFL則信號將按系統的缺省方式處理.
如許多與安全有關的程序禁止終端發中斷信息(BREAK和DELETE),以免自己
被用戶終端終止運行.
有些信號使UNIX系統的產生進程的核心轉儲(進程接收到信號時所占內存
的內容,有時含有重要信息),此系統子程序可用於禁止核心轉儲.
(3)文件屬性
*access():檢測指定文件的存取能力是否符合指定的存取類型.
需要兩個參數:文件名和要檢測的存取類型(整數).
下面還有喔 (19%) │ 結束 ← │ ↑/↓/PgUp/PgDn 移動 │ ? 輔助說明 │
需要兩個參數:文件名和要檢測的存取類型(整數).
存取類型定義如下:
0: 檢查文件是否存在
1: 檢查是否可執行(搜索)
2: 檢查是否可寫
3: 檢查是否可寫和執行

4: 檢查是否可讀
5: 檢查是否可讀和執行
6: 檢查是否可讀可寫可執行
這些數字的意義和chmod命令中規定許可方式的數字意義相同.
此子程序使用實際的UID和GID檢測文件的存取能力(一般有效的UID和GID
用於檢查文件存取能力).
返回值: 0:許可 -1:不許可.
*chmod():將指定文件或目錄的存取許可方式改成新的許可方式.
需要兩個參數:文件名和新的存取許可方式.
*chown():同時改變指定文件的所有者和小組的UID和GID.(與chown命令不
同).
由於此子程序同時改變文件的所有者和小組,故必須取消所操作文件的SUID
和SGID許可,以防止用戶建立SUID和SGID程序,然後運行chown()去獲得別
人的權限.
*stat():返回文件的狀態(屬性).
需要兩個參數:文件路徑名和一個結構指針,指向狀態信息的存放
的位置.
結構定義如下:
st_mode: 文件類型和存取許可方式
st_ino: I節點號
st_dev: 文件所在設備的ID
st_rdev: 特別文件的ID
st_nlink: 文件鏈接數
st_uid: 文件所有者的UID
st_gid: 文件小組的GID
st_size: 按字節計數的文件大小
st_atime: 最後存取時間(讀)
st_mtime: 最後修改時間(寫)和最後狀態的改變
st_ctime: 最後的狀態修改時間
返回值: 0:成功 1:失敗
*umask():將調用進程及其子進程的文件建立屏蔽值設置為指定的存取許可.
需要一個參數: 新的文件建立屏值.
(4)UID和GID的處理
*getuid():返回進程的實際UID.
*getgid():返回進程的實際GID.
以上兩個子程序可用於確定是誰在運行進程.
*geteuid():返回進程的有效UID.
*getegid():返回進程的有效GID.
以上兩個子程序可在一個程序不得不確定它是否在運行某用戶而不是運行
它的用戶的SUID程序時很有用,可調用它們來檢查確認本程序的確是以該
用戶的SUID許可在運行.
*setuid():用於改變有效的UID.
對於一般用戶,此子程序僅對要在有效和實際的UID之間變換的SUID程序才
有用(從原有效UID變換為實際UID),以保護進程不受到安全危害.實際上該
進程不再是SUID方式運行.
*setgid():用於改變有效的GID.


——摘自:http://www.linuxaid.com.cn


Copyright © Linux教程網 All Rights Reserved