一、文件的操作權限和UID,GID以及進程的UID,GID
1. 文件資源的權限力度:UID/GID
2. 文件的可操作權限
3. 進程的標識: PID, UID, GID, GIDs
二、UID,GID的Name 和ID的映射關系以及Chmod/chown命令
1. Name 跟 ID的映射
2. Chmod和chown命令介紹
3. UID/GID的銜接
三、進程的RealUID和EffectiveUID 以及進程UID的繼承關系
1. 身份的標識: Real UID
2. 權利的標識: Effective UID
3. 身份和權利的關系
4. ROOT 用戶的特權
5. UID的世襲
四、文件的setUID -- 文件的setUID標志以及其作用。
1. 平民身份,皇族特權 需求及解決
2. Linux的文件的setUID的標識
3. chmod設置setUID的方式
4. setUID的安全方式
5. 有RealGID, EffectiveGID, setGID嗎
---------------------------------------------------------
一、文件的操作權限和UID,GID以及進程的UID,GID
1. 文件資源的權限力度:UID/GID
* 文件是一類資源
* 在Linux中,一切皆是文件,Socket, Driver
* 文件資源對不同的Target(用戶)的 不同操作權限的需求
* 如何描述和區分不同的Target? ID -> UID 惟一
* 某些場景,允許多個不同的Target(用戶) 具有一致的操作權限, 用GID(Group ID)。多個用戶合一屬於一個GID,一個用戶合一屬於多個GID
* 文件權限管理: UID(文件的owner),GID, 其他用戶
* 上帝用戶: ROOT, 他的UID = 0; 上帝用戶永遠屬於任何UID
2. 文件的可操作權限
ls -l 或者 ll
d rwx r-x r-x UID GID
d: 是文件夾
rwx: 文件所屬UID1 具有的權限
r-x: 文件所屬GID,但不是所屬UID1,的UID2具有的權限 <=> UID1屬於GID, UID2也屬於GID
r-x: 既不是文件所屬GID, 也不是文件所屬UID1,的 其他 UID3具有的權限。<=> UID3不屬於GID
3. 進程的標識: PID, UID, GID, GIDs
PID: 進程的Unique Identity(惟一標識)。 每次Running的PID可能相同,或者不同,由系統分配
UID: 進程的身份標識。每次運行,即便重啟后默認都相同。 不同的進程允許有相同的UID(用戶身份標識)
GID: 進程的組身份標識。每次運行,即便重啟后默認都相同。不同進程允許有相同的GID(組用戶身份標識)。同一個進程允許屬於多個GID
GIDs: 進程所屬的全部GID
二、UID,GID的Name 和ID的映射關系以及Chmod/chown命令
1. Name 跟 ID的映射
userId: 10064
gids: 3003,1006,1015,1023,1028
不同的系統不同,我們這里討論Android -- android_filesystem_config.h
更多請查看:http://aijiawang-126-com.iteye.com/blog/1046964
上下兩張圖的映射,就是Name 跟ID(UID, GID) 的映射
普通的apk運行的時候
2. Chmod和chown命令介紹
文件的 R/W/X 在系統內部用 3bit表示。 R是最高位,置位為 0x04; W為中間比特,0x02; X為最低比特,置位為0x01
Shell中表示是,置位使用相應的RWX, 為置位使用-
2.1 改變文件面向群體的操作權限是,使用chmod, 可以用數字, 也可用助記符
(a:all, u: owner user, g: group, +:添加權限, -: 移除權限)
舉例:
2.2 chown用於修改文件的UID 和 GID
* Shell命令中常用Name的方式修改,而不是ID方式
* 一般格式: chown newUID : newGID FileName
3. UID/GID的銜接
* 文件基於UID /GID 划分面向群體, 不同的群體 定義不同的權限
* 用戶的行為映射為進程的運行
* 進程用UID/GID來標識自己的身份
* 進程的UID和GID和文件的UID/GID 完美銜接
* reboot 這個api 在入口 調用時,可以check UID是不是root,如果不是則reject
三、進程的RealUID和EffectiveUID 以及進程UID的繼承關系
1. 身份的標識: Real UID
* 進程的UID只是泛稱, 其實有很多種UID
* 進程的 Real UID 是進程身份的標識, 用來說明Who am I, 沒有實權
* 進程能做什么 不是有 RealUID來決定的
2. 權利的標識: Effective UID
* 有身份無權利是不行的, 有權利才能為所欲為
* Effective UID 是進程的權利的標識, 標識了該進程的“權利”
* Linux的授權 是 靠 Effective UID 來識別的
* 有權利就能做一切
* 之前說明的,文件、資源以及特權API操作權限 是 通過 Effective UID來識別的
3. 身份和權利的關系
* 默認情況下 Real UID == Effective UID, 所以使用ps命令輸出的 就是 Effective UID
* 我們也可以顯示完整的 Effective UID 和Real UID
4. ROOT 用戶的特權
* Root 用戶, 均是指 Effective UID == ROOT的進程
* 不受任何限制,可以為所欲為
* ROOT進程可以調用setUID 修改自己的Real UID,它也可以把自己的Effective UID改為普通的UID
5. UID的世襲
* 在Linux世界里,為了安全考慮,UID世襲規則: 身份可以世襲,權利不能世襲
* 子進程的 Real UID = Effective UID, 繼承 父進程的Real UID
若父進程的Effective UID 與 Real UID 不一樣,則不具有父進程的權利
四、文件的setUID -- 文件的setUID標志以及其作用。
1. 平民身份,皇族特權(ROOT權限) 需求及解決
1.1 需求:
* Linux的passwd是一個可執行程序, 用於修改用戶的密碼
* passwd需要修改多用戶的賬號文件(該文件僅能ROOT用戶可以讀寫)
* 但是 普通用戶 也要修改自己的密碼
* passwd雖然 是平民身份(由普通用戶啟動),但是卻需要皇族的權限 ---- 身份 和 權利不同
1.2 解決:
* 臨時替身進程的Effective UID, 而維持身份不變(Real UID), 讓他能夠利用特權,而又不傳給子進程
2. Linux的文件的setUID的標志
文件的Owner UID設置為特權用戶(如ROOT)
文件面向 Owner UID的群體和操作權限 增加額外的setUID標志
Linux系統保證,任何用戶(進程)執行該文件時(Fork一個新的進程來加載該可執行文件),子進程的Real UID仍然繼承起父進程的RealUID, Effective UID 卻被提升 到特權UID
setUID的前提是可執行文件,其他文件不能setUID
rws,用s替代了x;而且s包含了x
3. chmod設置setUID的方式
chmod 4775 test.txt 4就是特殊的設置方法
chmod 0775 test.txt 0可以清楚該標志
chmod u+s test.txt 也具有相同的效果
chmod u-s test.txt
4. setUID的安全問題
setUID的進程的EUID提升了, RUID沒有提升
但是如果該進程為自己正身(將自己的RUID改成了和EUID一樣的)了, 它的所有子進程都具有了該特殊權限
passwd沒有正身
Android將自己的su 正身了
5. 有RealGID, EffectiveGID, setGID嗎
答案是存在