彻底了解 suid, sgid ,sticky权限

sticky: 粘性的, 如 : sticky tape: 粘胶带
/tmp, /var/tmp: 位 sticky: 表示: 第一, 任何用户都可以在该目录下创建文件(编辑自己的文件),第二, 但是当前用户不能删除其它用户的文件。


其中的s表示: super, 超的, "特权的"...

参考: http://www.wangchao.net.cn/bbsdetail_1473424.html

Linux中/tmp文件夹的访问权限问题?

我用ls -l命令查看了/tmp的访问权限,竟然是rwxrwxrwt
我很不明白,最后那个t是从哪里来的?
x是可执行,r是可读,w是可写…… t是什么意思呢?

tmp的权限为[chmod 777 /tmp -R]

也就是rwxrwxrwx了,结果就发现…… root登录,用startx或init5进图形界面时,就会报一大堆错误…… 无法正常进入…… 这是什么原因呢?我要怎么修改才能正常进入图形界面呢?

首先,linux下的tmp目录是一个系统产生临时文件的存放目录,其权限是drwxrwxrwt(777),就是对每个用户都可以对他进行读写操作。
第一位d是指文件夹类型,
2-4位为文件所属者的读(read),写(write),执行(execute)权限。
5-7位为文件所属组的读(read),写(write),执行(execute)权限。
8-10位为其他用户的读(read),写(write),粘贴位(Sticky)
其中t的权限比较特殊,特指tmp和 /var/tmp目录供所有用户暂时存取文件,亦
即每位用户皆拥有完整的权限进入该目录, 去浏览、删除和移动文件。为特殊权限。

其实文件与目录设置不止这些,还有所谓的特殊权限。由于特殊权限会拥有一些“特权”,因而用户若无特殊需求,不应该启用这些权限,避免安全方面出现严重漏洞,造成黑客入侵,甚至摧毁系统!!! s或S(SUID,Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。请注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。 s或S(SGID,Set GID):设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。 T或T(Sticky):/tmp和 /var/tmp目录供所有用户暂时存取文件,亦即每位用户皆拥有完整的权限进入该目录,去浏览、删除和移动文件。 因为SUID、SGID、Sticky占用x的位置来表示,所以在表示上会有大小写之分。加入同时开启执行权限和SUID、SGID、Sticky,则权限表示字符是小写的: -rwsr-sr-t 1 root root 4096 6月 23 08:17 conf 如果关闭执行权限,则表示字符会变成大写: -rwSr-Sr-T 1 root root 4096 6月 23 08:17 conf

可以看到conkyrc.sample文件的权限已经修改为rwxrwxrwx
如果要加上特殊权限,就必须使用4位数字才能表示。特殊权限的对应数值为:
s或 S (SUID):对应数值4。
s或 S (SGID):对应数值2。
t或 T :对应数值1。

用同样的方法修改文件权限就可以了
例如:
[root@localhost ~]# chmod 7600 conkyrc.sample

知道了吧!就是chmod的时候后面多加一位。
收起

参考资料: http://www.wangchao.net.cn/bbsdetail_1473424.html

需要注意的是, 当使用chmod命令来 , 设置特殊权限的 占位符 是在 chmod 的 第一位, 而不是最后一位!! 如 chmod 7660 和 chmod 7447等, 它的特殊权限始终是: S S T 或 s s t (可执行文件为小写, 非可执行文件为 S) , 但是如果要去掉所有的特权, 就是将第一个数字设置为0: chmod 0755 foo.sh 是看第一个 数字. 但是 , 在显示特殊权限的时候, 它是"借用 了" 最后一位, 即"本来是x" 的位置, 那么x如何显示呢 ? 就是看特殊权限 符号的大小写了, 如果特殊权限符号是 大写, 表示不是x的, 如果是小写, 则表示 是x的. 即通过大小写来判断/表示 x的值

chown 后面的参数是 指对象的 新的 所有者 或 新的 所有组. 所有者直接写, 所有组用 冒号表示:


查看机器上的用户和组的信息? 就只是两个文件: 一个是passwd文件, 一个是 group文件

  1. 查看用户的信息是: cat /etc/passwd
  2. chakan 组的信息是 : cat /etc/group
  3. 命令是: groups, whoami
  4. 搜索是: grep等filter命令...
[root@localhost ~]# cat /etc/group
root:x:0:
bin:x:1:      //  groupName : passwd: gid: members-in-this-group
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
....

凡是有 "特权, setuid, setgid , sticky" 的文件, 系统会用 "背景高亮" 的方式进行显示/ 提醒/warning/注意/notice.

而且 不同 的 :特权" 的文件, 系统会用不同的 背景 高亮 / 反色 来表示

注意看, 当给文件 加上 +x可执行权限后, 文件的"特权" 符号就用小写来表示:


要递归地修改目录中的 mode和own, 需要使用 -R, --recursive 主要是大写的R

递归的选项有两种, 一种是大写的-R, 一种是小写的-r. 大多数时侯使用的是小写的, -R 较少, 但是在 cp, mv chmod等中就用到了大写的-R .

:::::::: 重点参考: http://www.cnblogs.com/baiyw/p/3502514.html , 关于uid和ugid的设置 ::::::::

什么叫 setuid, setgid?

  1. 是指: set uid/gid upon execution, 因此, setuid, setgid是 针对 可执行 文件而言的. 对于非 可执行 文件/目录, 设置 uid和 ugid 意义不大?? 不是没有意义, 是意义不大???
    [exe'cution [/eks2' kju:s2n]. 因为有tion, 所以重音在cu那里. 但是 exe [eks2]那里有次重音. 英语中的重音(次重音)叫紧音, 弱读叫松音. 所以 在 一紧一松中感受到语音的顿挫.//]
  2. 注意在 mode中的owner是用 u 来表示的, 不用o来表示 owner, 因为 o用来表示other 了: 如: chmod u+x foo.sh
  3. 设置可执行命令的 超级权限. 是用 s来表示的: 如: chmod u+s foo.sh

要特别注意区分: 当一个二进制可执行文件被设置了setuid属性之后, 在所创建的进程内部,有权限执行此文件(...这个文件是命令文件... )的用户 (当然是针对 非root用户而言的! 将会获得这个可执行文件的owner的权限(通常是root)

即: 命令文件的所有者和组, 跟 "有权执行这个命令的进程 /用户" : 之间的区别!!!!

  1. 用 ll (ls -l)命令 在第3, 第4个字段, 看到的是命令/文件的 所有者和组
  2. 最重要的是, 要看最前面第一个字段, 要把第一个字段和后面的所有者/组 的权限相结合起来看.
  3. 要查看其他非root用户(或该用户所创建的进程内部), 是否有权执行这个文件命令, 就是看第一个字段的最后一个(执行权限位 -x的值). 如果为x, 则该用户可以执行这个命令, 如果为0 -, 则无权执行这个命令:
  4. 对于非可执行命令文件, 如 /etc/passwd, 的 所有者和组, 只是说, 这个文件属于哪一个用户/组 , 是说谁可以编辑/修改这个文件, 跟其他用户是否可以执行是没有多大关系的.

ex-开头时, 什么时候读eks, igz, iks?
方法是: 首先看重音, 然后看元音/辅音字母.

ex-的读音规则,供参考
1. 以ex开头的词,无论ex后跟着什么字母,只要重音(包括次重音)落在第一个音节上,则ex的发音即为/eks/。例:exercise,expert(专家,能手),extra(额外的),exhibition

2. 以ex开头的词,若ex后接一个元音字母,且重音不落在第一个音节上,则ex的发音为/igz/。例如:exact,exam,example,exist。  

3. 以ex开头的词,若ex后接一个辅音字母,且重音不落在第一个音节上,则ex读/iks/。例:excuse,expect,exchange,except,experience,experiment,explain,expose,express,expression,expensive,extend,extraordinary

4. 读多了,这些发音规则就没有用了

linux程序后门的 病毒?

是指, 它写一个sh, 然后将这个sh设置为 7755的mode,然后上传到你的机器/网站, 好, 如果此时你去执行这个sh, 那么它就可以通过这个sh暂时获得root权限, 然后作一些"违法"的事情,包括留后门只是一个小case.

在linux中, 要提升用户的执行权限,有几种方法:

  1. 一是切换root用户, su -
  2. 二是 使用sudo, 让root用户给普通用户授权
  3. 三是, 使用 "特权"位的命令, 给某个命令设置为 setuid(或 setgid), 让执行这个命令的普通用户, 暂时获得root权限, 比如: passwd命令 . 普通用户使用 passwd命令, 修改用户密码的时候 , 实际上是修改了 /etc/passwd这个文件, 但是 /etc/passwd这个文件是root所有的, 普通用户没有权限去修改它, 因此, 这里passwd设置了 u+s. 使得普通用户在执行passwd命令的时候, 暂时获得了root权限,从而可以去修改/etc/passwd这个文件.

不必去关心, 设置, shutter的 透明背景, 因为, 你在 image viewer中看到 的透明 背景, 在图片插入网页中时, 会自动被 网页的默认颜色 所取代! 这个本身也是透明色的优点!!!

linux的简单编程

#include<stdio.h>
#include<unistd.h>

int main(void){
    FILE *file;

    fprintf(stdout, "real-uid      %d
", getuid());
    fprintf(stdout, "effective-uid %d
", geteuid());

    if((file = fopen("root_file", "w")) == NULL){
        perror("open root_file failed");    
    }   
    else{
        fprintf(stdout, "open root_file success
");    
        fclose(file);
    }   

    if((file = fopen("moon_file", "w")) == NULL){
        perror("open moon_file failed");    
    }   
    else{
        fprintf(stdout, "open moon_file success
");    
        fclose(file);
    }   

    return 0;
}


关于uid euid seuid, 参考: http://www.xuebuyuan.com/1359766.html

  1. 所谓的ruid(real uid),euid(effective uid) suid(set uid) 是针对 : 一个可执行 文件的进程而言的. 而且是设置了u+s "特权"位的命令文件进程而言的
    因为如果是 non-executable 文件, 或者即使是 executable文件, 但是没有设置 super位的话, 也是没有意义的, 因为这几种id总是一样的: ruid=euid=suid的
  2. 对于 非 可执行(unenforceable(不可强制执行的), nonexecutable(non-executable) 不可执行的 , 对于否定形式, 除了dis, un, ir, im- 等, 没有这些的话, 就用 non-) 文件, 这些概念是没有意义的.
  3. 启动, 执行 这个 命令程序的 用户的 id就是这个 进程的 ruid.
  4. 因为命令文件设置了 u+s, 所以执行命令后的进程, 用户将 "暂时" 获得 进程文件所有者(owner)的权限, 这个 owner的id就是 euid.即: 实际生效的 权限...

umask 是什么 ?

  1. umask: user mask, 是“用户文件创建模式掩码”的缩写,是/usr/bin/umask下的一个命令!

  2. 是一个四位的八进制数值。用来确定一个新创建文件的权限。如: 0022

  3. 每个进程都从父进程那里继承了自己的umask。一般该命令会在.bashrc,.profile,.cshrc或是/etc/profile及/etc/bashrc中。

  4. 文件的权限不只是三位, 而是 四位: 最前面还有一位 : 特权位 : super privillege: srwx: .默认的 :创建文件的模式是 0666, 即文件对所有人 有读写的权限, 加上 umask: 0666 + 0022(掩码)= 0644 . (对所有者有读写权限, 对组用户和其他用户只有 读 权限)


### linux的粘滞位? 粘滞位是一个历史产物, 现在的linux系统基本上很少用到它了. 粘滞位的主要应用是在 用于目录, 而且主要是 /tmp 和 /var/tmp两个目录.

是为了解决这样的问题: 对于一个目录, 主要是指: /tmp, 和 /var/tmp, 所有的用户对她都有 读写执行的权限. 这样一来, 一个用户A, 就可以编辑/修改/删除其中的任意/任何文件 ,比如: A 可以修改/甚至 删除 用户B 在这里/tmp放的文件.

为了让A 只能删除/tmp中, 属于 A 的文件, 而不能删除属于B 的文件; 同样, 让B 只能删除/tmp中属于B 的文件, 而不能修改/删除 属于A 的文件.

为了实现这样的目的: 引入了 "粘滞位:" 的概念!

Linux中的粘滞位  Sticky 位是一个访问权限标志位,可以用来标示 "文件"  和  "路径"

[历史:]
粘滞位是在1974年Unix的第5版中引入的,用来设置可执行文件。当可执行文件设置粘滞位之后,它能够指示操作系统在程序退出后,保留程序的代码段到swap空间。当程序再次执行时,内核只需将程序从swap搬到内存即可,这能够加速程序的执行。所以,频繁使用的程序比如编辑器能够更快的打开。目前,这种应用只是适用于HP-UX, NetBSD和UnixWare,Solaris在2005年放弃了这种应用,linux没有版本支持过这种行为。

[当今使用:]
当今,粘滞位最常用是应用于路径。当路径被设置粘滞位后,路径下的文件只有文件的owner, 或者root 才能够重命名、删除文件。如果没有粘滞位,任何用户,不管是不是owner, 只要有路径的 写 /执行权限   就可以重命名、删除文件。典型的应用就是/tmp路径,粘滞位可以阻止一般用户删除/重命名其他用户的文件。这种特性首次引入是在1986年4.3BSD, 今天在现在的Unix系统中都可以找到这个特性。另外,Solaris定义了独有的行为:当粘滞位设置到非执行文件时,当访问这种文件时,内核将不会缓存。这常用于设置swap文件,用来阻止访问这些文件时冲刷掉系统缓存中更重要的数据。

可以看到, /tmp中的文件, 只有用户自己才能编辑, 其他任何用户,包括组用户, 和other用户都没有任何权限!!!


代码编程解决

flw@Sleeper:~$ whoami</p>
<p>flw</p>
<p>flw@Sleeper:~$ cat tuid.c</p>
<p># include <stdio.h></p>
<p># include <sys/types.h></p>
<p># include <pwd.h></p>
<p>int main( void )</p>
<p>{</p>
<p>    struct passwd *pwd;</p>
<p>    pwd = getpwuid( geteuid() );</p>
<p>    printf( "effective UID: [%s]/n", pwd->pw_name );</p>
<p>    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );</p>
<p>    printf( "/nset EUID to `flw'../n" );</p>
<p>    pwd = getpwnam( "flw" );</p>
<p>    seteuid(pwd->pw_uid);</p>
<p>    pwd = getpwuid( geteuid() );</p>
<p>    printf( "effective UID: [%s]/n", pwd->pw_name );</p>
<p>    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );</p>
<p>    printf( "/nset EUID to `root'../n" );</p>
<p>    seteuid(0);</p>
<p>    pwd = getpwuid( geteuid() );</p>
<p>    printf( "effective UID: [%s]/n", pwd->pw_name );</p>
<p>    system( "touch /tmp/foo.txt; ls -l /tmp/foo.txt; rm -rf /tmp/foo.txt" );</p>
<p>    return 0;</p>
<p>}</p>
<p>flw@Sleeper:~$ su root -c "cc -o tuid tuid.c; chmod +s tuid; ls -al tuid"</p>
<p>Password:</p>
<p>-rwsr-sr-x 1 root root 7902 2006-08-31 13:55 tuid</p>
<p>flw@Sleeper:~$ ./tuid</p>
<p>effective UID: [root]</p>
<p>-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt</p>
<p>set EUID to `flw'..</p>
<p>effective UID: [flw]</p>
<p>-rw-r--r-- 1 flw root 0 2006-08-31 13:55 /tmp/foo.txt</p>
<p>set EUID to `root'..</p>
<p>effective UID: [root]</p>
<p>-rw-r--r-- 1 root root 0 2006-08-31 13:55 /tmp/foo.txt</p>
<p>flw@Sleeper:~$<br />

原文地址:https://www.cnblogs.com/bkylee/p/7655560.html