Fork me on GitHub

linux概念之用户,组及权限


Linux 是一个多用户、多任务的操作系统;我们应该了解单用户多任务和多用户多任务的概念

单用户多任务
一个beinan用户,为了完成工作,执行了几个任务;当然beinan这个用户,其它的人还能以远程登录过来,也能做其它的工作。
多用户多任务
比如LinuxSir.Org 服务器,上面有FTP 用户、系统管理员、web 用户、常规普通用户等,在同一时刻,可能有的弟兄正在访问论坛;有的可能在上传软件包管理子站,比如luma 或Yuking 兄在管理他们的主页系统和FTP ;在与此同时,可能还会有系统管理员在维护系统;浏览主页的用的是nobody用户,大家都用同一个,而上传软件包用的是FTP用户;管理员的对系统的维护或查看,可能用的是普通帐号或超级权限root帐号;不同用户所具有的权限也不同,要完成不同的任务得需要不同的用户,也可以说不同的用户,可能完成的工作也不一样;
值得注意的是:多用户多任务并不是大家同时挤到一起接在一台机器的键盘和显示器前来操作机器,多用户可能通过远程登录来进行,比如对服务器的远程控制,只要有用户权限任何人都是可以上去操作或访问的;
linux下用户的角色分类
用户在系统中是分角色的,在Linux系统中,由于角色不同,权限和所完成的任务也不同;值得注意的是用户的角色是通过UID和GID识别的,特别是UID;在系统管理中,系统管理员一定要坚守UID唯一的特性;UID是linux下确认用户权限的标志,用户的角色和权限都是通过UID来实现的,例如将普通用户的UID设置为0后,这个普通用户就具有了root用户的权限,这是极度危险的操作。因此要尽量保持用户UID的唯一性。
在linux下用户是根据角色定义的,具体分为三种角色:
超级用户:是真实用户,拥有对系统的最高管理权限,默认是root用户。
普通用户:是真实用户,只能对自己家目录下的文件进行访问和修改,具有登录系统的权限,但权限有限,例如上面提到的www用户、ftp用户等。这类用户都是系统管理员自行添加的;
虚拟用户:也叫“伪”用户,与真实用户区分开来,这类用户最大的特点是不能登录系统,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。这类用户都系统自身拥有的,而非后来添加的,当然我们也可以添加虚拟用户。例如系统默认的bin、adm、nobody用户等,一般运行的web服务,默认就是使用的nobody用户,但是nobody用户是不能登录系统的。

多用户系统从系统管理角度来说更为方便。从安全角度来说,多用户管理的系统更为安全,比如beinan用户下的某个文件不想让其它用户看到,只是设置一下文件的权限,只有beinan一个用户可读可写可编辑就行了,这样一来只有beinan一个用户可以对其私有文件进行操作,Linux 在多用户下表现最佳,Linux能很好的保护每个用户的安全,重要的是要有安全意识
用户
在Linux系统中还有一些用户是用来完成特定任务的,比如nobody和ftp等,我们访问LinuxSir.Org 的网页程序,就是nobody用户;我们匿名访问ftp 时,会用到用户ftp或nobody
用户组
用户组(group)就是具有相同特征的用户(user)的集合体;比如有时我们要让多个用户具有相同的权限,比如查看、修改某一文件或执行某个命令,这时我们需要用户组,我们把用户都定义到同一用户组,我们通过修改文件或目录的权限,让用户组具有一定的操作权限,这样用户组下的用户对该文件或目录都具有相同的权限,这是我们通过定义组和修改文件的权限来实现的;
举例:我们为了让一些用户有权限查看某一文档,比如是一个时间表,而编写时间表的人要具有读写执行的权限,我们想让一些用户知道这个时间表的内容,而不让他们修改,所以我们可以把这些用户都划到一个组,然后来修改这个文件的权限,让用户组可读,这样用户组下面的每个用户都是可读的;
将用户分组是Linux系统中对用户进行管理及控制访问权限的一种手段,通过定义用户组,在很大程度上简化了管理工作。

用户和用户组的对应关系是:一对一、多对一、一对多或多对多;
一对一:某个用户可以是某个组的唯一成员;
多对一:多个用户可以是某个唯一组的成员,不归属其它用户组;比如beinan和linuxsir两个用户只归属于beinan用户组;
一对多:某个用户可以是多个用户组的成员;比如beinan可以是root组成员,也可以是linuxsir用户组成员,还可以是adm用户组成员;
多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组;其实多对多的关系是前面三条的扩展;理解了上面的三条,这条也能理解;

id
id renyahong
finger
finger renyahong
groups    查看当前用户所属组的其它成员
groups renyahong    查看此用户所在的组

主组与辅组
groupadd sambauser
useradd -G sambauser lizongbin
这时lizongbin用户 主组为yanfazhongxin 附属组为sambauser
-bash-3.2$ id
uid=500(lizongbin) gid=502(yanfazhongxin) groups=502(yanfazhongxin),508(sambauser)
-bash-3.2$ newgrp sambauser    newgrp - log in to a new group    切换属组的,如果加-,则环境变量一块变过来,与su -一样
bash-3.2$ id
uid=500(lizongbin) gid=508(sambauser) groups=502(yanfazhongxin),508(sambauser)
切换前后,分别创建文件,组名是不一样的


本文总结了Linux添加或者删除用户和用户组时常用的一些命令和参数,还有文件与目录
1、建用户:
adduser phpq                           //新建phpq用户
passwd phpq                            //给phpq用户设置密码
2、建工作组
groupadd test                          //新建test工作组
3、新建用户同时增加工作组

useradd –D不加任何参数时,显示/etc/default/useradd文件的当前设置
useradd -g test phpq                   //新建phpq用户并增加到test工作组
注::-g 所属组 -d 家目录 -s 所用的SHELL
4、给已有的用户增加工作组
usermod -G groupname username
或者:gpasswd -a user group

添加一个用户mylinux,指定所属的主用户组为fanslinux,附加用户组为linuxfans,同时指定用户的默认主目录为/opt/mylinux
[root@localhost ~]# useradd -g fanslinux -G linuxfans -d /opt/mylinux mylinux
添加一个用户test_user,指定UID为686,默认的shell为/bin/csh,让其归属为用户组linuxfans和fanslinux,同时添加对此用户的描述,
[root@localhost ~]# useradd  -u 686 -s /bin/csh  -G linuxfans,fanslinux  -c "This is test user" test_user
[root@localhost ~]# chmod u=rwx,g+r,o+r install.log
5、从组中删除用户
编辑/etc/group 找到GROUP1那一行,删除 A
或者用命令
gpasswd -d A GROUP
6、临时关闭:在/etc/shadow文件中属于该用户的行的第二个字段(密码)前面加上*就可以了。想恢复该用户,去掉*即可。
或者使用如下命令关闭用户账号:
passwd peter –l
重新释放:
passwd peter –u
7、永久性删除用户账号
userdel peter
groupdel peter
usermod –G peter peter   (强制删除该用户的主目录和主目录下的所有文件和子目录)
8、显示用户信息
finger  user      注:查看用户信息工具
id user
cat /etc/passwd
9
su
sudo
visudo

/etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;
[root@CentOS5 file_user]# ls -la /etc/skel/
/etc/skel目录下的文件,一般是我们用useradd 和adduser 命令添加用户(user)时,系统自动复制到新添加用户(user)的家目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的家目录,然后把/etc/skel 下的文件复制到用户的家目录下,然后要用chown 来改变新用户家目录的属主;
/etc/login.defs 文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的;
/etc/default/useradd 文件是通过useradd 添加用户时的规则文件;

下面是/etc/shadow文件内容的格式:
用户名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:保留字段
下面是每个字段的详细含义:
用户名:与/etc/passwd文件中的用户名有相同的含义。
加密口令:存放的是加密后的用户口令字串,如果此字段是“*”、“!”、“x”等字符,则对应的用户不能登录系统。
最后一次修改时间:表示从某个时间起,到用户最近一次修改口令的间隔天数。可以通过passwd 来修改用户的密码,然后查看/etc/shadow中此字段的变化。
最小时间间隔:表示两次修改密码之间的最小时间间隔。
最大时间间隔:表示两次修改密码之间的最大时间间隔,这个设置能增强管理员管理用户的时效性。
警告时间:表示从系统开始警告用户到密码正式失效之间的天数。
不活动时间:此字段表示用户口令作废多少天后,系统会禁用此用户,也就是说系统不再让此用户登录,也不会提示用户过期,是完全禁用。
失效时间:表示该用户的帐号生存期,超过这个设定时间,帐号失效,用户就无法登录系统了。如果这个字段的值为空,帐号永久可用。
保留字段:linux的保留字段,目前为空,以备linux日后发展之用。

下面是/etc/group每个字段的含义:
组名:是用户组的名称,由字母或数字构成。与/etc/passwd中的用户名一样,组名不能重复。
口令:存放的是用户组加密后的口令字串,密码默认设置在/etc/gshadow文件中,而在这里用“x”代替,linux系统下默认的用户组都没有口令,可以通过gpasswd来给用户组添加密码。
组标识号:就是GID,与/etc/passwd中的组标识号对应。
组内用户列表: 显示属于这个组的所有用户,多个用户之间用逗号分隔。

由于用户(user)和用户组(group)是和文件及目录权限联系在一起的,所以文件及目录权限的操作也会来给大家介绍;

所谓的文件权限,是指对文件的访问权限,包括对文件的读、写、删除、执行等,在linux下,每个用户都具有不同的权限,普通用户只能在自己的主目录下进行写操作,而在主目录之外,普通用户只能进行查找、读取操作,如何处理好文件权限和用户之间的关系。

文件权限的机制是Linux系统中的一大特色,有六大权限

除了我们现在所熟知的rwx权限外,还有三个比较特殊的权限,分别为:setuid、setgid和stick bit(粘滞位),文件系统权限,chattr,acl,sudo

基本的rwx权限

一 三个特殊权限

对目录设置粘滞位限定用户只能对自己的文件进行处理
对文件设置setuid可以让执行该命令的用户以该命令拥有者的权限去执行,setuid使用不是无限制的。只能应用在Linux  ELF格式二进制文件上,而不能用于脚本文件。
1 setuid及setgid
[root@CentOS5 ~]# ll /etc/passwd /usr/bin/passwd
-rw-r--r-- 1 root root  1927 Jul 30  2013 /etc/passwd
-rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd
root用户和普通用户均可以用/usr/bin/passwd这个命令来修改这个/etc/passwd这个文件,root用户本身拥有对/etc/passwd的写权限,无可厚非;root可以修改任何人的密码,普通用户只能修改自己,普通用户之所以可以修改自己的密码是因为setuid,setuid的作用是“让执行该命令的用户以该命令拥有者的权限去执行”,就是普通用户执行passwd时会拥有root的权限,这样就可以修改/etc/passwd这个文件了。它的标志为:s,会出现在x的地方,例:-rwsr-xr-x 。而setgid的意思和它是一样的,即让执行文件的用户以该文件所属组的权限去执行。
chmod u+s xxx # 设置setuid权限
chmod g+s xxx # 设置setgid权限
chmod o+t xxx # 设置stick bit权限,针对目录
chmod 4775 xxx # 设置setuid权限
chmod 2775 xxx # 设置setgid权限
chmod 1775 xxx # 设置stick bit权限,针对目录
注意:但是事实证明S或T与x没关有时你设置了s或t 权限,你会发现它变成了S或T,这是因为在那个位置上你没有给它x(可执行)的权限,这样的话这样的设置是不会有效的,你可以先给它赋上x的权限,然后再给s或t的权限。

[root@CentOS5 bin]# ll|grep "^-rws"
-rws--x--x 1 root root    1890660 Mar 31  2010 Xorg
-rwsr-xr-x 1 root root      43492 Jan 27  2010 at
-rwsr-xr-x 1 root root      46972 Mar 31  2010 chage
-rws--x--x 1 root root      17900 Jan 20  2010 chfn
-rws--x--x 1 root root      19096 Jan 20  2010 chsh
-rwsr-sr-x 1 root root     315416 Jan  6  2010 crontab
-rwsr-xr-x 1 root root      51512 Mar 31  2010 gpasswd
-rwsr-xr-x 1 root root      24588 Mar 31  2010 newgrp
-rwsr-xr-x 1 root root      22984 Jan  7  2007 passwd
-rwsr-xr-x 1 root root      18608 Sep 22  2009 rcp
-rwsr-xr-x 1 root root      13108 Sep 22  2009 rlogin
-rwsr-xr-x 1 root root       8908 Sep 22  2009 rsh
[root@CentOS5 bin]# pwd
/usr/bin

-rwsr-xr-x 1 root root   58324 Jan 20  2010 mount
-rwsr-xr-x 1 root root   35832 Sep 27  2009 ping
-rwsr-xr-x 1 root root   31244 Sep 27  2009 ping6
-rwsr-xr-x 1 root root   23960 Mar  1  2010 su
-rwsr-xr-x 1 root root   38936 Jan 20  2010 umount

[root@CentOS5 file_user]# ll /etc/passwd
-rw-r--r-- 1 root root 1927 Jul 30  2013 /etc/passwd
第二列显示的是文档的连结数,这个连结数就是硬链接的概念,即多少个文件指向同一个索引节点,举例如下:
ln install.log  install.log2
第五列显示文档最后一次的修改日期

 

id - print real and effective user and group IDs

linux系统中每个进程都有2个ID,分别为用户ID(uid)和有效用户ID(euid),UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。C语言中,可以通过函数getuid()和geteuid()来获得进程的两个ID值。

当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
gid和egid同理。

下面一段C代码将解释区别:"printid.c"

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

int main(void)
{
    printf(" UID\t= %d\n", getuid());
    printf(" EUID\t= %d\n", geteuid());
    printf(" GID\t= %d\n", getgid());
    printf(" EGID\t= %d\n", getegid());

    return EXIT_SUCCESS;
}

编译之:
aguo@linux-x9rc:~> gcc -o printid printid.c 

执行:
aguo@linux-x9rc:~> ./printid 
Real UID        = 1000
Effective UID        = 1000
Real GID        = 100
Effective GID        = 100

看看/etc/passwd里uid和gid:
aguo@linux-x9rc:~> cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'
uid:1000        gid:100

以上是相同的例子。

下面演示uid和euid不同的例子。
首先,修改一下文件属性,setuid或setgid
aguo@linux-x9rc:~> chmod u+s printid #这样一来,文件在执行阶段具有文件所有者的权限。
还可以再补充一个:
aguo@linux-x9rc:~> chmod g+s printid #这样一来,文件在执行阶段具有文件所属组的权限。

其次,变成其他用户,再来试验一下,比如变成root;
linux-x9rc:/home/aguo # ./printid 
Real UID        = 0
Effective UID        = 1000
Real GID        = 0
Effective GID        = 100

 



2 粘着位
Linux中有一个存放临时文件的目录/tmp(类似于Windows中的temp目录),每个用户产生的临时文件都存放在此目录下,也就是说每个用户对/tmp目录都应该有写权限(否则无法拷贝生成文件),这样造成一个问题,比如,高洛峰在/tmp目录下创建了一个文件,张沫看着不爽就可以删掉,这如何控制?
其实,这种情况永远都不会发生,因为/tmp目录有一个特殊的权限标记:
ls -ld /tmp
drwxrwxrwt 5 root root 4096 May 24 13:55 /tmp
瞧见那个rwx权限最后的“t”了没,那个神奇的“t”就是粘着位t(有的资料中文也称为粘滞位),是Linux特殊权限中的第三个(另外两个是SetUID和SetGID),定义为:权限为777的目录设置粘着位t以后,具有写权限每个用户都可以在目录下创建文件,不同的是每个用户只能删除自己是所有者的文件,也就是说只能删除自己创建的文件。
案例一操作(给目录/test授予777权限用一个普通用户登录删除另一个普通用户创建的文件),不过这次创建的目录/test多授予它一个粘着位权限:
chmod o+t /test # 或 chmod 1777 /test
此时普通用户尝试删除其他用户的文件时,会给出提示“Operation not permitted”。 当root设置粘滞位后,即时生效

二 文件系统权限
每个操作系统都要有一种组织管理数据的方式,我们可以理解为就是文件系统,比如Windows的NTFS、FAT ,Linux的EXT ,而在Linux加载分区时可以针对文件系统进行权限设定。
配置文件/etc/fstab保存了Linux启动时自动加载的分区信息,/etc/fstab文件中第四项定义了加载时的设置,默认为defaults ,包括rw、suid、dev、exec、auto、nouser、async ,如果想改变整个分区的限定,可以利用这些选项。本文举两例说明,证明基于文件系统的权限那是相当霸道。

案例一:只读分区
默认加载分区是可读写rw的,但是如果特殊应用希望分区加载后是只读的,可以做一下设置:

默认这个文件不可修改
[root@CentOS5 /]# lsattr  /etc/fstab
----i-------- /etc/fstab
[root@CentOS5 /]# chattr  -i /etc/fstab
[root@CentOS5 /]# vim /etc/fstab
[root@CentOS5 /]# chattr  +i /etc/fstab
vi /etc/fstab # 编辑/etc/fstab文件在defaults后加入ro选项(逗号分隔)
LABEL=/soft /soft ext3 defaults,ro 1 2
mount -o remount /soft # 重新加载/soft分区,使设置生效
如果你不嫌麻烦也可以重启系统,设置同样会生效。
此时整个/soft分区都是只读的,用root登录后执行:
touch /soft/testfile
touch: cannot touch `testfile': Read-only file system
会提示/soft分区是只读的,即便牛X到是root也不可以创建文件,这是凌驾于rwx权限之上的文件系统权限,相当的牛A与牛C之间。像本例是笔者公司的软件共享目录,一般半个月才更新一次软件,平时不想任何人增加或删除(包括不希望root用户误删除),所以设置为ro ,更新软件时,可以临时更改为rw来设置:
mount -o remount,rw /soft
在命令行上也可以设置分区权限,但是只是当前会话有效,而写入/etc/fstab文件后则会一直有效。

案例二:安全分区
数据存储的分区,如用做备份的分区,我们可以增加下安全设置选项:
vi /etc/fstab # 编辑/etc/fstab文件在defaults后加入noexec选项
LABEL=/backup /backup ext3 defaults,noexec 1 2
mount -o remount /backup # 重新加载/backup分区,使设置生效
此时做个试验,我们使用普通用户拷贝一个命令文件pwd在/backup目录下
cp /bin/pwd /backup
/backup/pwd
-bash: pwd: Permission denied
ls -l pwd
-rwxr-xr-x 1 liming liming 93560 Sep 25 10:13 pwd
命令拷贝到/backup下虽然具有可执行权限,但是也无法执行,在/backup分区下,任何可执行文件都将不能执行,这么做的意义在哪里?如果攻击程序、木马、病毒不能够执行,那么就相当于没有意义。
其他选项不做更多演示,这里只抛砖引玉,其他选项设置读者可man mount查看,查看-o选项中的详细介绍,更多设置读者可自行尝试,所谓授之以鱼不如授之以渔读万卷书不如行万里路万恶淫为首窗前明月光啊。

三 权限之chattr
chatrr只有root用户可以使用,用来修改文件的权限属性,建立凌驾于rwx基础权限之上的授权。
在此介绍两个常用选项:
a 只允许在文件后追加数据,如果目录具有此属性,系统将只允许在目录下建立和修改文件,而不允许删除任何文件。
i 不允许对文件进行任何修改,如果目录具有此属性,那么只能修改目录下的文件,不允许建立和删除文件。

案例一:无法删除和更改的文件
如果要建立一个公共访问的目录,大家都可以删除和创建、拷贝文件,但是有一个基本的使用此目录的规则,要建立一个说明文件README ,这个文件不允许大家删除和修改,则可以如下设置:
chattr +i README
这时,README文件所在目录所有用户都有读写权限,但是任何用户都无法删除README文件(包括root),尝试删除会提示:
rm README
rm: remove write-protected regular empty file `README'? y
rm: cannot remove `README': Operation not permitted
同样也不可以改变文件的内容,可以查看到README文件被增加了一个不可更改的属性:
lsattr README
----i-------- README
此时,README变成了一个非常牛XX的文件,即便你是SuperUser也无法删除和修改它,想对它干嘛都不成。
若要更改或删除文件也必须先去掉i属性才可以:
chattr -i README

案例二:备份目录应用
假设有这样一种应用,我们每天自动化实现把上海服务器的日志通过scp和rsync远程备份到北京的备份服务器上,备份服务器的存储目录可设置为只可创建文件而不可删除。
chattr +a /backup/log
设置后,可在本机测试:
cp /var/log/messages /backup/log # 可以拷贝文件
rm /backup/log/messages # 删除文件则被禁止
rm: remove regular file `messages'? y
rm: cannot remove `messages': Operation not permitted
chattr命令不宜对目录/、/dev、/tmp、/var等设置,严重者甚至容易导致系统无法启动,比如根目录如果设置了i属性,谨慎设置。

四 权限之ACL
Linux中默认的权限管理比较简单,难以实现复杂的权限控制,如针对一个文件设置几个用户或用户组具有不同权限,这就需要依靠ACL(Access Control List)访问控制列表实现,可以针对任意指定的用户/用户组分配权限。在一个文件系统上使用ACL需要在挂载文件系统的时候打开ACL功能。而根分区(ROOT)默认挂载的时候支持ACL
开启分区的ACL功能 ,需要在/etc/fstab文件中加入acl选项,如:
LABEL=/backup        /backup        ext3        defaults,acl        1 2
然后重新加载分区即可生效:
mount -o remount /backup
如果想临时生效可不修改/etc/fstab文件,直接执行命令“mount -o remount,acl /backup”即可。

[root@coreserv ~]# setfacl -v 查看版本
setfacl 2.2.49
[root@coreserv ~]# tune2fs -l /dev/sda3 | grep option 查看文件系统是否支持acl权限控制:
Default mount options: user_xattr acl

开启acl支持有两种方法:
1)修改mount选项:
mount -o remount,acl /dev/sda3 /mnt/acltest
开机自动挂载:
vim /etc/fstab
/dev/sda3 /mnt/acltest ext4 defaults,acl 0 0
2)使用tune2fs修改文件系统信息:
tune2fs开启acl后已是永久有效,无需再改fstab的mount选项:
tune2fs -o acl /dev/sda3 修改文件系统自身信息来设置acl选项
tune2fs -o ^acl /dev/sda3 取消acl选项
setfacl -m g:aclgp1:rx bobdir/
对于组权限,setfacl设置的权限只对主组(即useradd -g或usermod -g的组)有效,对附加组(即useradd -G或usermod -aG的组)无效,即使文件的所有组已改为附加组。
setfacl和chmod设置的权限可以相互覆盖,当二者设置的权限不一致时,以使用getfacl看到的“#effective:”后的权限为准。

useradd http -h /var/www/html 设置宿主目录
passwd http
setfacl -R -m u:http:rwx /var/www/html/ 这样http用户就可以操作html目录
setfacl -d --set u:http:rwx /var/www/html/cache -d是让子目录继承父目录权限
setfacl -x u:http /var/www/html/ 去掉单个用户的权限
setfacl -b /var/www/html/ 删除目录的所有acl权限
getfacl /var/www/html

案例:设定复杂权限控制目录
设定目录/backup/log用户zhangsan有读写执行权限,用户lisi有读权限,用户wangwu有读写权限,而用户组bakgroup有读和执行权限,则可做如下设置:
setfacl -m u:zhangsan:rwx,u:lisi:r,u:wangwu:rw,g:bakgroup:rx /backup/log
setfacl -m可以设置文件/目录的访问权限,至于权限设定的写法包括三个组成部分,第一部分列出设定对象是用户u或用户组g ;第二部分指定用户名或用户组名;第三部分指定访问权限rwx ,设定多组权限中间用逗号分隔。如“u:lisi:r”表示设定用户lisi为只读权限。
查看目录属性:
ls -ld /backup/log
drwxrwxr-x+ 2 root root 4096 May 25 07:16 /backup/log
会发现文件权限位后增加了一个加号,这说明/backup/log设置了ACL ,同时可以查看其详细的权限设置:
getfacl /backup/log
# file: backup/log
# owner: root
# group: root
user::rwx
user:zhangsan:rwx
user:lisi:r--
user:wangwu:rw-
group::r-x
group:bakgroup:r-x
mask::rwx
other::r-x
这样即可实现Linux中文件/目录的复杂权限控制,要注意的是ACL优先于基本权限设置,也就是说如果默认所属组为rx权限,但是ACL若指定了所属组中某个成员为rwx权限,则此成员拥有rwx权限。

五 权限之管理员授权
Sudo使用简单,管理员root使用visudo命令即可编辑其配置文件/etc/sudoers进行授权,具体格式为:
用户名/用户组名        主机地址=授权命令(绝对路径)
如,授权用户zhaoliu可以关机和重启,则添加如下行:
zhaoliu        Helen=/sbin/shutdown,/sbin/reboot
指定组名用百分号标记,如%admgroup ,多个授权命令之间用逗号分隔。
用户zhaoliu可以使用sudo查看授权的命令列表:
sudo -l
Password:
User zhaoliu may run the following commands on this host:
    (root) /sbin/shutdown
    (root) /sbin/reboot
提示输入密码为zhaoliu的密码,验证其是否为管理员通过sudo授权的用户,执行命令:
sudo /sbin/shutdown -h now
zhaoliu即可关机,注意命令写绝对路径,或者把/sbin路径导入到用户缺省路径中,否则无法执行。

案例:授权用户管理Apache
首先要分析授权用户管理Apache至少要实现哪些基本授权:
1、可以使用Apache管理脚本
2、可以修改Apache配置文件
3、可以更新网页内容
假设Aapche管理脚本为/etc/rc.d/init.d/httpd ,满足条件一,用visudo进行授权:
zhaoliu        Helen=/etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest
授权用户zhaoliu可以通过Apache管理脚本重新读取配置文件让更改的设置生效(reload)和可以检测Apache配置文件语法错误(configtest),但不允许其执行关闭(stop)、重启(restart)等操作。
满足条件二,同样使用visudo授权:
zhaoliu        Helen=/bin/vi /etc/httpd/conf/httpd.conf
授权用户可以root身份使用vi编辑Apache配置文件。
以上两种sudo的设置,要特别注意,很多朋友使用sudo会犯两个错误:第一,授权命令没有细化到选项和参数;第二,认为只能授权管理员执行的命令。
条件三则比较简单,假设网页存放目录为/var/www/html ,则只需要授权zhaoliu对此目录具有写权限或者索性更改目录所有者为zhaoliu即可,如果需要还可以设置zhaoliu可以通过FTP等文件共享服务更新网页。
最后请切记系统安全的基本原则:授权用户最小的权限。
蜘蛛侠说“能力越大责任越大”,Linux管理员说“能力越大出错几率越大”,阿门。

posted on 2014-04-15 18:08  阳光-源泉  阅读(4773)  评论(0编辑  收藏  举报

导航