linux最优秀的地方就在于,就在于它是一个多用户,多任务环境。但是在同一个内核系统中,多用户存在就意味着风险,因为每个用户可能拥有自己的私密文件,所以这时候就需要对文件的权限设置一系列的访问权限设置策略,以保证用户有序的调用内核。举例来说,同一时刻,有的兄弟在使用ftp上传文件,有的兄弟在浏览网页,有的兄弟需要维护论坛,有的兄弟需要维护linux系统;他们使用的账户可能是不同的普通账户或者超级BOSS-root,不同的用户或者用户的集合(用户组)拥有不同的权限,以完成不同的任务。

   所以我们要了解用户及用户组,首先要分用户及用户组进行区别。

一.用户角色的区分

    用户在系统中是通过UID来之别,这就是用户身份标识,所以分为以下几种:

  1. 管理员(root):系统唯一,拥有最高权限;

  2. 普通账户

  • 系统用户:

    • 为了能够让后台进程或服务类进程以非管理员的身份运行,通常需要为此创建多个普通用户,这类用户从不用登陆系统;也就说系统用户没有家目录

  • 登陆用户


二.用户组角色的区分

    用户组也有自己身份标识,即GID。种类如下:

  1. 管理员组(root)

  2. 普通用户组

  • 系统用户组

  • 登陆用户组


另外可根据组类别,还可分为:

私有组:(此时组里只有包含一个用户,组名跟用户名相同) 一个部门有且只有一个人;    共有组(共有组里包含多个用户)类似于一个部门里拥有多个职员一样。


三.用户和用户组的对应关系是:一对一、多对一、一对多或多对多;

  1. 一对一:某个用户可以是某个组的唯一成员;

  2. 多对一:多个用户可以是某个唯一的组的成员,不归属其它用户组;比如fedora和gentoo两个用户只归属于beinan用户组;

  3. 一对多:某个用户可以是多个用户组的成员;比如fedora可以是gentoo组成员,也可以是fedora用户组成员,还可以是centos用户组成员;

  4. 多对多:多个用户对应多个用户组,并且几个用户可以是归属相同的组;其实多对多的关系是前面三条的扩展.


四.与用户及用户组相关的配置文件

  1. 用户配置文件:用户的信息库保存在:/etc/passwd下

  2. 格式:name:password:UID:GID:GECOS:directory:shell,含义:

  • name:用户名;

  • password:可以是加密的密码,也可是占位符

  • UID:用户的标识;

  • GID:用户所属的主组的ID号;

  • GECOS:用户的注释信息;

  • directory:用户的家目录;

  • shell:用户的默认shell,登陆时默认shell程序    

用户密码文件,保存在/etc/shadow
  •  格式:用户名:加密的密码:最近一次修改密码的时间:最短使用期限;最长使用期限;

用户组配置文件,用户组信息保存在:/etc/group下格式:group_name:password:GID:user_list,含义
  • group_name:组名

  • group_name:组密码

  • GID:组ID

  • user_list:该组的用户成员;以此组为附加组的用户的用户列表。

用户组密码文件,保存在/etc/gshadow


五.用户及用户组的创建,修改,删除:

    了解了这些之后,那么如何创建删除用户(用户组),如何改变用户的属性呢?可以通过以下的命令来实现:


1.创建用户:useradd [选项] 登录名,选项如下:

  • -u --uid UID:指定UID号;

  • -g --gid GROUP:指定基本组ID,此组要实现存在;

  • -c --comment COMMENT:指明注释信息;

  • -G --groups GROUP1 :指明用户所属的附加组,多个组之间用逗号分隔

  • -d 指定家目录:创建以指定的路径为用户的家目录:通过复制/etc/skel次目录并重命名实现:指 定的家目录路径,如果事先存在,则不会为用户复制环境配置文件;

  • -s --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells;

  • -r --system:创建系统用户

  • -D :显示创建用户的默认配置:

    • useradd -D 选项:修改默认选项的值

    • 修改的结果保存于/etc/default/useradd文件中

注意:创建用户是的诸多默认设置文件为:/etc/login.defs


2.创建好用户之后,修改用户的属性:usermod [选项] 登录,选项:

  • -u --uid UID:修改用户的ID为此处指定的新UID;

  • -g --gid GROUP:修改用户所属的基本组;

  • -G --groups GROUP1 :修改用户所属的附加组:原来的附加组会被覆盖;

  • -a --append:与-G一同使用,用于为用户追加新的用户组;

  • -c --comment COMMENT:指明注释信息;

  • -d --home HOME_DIR:修改用户的家目录,用户原有的文件不会被转移至新位置;

  • -m, --move-home :只能与-d选项一起使用,用于将原有的家目录移动至新的家目录;

  • -l --login NEW_NAME :修改用户名;

  • -s,--shell SHELL:修改用户的默认shell;

  • -L --lock: 锁定用户密码,即在用户原来的密码字符串之前添加一个“!”;

  • -U --unlock:解锁用户的密码。


3.假如我们想删除一个用户,可使用userdel [选项] 登录名,选项:

  • -r 删除用户时一并删除其家目录


4.针对用户来说,创建用户组,groupadd [选项] group_name,选项:

  • -g GID:手动指定GID,默认是上一个组的GID+1;

  • -r :创建系统组:


5.删除用户组,groupdel:删除组。


六.特殊配置文件

1./etc/skel 目录

  • /etc/skel目录一般是存放用户启动文件的目录,这个目录是由root权限控制,当我们添加用户时,这个目录下的文件自动复制到新添加的用户的家目录下;/etc/skel 目录下的文件都是隐藏文件,也就是类似.file格式的;我们可通过修改、添加、删除/etc/skel目录下的文件,来为用户提供一个统一、标准的、默认的用户环境;

  • /etc/skel 目录下的文件,一般是我们用useradd命令添加用户(user)时,系统自动复制到新添加用户(user)的家目录下;如果我们通过修改 /etc/passwd 来添加用户时,我们可以自己创建用户的家目录,然后把/etc/skel 下的文件复制到用户的家目录下,然后要用chown 来改变新用户家目录的属主;

 

2./etc/login.defs 配置文件

  • /etc/login.defs 文件是当创建用户时的一些规划,比如创建用户时,是否需要家目录,UID和GID的范围;用户的期限等等,这个文件是可以通过root来定义的,配置如下:

    • PASS_MAX_DAYS   99999   注:用户的密码不过期最多的天数;

    • PASS_MIN_DAYS   0       注:密码修改之间最小的天数;

    • PASS_MIN_LEN    5       注:密码最小长度;

    • UID_MIN                 1000  注:最小UID为1000,也就是说添加普通用户时,UID是从1000开始的;

    • UID_MAX                 60000   注:最大UID为60000;

    • SIS_MIN                 201    系统用户最小UID

    • SIS_MAX                 999    系统用户最大UID

    • GID_MIN                 1000   注:GID 是从1000开始;

    • GID_MAX                 60000

    • CREATE_HOME     yes   注:是否创用户家目录,要求创建;

3./etc/default/useradd 文件;

  • 通过useradd 添加用户时的规则文件

    • GROUP=100

    • HOME=/home  注:把用户的家目录建在/home中;

    • INACTIVE=-1  注:是否启用帐号过期停权,-1表示不启用;

    • EXPIRE=   注:帐号终止日期,不设置表示不启用;

    • SHELL=/bin/bash  注:默认使用shell的类型;

    • SKEL=/etc/skel   注: 默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的;


七.权限的理解及修改

1.权限的理解:

  • linux的哲学思想是一切皆文件,而文件,我们可以看成linux内核管理的种种资源,那么权限也就是用户使用调用内核资源的权力等级。那么当我们打开一个进程的时候,就是用户在行使自己调用资源权限的权力了,此时,这种权力要在某种被允许的规则下去调用,无节制没有秩序的调用是被允许的,那么这种规则是什么,即下面的规则:

    1)进程的属主与文件的属主是否相同,如果相同,则应用属主权限;进程的属主与文件的属主是否相同,如果相同,则应用属主权限;

    2)进程属主如果与文件的属主不相同;那么分为两支:

        2.1)继续检查进程的属主是否属于文件的文件的属组,如果属于,则应用文件属组权限;

        2.2)如果文件的属主也不属于文件的属组,那么就只能应用other权限了。


2.使用验证:当前用户环境下,一个进程的运行是以其进程所属的属主及属组的权限运行的;

举例来说:

2.1

[gentoo@localhost ~]$ ls -l .

总用量 0

-rw-rw-r--. 1 gentoo gentoo 0 12月 10 03:12 a

-rw-rw-r--. 1 gentoo gentoo 0 12月 10 03:12 b

-rw-rw-r--. 1 gentoo gentoo 0 12月 10 03:12 c

我现在查看当前目录下所有文件的属性,那么运行ls -l就是运行一个进程,此时,此进程的用户是谁呢,看一下:

[gentoo@localhost ~]$ whoami

gentoo

此时是gentoo用户,那么运行ls -l进程的就是以gentoo发起运行的,所以此时进程的属主,进程的所有者是gentoo,再对比目录下a文件的属主,也是gentoo,那么此时就会应用属主gentoo的权限,gentoo的属主权限为rw-,所以我们此时我们可以可读可写;

验证可读:

[gentoo@localhost ~]$ cat a 

teat

我们可以看到a文件的内容;

验证可写:

[gentoo@localhost ~]$ echo "test1" >>a

[gentoo@localhost ~]$ cat a 

teat

test1

同样,我们也可以给文件新增内容。


2.2 验证进程属主如果与文件的属主不相同的情况.

  • 假如此时用户切换为非gentoo用户,即非文件的属主用户,该如何执行?

2.2.1

[fedora@localhost gentoo]$ whoami

fedora

此时进程用户为fedora,再看下用户组信息:

[fedora@localhost gentoo]$ cat /etc/group |grep fedora

mageedu:x:1000:mageedu,gentoo,fedora

fedora:x:1003:

我们可以得知fedora属于用户组ID为1003的用户组Fedora;


然后查看下目录下文件权限:

[fedora@localhost gentoo]$ ls -l

总用量 8

-rw-rw-r--. 1 gentoo gentoo 11 12月 10 04:01 a

-rw-rw-r--. 1 gentoo fedora  6 12月 10 04:00 b

-rw-rw-r--. 1 gentoo gentoo  0 12月 10 03:12 c


此时我们可以看到用户组fedora拥有对b文件的rw-权限,即可读可写全写权限,即此时打开进程的用户fedora所属的用户组与文件b的用户组是一致的,此时也就意味着fedora拥有对b文件所属用户组的权限--可读可写,测试一下;

[fedora@localhost gentoo]$ cat b 

teat3

可以读到b文件的内容;

[fedora@localhost gentoo]$ echo "test3" >>b

[fedora@localhost gentoo]$ cat b

teat3

test3

可以往b文件里追加内容,即fedora对文件b有写入权限。这验证2.1)的原则,即继续检查进程的属主是否属于文件的文件的属组,如果属于,则应用文件属组权限;



2.2.2 验证2.3)原则

  •     在下面我们看到d文件的属组为roo,而root用户组并不包含fedora

[fedora@localhost gentoo]$ ls -l

总用量 12

-rw-rw-r--. 1 gentoo gentoo 11 12月 10 04:01 a

-rw-rw-r--. 1 gentoo fedora 12 12月 10 04:13 b

-rw-rw-r--. 1 gentoo gentoo  0 12月 10 03:12 c

-rw-r-----. 1 root   root    5 12月 10 04:39 d

[fedora@localhost gentoo]$ cat /etc/group |grep root

root:x:0:

此时尝试读取d文件,由于fedora所属的组fedora gentoo都跟d的所属组对应不起来,所以只能到other组,此时other


组无任何权限;

[fedora@localhost gentoo]$ cat d

cat: d: 权限不够

报权限不够,[fedora@localhost gentoo]$ echo "cdef" >>d

-bash: d: 权限不够

验证了2.3)原则,即:如果文件的属主也不属于文件的属组,那么就只能应用other权限。



3.权限的修改:

  • 在linux内核中,基本是遵循这个策略来规定用户及用户组对文件的权限的,这就可以使每个用户在一个系统下,一个屋檐中有序的管理自己文件,拥有一个有序的天空。那么如果我们需要改变某个用户或者用户组对目录或者文件的权限怎么办呢?这就需要权限管理工具来实现了,即usermod命令。

  • 定义修改的情况:

    • u:用户的属主

    • g:用户的属组

    • o:其他情况

    • a:所有

  • 修改方法:

    • 赋权表示法:直接操作一类用户的所有权限为rwx,例子如下:

      • [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-r--r--. 1 root root  595 12月 10 03:31 fstab

        [root@localhost ~]# chmod g=rw fstab

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-rw-r--. 1 root root  595 12月 10 03:31 fstab

        使fstab文件的属组拥有了可写权限,直接操作文件的属组。


      • [root@localhost ~]# chmod ug=r fstab 

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -r--r--r--. 1 root root  595 12月 10 03:31 fstab

        修改fstab的文件的属主属组都只有可读权限。


    • 授权表示法:直接操作一类用户的一个权限位,r,w,x

      • [root@localhost ~]# chmod ug=rw fstab 

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-rw-r--. 1 root root  595 12月 10 03:31 fstab

        [root@localhost ~]# chmod g-w fstab

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-r--r--. 1 root root  595 12月 10 03:31 fstab

      • 直接去除用户组写权限。

        [root@localhost ~]# chmod o-r fstab 

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-r-----. 1 root root  595 12月 10 03:31 fstab

        去除其他用户的读权限。


    • 直接数字8进制

      • [root@localhost ~]# chmod 664 fstab 

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-rw-r--. 1 root root  595 12月 10 03:31 fstab

      • 使fstab文件的属主属组拥有可写可读权限,其他只拥有可读权限


    • 引用性修改

      • [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-rw-r--. 1 root root  595 12月 10 03:31 fstab

        -rw-r--r--. 1 root root    0 12月 10 04:58 test

        [root@localhost ~]# chmod  --reference=./fstab test

        [root@localhost ~]# ll

        总用量 8

        -rw-------. 1 root root 1998 12月  7 05:57 anaconda-ks.cfg

        -rw-rw-r--. 1 root root  595 12月 10 03:31 fstab

        -rw-rw-r--. 1 root root    0 12月 10 04:58 test

        使test拥有跟fstab一样的属组属组及其他权限。


    • 如果我们想使一个目录极其子目录的文件都拥有一样的权限,可以使用-R递归参数;但是一般在授权及赋权表示法时使用,8进制时不建议用,以避免文件拥有可执行权限。


4.文件及目录属主及属组的修改:

  • 实现方式:chown [OPTION]... [OWNER][:[GROUP]] FILE

    • [root@localhost ~]# chown gentoo:fedora test

      [root@localhost ~]# ll

      总用量 8

      -rw-------. 1 root   root   1998 12月  7 05:57 anaconda-ks.cfg

      -rw-rw-r--. 1 root   root    595 12月 10 03:31 fstab

      -rw-rw-r--. 1 gentoo fedora    0 12月 10 04:58 test

      drwxr-xr-x. 2 root   root     30 12月 10 05:01 test1

      可以看到test的属主变为gentoo,属组变为fedora。当然我们可以加-R参数来使其子目录也拥有同样的属主属组。


5.修改默认创建权限;

  • 我们知道了权限的定义及如何修改权限之后,我们会想一个问题,当我们新创一个文件的时候,他默认的权限是什么呢?那他就与umask有关了。

  • umask:当前用户在新建目录及文件的时候权限默认值。我们称之为权限的反向掩码。

    • 查看当前umask值

      • [root@localhost ~]# umask

        0022

    • 修改umask值:umask 数值

      • [root@localhost ~]# umask 23

        [root@localhost ~]# umask

        0023

    • 注意:此种方式修改umask只对当前shell进程有效。

  • 使用方法:

    • 目录: 777-umask

    • 文件: 666-umask

      • 文件之所以用666去减,表示文件默认不能拥有执行权限:如果减得的结果中有执行权限,则需要将其加1。


总结:用户用户组及权限,可以让不同的用户及用户组在同一工作场景下拥有不同的权限来有序的使用内核资源。这对于我们以后规范系统的安全健壮性及满足不同用户的不同需求,具有极其重要的作用。