❶ linux內核態,在LSM框架中的文件操作hook介面中如何獲取一個正在被操作的文件的內容(linux4.4版本)
LSM是Linux Secrity Mole的簡稱,即linux安全模塊。其是一種輕量級通用訪
問控制框架,適合於多種訪問控制模型在它上面以內核可載入模塊的形實現。用
戶可以根據自己的需求選擇合適的安全模塊載入到內核上實現。
LSM設計思想:
LSM的設計思想:在最少改變內核代碼的情況下,提供一個能夠成功實現強制訪
問控制模塊需要的結構或者介面。LSM避免了利用如在systrace系統調用中的出
現過的系統調用干預,因為它不能擴展到多處理器內核,並且它受制於參數替換
攻擊。還有LSM在設計時做了兩點考慮:對不使用的人來說盡量少引入麻煩,對
使用的人來說要帶來效率。以Linus Torvalds為代表的內核開發人員對Linux安
全模塊(LSM)提出了三點要求:
1、真正的通用,當使用一個不同的安全模型的時候,只需要載入一個不同的內
核模塊。
2、概念上簡單,對Linux內核影響最小,高效,並且。
3、能夠支持現存的POSIX.1e capabilities邏輯,作為一個可選的安全模塊。
還有,針對linux上提出的各種不同的Linux安全增強系統對Linux安全模塊(LSM
)提出的要求是:能夠允許他們以可載入內核模塊的形式重新實現其安全功能,
並且不會在安全性方面帶來明顯的損失,也不會帶來額外的系統開銷。
LSM框架結構:
LSM框架主要由五部分構成:
1、在特定的內核數據結構中加入安全域。
2、在內核源代碼中不同的關鍵點插入對安全鉤子函數的調用。
3、加入一個通用的安全系統調用。
4、提供了函數允許內核模塊注冊為安全模塊或者注銷。
5、5、將capabilities邏輯的大部分移植為一個可選的安全模塊。
安全域是一個void*類型的指針,它使得安全模塊把安全信息和內核內部對象聯
系起來。下面列出被修改加入了安全域的內核數據結構,以及各自所代表的內核
內部對象:
task_struct結構:代表任務(進程)
linux_binprm結構:代表程序
super_block結構:代表文件系統
inode結構:代表管道,文件,或者Socket套接字
file結構:代表打開的文件
sk_buff結構:代表網路緩沖區(包)
net_device結構:代表網路設備
kern_ipc_perm結構:代表Semaphore信號,共享內存段,或者消息隊列
msg_msg:代表單個的消息
Linux安全模塊(LSM)提供了兩類對安全鉤子函數的調用:一類管理內核對象的
安全域,另一類仲裁對這些內核對象的訪問。對安全鉤子函數的調用通過鉤子來
實現,鉤子是全局表security_ops中的函數指針,這個全局表的類型是
security_operations結構,這個結構定義在include/linux/security.h這個頭
文件中。
LSM介面的核心是security_ops,當系統啟動時,他們被初始化為傳統的DAC策略
。傳統DAC訪問控制是指控制系統中的主體(如進程)對系統中的客體(如文件
目錄、文件)的訪問(讀、寫和執行等)。自主訪問控制DAC 是指主體(進程,
用戶)對客體(文件、目錄、特殊設備文件、IPC等)的訪問許可權是由客體的屬
主或超級用戶決定的,而且此許可權一旦確定,將作為以後判斷主體對客體是否有
訪問許可權的依據。
在載入安全模塊時,我們必需先對模塊進行注冊,我們可以使用
register_security()函數向LSM注冊一個安全模塊。在我們的模塊被載入成
功後,就可以進行訪問控制操作。如果此時還有一個安全模塊要使用
register_security()函數進行載入,則會出現錯誤,直到使用
unregister_security()函數向框架注銷後,下一個模塊才可以載入。當然LS
M還提供了mod_reg_security()函數和mod_unreg_security()函數,可以連續注
冊多個安全模塊。如果有其他後來的模塊需要載入,可以通過mod_reg_security
()向第一個模塊注冊,形成支持不同策略的模塊棧。
註:以上出現的函數均基於2.6.22以前的版本,對於後續的版本,出現了
register_security()函數未被導出或者取消掉了unregister_security()函數。
LSM執行過程:
根據下圖的執行步驟:用戶在執行系統調用時,先通過原有的內核介面依次執行
功能性的錯誤檢查,接著進行傳統的DAC檢查,並在即將訪問內核的內部對象之
前,通過LSM鉤子函數調用LSM。LSM再調用具體的訪問控制策略來決定訪問的合
法性。圖三顯示了LSM鉤子的調用:
圖三:基於LSM的內核對象訪問過程
Lilinux安全模塊(LSM)主要支持"限制型"的訪問控制決策:當Linux內核授予
文件或目錄訪問許可權時,Linux安全模塊(LSM)可能會拒絕,而當 Linux內核拒
絕訪問時,可以跳過LSM。
========
使用LSM實現自己的訪問控制
首先對LSM 進行簡單介紹。雖然linux下的各位基本都知道一些,但是還要羅嗦
一下。
LSM中文全稱是linux安全模塊。英文全稱:linux security mole.
LSM是一種輕量級、通用的訪問控制框架,適合多種訪問控制模型以內核模塊的
形式實現。其特點是通用、簡單、高效、支持POSIX。1e能力機制。
LSM的架構圖如下:
通過系統調用進入內核之後,系統首先進行傳統的許可權檢查(傳統許可權檢查主要
是基於用戶的,用戶通過驗證之後就可以訪問資源),通過之後才會進行強制訪
問控制。(強制訪問控制是不允許主體干涉的一種訪問控制,其採用安全標識、
信息分級等信息敏感性進行訪問控制。並且通過比較主體的級別和資源的敏感性
來確定是否允許訪問。比如說系統設置A用戶不允許訪問文件B,即便A是文件B的
所有者,訪問也是受限制的。)從圖上看來,LSM實現訪問控制主要通過安全模
塊的鉤子函數實現。
LSM框架主要由五部分組成:這個網上資料很多。
在關鍵的特定內核數據結構中加入了安全域;
在內核源碼中不同的關鍵點處插入對安全鉤子函數的調用;
提供了一個通用的安全系統調用;
提供了注冊和注銷函數,使得訪問控制策略可以以內核模塊方式實現;
將capabilities邏輯的大部分功能移植為一個可選的安全模塊。
我們這里重點結合源碼對LSM框架進行解釋。我使用的源碼是3.5.4
首先介紹安全域欄位,它是一個空類型的指針,在內核中的很多內核結構中都存
在,比如inode、superblock、dentry、file等等。類型欄位為void *
security;
那麼安全域怎麼和安全模塊中的信息關聯起來?
當安全模塊載入之後,安全域中的指針便指向安全模塊中的安全信息。這里以
selinux為例進行介紹。
內核裡面security/selinux/include/objsec.h中定義了不同對象的安全信息,
格式為XXX_security_strut.
上面的文件的安全信息裡麵包含打開文件描述符時的安全ID、文件所有者的安全
ID等等。
要聯系安全模塊中安全信息和安全域需要幾個控制鉤子函數。這些鉤子函數實現
了對內核關鍵信息的設置和管理。這里主要介紹alloc_security、
free_security。
selinux裡面通過實現安全信息空間分配實現關聯。比如以文件安全信息為例
這里分配空間成功之後,通過file->f_security = fsec實現了關聯。
撤銷關聯是在安全模塊卸載之後調用file_free_security.
這里具體通過設置file->f_secrity為NULL,然後釋放安全信息結構實現。
現在來看看內核如何實現selinux的訪問控制。這里主要就是實現LSM裡面的鉤子
函數了。LSM裡面給出了結構體security_operations,裡面給出了很多鉤子函數
,實現了相關鉤子函數就可以實現訪問控制了。
上面的函數就實現了file_permission鉤子函數。可以看下inode結構體的獲得,
感受內核是通過文件->目錄項->inode。該函數主要實現自己的訪問控制策略就
OK 了。
哪selinux來說,在獲得文件安全ID之後,主要對掩碼和文件打開時相關的安全
信息進行檢測,符合就通過訪問控制。
selinux基本實現了LSM裡面的所有鉤子函數,待鉤子函數實現後,對LSM裡面鉤
子域進行填充就OK了。
做完以上這些還需要注冊安全模塊到LSM,這里注冊和注銷使用了
register_security和unregister_security。
比如selinux在注冊時使用語句register_security(&selinux_ops)實現。
接下來通過上面的分析我們可以實現簡單的基於LSM的訪問控制。
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/mole.h>
#include <linux/fs.h>
#include <linux/security.h>
#include <linux/types.h>
#include <asm/uaccess.h>
#include <linux/fcntl.h>
#include <linux/uaccess.h>
#include <linux/file.h>
#include <linux/namei.h>
static int lsm_test_file_permission(struct file *file,int mask)
{
int path=0;
struct file *filp;
struct nameidata nd;
path = path_lookup(FILENAME,LOOKUP_FOLLOW,&nd);
if(!mask)
return 0;
if(path)
{
printk("lookup file failed!\n");
return -1;
}
filp = filp_open("/home/yuyunchao/code/sb.c",O_RDONLY,0);
{
printk("open failed!\n");
}
return 0;
}
static struct security_operations lsm_test_security_ops = {
.file_permission = lsm_test_file_permission,
};
static int __init lsm_file_init(void)
{
if(register_security(&lsm_test_security_ops)){
printk("register error ..........\n");
return -1;
}
printk("lsm_file init..\n ");
return 0;
}
static void __exit lsm_file_exit(void)
{
if(unregister_security(&lsm_test_security_ops)){
printk("unregister error................\n");
return ;
}
printk("mole exit.......\n");
}
MODULE_LICENSE("GPL");
mole_init(lsm_file_init);
mole_exit(lsm_file_exit);
========
LSM(Linux Security Mole)應用方法(簡單例子)
LSM在內核中很多地方已經插入了hook函數,並且在security.c函數中聲明了
security_ops結構,要實現你自己的安全模塊,只需要定義你自己的struct
security_operations,並且用register_security注冊即可,下面舉個簡單例子
:
test.c代碼如下:
/*
* Test Linux Security Mole
*
* Author: penghuan <[email protected]>
*
* Copyright (C) 2010 UbuntuKylin, Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, as
* published by the Free Software Foundation.
*
*/
#include <linux/security.h>
#include <linux/sysctl.h>
#include <linux/ptrace.h>
#include <linux/prctl.h>
#include <linux/ratelimit.h>
#include <linux/workqueue.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/dcache.h>
#include <linux/path.h>
int test_file_permission(struct file *file, int mask)
{
char *name = file->f_path.dentry->d_name.name;
if(!strcmp(name, "test.txt"))
{
file->f_flags |= O_RDONLY;
printk("you can have your control code here!\n");
}
return 0;
}
static struct security_operations test_security_ops = {
.name = "test",
.file_permission = test_file_permission,
};
static __init int test_init(void)
{
printk("enter test init!\n");
printk(KERN_INFO "Test: becoming......\n")
if (register_security(&test_security_ops))
panic("Test: kernel registration failed.\n");
return 0;
}
security_initcall(test_init);
將該文件以模塊的形式放到security/下編譯進內核,啟用新的內核後,當你操
作文件test.txt時,通過dmesg命令就能再終端看到」you can have your
control code here!「輸出
所以一般的做法是:定義你自己的struct security_operations,實現你自己的
hook函數,具體有哪些hook函數可以查詢include/linux/security.h文件,然後
調用register_security來用你的test_security_ops初始化全局的security_ops
指針
樓主,我剛開始研究LSM,但網上資料太少,您這個代碼,我編譯成ko文件老是
有警告,並且insmod時,說Unknown symbol register_security。我最近看了看
內核模塊變成,沒有對內核進行太深入的了解。不知能否把LSM的實驗步驟給出
的再詳細點,謝謝。
你需要把代碼編進內核
是需要把那段源碼拷到內核目錄下,然後重新編譯內核?。。沒有不編譯內核的
方法嗎?。。直接按照模塊進行編譯。另外那個test.txt放在哪個文件夾里?。
是需要把那段源碼拷到內核目錄下,然後重新編譯內核?。。沒有不編譯內核的
方法嗎?。。直接按照模塊進行 ...
是的,你去網上找下怎麼把模塊編進內核,lsm模塊不能以模塊方式載入,涉及
安全;test.txt是測試文件,當你把代碼編進內核後,用新內核啟動,然後操作
test.txt文件,就會有輸出,test.txt隨便放哪裡
樓主,您好,我剛開始學習lsm模塊,把您的模塊編譯進內核,新的內核載入後
,register_security總是失敗,請問下可能是什麼原因導致的。我的內核版本
是3.13.11。
register_security的返回值是-11
========
LSM在Linux中的實現方式
LSM(Linux Secure Model)一種輕量級訪問控制機制.
其實現方式有如在系統調用中加入一個後門....
方式如下:
static struct file *__dentry_open(struct dentry *dentry, struct
vfsmount *mnt,
struct file *f,
int (*open)(struct inode *, struct file *),
const struct cred *cred)
{
struct inode *inode;
int error;
...............................................................
error = security_dentry_open(f, cred); //LSM機制實現方式,在此加入了
一個LSM函數.
//security_dentry_open的實現如下,相當於一個介面,對一個函數指針再
//封裝一下.
//只返回是與否,這樣的控制信息.
if (error)
goto cleanup_all;
................................................................
return f;
cleanup_all:
.................................................................
return ERR_PTR(error);
}
//========簡單封裝一個指針結構體===========================
int security_dentry_open(struct file *file, const struct cred *cred)
{
int ret;
ret = security_ops->dentry_open(file, cred);
if (ret)
return ret;
return fsnotify_perm(file, MAY_OPEN);
}
========
利用LSM實現更安全的linux
LSM的全稱是Linux Security Moles,它是linux內核中用來支持更靈活的
安全策略的一個底層框架,雖然聽起來比較復雜,但是可以就把它理解成一組安
插在linux內核的鉤子函數和一些預留的被稱為安全域的數據結構,下面先說說
這個框架的由來吧。
linux本身的機制就保證了linux擁有更好的安全機制,但是在這個機制下面
,還是隱藏了許多的問題:
1、許可權粒度太大。用過linux的人應該對0644這樣的訪問許可權設置不陌生,
它對能夠操作這個文件的用戶做了限制,但是這個只是限制到了組,而沒有更進
一步的細分,當然,如果LSM只是用來限制這個的話,那麼也就太沒意思了,因
為實現文件更細的控制粒度,ACL就能夠很出色的完成,順便提一下,ACL有一個
分配的限制,如果哪位朋友需要用ACL進行粒度更細的訪問許可權控制的話,可能
需要注意一下這方面的東西。
2、root用戶的許可權太大。在linux中,root用戶就是至高無上的,他擁有對
機器的完全控制許可權,可以做他想做的一切事情。但是很多時候,我們可能並不
希望有root有這么大的許可權,比如在現在比較流行的雲存儲中,用戶肯定不希望
服務提供商能夠隨意訪問我們的文件,那麼這個時候,就需要對root用戶進行一
定的設置了。
由於這些問題的存在,所以出現了像SE Linux(Securiy Enhanced Linux )
這樣的增強補丁。但是每個系統對於具體安全細節的控制不盡相同, 所以Linus
Tovalds 提出應該要有一個 Linux 內核所能接受的安全框架來支持這些安全策
略,這個安全框架應該提供包含內核數據結構中的透明安全域以及用來控制、維
護安全域操作的安全鉤子,於是就有了LSM。
LSM在內核中的位置,可以用下圖來表示:
當用戶態程序調用某些操作系統提供的函數的時候,比如read()函數,其會
對應於內核中的一個系統調用,然後該首先會進行一些常規的錯誤檢測,接著進
行DAC(Discretionary Access Control)檢測,再接著它會進行LSM檢測。從上
圖中能夠看出來,LSM其實是一個非常底層的安全策略框架,利用LSM,可以接管
所有的系統調用,這樣,我們就能對包括root在內的所有用戶的許可權進行控制,
並且實現粒度更細的訪問許可權控制。
當系統初始化的時候,LSM就是一個空的框架,它不提供任何的檢測,其所
做的全部工作幾乎就是返回0,當然,有些不帶返回值的函數除外。而我們則可
以針對自己特定的需求來編寫LSM,然後將我們編寫的LSM鉤子函數,通過其數據
結構struct security_operations注冊到系統中去,這樣,我們的LSM檢測就開
始起作用了。
更多信息可參考《Linux就該這么學》
❷ 什麼是Linux系統架構
您好很高興回答您的問題:
Linux系統架構分為兩個部分一個是單台Linux系統架構 另外一個是網站集群架構.
單台Linux系統架構:
由硬體,內核,命令解釋器,外圍軟體組成
網站集群架構
❸ Linux裡面pv和vg區別是什麼
來自頂級大咖的解答:
邏輯卷管理(Logic Volume Manager),簡稱LVM,是動態磁碟分區管理技術,目前已經很少使用了,如果是學習,大可不必浪費時間掌握了。
1.PV(Physical Volume),物理卷,即物理磁碟分區。
2.VG(Volume Group),卷組,是所有物理卷PV組成的集合。
3.LV(Logic Volume),邏輯卷,是從卷組VG中劃分出來的存放數據的磁碟空間。
❹ Linux操作系統由什麼組成
Linux系統結構一般有3個主要部分:內核kernel、命令解釋層Shell或其他操作環境、實用工具
1.Linux內核
內核是系統的核心,是運行程序和管理磁碟、列印機等硬體設備的核心程序。操作系統向用戶提供一個操作界面,它從用戶那裡接收命令,並且把命令送給內核去執行。
當 Linux安裝完畢之後,一個通用的內核就被安裝到主機中,這個通用內核能滿足絕大部分用戶的需求,但普遍適用性內核對具體的某台主機來說,可能有一些並不需要的內核程序將被安裝。因此,Linux允許用戶根據主機的實際配置定製 Linux的內核,從而有效地簡化 Linux內核,提高系統啟動速度。
2.Linux Shell
Shell是系統的用戶界面,提供了用戶與內核進行交互操作的介面。它接收用戶輸入的命今,並且把它送入內核執行。操作系統在系統內核與用戶之間提供操作界面, Linux存在多種操作環境,分別是基於圖形界面的集成桌面環境和基於Shell命令行環境。
Shell是一個命令解釋器,它解釋由用戶輸入的命令,並且送到內核。Shell編程語言具有普通編程語言的很多特點,如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。
作為命令行操作界面的替代, Linux還提供了像 Windows那樣的可視化圖形界面X-window的圖形用戶界面。
3.實用工具
標準的 Linux系統都有配套的實用工具程序,如編輯器、瀏覽器、辦公套件及其它系統管理工具等,用戶可以自行編寫需要的應用程序。
❺ Linux文件組織結構是什麼
一切從「/」開始
在Linux系統中,目錄、字元設備、塊設備、套接字、列印機等都被抽象成了文件,即劉遄老師所一直強調的「Linux系統中一切都是文件」。既然平時我們打交道的都是文件,那麼又應該如何找到它們呢?在Windows操作系統中,想要找到一個文件,我們要依次進入該文件所在的磁碟分區(假設這里是D盤),然後在進入該分區下的具體目錄,最終找到這個文件。但是在Linux系統中並不存在C/D/E/F等盤符,Linux系統中的一切文件都是從「根(/)」目錄開始的,並按照文件系統層次化標准(FHS)採用樹形結構來存放文件,以及定義了常見目錄的用途。另外,Linux系統中的文件和目錄名稱是嚴格區分大小寫的。例如,root、rOOt、Root、rooT均代表不同的目錄,並且文件名稱中不得包含斜杠(/)。Linux系統中的文件存儲結構如圖6-1所示。
前文提到的FHS是根據以往無數Linux系統用戶和開發者的經驗而總結出來的,是用戶在Linux系統中存儲文件時需要遵守的規則,用於指導我們應該把文件保存到什麼位置,以及告訴用戶應該在何處找到所需的文件。但是,FHS對於用戶來講只能算是一種道德上的約束,有些用戶就是懶得遵守,依然會把文件到處亂放,有些甚至從來沒有聽說過它。這里並不是號召各位讀者去譴責他們,而是建議大家要靈活運用所學的知識,千萬不要認准這個FHS協定只講死道理,不然吃虧的可就是自己了。《Linux就該這么學》一起學習linux, 在Linux系統中,最常見的目錄以及所對應的存放內容如表所示。
Linux系統中常見的目錄名稱以及相應內容
目錄名稱 應放置文件的內容
/boot 開機所需文件—內核、開機菜單以及所需配置文件等
/dev 以文件形式存放任何設備與介面
/etc 配置文件
/home 用戶主目錄
/bin 存放單用戶模式下還可以操作的命令
/lib 開機時用到的函數庫,以及/bin與/sbin下面的命令要調用的函數
/sbin 開機過程中需要的命令
/media 用於掛載設備文件的目錄
/opt 放置第三方的軟體
/root 系統管理員的家目錄
/srv 一些網路服務的數據文件目錄
/tmp 任何人均可使用的「共享」臨時目錄
/proc 虛擬文件系統,例如系統內核、進程、外部設備及網路狀態等
/usr/local 用戶自行安裝的軟體
/usr/sbin Linux系統開機時不會使用到的軟體/命令/腳本
/usr/share 幫助與說明文件,也可放置共享文件
/var 主要存放經常變化的文件,如日誌
/lost+found 當文件系統發生錯誤時,將一些丟失的文件片段存放在這里
❻ linux操作系統的體系結構
看下操作系統原理就懂了,操作系統就是在用戶和硬體之間的一個媒介,因此它有兩個任務,一個是方便用戶操作,一個是管理硬體,所有的操作系統架構都離不開這兩個最初的動機,包括 windows、linux、mac等等。 另外內核主要實現的硬體管理,用戶操作主要通過shell來完成,比如windows上的cmd、explorer.exe,以及linux上的bash shell、kde、gnome。 其實說白了就是一種思想 ——封裝思想,譬如送人一台筆記本,你不用告訴它裡面有什麼CPU、內存,只要告訴他開機按鈕在哪裡就好了。 下面有一張linux體系的結構圖:
❼ Linux系統一般由哪4個部分組成
Linux系統一般有4個主要部分:內核、shell、文件系統和應用程序。內核、shell和文件系統一起形成了基本的操作系統結構,它們使得用戶可以運行程序、管理文件並使用系統。
一、Linux內核
內核是操作系統的核心,具有很多最基本功能,如虛擬內存、多任務、共享庫、需求載入、可執行程序和TCP/IP網路功能。Linux內核的模塊分為以下幾個部分:存儲管理、CPU和進程管理、文件系統、設備管理和驅動、網路通信、系統的初始化和系統調用等。
二、Linuxshell
shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種介面。它接收用戶輸入的命令並把它送入內核去執行,是一個命令解釋器。另外,shell編程語言具有普通編程語言的很多特點,用這種編程語言編寫的shell程序與其他應用程序具有同樣的效果。
三、Linux文件系統
文件系統是文件存放在磁碟等存儲設備上的組織方法。Linux系統能支持多種目前流行的文件系統,如EXT2、EXT3、FAT、FAT32、VFAT和ISO9660。
四、Linux應用程序
標準的Linux系統一般都有一套都有稱為應用程序的程序集,它包括文本編輯器、編程語言、XWindow、辦公套件、Internet工具和資料庫等。
(7)linux架構圖擴展閱讀:
LINUX系統的特點
1、Linux是一款免費的操作系統,用戶可以通過網路或其他途徑免費獲得,並可以任意修改其源代碼。這是其他的操作系統所做不到的。
2、在Linux下通過相應的模擬器運行常見的DOS、Windows的程序。這為用戶從Windows轉到Linux奠定了基礎。
3、Linux可以運行在多種硬體平台上,如具有x86、680x0、SPARC、Alpha等處理器的平台。此外Linux還是一種嵌入式操作系統,可以運行在掌上電腦、機頂盒或游戲機上。