一、用户和组
1、用户(UID):
1>是对现实的一种抽象, 系统中所有用户都存储在/etc/passwd
2>分类
管理员[0]
系统用户 [1-499]: 专门用于运行服务的用户,不需要登录系统
一般用户 [500-60000]: 可以登录系统获取资源
3>常用命令:useradd,userdel,usermod,passwd, chsh, chfn, finger,id,chage
2、组(GID):
1>是一类用户的集合, 系统中所有组都存储在/etc/group,一个用户可以属于多个组,一个组中也可以包含多个用户(m:n)
2>用户组类别
私有组:创建用户时,如果没有为其指定所属的组,系统会自动为其创建一个与用户名同名的组;
基本组:用户的默认组
附加组:默认组以外的其他组
3>常用命令: groupadd,groupdel,groupmod, gpasswd
二、linux系统中的权限表示(ls、chmod)
1、其中根据所有者、所属组和其它分为三组权限,每组详解如下:
第一位:r(read),可读取
第二位:w(write),可写入
第三位:
x(execute),可执行
s(setid),[本身没有执行权限,则显示为S]运行某程序时,相应进程的属主是程序文件自身的属主(组),而不是调用者
t(sticky),常用于设置目录,在该目录中每个人都可以创建文件,删除自己的文件,但不能删除别人创建的文件;
注:st对应特殊权限位[即0220中的第一个八进程位]
2、rwx权限针对文件和目录的区别如下:
|
文件 |
目录 |
Read |
可以使用类似cat等命令查看文件内容 |
可以对此目录执行ls以列出内部的所有文件 |
Write |
可以编辑或者删除此文件 |
可以在此目录创建文件 |
eXecute |
可以在命令提示符下当做命令提交给内核运行 |
[默认有可执行权限]可以使用cd切换此目录,也可以使用ls -l查看内部文件的详细信息 |
3、常用命令:chown, chgrp, chmod,umask.
三、用户、进程、文件和权限
在Unix进程中涉及多种用户ID和用户组ID。用户ID是个整型数,为了说明方便一般直接使用用户名来代表不同的UID。
[ unix类系统中一般有两种标识,一种是对用户友好的标识,一般是以字符串的形式表示;另一种是对机器友好的标识,一般以整数的形式表示,两者有一定的对应关系。]
ID种类 |
作用 |
RUID(实际用户ID) |
用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的RUID |
EUID(有效用户ID) |
用于系统决定用户对系统资源的访问权限,通常情况下等于RUID |
SUID(设置用户ID) |
用于对外权限的开放。跟RUID及EUID是用一个用户绑定不同,它是跟文件而不是跟用户绑定 |
下面就拿passwd这个程序来分析,linux系统的密码都存在了/etc/shadow这个文件里。
查看/etc/shadow文件的属性如下:
从上可以看出/etc/shadow文件是一个属于root用户及shadow组的文件,并且只有EUID为root的用户具有读的权限(注意此处用的是EUID,不是其它的ID)。
当你在steve用户(EUID此时也为steve)的shell下试图用vim打开这个文件时会提示权限不允许。至于连root用户也只有读的权限我猜是为了不鼓励root用户
使用vim类的编辑器去直接修改它,而要采用passwd命令来修改这个文件。用过UNIX系统的人都知道,任何一个用户都可以使用passwd这个命令来得新设定
自己的密码。
但从上面已经知道,非root用记是无法读这个文件的,那么普通用户是如何做到修改这个文件的呢?我们知道passwd这个命令实际执行的程序是/usr/bin/passwd,
查看这个文件属性如下:
对应文件存取标志的s位就是通常说的SUID位,另外可以看到所有用户都有执行的这个程序权力。当steve用户执行passwd命令的时候,Shell会fork出一个子进程,
此时进程的EUID还是steve,然后exec程序/usr/bin/passwd。exec会根据/usr/bin/passwd的SUID位会把进程的EUID设成root, 此时这个进程都获得了root权限,
得到了读写/etc/shadow文件的权限, 从而steve用户可完成密码的修改。 exec退出后会恢复steve用户的EUID为steve.这样就不会使steve用户一直拥有root权限。
我们可以测试一下,用root用户把/usr/bin/passwd的SUID位去掉,然后steve用户用命令passwd去更新密码会提示如下错误:
passwd: Authenticationtoken manipulation error。
这就是因为/usr/bin/passwd程序的SUID去掉后,steve用户虽然可以执行该程序,但因为/usr/bin/passwd/的SUID没有设置,这样exec后进程的EUID仍为steve的原因。
四、理清linux中各种用户ID关系
看到上面文件根据用户划分权限,用户又分真实用户,有效用户,对于我这种头脑简单的人来说早以摸不到头脑了~下面就来一起疏理下吧。
Unix中一切皆文件,文件根据权限位判定用户是否具有读取和执行权限。用户读取文件的时候需要借助程序(不借助程序再NB的你也没办法读吧???),
程序代表用户来读取文件,即:用户A —> 进程(代理A) —> 文件。由于这个比较复杂,我们先分两步分析,最后总结在一起。
为了更清楚的说明这个过程,引用一张大神lvyilong316的一幅图片,谢谢:)
###当进程代表用户A打开文件进行读取时,内核会进行如下权限测试:
0. 若进程的有效用户ID是0(超级用户),则允许访问。
1. 若进程的有效用户ID等于文件的所有者ID,那么进行文件所有者访问权限的测试(与open的参数对比),对应图中的1。
2. 若进程的有效组ID或进程的附加组ID之一等于文件的组ID,则进行文件所属组的权限测试,对应图中的2.
3. 测试文件的Other访问权限。
注:如果第1步中进程有效用户ID等于文件所有者ID,但相应权限的测试不符合,则不会进入第2步的组测试。对于2,3步也同理。
流程图如下:
可以看出来上面只是“进程(代理A) —> 文件”这一部分,现在再来看“用户A —> 进程(代理A)”这一部分:
###用户执行进程的过程:
1、 每个用户登录后都对应一个uid,一个gid,一组附加组id;
2、 每个程序文件和普通文件一样拥有文件所有者id,文件所有组id,并具有相应rwx权限;
3、 用户打开文件时进行流程图描述流程的x权限测试(只不过此时不是有效ID而是用户ID);
4、 当a.用户是超级用户或b.用户id和文件所有者id相同且文件所有者具有x权限或c.用户的gid和文件的所属组id相同且文件所属组具有x权限或d.文件的other具有x权限,则用户可执行此程序,产生进程(上图绿色部分);
5、 用户的uid变成进程的实际用户id,用户的gid变成进程的实际组id,用户的附加组id变成进程的附加组id;
6、 当程序文件没有设置”设置用户id位(SUID)时进程的有效用户id等于进程的实际用户id;
7、 当程序文件设置了”设置用户id位(SUID)”时,进程的有效用户id保存到进程“保存的设置用户id”,之后进程的有效用户id变为程序文件的所有者id;
将两部分结合起来可以直接使用大神lvyilong316的一幅图片,再次向大神致敬:)
五、sudo简介
1、系统安全的一个重要的原则就是权限越小越好,root密码知道的人越少越好。有些情况下必须使用root权限,但是又不想让别人知道root密码,该怎么办呢?
–>sudo来帮你:)Sudo是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或
其他特许用户才能完成的任务。sudo有以下特点:
1> sudo能够限制指定用户在指定主机上运行某些命令;
2>sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机或者日志服务器;
3>sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机,它默认的存放位置是/etc/sudoers;
4>sudo使用时间戳文件来完成类似“检票”的系统。当用户执行sudo并且输入密码后,用户获得了一张默认存活期为5分钟的“入场券”(默认值可以在编译的时候改变)。超时以后,用户必须重新输入密码;
5>给用户尽可能少的权限但仍允许完成他们的工作;
2、sudo命令
sudo程序本身就是一个设置了SUID位的二进制文件。它的所有者是root,所以每个用户都可以像root那样执行该程序。设置了SUID的程序在运行时
可以给使用者以所有者的EUID。这也是为什么设置了SUID的程序必须小心编写。但是设置一个命令文件的SUID和用sudo来运行它是不同的概念,它们起着不同的作用。
sudo的配置都记录在/etc/sudoers文件中,我们下面将会详细说明。配置文件指明哪些用户可以执行哪些命令。要使用sudo,用户 必须提供一个指定用户名和密码。
注意:sudo需要的不是目标用户的密码,而是执行sudo的用户的密码。如果不在sudoers中的用户通过sudo执 行命令,sudo会向管理员报告这一事件。用户可以
通过sudo -v来查看自己是否是在sudoers 之中。如果是,它还可以更新你的“入场券”上的时间;如果不是,它会提示你,但不会通知管理员。
常用的选项:
–l,列出当前用户可以执行的命令。只有在sudoers里的用户才能使用该选项。
-u username,以指定用户的身份执行命令。后面的用户是除root以外的,可以是用户名,也可以是uid。
-k,清除“入场卷”上的时间,下次再使用sudo时要再输入密码。
配置文件:
配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因:一是它能够防止两个用户同时修改它;
二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。
foobarALL=(ALL)ALL /*像root一样拥有至高权限*/
foobarlocalhost=/sbin/ifconfig,/bin/ls /*只能像root那样使用ls和ifconfig*/
ALL:指网络中的主机。我们后面把它改成了主机名,它指明foobar可以在此主机上执行后面的命令。
ALL:指目标用户。是以谁的身份去执行命令。
ALL:是指命令名。
例如,我们想让foobar用户在linux主机上以jimmy或rene的身份执行kill命令,这样编写配置文件:foobarlinux=(jimmy,rene)/bin/kill